區(qū)塊鏈技術(shù)的起源與沿革(上篇):區(qū)塊鏈網(wǎng)絡(luò)與數(shù)字貨幣系統(tǒng)
原創(chuàng)【51CTO.com原創(chuàng)稿件】前言
說起當(dāng)今最具代表性的數(shù)據(jù)通信技術(shù),區(qū)塊鏈無疑在列。作為當(dāng)下最受關(guān)注的次世代分布式系統(tǒng),區(qū)塊鏈可謂眾說紛紜,莫衷一是。有人視之為引爆下一次互聯(lián)網(wǎng)技術(shù)革命的突破口,也有人稱其為投機(jī)工具,驚世騙局。本文旨在于盡可能懸置那些游離于技術(shù)層面之外的價(jià)值判斷,將視角重新移回到區(qū)塊鏈技術(shù)本身,完整回溯區(qū)塊鏈1.0到3.0的技術(shù)原理和設(shè)計(jì)理念之沿革,為讀者揭開籠罩在區(qū)塊鏈之上那層神秘的面紗。
第一章 區(qū)塊鏈網(wǎng)絡(luò)與數(shù)字貨幣系統(tǒng)
一、區(qū)塊鏈的技術(shù)背景
1.區(qū)塊鏈的起源
2008年,美國(guó)次貸危機(jī)爆發(fā),金融海嘯席卷全球,經(jīng)濟(jì)蕭條延宕數(shù)年之久。對(duì)2008危機(jī)的溯源性研究指向了多個(gè)可能的誘發(fā)性因素。除了次級(jí)貸款市場(chǎng)的過度放貸和杠桿率居高不下,主權(quán)貨幣的濫發(fā)也成為了金融危機(jī)的一個(gè)重要誘因。
同年11月1日,某化名為“中本聰(Satoshi Nakamoto)”的網(wǎng)絡(luò)極客發(fā)表了一篇名為《比特幣:一種點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)》的技術(shù)論文,也即后來人們所稱的《白皮書》?!栋灼吩诨谥鳈?quán)信用背書的貨幣系統(tǒng)基礎(chǔ)上進(jìn)一步提出了一種能夠規(guī)避主權(quán)貨幣濫發(fā),而且完美解決了貨幣信用問題的電子支付系統(tǒng)——比特幣。該書完整闡述了筑基于點(diǎn)對(duì)點(diǎn)傳輸技術(shù),密碼學(xué)算法,區(qū)塊鏈技術(shù)之上的比特幣分布式網(wǎng)絡(luò)的架構(gòu)理念。
2009年,序號(hào)為0的區(qū)塊——創(chuàng)世區(qū)塊誕生。時(shí)隔不久,序號(hào)為1的第二個(gè)區(qū)塊誕生,并與創(chuàng)世區(qū)塊相連,世界首條區(qū)塊鏈面世。
需要澄清的一點(diǎn)是,與其說區(qū)塊鏈?zhǔn)且环N技術(shù)工具,毋寧謂其為一種理念。無論是構(gòu)成區(qū)塊鏈技術(shù)核心的共識(shí)算法,容錯(cuò)算法,加密技術(shù),傳輸技術(shù),存儲(chǔ)技術(shù),其都是構(gòu)筑于完備的數(shù)學(xué)和密碼學(xué)基礎(chǔ),而非工程學(xué)技術(shù)。正是因此,區(qū)塊鏈技術(shù)并不強(qiáng)依賴于物理基礎(chǔ)設(shè)施,在最極端的情況下,理論上我們甚至可以只借助于二戰(zhàn)時(shí)期的無線電技術(shù)來搭建一個(gè)簡(jiǎn)易的區(qū)塊鏈網(wǎng)絡(luò)。就廣義范疇而言,比特幣只是區(qū)塊鏈技術(shù)的一種具體實(shí)現(xiàn)形式,只要具備去中心化,全網(wǎng)共識(shí),防篡改,可回溯這幾個(gè)核心要素,都可視為區(qū)塊鏈技術(shù)理念的橫向延伸。
一言以蔽之,區(qū)塊鏈的本質(zhì)是一種基于密碼學(xué)算法的“電子契約”。
2.區(qū)塊鏈的技術(shù)優(yōu)勢(shì)
十?dāng)?shù)年間區(qū)塊鏈技術(shù)歷經(jīng)了數(shù)次迭代發(fā)展。從以比特幣為代表的區(qū)塊鏈1.0到以以太坊為代表的區(qū)塊鏈2.0再到以Hyperledger,EOS為代表的區(qū)塊鏈3.0,區(qū)塊鏈技術(shù)所能承載的業(yè)務(wù)場(chǎng)景和應(yīng)用范圍愈加廣泛。其功能已不僅僅局限于電子貨幣系統(tǒng),而是進(jìn)一步推廣到了企業(yè),機(jī)構(gòu)間數(shù)據(jù)共享,高敏感性數(shù)據(jù)存儲(chǔ)等諸多場(chǎng)景。
目前區(qū)塊鏈的技術(shù)優(yōu)勢(shì)在于:
- 去中心化(或多中心化),每個(gè)節(jié)點(diǎn)都保存了完整的區(qū)塊鏈信息,解決了敏感數(shù)據(jù)的備份問題和傳統(tǒng)分布式系統(tǒng)的信息不對(duì)稱問題。
- 去信任化,通過密碼學(xué)基礎(chǔ)和區(qū)塊鏈網(wǎng)絡(luò)解決了中心化系統(tǒng)的信任機(jī)制問題,由整個(gè)區(qū)塊鏈網(wǎng)絡(luò)而非某個(gè)中心服務(wù)器提供信用擔(dān)保。
- 不可篡改,所有持久化的區(qū)塊永久保存,交易記錄可隨時(shí)回溯,一筆交易只能通過另一筆交易進(jìn)行追償,無法單方面取消。規(guī)避了傳統(tǒng)數(shù)據(jù)庫的數(shù)據(jù)丟失和惡意篡改風(fēng)險(xiǎn),更加適用于高敏感性數(shù)據(jù)(如金融數(shù)據(jù),企業(yè)核心業(yè)務(wù)數(shù)據(jù)等)。
二、比特幣的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)與交易集驗(yàn)證機(jī)制
1.區(qū)塊與區(qū)塊鏈
作為一種數(shù)據(jù)存儲(chǔ)系統(tǒng),區(qū)塊鏈的本質(zhì)仍然是一個(gè)數(shù)據(jù)庫,只不過是由整個(gè)網(wǎng)絡(luò)共同維護(hù)的分布式數(shù)據(jù)庫。不同于傳統(tǒng)的結(jié)構(gòu)化關(guān)系型數(shù)據(jù)庫,區(qū)塊鏈為了實(shí)現(xiàn)時(shí)間維度的永久可回溯性,在底層數(shù)據(jù)結(jié)構(gòu)中并不存儲(chǔ)數(shù)據(jù)的狀態(tài),而只存儲(chǔ)對(duì)數(shù)據(jù)的變更。
以比特幣為例,作為一般等價(jià)物的貨幣本身只是一個(gè)價(jià)值符號(hào),其意義在于對(duì)交易的額度標(biāo)記。因此比特幣網(wǎng)絡(luò)就是一個(gè)大型的電子記賬系統(tǒng)。而區(qū)塊鏈中存儲(chǔ)的便是網(wǎng)絡(luò)中用戶之間的交易記錄。
圖一:區(qū)塊鏈結(jié)構(gòu)
一個(gè)區(qū)塊主要由區(qū)塊頭和區(qū)塊體兩部分構(gòu)成,大小約為1M左右。區(qū)塊頭主要用于存儲(chǔ)版本號(hào)(用于標(biāo)識(shí)當(dāng)前的軟件協(xié)議版本),父區(qū)塊哈希編碼,默克爾根,時(shí)間戳,難度目標(biāo),Nonce隨機(jī)數(shù)等數(shù)據(jù)。其中父區(qū)塊哈希編碼用于和上一個(gè)區(qū)塊產(chǎn)生唯一性鏈接。默克爾根用于為比特幣用戶提供簡(jiǎn)單支付驗(yàn)證(SPV),這一部分內(nèi)容將在后文中詳細(xì)介紹。
而區(qū)塊體中則包含了一組具體的交易記錄集合,交易分為兩種類型,Coinbase交易和普通交易,每個(gè)區(qū)塊中第一筆交易屬于Coinbase交易,是區(qū)塊鏈網(wǎng)絡(luò)給予記賬者的獎(jiǎng)勵(lì)。而其它則是用戶之間進(jìn)行轉(zhuǎn)賬的普通交易。每個(gè)區(qū)塊中大概包含了4000條左右的交易記錄。獲得記賬權(quán)限的節(jié)點(diǎn)會(huì)將區(qū)塊頭和區(qū)塊體打包成一個(gè)完整的塊并廣播給整個(gè)區(qū)塊鏈網(wǎng)絡(luò),其它節(jié)點(diǎn)驗(yàn)證通過后便會(huì)將其作為一個(gè)新區(qū)塊加入?yún)^(qū)塊鏈。
2.默克爾樹(Merkle Tree)與交易集合
在區(qū)塊鏈結(jié)構(gòu)中默克爾樹扮演了極為重要的角色。其一方面用于產(chǎn)生每個(gè)區(qū)塊的唯一數(shù)字摘要,另一方面也可以用于在部分節(jié)點(diǎn)存儲(chǔ)空間有限的情況下進(jìn)行簡(jiǎn)單支付驗(yàn)證(SPV)操作。
圖二:默克爾樹
所謂默克爾樹,是一種典型的二叉樹數(shù)據(jù)結(jié)構(gòu)。在每個(gè)區(qū)塊的區(qū)塊體中都保存了若干條交易記錄,這些交易記錄被均勻掛載在一個(gè)默克爾樹結(jié)構(gòu)中。樹的每個(gè)葉子節(jié)點(diǎn)都保存了對(duì)應(yīng)掛載的交易記錄哈希值。而每個(gè)葉子節(jié)點(diǎn)又會(huì)兩兩配對(duì)合并為一個(gè)新的字符串,進(jìn)而用新字符串的哈希值構(gòu)成上一級(jí)節(jié)點(diǎn),一直迭代到最終產(chǎn)生一個(gè)唯一的根節(jié)點(diǎn)HROOT(在交易記錄為奇數(shù)條的情況下可能會(huì)存在余根的情況,因此會(huì)將奇數(shù)條記錄全部拷貝一份,構(gòu)成平衡樹)。這樣在根哈希HROOT中就包含了每一條交易的數(shù)字摘要,任何一條記錄的增刪和變更都會(huì)由末端傳導(dǎo)至根哈希上。
因?yàn)槟藸枠湎聮燧d的每一筆非相鄰交易記錄之間都是通過不同的上溯分支連接到根節(jié)點(diǎn),因此默克爾樹相比哈希列表可以單獨(dú)對(duì)某個(gè)分區(qū)內(nèi)的信息正確性和完整性進(jìn)行驗(yàn)證而無需重構(gòu)所有葉子節(jié)點(diǎn)下的數(shù)據(jù)。這一數(shù)據(jù)結(jié)構(gòu)被廣泛應(yīng)用于分布式網(wǎng)絡(luò)中的數(shù)據(jù)校驗(yàn)服務(wù)。
圖三:異質(zhì)分區(qū)定位算法
除了通過上溯分支驗(yàn)證數(shù)據(jù)正確性外,默克爾樹還可以用于快速定位兩個(gè)樹結(jié)構(gòu)下異質(zhì)分區(qū)的位置。如上圖所示。當(dāng)HROOT-A≠HROOT-B時(shí),只需向其下級(jí)節(jié)點(diǎn)回溯找到“gsc3”和“gts1”兩個(gè)異質(zhì)節(jié)點(diǎn),之后重復(fù)這一過程直至追溯到葉子節(jié)點(diǎn),即可定位到兩個(gè)樹結(jié)構(gòu)中的異質(zhì)分區(qū)。
3.簡(jiǎn)單支付驗(yàn)證(Simplified Payment Verification)
在比特幣網(wǎng)絡(luò)中,每一筆交易都要驗(yàn)證,不僅涉及對(duì)帳戶余額的驗(yàn)證,還需要對(duì)交易的執(zhí)行結(jié)果進(jìn)行驗(yàn)證。這一過程有時(shí)可能需要回溯整個(gè)區(qū)塊鏈重構(gòu)賬戶狀態(tài),所需要的算力往往超出一般節(jié)點(diǎn)的算力載荷,因此通常情況下是由一些挖礦節(jié)點(diǎn)來進(jìn)行交易驗(yàn)證。
此外還存在另一種場(chǎng)景,那就是支付驗(yàn)證。也就是驗(yàn)證某一筆交易信息是否已經(jīng)被區(qū)塊鏈網(wǎng)絡(luò)所確認(rèn)。對(duì)此,中本聰提出了一種更為經(jīng)濟(jì)的驗(yàn)證方式,那就是簡(jiǎn)單支付驗(yàn)證(SPV)。SPV是一種基于默克爾樹結(jié)構(gòu)的數(shù)據(jù)存在性校驗(yàn)算法。因?yàn)橹Ц厄?yàn)證只需要校驗(yàn)?zāi)彻P交易是否在區(qū)塊鏈中存在,因此并不需要保存整個(gè)區(qū)塊鏈的信息。
圖四:SPV算法
如圖所示,在區(qū)塊體中,每筆交易都掛載在默克爾樹的一個(gè)葉子節(jié)點(diǎn)上。如果我要驗(yàn)證交易6是否在某個(gè)區(qū)塊中存在,那么我只需要得到H5,H78,H1234三個(gè)節(jié)點(diǎn)的信息,然后循著上溯分支計(jì)算出默克爾根,驗(yàn)證其與HROOT是否相同即可。因此用戶只需要保存每個(gè)區(qū)塊的區(qū)塊頭信息即可完成對(duì)某筆交易的支付驗(yàn)證(其本質(zhì)為驗(yàn)證某筆交易所在的區(qū)塊是否為共識(shí)區(qū)塊)。
三、拜占庭將軍問題(Byzantine Failures)與拜占庭容錯(cuò)算法(Byzantine Fault Tolerance)
1.拜占庭將軍問題
1982年,計(jì)算機(jī)科學(xué)家萊斯利·蘭伯特(Leslie Lamport)提出了著名的拜占庭將軍問題,該問題基于一個(gè)虛構(gòu)的歷史架空?qǐng)鼍埃?/p>
圖五:拜占庭將軍問題
拜占庭帝國(guó)的軍隊(duì)包圍了一處敵軍的堡壘,但是為了維持包圍縱深使得軍力不得不分散為幾支彼此獨(dú)立的部隊(duì)。如果想要攻陷堡壘,那么就需要幾支部隊(duì)共同行動(dòng)(一起進(jìn)攻或者一起撤退)。如果只有一部分軍隊(duì)進(jìn)攻,另一部分軍隊(duì)撤退,那么戰(zhàn)局將會(huì)陷入無可挽回的失敗。已知其中幾只部隊(duì)的將領(lǐng)已經(jīng)叛變且會(huì)向其它部隊(duì)發(fā)送錯(cuò)誤的信息,那么采用何種策略才能確保部隊(duì)之間行動(dòng)的一致性呢?
這一看似與區(qū)塊鏈無關(guān)的問題實(shí)則觸及到了整個(gè)區(qū)塊鏈網(wǎng)絡(luò)設(shè)計(jì)的核心——在成千上萬節(jié)點(diǎn)共同運(yùn)作的情況下,如何達(dá)成全局?jǐn)?shù)據(jù)一致性?
2.拜占庭容錯(cuò)算法
比特幣網(wǎng)絡(luò)屬于典型的公鏈系統(tǒng),這意味著并不會(huì)對(duì)網(wǎng)絡(luò)中的成員設(shè)置嚴(yán)苛的準(zhǔn)入機(jī)制。那么惡意節(jié)點(diǎn)和作弊行為就是一個(gè)幾乎無法規(guī)避的問題。如何才能防止惡意節(jié)點(diǎn)破壞網(wǎng)絡(luò),隨意篡改區(qū)塊鏈中的數(shù)據(jù)呢?
萊斯利·蘭伯特在提出這一問題的同時(shí)也給出了一種在無網(wǎng)絡(luò)延遲狀況下的拜占庭容錯(cuò)算法,這一算法在惡意節(jié)點(diǎn)數(shù)不超過總結(jié)點(diǎn)數(shù)1/3的狀況下是可解的。首先這一算法將整個(gè)分布式網(wǎng)絡(luò)簡(jiǎn)化為一個(gè)“將軍(Commander)——副官(Vice-general)模型”,其中發(fā)起某個(gè)提議的節(jié)點(diǎn)扮演將軍,其余節(jié)點(diǎn)扮演副官,每支部隊(duì)之間可以兩兩互通。
所謂拜占庭容錯(cuò),指的是在拜占庭問題的場(chǎng)景設(shè)定下,要保證如下兩點(diǎn):
當(dāng)將軍是忠誠的時(shí),要同時(shí)保證命令的準(zhǔn)確性(將軍的提議被所有忠誠的副官正確執(zhí)行)和行動(dòng)的一致性(將軍和忠誠的副官行動(dòng)保持一致)。
當(dāng)將軍非忠誠時(shí),要保證所有忠誠的副官行動(dòng)的一致性。
設(shè)總結(jié)點(diǎn)數(shù)為N,惡意節(jié)點(diǎn)數(shù)為F,首先考慮不可解的情況,即N≤3F時(shí):
圖六:N=3時(shí),V2為叛徒的情況
當(dāng)C和V1是忠誠的,V2是叛徒時(shí)。C向V1,V2發(fā)出進(jìn)攻命令。V1從將軍處收到進(jìn)攻命令,但V2告訴V1自己收到撤退命令,V1無法判定C與V2誰是忠誠的,故無法達(dá)成一致性。
圖七:N=3時(shí),C為叛徒的情況
當(dāng)V1,V2是忠誠的,C是叛徒時(shí)。C向V1發(fā)出進(jìn)攻命令,向V2發(fā)出撤退命令。V1從C處收到進(jìn)攻命令,V2告訴V1自己收到撤退命令,V1仍然無法判定C與V2誰是忠誠的,故無法達(dá)成一致性。
之后考慮可解的情況,即N>3F時(shí):
圖八:N=4時(shí),V3為叛徒的情況
當(dāng)C和V1,V2是忠誠的,V3是叛徒時(shí)。C向V1,V2,V3發(fā)出進(jìn)攻命令,V2告訴V1自己收到進(jìn)攻命令,V3告訴V1自己收到撤退命令,此時(shí)V1收到的信息集合為{A,A,R},取多數(shù)原則,執(zhí)行進(jìn)攻命令。其余忠誠副官同理執(zhí)行進(jìn)攻命令,實(shí)現(xiàn)準(zhǔn)確性和全局一致性。
圖九:N=4時(shí),C為叛徒的情況
當(dāng)V1,V2,V3是忠誠的,C為叛徒時(shí)。C向V1,V2發(fā)出進(jìn)攻命令,向V3發(fā)出撤退命令。V1收到的信息集合為{A,A,R},執(zhí)行進(jìn)攻策略。其余忠誠副官同理執(zhí)行進(jìn)攻策略,實(shí)現(xiàn)全局一致性。
當(dāng)然在實(shí)際的分布式系統(tǒng)中情況遠(yuǎn)比這要復(fù)雜,可能有成百上千節(jié)點(diǎn)同時(shí)運(yùn)行,因此當(dāng)惡意節(jié)點(diǎn)的數(shù)量增加,這一算法是否還能夠?qū)崿F(xiàn)拜占庭容錯(cuò)呢?我們考慮一種更復(fù)雜的情況,令N=7,F(xiàn)=2。
圖十:N=7時(shí),V5,V6為叛徒的情況
首先我們定義一個(gè)三元函數(shù):
該函數(shù)表示“Vz告訴Vx:‘Vy告訴Vz其所收到的命令’”。A表示進(jìn)攻,R表示撤退,I表示不確定。假設(shè)v5和V6是叛徒,C,V1,V2,V3,V4是忠誠的。那么要想在這一情況下實(shí)現(xiàn)拜占庭容錯(cuò),就必須用到遞歸算法。我們以V1節(jié)點(diǎn)為例,當(dāng)Vx=V1時(shí),作出FVz→V1(Vy→Vz)函數(shù)的真值表:
Vz \ Vy |
V1 |
V2 |
V3 |
V4 |
V5 |
V6 |
V1=A |
A |
A |
A |
A |
I |
I |
V2=A |
A |
A |
A |
A |
I |
I |
V3=A |
A |
A |
A |
R |
I |
I |
V4=A |
A |
A |
A |
R |
I |
I |
V5=I |
A |
I |
I |
I |
I |
I |
V6=I |
A |
I |
I |
I |
I |
I |
表一: FVz→V1(Vy→Vz)函數(shù)真值表
首先我們根據(jù)橫向多數(shù)原則確定每一個(gè)忠誠將領(lǐng)從其它將領(lǐng)處收到的信息中的多數(shù)真值。然后根據(jù)縱向多數(shù)原則確定V1的最終策略,根據(jù)FVz→V1(Vy→Vz)函數(shù)真值表可確定V1的最終策略為攻擊。
同理可以計(jì)算出其它將領(lǐng)的FVz→Vx(Vy→Vz)函數(shù)真值表,結(jié)果為所有忠誠將領(lǐng)都會(huì)選擇攻擊策略。當(dāng)將軍為叛徒時(shí)推演過程同上。
需要強(qiáng)調(diào)的是,萊斯利·蘭伯特的這一算法只能應(yīng)用在無網(wǎng)絡(luò)延遲(即任意節(jié)點(diǎn)間可以瞬時(shí)互通)的情形下。當(dāng)F值增加時(shí),遞歸算法需要用到一個(gè)F維的向量函數(shù)真值表,算法復(fù)雜度會(huì)以指數(shù)級(jí)上升,因此這一算法在實(shí)際的分布式系統(tǒng)中幾乎無法應(yīng)用。在此基礎(chǔ)上,后來計(jì)算機(jī)學(xué)者們進(jìn)一步提出了POW,POS,PBFT,RAFT等實(shí)用的拜占庭容錯(cuò)算法,這一部分將在后文中詳述。
四、比特幣的記賬賦權(quán)機(jī)制與基于工作量證明(Proof of Work)的共識(shí)算法
1.比特幣的記賬賦權(quán)機(jī)制
比特幣網(wǎng)絡(luò)的本質(zhì)是一個(gè)大型的分布式記賬系統(tǒng),由于該網(wǎng)絡(luò)不設(shè)準(zhǔn)入機(jī)制,每一個(gè)成員節(jié)點(diǎn)都可以參與記賬。雖然每一筆交易都會(huì)被全網(wǎng)廣播,但是因?yàn)槌蓡T節(jié)點(diǎn)的網(wǎng)絡(luò)環(huán)境,數(shù)據(jù)延遲都有可能不同,進(jìn)而導(dǎo)致每個(gè)節(jié)點(diǎn)的賬本中記錄的交易數(shù)據(jù)也有所不同。更何況還會(huì)存在惡意節(jié)點(diǎn)的作弊行為。那么對(duì)記賬者的篩選以及排除惡意節(jié)點(diǎn)的影響就成了比特幣網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)中所涉的核心問題。
首先比特幣網(wǎng)絡(luò)采用了一套有獎(jiǎng)勵(lì)的記賬賦權(quán)機(jī)制。因?yàn)橛涃~行為需要算力和內(nèi)存開銷,而且保存的賬本中大部分內(nèi)容都是與記賬節(jié)點(diǎn)無關(guān)的交易內(nèi)容。為了保持成員記賬的積極性,比特幣網(wǎng)絡(luò)設(shè)置了一定的記賬獎(jiǎng)勵(lì)。首先參與記賬的節(jié)點(diǎn)可以獲得以比特幣形式支付的定額手續(xù)費(fèi)。而獲得最終打包權(quán)(賬本入鏈)的節(jié)點(diǎn)則可以獲得高額的打包獎(jiǎng)勵(lì)。打包獎(jiǎng)勵(lì)在第一個(gè)四年高達(dá)每次50個(gè)比特幣,而這一數(shù)額每四年會(huì)減半,最終收斂于2100萬個(gè)。打包機(jī)會(huì)與算力正相關(guān),只要全網(wǎng)算力分布均勻,那么打包權(quán)也會(huì)均勻賦權(quán)給所有節(jié)點(diǎn)。比特幣系統(tǒng)正是通過這種方式完成了貨幣在全網(wǎng)的擴(kuò)散分發(fā)。
2.工作量證明(POW)
既然每個(gè)節(jié)點(diǎn)的賬本都有可能不一樣,那么最終由誰負(fù)責(zé)記賬就成為了一個(gè)至關(guān)重要的問題。比特幣網(wǎng)絡(luò)采用工作量證明(POW)來實(shí)現(xiàn)對(duì)記賬權(quán)限的唯一下發(fā),進(jìn)而實(shí)現(xiàn)賬本的全網(wǎng)一致性。
傳統(tǒng)的拜占庭容錯(cuò)算法如PBFT算法往往旨在于設(shè)計(jì)出一種能夠?qū)?jié)點(diǎn)間的信息傳輸進(jìn)行多重交叉驗(yàn)證的通信機(jī)制來達(dá)成全局一致性。而POW則采用了另一種更為簡(jiǎn)單粗暴的設(shè)計(jì)思路,那就是人為提高惡意節(jié)點(diǎn)偽造信息的成本,使得作弊成本遠(yuǎn)遠(yuǎn)高于所帶來的收益,通過犧牲區(qū)塊鏈網(wǎng)絡(luò)的效率來換取數(shù)據(jù)安全性。
POW是一種以結(jié)果為導(dǎo)向的認(rèn)證賦權(quán)機(jī)制,即不關(guān)心受驗(yàn)者具體的計(jì)算過程,只關(guān)心最終的結(jié)果。POW要求所有受驗(yàn)者計(jì)算一個(gè)“數(shù)字謎題”,先計(jì)算出這個(gè)數(shù)字謎題的節(jié)點(diǎn)將獲得當(dāng)前區(qū)塊的打包權(quán)限。
在每一個(gè)記賬周期內(nèi),每個(gè)節(jié)點(diǎn)都會(huì)接收到全網(wǎng)的多筆交易記錄,并保存在本地區(qū)塊體的交易集合中(其中第一筆交易記錄為Coinbase交易,即打包獎(jiǎng)勵(lì)的交易記錄,每個(gè)節(jié)點(diǎn)都會(huì)生成自己的Coinbase交易記錄)。根據(jù)交易集合可以計(jì)算出其默克爾根,并和其余信息一起組裝成區(qū)塊頭。除默克爾根外,區(qū)塊頭中還保存了當(dāng)前的協(xié)議版本號(hào),父區(qū)塊哈希值,時(shí)間戳,難度目標(biāo),Nonce隨機(jī)數(shù)等。其中除了Nonce隨機(jī)數(shù)之外,其它數(shù)據(jù)都是已經(jīng)確定的。POW要求參與記賬的節(jié)點(diǎn)對(duì)自己當(dāng)前區(qū)塊的區(qū)塊頭信息進(jìn)行兩次SHA256哈希運(yùn)算,得到一個(gè)256位的數(shù)字摘要。哈希運(yùn)算是一種將不定長(zhǎng)字符串?dāng)?shù)據(jù)映射到一個(gè)256位定長(zhǎng)的二進(jìn)制散列結(jié)構(gòu)上的加密算法,且用原始數(shù)據(jù)計(jì)算哈希值很容易,但是卻幾乎無法通過哈希值逆推原始數(shù)據(jù)。此外哈希算法還具有輸入敏感特性,原始數(shù)據(jù)微小的差異都會(huì)使得哈希值大相徑庭,幾乎不需要考慮哈希碰撞的情況。因而有效規(guī)避了記賬節(jié)點(diǎn)通過偽造符合要求的哈希值和原始數(shù)據(jù)來竊取記賬權(quán)利的風(fēng)險(xiǎn)。
圖十一:POW解謎流程
首先區(qū)塊頭中保存了一個(gè)名為難度目標(biāo)(target_bits)的字段信息,這一字段用來調(diào)節(jié)當(dāng)前POW算法的題設(shè)難度。
其中target_bits為目標(biāo)值,最大為一個(gè)固定的十六進(jìn)制常數(shù)target_max。因?yàn)楣V荡篌w上是均勻離散的,因此哈希值每一位是0或者1的概率大體上都是1/2,其取值符合古典概率模型。每一個(gè)可能的哈希值都是一個(gè)基本事件,總共有有限多個(gè)基本事件,這就使得解謎成功率可以通過target_bits參量進(jìn)行調(diào)節(jié)。POW的目標(biāo)難度會(huì)隨著全網(wǎng)算力漲落而上下浮動(dòng),確保每10分鐘全網(wǎng)至少能打包一個(gè)區(qū)塊。
POW要求受驗(yàn)節(jié)點(diǎn)計(jì)算一個(gè)哈希值:
且要求:
又因?yàn)橐粋€(gè)待打包區(qū)塊的區(qū)塊頭中除Nonce隨機(jī)數(shù)外其余的字段都已經(jīng)確定,受驗(yàn)節(jié)點(diǎn)就只能通過調(diào)節(jié)Nonce的值來改變H(Nonce)的值。因此解題過程實(shí)際上也就是一個(gè)通過不斷改變Nonce的值來暴力計(jì)算符合要求的H(Nonce)的過程,也即俗稱的——挖礦。
類似于紙幣與主權(quán)信用掛鉤的主權(quán)貨幣體系抑或是美元與黃金掛鉤的布雷頓森林體系。POW是在嚴(yán)格的密碼學(xué)理論和數(shù)學(xué)算法限制下用物理資源的強(qiáng)制性開銷為比特幣的稀缺性和流通性提供信用擔(dān)保的一種手段,其構(gòu)成了比特幣作為一種貨幣的信用基石。
也就是說,挖礦本質(zhì)上是將實(shí)體物理資源(如計(jì)算機(jī)算力與電力開銷)轉(zhuǎn)換為虛擬資源(比特幣)的過程。
我們假設(shè)全網(wǎng)有N臺(tái)礦機(jī),每臺(tái)礦機(jī)的平均算力為S(次/秒),當(dāng)前的目標(biāo)難度為target_bits,要保證十分鐘至少打包一個(gè)區(qū)塊,則很容易得出這三者之間的算數(shù)關(guān)系。
已知H(Nonce)的值域?yàn)殡x散的定長(zhǎng)二進(jìn)制數(shù)且符合古典概率模型,故任取一個(gè)Nonce1,H(Nonce1)<target_bits的概率為:
每秒全網(wǎng)能進(jìn)行N*S次計(jì)算,則每秒產(chǎn)生的H(Nonce)符合條件的概率為:
要求10分鐘至少打包一個(gè)塊,那么要求十分鐘全網(wǎng)算出符合要求的H(Nonce)的概率必須為1,則有:
進(jìn)而易得:
當(dāng)某個(gè)受驗(yàn)節(jié)點(diǎn)第一個(gè)得出符合要求的H(Nonce)值時(shí),便會(huì)將自己打包的區(qū)塊和H(Nonce)向全網(wǎng)廣播(H(Nonce)會(huì)作為本區(qū)塊哈希編碼存入下一個(gè)區(qū)塊的區(qū)塊頭中)。其它節(jié)點(diǎn)接收到該信息后會(huì)迅速對(duì)結(jié)果進(jìn)行驗(yàn)證(驗(yàn)證分為兩部分,一方面驗(yàn)證受驗(yàn)區(qū)塊H(Nonce)是否符合要求,另一方面驗(yàn)證交易集合中的記錄是否合法),如果驗(yàn)證通過則將該區(qū)塊入鏈并放棄對(duì)當(dāng)前區(qū)塊的解謎,進(jìn)入下一個(gè)區(qū)塊的解謎工作。POW記賬賦權(quán)機(jī)制保證了全網(wǎng)只會(huì)接受最快算出數(shù)字謎題的那個(gè)節(jié)點(diǎn)所打包的塊,進(jìn)而保證了數(shù)據(jù)的全局一致性。
就POW作為一種共識(shí)算法而言,其優(yōu)點(diǎn)是顯而易見的。去中心化,不設(shè)準(zhǔn)入的設(shè)計(jì)有效規(guī)避了少數(shù)成員對(duì)記賬權(quán)利的壟斷。而且強(qiáng)制性的物理資源開銷也大大增加了惡意節(jié)點(diǎn)的作弊成本,有效避免了惡意節(jié)點(diǎn)對(duì)全網(wǎng)共識(shí)的干擾。
但是另一方面POW的缺點(diǎn)也尤為突出,最明顯的便是“數(shù)字解謎”的設(shè)計(jì)大大延緩了網(wǎng)絡(luò)的記賬效率。在10分鐘記賬周期內(nèi),一個(gè)區(qū)塊大約只能存儲(chǔ)4000條交易記錄,意味著比特幣網(wǎng)絡(luò)每秒大約只能處理7條左右的交易請(qǐng)求。
而且雖然POW基于去中心化的理念設(shè)計(jì),但是在后來的實(shí)踐中不可避免的發(fā)生了對(duì)初衷的偏移。中本聰最初的設(shè)計(jì)愿景是全網(wǎng)每一個(gè)CPU公平分享記賬的權(quán)利。但是因?yàn)?ldquo;數(shù)字解密”的算數(shù)重復(fù)性特征,很多專業(yè)挖礦團(tuán)隊(duì)都采用了更加適合重復(fù)運(yùn)算的GPU集群來挖礦。這使得POW最初的均質(zhì)賦權(quán)體系受到了相當(dāng)程度的沖擊,形成了少數(shù)大型礦場(chǎng)壟斷算力的局面。針對(duì)這種情況,區(qū)塊鏈技術(shù)在后來的演進(jìn)中也采用了其它形式的POW算法。如以太坊(Ethash)采用的“內(nèi)存困難算法”,即將算力開銷轉(zhuǎn)為內(nèi)存開銷,使得礦場(chǎng)要想提升挖礦成功率就必須增加內(nèi)存,而無法借助優(yōu)化了CPU/GPU架構(gòu)的專業(yè)礦機(jī)來實(shí)現(xiàn)挖礦效率的指數(shù)級(jí)提升。
五、比特幣網(wǎng)絡(luò)的身份防偽與交易驗(yàn)證機(jī)制
1.公/私鑰加密算法與身份防偽
在比特幣網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)隨時(shí)都會(huì)收到來自其它節(jié)點(diǎn)的多條交易記錄,其中有的交易記錄可能是惡意節(jié)點(diǎn)偽造的,確保每一筆交易由賬戶持有者本人發(fā)出且合法便成為了比特幣交易安全中一個(gè)至關(guān)重要的問題。對(duì)此比特幣網(wǎng)絡(luò)采用了公/私鑰加密算法來對(duì)每一筆交易進(jìn)行身份驗(yàn)證。所謂公/私鑰加密是一種典型的“非對(duì)稱加密算法”,“非對(duì)稱”的意思是信息的加/解密所需要的密鑰是不一致的。
用于信息加密的密鑰稱為“私鑰”,當(dāng)用戶注冊(cè)時(shí)會(huì)生成一個(gè)隨機(jī)數(shù),并由該隨機(jī)數(shù)生成用戶私鑰,其由用戶本人唯一持有且與比特幣賬戶關(guān)聯(lián)(私鑰丟失意味著該賬戶下所有資產(chǎn)的丟失)。同時(shí)比特幣網(wǎng)絡(luò)還會(huì)根據(jù)私鑰產(chǎn)生與之對(duì)應(yīng)的公鑰和地址,這兩者都是公開的,用于交易時(shí)其它節(jié)點(diǎn)對(duì)交易合法性的驗(yàn)證。
圖十二:基于公/私鑰算法的身份驗(yàn)證機(jī)制
已知私鑰由賬戶所有者唯一持有,而對(duì)應(yīng)公鑰可以由任何一個(gè)用戶持有。當(dāng)用戶A發(fā)起一筆轉(zhuǎn)賬交易Trade=“A向B轉(zhuǎn)賬5BTC”時(shí),首先A會(huì)對(duì)Trade進(jìn)行一次SHA256運(yùn)算得到數(shù)字摘要H(Trade)=SHA256(Trade)。之后A會(huì)用私鑰對(duì)H(Trade)加密得到密文C(Trade),然后A會(huì)將交易記錄Trade,C(Trade),公鑰,地址一起打包后向全網(wǎng)廣播。
當(dāng)節(jié)點(diǎn)I收到A的廣播后,首先會(huì)對(duì)Trade進(jìn)行一次SHA256運(yùn)算得到H(Trade)=SHA256(Trade),之后用收到的公鑰解密密文C(Trade),得到D(Trade)= Deciphering(C(Trade))。比對(duì)H(Trade)和D(Trade),如果兩者一致則證明該條交易記錄確實(shí)由A發(fā)出,若不一致則說明該條記錄由惡意節(jié)點(diǎn)偽造。
2.超額透支與雙重支付
公/私鑰加密算法有效排除了惡意節(jié)點(diǎn)偽造交易記錄的情況,但是即便是正常用戶也有可能會(huì)存在超額透支自己賬戶中余額的作弊行為,這就需要引入額外的驗(yàn)證機(jī)制。假設(shè)用戶A的賬戶中余額為50BTC,但是其卻向全網(wǎng)廣播了一條“A向B轉(zhuǎn)賬100BTC”的交易信息。當(dāng)其它節(jié)點(diǎn)收到該信息后,并不會(huì)馬上將這條記錄寫入?yún)^(qū)塊,而是會(huì)通過回溯歷史區(qū)塊來重建A的賬戶信息,并對(duì)A的賬戶狀態(tài)進(jìn)行校驗(yàn)。如果其余額低于100BTC,則該條交易信息視為無效交易,并不會(huì)被打包進(jìn)區(qū)塊中,也就不會(huì)出現(xiàn)超額透支的問題。
此外還有另一種更為特殊的情況,假設(shè)A的賬戶中余額為50BTC,但是A同時(shí)向全網(wǎng)廣播了兩條交易信息:“A向B轉(zhuǎn)賬50BTC”;“A向C轉(zhuǎn)賬50BTC”。當(dāng)其它節(jié)點(diǎn)接收到這兩條信息后,都會(huì)只接受前一條信息,放棄后一條信息。但是因?yàn)榫W(wǎng)絡(luò)狀況的不同,有可能有的節(jié)點(diǎn)保留了前一條信息,而有的節(jié)點(diǎn)保留了后一條信息。在這種情況下,永遠(yuǎn)都是以最終入鏈的那條交易記錄為準(zhǔn),因此發(fā)出一條交易記錄并不意味著該筆交易會(huì)立即生效,只有最終入鏈的交易記錄才會(huì)被全網(wǎng)所認(rèn)可。
3.防篡改機(jī)制與最長(zhǎng)鏈原則
圖十三:防篡改機(jī)制與最長(zhǎng)鏈原則
此外還存在另一種比較極端的情況,因?yàn)閰^(qū)塊鏈本身的拓?fù)浣Y(jié)構(gòu),每個(gè)區(qū)塊都保存了前一個(gè)區(qū)塊的數(shù)字摘要(父區(qū)塊哈希編碼)。如果某個(gè)歷史區(qū)塊中的記錄發(fā)生變動(dòng),那么其區(qū)塊哈希值也會(huì)隨之發(fā)生改變,從而破壞全鏈的拓?fù)浣Y(jié)構(gòu),成為一條廢鏈。如果某個(gè)惡意節(jié)點(diǎn)想要篡改歷史區(qū)塊中的交易記錄,即必須從被篡改的區(qū)塊開始重新計(jì)算一條新鏈。為了規(guī)避惡意節(jié)點(diǎn)用被篡改的分支鏈取代公鏈,比特幣網(wǎng)絡(luò)引入了“最長(zhǎng)鏈原則”,也就是全網(wǎng)永遠(yuǎn)以最長(zhǎng)的那條區(qū)塊鏈作為公鏈。如果惡意節(jié)點(diǎn)想要用分支鏈B取代公鏈A,就必須不斷向下計(jì)算直到分支鏈B比公鏈A更長(zhǎng)。而又因?yàn)镻OW的限制,記賬概率與算力成正比。這就要求惡意用戶至少需要占有全網(wǎng)的多數(shù)算力才有可能做到這一點(diǎn)(51%算力攻擊),而這幾乎是一件不可能的事。
在POW和“最長(zhǎng)鏈原則”的雙重保障下,比特幣網(wǎng)絡(luò)有效實(shí)現(xiàn)了歷史數(shù)據(jù)的防篡改機(jī)制。
下篇:區(qū)塊鏈技術(shù)的起源與沿革(上篇):區(qū)塊鏈網(wǎng)絡(luò)與數(shù)字貨幣系統(tǒng)
參考文獻(xiàn)
[1] Satoshi Nakamoto: Bitcoin:A Peer-to-Peer Electronic Cash System[EB/OL]
[2] Castro,Miguel,Barbara Liskov: Practical Byzantine fault tolerance.OSDI.Vol.99.1999
[3] Kwon,Jae: Tendermint:Consensus without mining.Draft v.0.6,fall(2014)
作者介紹:
王翔,畢業(yè)于安徽大學(xué)2018屆電子信息工程專業(yè),現(xiàn)就職于某知名世界五百強(qiáng)互聯(lián)網(wǎng)企業(yè)。致力于服務(wù)端系統(tǒng)的架構(gòu)設(shè)計(jì),多活部署,性能優(yōu)化,業(yè)務(wù)開發(fā)等工作。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】