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

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

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

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

賬戶

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

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

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

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

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

公鑰算法

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

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

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

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

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

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

交易

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

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

比如我給你轉(zhuǎn)5毛,你給我轉(zhuǎn)500,這個過程都只是數(shù)據(jù)的流動,支付寶會真的把五毛錢挪來挪去嗎?不會,都只是數(shù)據(jù)庫里的數(shù)字變化而已。但因為支付寶和騰訊是大企業(yè),具有公信力,因此我們相信他們不會擅自動我們賬戶里的錢。無論你查看多少次,五毛也不會突然變五個億。

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

數(shù)字簽名

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

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

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

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

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

區(qū)塊

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

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

哈希

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

區(qū)塊鏈

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

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

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

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

結(jié)語

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

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

THEEND

最新評論(評論僅代表用戶觀點(diǎn))

更多
暫無評論