◎段夕華
2008 年10 月,一篇署名中本聰(Satoshi Nakamoto)的論文《比特幣——一種點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)》 出現(xiàn)在了一個(gè)小眾的密碼學(xué)網(wǎng)站metzdowd.com 的郵件列表中,兩個(gè)月之后,比特幣的開(kāi)源軟件悄然現(xiàn)身互聯(lián)網(wǎng)。這就是區(qū)塊鏈的起點(diǎn),理解區(qū)塊鏈要從理解比特幣開(kāi)始。下文將對(duì)比特幣的原理和機(jī)制進(jìn)行通俗概要的解釋。
比特幣是在密碼學(xué)基礎(chǔ)上通過(guò)一系列機(jī)制設(shè)計(jì),實(shí)現(xiàn)的一種電子現(xiàn)金系統(tǒng)。在論文中,中本聰對(duì)這一系列機(jī)制設(shè)計(jì)進(jìn)行了完整的解釋。但這篇論文的讀者是面向密碼極客們,其中沒(méi)有對(duì)其密碼學(xué)基礎(chǔ)做任何解釋?zhuān)蛊胀ㄗx者理解,就必須首先對(duì)比特幣所涉及的密碼學(xué)基礎(chǔ)知識(shí)進(jìn)行簡(jiǎn)要的解釋。
區(qū)塊鏈的密碼學(xué)基礎(chǔ),最重要的有兩個(gè): 哈希函數(shù)和非對(duì)稱(chēng)加密算法。
哈希函數(shù) (Hash Function)是一種音譯,也可以被譯為散列函數(shù)、雜湊函數(shù)。區(qū)塊鏈領(lǐng)域里目前使用的主要為安全哈希算法 (Secure Hash Algorithm,縮寫(xiě)SHA),其中以SHA-2 系列算法為主,而SHA-2 算法根據(jù)輸出長(zhǎng)度,又被分為SHA-224、SHA-256、SHA-384、SHA-512 等,這些算法都是由美國(guó)國(guó)家安全局 (NSA)設(shè)計(jì),由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布的,其中比特幣使用的就是其中的SHA-256 算法。
對(duì)哈希函數(shù)的最簡(jiǎn)單解釋?zhuān)褪前演斎胫涤成錇橐粋€(gè)固定長(zhǎng)度的數(shù)字摘要。它的輸入值可以是任意的,一切可以被數(shù)字化的東西,電影、圖片、音樂(lè)、文字、合約、代碼都可以,輸出值則是一個(gè)固定長(zhǎng)度的二進(jìn)制數(shù)字。這種映射關(guān)系,就像人和他的指紋,人是輸入值,指紋就是輸出值,是這個(gè)人的映射。
哈希函數(shù)有兩個(gè)主要特點(diǎn):
一是不能倒算。正向運(yùn)算哈希函數(shù),快速簡(jiǎn)單,但倒算卻不可能實(shí)現(xiàn),也就是說(shuō)不可能通過(guò)輸出值算出輸入值,如果一定要找出輸入值,只能通過(guò)窮舉法,把可能的輸入值依次嘗試,直到找出正確的輸入值,但由于輸入空間無(wú)限,事實(shí)上,這在現(xiàn)實(shí)中是不可能的。延續(xù)之前的比喻,不能倒算可以被想象為這樣的關(guān)系: 取一個(gè)人的指紋很容易,但靠指紋算出這個(gè)人的信息則是不可能的。
二是不可能人為制造哈希碰撞 (Hash collision)。碰撞是指兩個(gè)輸入值不相同,但輸出值相同的情況。因?yàn)檩斎胫档姆秶鸁o(wú)限,但輸出值的范圍有限,所以碰撞理論上一定存在的。以SHA-256 算法為例,它的輸出值是一個(gè)256 位的二進(jìn)制數(shù)字,存在2256種可能,理論上進(jìn)行2130次輸入就會(huì)有99%的可能性發(fā)生一次碰撞,不過(guò)既使用人類(lèi)制造的所有計(jì)算機(jī)自宇宙誕生一直運(yùn)算到現(xiàn)在,發(fā)生一次碰撞的幾率也可以忽略不計(jì)。繼續(xù)比喻,不可碰撞就是說(shuō): 雖然只要有無(wú)限多數(shù)量的人,就有可能出現(xiàn)兩個(gè)指紋相同的人,畢竟理論上構(gòu)成指紋的原子數(shù)量是有限的,其排列組合方式因而也是有限的,但要以人工方法找到這兩個(gè)人則是不可能的。
基于這兩個(gè)特點(diǎn),哈希算法就能為任何數(shù)據(jù)提供一個(gè)唯一、對(duì)應(yīng)的摘要,比喻的說(shuō)也可以叫做為任何數(shù)據(jù)算出一個(gè)指紋。這就是哈希算法的主要用途。
加密的辦法分兩種,對(duì)稱(chēng)的和非對(duì)稱(chēng)的。簡(jiǎn)單的說(shuō),如果加密和解密用相同的密鑰,就是對(duì)稱(chēng)加密,如果不同,則是非對(duì)稱(chēng)加密。
對(duì)稱(chēng)加密也可能是安全的,但前提是能夠安全傳輸密鑰。比如上級(jí)和特工之間共用同一個(gè)密碼本,只要密碼本不泄露,那密文泄露也沒(méi)事,但密碼本一旦被敵人掌握,那就一切皆休。上級(jí)和特工之間可以有秘密通道傳輸密碼本,但在現(xiàn)實(shí)的、開(kāi)放的互聯(lián)網(wǎng)環(huán)境中,只要傳輸密鑰,就無(wú)法保證安全。
在開(kāi)放的傳輸環(huán)境中,實(shí)現(xiàn)安全的加密,就需要非對(duì)稱(chēng)加密算法。非對(duì)稱(chēng)加密中,需要公鑰和私鑰兩種密鑰,公鑰與私鑰一一對(duì)應(yīng),公鑰公開(kāi),私鑰保密。如果使用公鑰對(duì)內(nèi)容加密,那么就只有用這個(gè)公鑰對(duì)應(yīng)的私鑰才能解密,只要私鑰不泄露,那這個(gè)內(nèi)容就是安全的;同樣反過(guò)來(lái),如果用私鑰加密內(nèi)容,那么人人都可以用對(duì)應(yīng)的公鑰加以解密獲得內(nèi)容,也就可以確知,這個(gè)內(nèi)容必定是由這個(gè)公鑰的掌握者發(fā)出,而不可能來(lái)自任何其他人。
如果甲說(shuō),他向乙轉(zhuǎn)了一塊錢(qián),別人如何驗(yàn)證這確實(shí)是甲說(shuō)的,并且錢(qián)確實(shí)是轉(zhuǎn)給乙的,而數(shù)額也沒(méi)有被任何人改動(dòng)過(guò)呢? 甲就可以把這條轉(zhuǎn)錢(qián)的信息取哈希值,發(fā)信息時(shí),把這個(gè)哈希值用私鑰加密后隨信息一起發(fā)出去,這樣,任何人都可以重新計(jì)算信息的哈希值,并和用甲的公鑰解密出的哈希值對(duì)比,對(duì)原來(lái)信息的任何改動(dòng)都會(huì)使哈希值發(fā)生變化,因而發(fā)生不一致。如果一致,就說(shuō)明信息的內(nèi)容不可能被修改過(guò),而且這個(gè)信息也只可能是甲發(fā)出的,這個(gè)過(guò)程就實(shí)現(xiàn)了甲對(duì)自己發(fā)出的信息的簽名驗(yàn)證。
事實(shí)上,不論哈希函數(shù)還是非對(duì)稱(chēng)加密算法,在2008 年中本聰論文發(fā)表時(shí)都已不是新鮮事物。較早期的哈希函數(shù)MD4 (MD 為Message Digest,信息摘要的縮寫(xiě))在1990 年就被麻省理工的一位教授設(shè)計(jì)出來(lái)了;非對(duì)稱(chēng)加密算法則在1978 年就被發(fā)明了。在當(dāng)代的網(wǎng)絡(luò)技術(shù)中,這兩種算法實(shí)際都已經(jīng)得到了廣泛的應(yīng)用。
比特幣的特別之處,就在于它通過(guò)一系列的機(jī)制設(shè)計(jì),通過(guò)區(qū)塊和鏈的數(shù)據(jù)結(jié)構(gòu),首次實(shí)現(xiàn)了一種可行的電子貨幣系統(tǒng)。
比特幣的設(shè)計(jì),目的在于建立一個(gè)電子貨幣系統(tǒng),它需要記錄每一單位的比特幣來(lái)自哪里,誰(shuí)曾經(jīng)擁有,又花給了誰(shuí),從被創(chuàng)造到當(dāng)下所經(jīng)歷的一切交易的全部信息。這需要記賬,而且這個(gè)賬本需要被全網(wǎng)認(rèn)可,沒(méi)有歧義,這就需要共識(shí)機(jī)制。
比特幣怎么記賬呢? 首先,任何人都可以發(fā)起交易,只要他下載了比特幣的軟件,生成了一個(gè)公私鑰對(duì),公鑰就是他的地址,或者叫錢(qián)包,私鑰就是錢(qián)包的密碼。
他可以用私鑰簽名發(fā)起任何交易,并且向全網(wǎng)廣播。任何試圖記賬的人都可以收集這些交易,并將它們打包成塊。所謂打包成塊,就是把收到的交易數(shù)據(jù)的哈希值按時(shí)間時(shí)間順序兩兩合并,再取哈希值,然后把第二層的哈希值繼續(xù)兩兩合并取哈希值,如此持續(xù),直到算出一個(gè)把所有交易都容納進(jìn)去的最終的哈希值 (Merkle Root,根哈希值),這個(gè)過(guò)程,從交易內(nèi)容,到層層的哈希值,到最終的跟哈希值合起來(lái),就組合成了一個(gè)二叉的Merkle Tree (譯為默克爾樹(shù)或可信樹(shù)),這就是一個(gè)區(qū)塊體的內(nèi)容。
區(qū)塊體就是記錄其所對(duì)應(yīng)的成塊時(shí)間內(nèi)的交易的分賬本,這個(gè)分帳本的根哈希值加上前一個(gè)區(qū)塊的哈希值、區(qū)塊鏈的版本號(hào)、本區(qū)塊的時(shí)間戳、當(dāng)前區(qū)塊鏈的難度系數(shù)和一個(gè)隨機(jī)數(shù),就組成了這個(gè)區(qū)塊的區(qū)塊頭,區(qū)塊頭和區(qū)塊體合起來(lái)就是一個(gè)區(qū)塊,由于每一個(gè)區(qū)塊都含有前一個(gè)區(qū)塊的哈希值 (一般稱(chēng)為哈希指針),所以每一區(qū)塊都和其之前的一個(gè)區(qū)塊唯一地不可更改地連接,這樣一個(gè)個(gè)相連的區(qū)塊就構(gòu)成了區(qū)塊鏈。
什么樣的交易能被收錄到塊里呢? 必須是合法的交易,也就是這個(gè)交易所花的錢(qián),確實(shí)是花錢(qián)者的,并且沒(méi)有被花過(guò),由于自從整個(gè)區(qū)塊鏈建立以來(lái)所有交易都被記錄在鏈上,所以每一個(gè)交易是否合法很容易被驗(yàn)證。任何新的區(qū)塊所包含的所有交易必須都是合法的,包含了不合法的交易的區(qū)塊會(huì)因被其他節(jié)點(diǎn)放棄而無(wú)效。
誰(shuí)來(lái)打包成塊呢? 這是記賬權(quán)歸誰(shuí)的問(wèn)題。區(qū)塊頭里有一個(gè)隨機(jī)數(shù),它的用途就在這里。打包者需要算出這個(gè)隨機(jī)數(shù),使本區(qū)塊的哈希值符合難度系數(shù),也就是這個(gè)哈希值的前N 位必須是零。哈希函數(shù)無(wú)法倒算,所以這個(gè)滿(mǎn)足難度系數(shù)的隨機(jī)數(shù)必須通過(guò)一個(gè)一個(gè)的嘗試來(lái)獲得,誰(shuí)先發(fā)現(xiàn)這個(gè)隨機(jī)數(shù),誰(shuí)就可以打包這個(gè)區(qū)塊,把它接到鏈上。
如果有兩個(gè)人同時(shí)算出隨機(jī)數(shù)呢? 兩個(gè)人都會(huì)把自己打包的區(qū)塊接到鏈上,這就會(huì)使鏈產(chǎn)生分叉。那么,接下來(lái)兩個(gè)分叉,哪一個(gè)后續(xù)接的區(qū)塊多,形成最長(zhǎng)合法鏈,哪一個(gè)就會(huì)成為主鏈被全網(wǎng)認(rèn)可,這就是比特幣的最長(zhǎng)鏈原則。所以,最終還是只有其中一個(gè)區(qū)塊被認(rèn)可。同理,如果有人想把同一份錢(qián)花兩次,首先這兩個(gè)交易在同一個(gè)區(qū)塊里只有其中之一會(huì)被接納,任何一個(gè)被接納后,另一個(gè)就成為非法的;第二,如果兩個(gè)交易分別被不同的打包者接納,那么兩個(gè)區(qū)塊也只有其中之一最終被主鏈接納。所以,通常比特幣的交易者都會(huì)在自己的交易被收錄進(jìn)鏈之后,再等幾個(gè)塊才算交易完成。
比特幣是怎樣產(chǎn)生的呢? 來(lái)自出塊獎(jiǎng)勵(lì)。算成塊所需的隨機(jī)數(shù)是一個(gè)對(duì)算力要求很高的工作,為了鼓勵(lì)參與者,比特幣設(shè)計(jì)了出塊獎(jiǎng)勵(lì)。誰(shuí)打包這個(gè)塊,全網(wǎng)就認(rèn)可這個(gè)人的錢(qián)包多出了一定數(shù)量的比特幣。這個(gè)數(shù)量在開(kāi)始時(shí)是50 個(gè)比特幣,之后每21 萬(wàn)個(gè)區(qū)塊減半 (約合4 年),在2012 年減為了25 個(gè)幣,在2016 年減為了12.5 個(gè)幣,之后,出塊獎(jiǎng)勵(lì)還將繼續(xù)每4 年左右減半一次,最終比特幣的總數(shù)量將會(huì)在到2140 年10 月的某天終結(jié)于2100 萬(wàn)個(gè)。
由于計(jì)算隨機(jī)數(shù)是一個(gè)極其消耗算力的過(guò)程,2009 年1 月3 日,中本聰發(fā)布了比特幣的第一個(gè)區(qū)塊,之后六天,他才算出了第二個(gè)區(qū)塊。比特幣的這個(gè)共識(shí)機(jī)制形成過(guò)程又叫做工作量證明 (Proof of Work,POW),所有參與者獲得出塊獎(jiǎng)勵(lì)的概率,實(shí)際就是他所掌握的算力在全網(wǎng)算力中的比例。計(jì)算隨機(jī)數(shù),獲得出塊獎(jiǎng)勵(lì),這個(gè)過(guò)程就是俗稱(chēng)的 “挖礦”。
參與挖礦的算力是變化的,但出塊的時(shí)間需要大致保持在10 分鐘左右,這一點(diǎn)通過(guò)調(diào)節(jié)難度系數(shù)來(lái)完成,這個(gè)難度系數(shù)就取決于所要求的前N 位為零的目標(biāo)哈希值,N 越大,在規(guī)定時(shí)間算出隨機(jī)數(shù)所需要的算力就越大,挖礦難度也就越大。
基于上面的描述,那么關(guān)于區(qū)塊鏈常見(jiàn)的提法: 匿名、點(diǎn)對(duì)點(diǎn)傳輸、公開(kāi)透明、去中心化、信任機(jī)制等等各種說(shuō)法就不難理解了。
參與區(qū)塊鏈,只需要一個(gè)公私鑰對(duì),誰(shuí)掌握公鑰對(duì)應(yīng)的私鑰,誰(shuí)就是這個(gè)公鑰地址 (錢(qián)包)的所有者,任何人都可以擁有任意數(shù)量的錢(qián)包,記住私鑰就行,和參與者是何許人,在哪里毫無(wú)關(guān)聯(lián)。
交易是點(diǎn)對(duì)點(diǎn)的,或者說(shuō)是一個(gè)地址對(duì)另一個(gè)地址的,交易信息全網(wǎng)公開(kāi),全網(wǎng)可查詢(xún),全網(wǎng)一起維護(hù),因而也就不存在一個(gè)中心管理者。
在沒(méi)有中心管理者的條件下,區(qū)塊鏈又通過(guò)一系列的機(jī)制設(shè)計(jì)確保鏈上信息可靠、可信任,這一系列的機(jī)制設(shè)計(jì)就構(gòu)成了區(qū)塊鏈的共識(shí)機(jī)制。
實(shí)際上,目前區(qū)塊鏈相對(duì)于比特幣區(qū)塊鏈已經(jīng)有了很多發(fā)展。
比如智能合約,哈希函數(shù)能把任何數(shù)字內(nèi)容轉(zhuǎn)化為一個(gè)數(shù)字摘要,一段代碼、一個(gè)程序當(dāng)然也可以。把合約程序化,然后把程序的輸出上鏈就成為了智能合約。事實(shí)上,作為一種數(shù)據(jù)結(jié)構(gòu)的區(qū)塊鏈,不止可以被設(shè)計(jì)用來(lái)作為一種電子貨幣系統(tǒng),也不止是一種智能合約的實(shí)現(xiàn)方式,它能為分散的、無(wú)需任何組織認(rèn)證背書(shū)、相互完全陌生的使用者,提供一種對(duì)任何數(shù)字信息,建立可靠的、不可更改的記錄和鑒證方式的系統(tǒng)。區(qū)塊鏈的演化方向及潛在的應(yīng)用場(chǎng)景可能還有很多,當(dāng)前已經(jīng)有了不少有益探索,但更多可能還需要在未來(lái)慢慢探索。
比如POS (Proof of stake,權(quán)益證明)。比特幣的POW 是一種經(jīng)典的共識(shí)機(jī)制,但用工作量對(duì)記賬權(quán)進(jìn)行投票所需的算力競(jìng)爭(zhēng),意味著巨大的能源消耗,POS 則是用幣齡替換了POW中的算力,幣齡是指持有的電子貨幣數(shù)量與持有時(shí)間的乘積,單個(gè)節(jié)點(diǎn)的幣齡越大,它獲得記賬權(quán)和出塊激勵(lì)的可能性就越大。
比如公鏈、私鏈、聯(lián)盟鏈。比特幣是典型的公鏈,數(shù)據(jù)全網(wǎng)公開(kāi),所有節(jié)點(diǎn)隨意加入和退出,因此也稱(chēng)為非許可鍵;私鏈則一般非公開(kāi),需要授權(quán)才能加入節(jié)點(diǎn),鏈上只有少量節(jié)點(diǎn),只需要單個(gè)或部分節(jié)點(diǎn)來(lái)驗(yàn)證交易;聯(lián)盟鏈則是由若干機(jī)構(gòu)或組織共同發(fā)起和維護(hù)的鏈,比如Libra 的初始設(shè)計(jì)就是聯(lián)盟鏈。后兩者因?yàn)楣?jié)點(diǎn)準(zhǔn)入設(shè)計(jì),所以也被稱(chēng)為許可鏈。