透視區(qū)塊鏈里的密碼學(xué)

區(qū)塊鏈本身是容易理解的,網(wǎng)上的許多圖片都是一串大鏈子,由一個(gè)個(gè)區(qū)塊串聯(lián)而成。而且在每個(gè)區(qū)塊生成的同時(shí),它也已經(jīng)被固定在區(qū)塊鏈上,不需要額外生成一條鏈的過(guò)程。

大多數(shù)人對(duì)區(qū)塊鏈的理解還只是一個(gè)大概印象,雖然很多人都認(rèn)為區(qū)塊鏈?zhǔn)侨ブ行幕目尚呕A(chǔ),但只有少部分人可以理解其中的具體原因。現(xiàn)在談到的區(qū)塊鏈,其實(shí)是基于一系列密碼學(xué)算法構(gòu)建而成的。對(duì)于非密碼學(xué)專(zhuān)業(yè)的人來(lái)說(shuō),理解起來(lái)是很艱澀的。

本文,我們將從密碼學(xué)的角度對(duì)整個(gè)區(qū)塊鏈結(jié)構(gòu)進(jìn)行一個(gè)整理講解。針對(duì)具體的密碼學(xué)技術(shù),盡量使用通俗的例子,希望能幫助大家增加對(duì)區(qū)塊鏈的理解。

賬戶(hù)

深入學(xué)習(xí)區(qū)塊鏈之前,我最好奇的就是每個(gè)人的賬戶(hù)在一個(gè)分布式系統(tǒng)中都是如何生成的。

畢竟在中心化系統(tǒng)中,賬戶(hù)是由服務(wù)方進(jìn)行生成和驗(yàn)證的。比如我們申請(qǐng)微信號(hào),微信號(hào)是騰訊在他們自己的服務(wù)器里幫我們創(chuàng)建并管理。但在區(qū)塊鏈系統(tǒng)中沒(méi)有一個(gè)中間企業(yè)幫我們創(chuàng)建賬戶(hù),那在區(qū)塊鏈里是如何生成賬戶(hù)的呢?

安全隨機(jī)數(shù)

這里就需要引入密碼學(xué)里的第一個(gè)概念,【安全隨機(jī)數(shù)】,即在本地隨機(jī)生成一個(gè)字符串,也就是我們的私鑰。由安全隨機(jī)數(shù)算法生成的隨機(jī)數(shù),我們可以無(wú)限假設(shè)是安全的。

比如,現(xiàn)在允許你在全宇宙中隨機(jī)選擇一個(gè)原子,不做標(biāo)記,然后讓你的朋友在不知情的情況下找出這個(gè)原子,你可以想象一下這個(gè)難度,而基于不同的足夠安全的隨機(jī)數(shù)種子生成相同的隨機(jī)字符串的概率比找到那個(gè)【原子】還低的多得多。因此,雖然我們都是在本地生成區(qū)塊鏈私鑰,但是完全可以認(rèn)為是安全的。

公鑰算法

通過(guò)安全隨機(jī)數(shù)算法生成了私鑰,那么如何通過(guò)私鑰生成公鑰以至地址呢?這里就需要引入第二個(gè)密碼學(xué)概念【公鑰算法】。

【公鑰算法】通俗來(lái)講就是公鑰加密,私鑰解密,任何擁有你公鑰的人都可以用你的公鑰來(lái)對(duì)數(shù)據(jù)進(jìn)行加密,但是只有對(duì)應(yīng)的私鑰才能對(duì)這個(gè)數(shù)據(jù)進(jìn)行解密。就好比是你造了保險(xiǎn)箱,任何人都可以把他的東西放在保險(xiǎn)箱里,然后鎖上箱子,一旦鎖上只有你才能打開(kāi)。這個(gè)公鑰算法在區(qū)塊鏈里用的是橢圓曲線,原理則是數(shù)學(xué)上對(duì)大數(shù)進(jìn)行因數(shù)分解的困難。

比如,大家都知道6可以由2乘上3得到,這個(gè)很簡(jiǎn)單,但如果給你超級(jí)大的數(shù)呢?比如一千位??jī)汕唬磕憧赡軙?huì)想著用自己的電腦來(lái)計(jì)算,畢竟數(shù)學(xué)已經(jīng)發(fā)展這么多年計(jì)算機(jī)算力也幾何式增長(zhǎng),肯定算得出,但是很遺憾的告訴你這個(gè)時(shí)間是成千上萬(wàn)年,足夠我們每個(gè)人回歸地球母親了。

給一個(gè)足夠長(zhǎng)的私鑰,我們可以得到一個(gè)公鑰,基于大數(shù)因數(shù)分解的困難性,沒(méi)有人可以通過(guò)這個(gè)公鑰計(jì)算出私鑰,這樣我們就得到了一個(gè)區(qū)塊鏈賬戶(hù)。這個(gè)賬戶(hù)僅僅包含私鑰和公鑰,那么我們通常使用的地址又是怎么來(lái)的呢?

簡(jiǎn)單來(lái)說(shuō)我們通常使用的地址就是公鑰的小名,比如迪麗熱巴·迪力木拉提是迪麗熱巴的全名,但是這個(gè)名字太長(zhǎng)了,所以我們通常叫她熱巴。公鑰也是這樣,雖然公鑰的長(zhǎng)度保證了安全性,但在使用時(shí)沒(méi)這個(gè)必要,畢竟數(shù)據(jù)是要存儲(chǔ)起來(lái)的,沒(méi)必要的數(shù)據(jù)也就沒(méi)必要存在,因此我們對(duì)區(qū)塊鏈賬戶(hù)的公鑰進(jìn)行了一系列的【哈?!坎僮?,并添加一些版本信息以及校驗(yàn)信息等等生成我們最終的區(qū)塊鏈地址。后文也將提到這個(gè)重要的密碼學(xué)概念【哈希/摘要】。

以上介紹了區(qū)塊鏈里的賬戶(hù),基本邏輯就是隨機(jī)數(shù)→私鑰→公鑰→地址。隨機(jī)數(shù)是不可重復(fù)的,公鑰和地址是可以計(jì)算的,因此你一定要保護(hù)好自己的私鑰,有私鑰,有一切。沒(méi)私鑰,那你可能也要像英國(guó)小哥一樣天天在垃圾站扒拉自己的硬盤(pán)了。

交易

交易對(duì)于大對(duì)數(shù)用戶(hù)來(lái)說(shuō),算是了解區(qū)塊鏈最多的地方了,畢竟大家用區(qū)塊鏈主要還是為了【交易】。假如最開(kāi)始中本聰提出的比特幣沒(méi)有幣這種激勵(lì)概念,那恐怕無(wú)論區(qū)塊鏈還是比特幣現(xiàn)在都早就被遺忘了。

國(guó)內(nèi)現(xiàn)在習(xí)慣使用支付寶和微信來(lái)進(jìn)行轉(zhuǎn)賬發(fā)紅包,這個(gè)過(guò)程是由支付寶和騰訊這種中心化機(jī)構(gòu)來(lái)幫助我們處理的。

比如我給你轉(zhuǎn)5毛,你給我轉(zhuǎn)500,這個(gè)過(guò)程都只是數(shù)據(jù)的流動(dòng),支付寶會(huì)真的把五毛錢(qián)挪來(lái)挪去嗎?不會(huì),都只是數(shù)據(jù)庫(kù)里的數(shù)字變化而已。但因?yàn)橹Ц秾毢万v訊是大企業(yè),具有公信力,因此我們相信他們不會(huì)擅自動(dòng)我們賬戶(hù)里的錢(qián)。無(wú)論你查看多少次,五毛也不會(huì)突然變五個(gè)億。

但是區(qū)塊鏈的交易就會(huì)出現(xiàn)問(wèn)題,我們沒(méi)有一個(gè)中心化的企業(yè)幫我們管理這幾個(gè)億。我說(shuō)給你轉(zhuǎn)1個(gè)億,但是我賬戶(hù)里只有五毛,怎么辦?我說(shuō)給你轉(zhuǎn)五毛,但是區(qū)塊鏈從我的賬戶(hù)里給你轉(zhuǎn)了一個(gè)億,我怎么辦?

數(shù)字簽名

【數(shù)字簽名】密碼學(xué)算法,可以解決這樣的困擾?!緮?shù)字簽名】顧名思義就是數(shù)字化的簽名。

在日常生活中,簽名代表著自己的授權(quán),具有法律效力。在數(shù)字時(shí)代,取代古時(shí)候簽字畫(huà)押的就是【數(shù)字簽名】,畢竟你不能對(duì)著電腦屏幕按指紋。數(shù)字簽名也是基于我們提到的【公鑰算法】,但是反著來(lái),前面提到公鑰加密與私鑰解密,這里我們用私鑰對(duì)輸入數(shù)據(jù)生成一段可驗(yàn)證的字符串稱(chēng)為簽名,這個(gè)簽名可以用公鑰來(lái)進(jìn)行驗(yàn)證。數(shù)字簽名可以保證原數(shù)據(jù)的完整性和真實(shí)性。

比如,你給你女朋友發(fā)個(gè)I love U,并附帶你的簽名,你女朋友驗(yàn)證了簽名后知道是你發(fā)的,又知道數(shù)據(jù)沒(méi)有被改過(guò),這就是個(gè)浪漫的愛(ài)情故事。但如果沒(méi)有簽名,中間被情敵改成了I hate U,你女朋友又沒(méi)法驗(yàn)證,那你的下一個(gè)520可能就要自己過(guò)了。

同理,【數(shù)字簽名】在區(qū)塊鏈的交易過(guò)程中也扮演著同樣的角色,保證交易的完整性和真實(shí)性。

完整性即交易的準(zhǔn)確數(shù)額,真實(shí)性即交易的存在與否。具體而言,我生成一筆交易寫(xiě)上給你轉(zhuǎn)五毛,然后用我的私鑰對(duì)數(shù)據(jù)進(jìn)行簽名,說(shuō)明這個(gè)交易確實(shí)是我授權(quán)的,然后把交易廣播出去,別的節(jié)點(diǎn)就會(huì)驗(yàn)證這個(gè)交易,一看簽名確認(rèn)數(shù)據(jù)是正確且真實(shí)的,那剩下的事情就交給共識(shí)了。但是如果發(fā)現(xiàn)數(shù)據(jù)和簽名對(duì)不上,那不好意思,你的五毛沒(méi)有了,一毛都不給了。

區(qū)塊

查閱區(qū)塊鏈圖片時(shí),基本通篇都是數(shù)字化鐵鏈的圖片,雖然看上去很酷炫,也和【鏈】這個(gè)詞很契合,但是區(qū)塊就很委屈了,畢竟鐵鏈子的結(jié)構(gòu)里完全看不到區(qū)塊原本的樣子。這里需要給區(qū)塊正名下,我區(qū)塊,今天從這里跳下去,哪怕打包到分叉上,也不當(dāng)一個(gè)鐵環(huán)。

從數(shù)據(jù)結(jié)構(gòu)上來(lái)說(shuō),一個(gè)合格的區(qū)塊應(yīng)該像一顆二叉樹(shù),或者類(lèi)似于生物譜系圖,從爺爺輩到父輩到自己這輩整體看下來(lái)就是個(gè)分叉樹(shù),不過(guò)區(qū)塊是個(gè)二叉的。這樣的結(jié)構(gòu)是因?yàn)閰^(qū)塊本身是基于Merkel Tree這種數(shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行組織的,最下層是交易的【哈希】,往上是兩個(gè)交易哈希的哈希,再往上是兩個(gè)「兩個(gè)交易哈希」的哈希的哈希。通俗點(diǎn)理解就是你的公司,最下面是干活的你;上面是看你干活的主管;再上面是主管的主管,看下級(jí)主管和干活的你,以此類(lèi)推到CEO。

哈希

這里著重提一下【哈希/摘要】,哈希算法是一種基于哈希函數(shù)/散列函數(shù)的單項(xiàng)算法,具有定長(zhǎng)性和不可逆性。定長(zhǎng)是指無(wú)論你輸入多長(zhǎng)的數(shù)據(jù),輸出都是固定長(zhǎng)度的字符串;不可逆性是指你無(wú)法通過(guò)輸出的數(shù)據(jù)逆推出原本的輸入。比如【碼】,在加碼的過(guò)程中,無(wú)論原本的數(shù)據(jù)多么內(nèi)涵,輸出的都是固定大小的色塊,原本的數(shù)據(jù)信息其實(shí)是大量混淆并且丟失了的,你無(wú)法根據(jù)碼后的數(shù)據(jù)恢復(fù)出碼前的數(shù)據(jù)。

區(qū)塊鏈

區(qū)塊鏈本身是容易理解的,網(wǎng)上的許多圖片都是一串大鏈子,由一個(gè)個(gè)區(qū)塊串聯(lián)而成。而且在每個(gè)區(qū)塊生成的同時(shí),它也已經(jīng)被固定在區(qū)塊鏈上,不需要額外生成一條鏈的過(guò)程。

我們?cè)谥v區(qū)塊的時(shí)候忽略掉了一部分?jǐn)?shù)據(jù),就是關(guān)于當(dāng)前區(qū)塊在區(qū)塊鏈上的高度,以及前區(qū)塊的哈希值。有了這兩個(gè)數(shù)據(jù),每一個(gè)區(qū)塊在所有的由區(qū)塊構(gòu)成的鏈?zhǔn)浇Y(jié)構(gòu)里都具有了位置的唯一性和數(shù)據(jù)的不可篡改性。

比如,小學(xué)組織出游,老師為了避免學(xué)生走丟,都讓每個(gè)學(xué)生依次記住另一個(gè)學(xué)生。如果老師想查人,只要讓每個(gè)學(xué)生查看鄰邊的學(xué)生即可。如果你中間想自己跑著玩,你鄰邊的學(xué)生立即就知道你不見(jiàn)了。

你可能會(huì)問(wèn),如果你偷偷把朋友也叫過(guò)來(lái)一起玩夾在你之后呢,但是每個(gè)學(xué)生也有自己的編號(hào),如果你偷偷夾了朋友,那你朋友的編號(hào)必然要么跟你或者跟你的后一個(gè)人是重復(fù)的,這樣也很容易發(fā)現(xiàn)?;谶@樣的組織形式,我們就從交易打包成區(qū)塊,又從區(qū)塊連接成了完整的區(qū)塊鏈。

結(jié)語(yǔ)

以上從分布式系統(tǒng)中的賬戶(hù)生成、交易驗(yàn)證、區(qū)塊結(jié)構(gòu)、哈希算法等密碼學(xué)角度,大致介紹了區(qū)塊鏈技術(shù)的概念。

如果你還不能完全理解區(qū)塊鏈時(shí),就多品一品那些通俗易懂的例子。當(dāng)以后有朋友問(wèn)你區(qū)塊鏈概念時(shí),就用例子以說(shuō)之。

THEEND

最新評(píng)論(評(píng)論僅代表用戶(hù)觀點(diǎn))

更多
暫無(wú)評(píng)論