(四川省區(qū)塊未來科技有限責(zé)任公司 ,四川 成都 610000)
摘 要:介紹區(qū)塊鏈共識(shí)機(jī)制的基本功能,闡述工作量證明(Proof-of-Work,POW)和權(quán)益證明(Proof-of-Stake,POS)的基本原理,對比分析兩種共識(shí)機(jī)制的優(yōu)缺點(diǎn)——POW機(jī)制簡單、安全,但浪費(fèi)能源;POS機(jī)制環(huán)保、共識(shí)快,但其安全性缺乏嚴(yán)格的數(shù)學(xué)證明。
關(guān)鍵詞:區(qū)塊鏈;共識(shí)機(jī)制;POW;POS
一般而言,在介紹區(qū)塊鏈時(shí)都會(huì)提到兩個(gè)核心要點(diǎn):一是分布式賬本,二是拜占庭將軍問題(Byzantine Generals Problem)。使用分布式賬本目的是讓每個(gè)節(jié)點(diǎn)都能夠驗(yàn)證交易,而拜占庭將軍問題與賬本的一致性有關(guān),即本文要討論的共識(shí)機(jī)制(consensus)。
區(qū)塊鏈上的共識(shí)機(jī)制主要解決由誰來記賬,以及如何維護(hù)賬本統(tǒng)一的問題,該問題的理論基礎(chǔ)是拜占庭容錯(cuò)(Byzantine Fault Tolerant,BFT)。拜占庭容錯(cuò)從20世紀(jì)80年代開始被研究,目前已經(jīng)是一個(gè)被研究得比較透徹的理論,存在解的前提條件及具體實(shí)現(xiàn)都有現(xiàn)成算法。本文不打算從BFT說起,因?yàn)橐治龅氖菂^(qū)塊鏈共識(shí)機(jī)制的演進(jìn)之路,而中本聰并沒有采用BFT,其實(shí)在筆者研究比特幣伊始,即便在理解了POW(Proof-of-Work,工作量證明方式)機(jī)制之后的很長一段時(shí)間,并不了解拜占庭將軍問題。下文在分析 HyperLedger Fabric的PBFT(Practical Byzantine Fault Tolerant)算法以及小蟻項(xiàng)目的DBFT算法時(shí)再全面闡述拜占庭將軍問題及傳統(tǒng)分布式一致性算法(PAXOS、RAFT)。
POW
其實(shí)“共識(shí)機(jī)制”一詞在這一兩年才被頻繁使用,以前一般叫證明方式(Proof),因?yàn)楸忍貛挪捎霉ぷ髁孔C明方式(POW)。隨著大家對分布式賬本一致性問題的不斷探索,很多算法被提出來,尤其近期有很多項(xiàng)目回歸了對傳統(tǒng)BFT算法的改進(jìn),在算法思路上已經(jīng)跳出了“證明”的語義,進(jìn)一步高度概括為共識(shí)機(jī)制。筆者記得第一次碰到POW這一概念時(shí)感到很費(fèi)解,對這種表述方式很頭疼,掌握了POW機(jī)理后才真正明白其本意為“通過工作以獲得指定成果,用成果來證明曾經(jīng)付出的努力”。其實(shí)我們?nèi)粘9ぷ魃钪薪?jīng)常使用POW,比如學(xué)生考試成績、畢業(yè)證、駕照等,這種證明方式的一個(gè)顯著特征是往往需要很大的工作量才能拿到指定成果,且這個(gè)成果很容易驗(yàn)證。之所以如此是因?yàn)槲覀円话愫茈y去實(shí)時(shí)監(jiān)督一個(gè)人是否真的付出了這些工作量。
再回到比特幣的設(shè)計(jì)思路,中本聰已經(jīng)使用非對稱密碼解決了電子貨幣的所有權(quán)問題,用區(qū)塊時(shí)間戳解決了交易的存在性問題,用分布式賬本解決了剔除第三方結(jié)構(gòu)后交易的驗(yàn)證問題,剩下需要解決的問題是雙重支付,這要求所有節(jié)點(diǎn)賬本統(tǒng)一,而真正的平等又必須賦予人人都有記賬的權(quán)利,記賬是一件簡單的事情,每個(gè)人都可以做,顯然最終會(huì)存在眾多大同小異的賬本,而其實(shí)我們只需要其中的一個(gè)賬本就夠了。
中本聰想到給記賬加入成本,總賬本由各個(gè)分頁按照時(shí)間先后排序,給每個(gè)賬本分頁設(shè)立一個(gè)評(píng)判標(biāo)準(zhǔn),以區(qū)分賬本分頁是否合格,這給記賬增加了難度,同時(shí)給每個(gè)賬本分頁加入一個(gè)隨機(jī)元素,用以調(diào)節(jié)記賬難度以保證一定時(shí)間段內(nèi)只有一個(gè)人生成合格的賬本分頁。增加的成本就是工作量,合格的賬本分頁就是工作量證明。對于比特幣而言,所謂的賬本分頁就是一個(gè)區(qū)塊,區(qū)塊通過巧妙設(shè)計(jì)形成區(qū)塊鏈,合格的區(qū)塊可以表述為
F(Nonce) < Target
其中Nonce是隨機(jī)元素,Target是合格區(qū)塊的量化,每個(gè)記賬節(jié)點(diǎn)的Target一致。Target根據(jù)過往一段時(shí)間內(nèi)的平均區(qū)塊間距時(shí)間與預(yù)期間距時(shí)間的差異來自動(dòng)調(diào)節(jié)。此外POW的成功運(yùn)行還需要配合如下兩條約定。
(1)Best chain原則:將最長的鏈條視為正確的鏈條。
(2)激勵(lì)原則:找到合格的區(qū)塊有獎(jiǎng)勵(lì)收益。
第(1)條約定為硬性規(guī)則,所有人必須無條件遵守,畢竟大家共同的目標(biāo)是找到一致性賬本,而最長的鏈條代表最大的工作量。如果沒有這條約定,每個(gè)人都只會(huì)構(gòu)造自己的區(qū)塊鏈,無法統(tǒng)一。第(2)條為工作量激勵(lì),既然記賬有成本,那唯有收益才能驅(qū)動(dòng)大家都去記賬,參與記賬構(gòu)造區(qū)塊變成投資行為,其成本和收益風(fēng)險(xiǎn)在第(1)條約束下形成博弈,驅(qū)動(dòng)所有節(jié)點(diǎn)按約定規(guī)則老老實(shí)實(shí)地夠造區(qū)塊,最終達(dá)到納什均衡。
具體實(shí)現(xiàn)方式是比特幣采用哈希(Hash)算法。邏輯上比特幣是對整個(gè)區(qū)塊進(jìn)行哈希運(yùn)算,但真正實(shí)現(xiàn)并非將整個(gè)區(qū)塊數(shù)據(jù)作為哈希函數(shù)的參數(shù),區(qū)塊數(shù)據(jù)大體可以分為區(qū)塊頭和交易列表兩部分,如圖1所示。交易列表通過構(gòu)造成Merkle樹最終濃縮成Merkleroot內(nèi)置于區(qū)塊頭,區(qū)塊頭只有6個(gè)字段,共80字節(jié)。如此設(shè)計(jì)的好處是方便哈希運(yùn)算,每次運(yùn)算只需要80字節(jié)的參數(shù)輸入,而不是整個(gè)區(qū)塊輸入。
比特幣采用SHA256哈希運(yùn)算,且每次都是連續(xù)進(jìn)行兩次SHA256運(yùn)算才能作為最終結(jié)果,前一次運(yùn)算的結(jié)果作為后一次運(yùn)算的輸入,即Double SHA256,一般簡稱SHA256D,擴(kuò)展上面的公式,比特幣合格區(qū)塊判斷依據(jù)如上:
公式(1)的各項(xiàng)參數(shù)釋義如下。
nVersion:版本號(hào),4字節(jié)。
hashPrevBlock:前一個(gè)區(qū)塊hash值,32字節(jié)。
hashMerkleRoot:包含進(jìn)本區(qū)塊的所有交易構(gòu)造的Merkle樹根,32字節(jié)。
nTime:Unix時(shí)間戳,4字節(jié)。
nBits:記錄本區(qū)塊難度,4字節(jié)。
nNonce:隨機(jī)數(shù),4字節(jié)。
MAXTARGET:最大目標(biāo)值,常量。
Diff:當(dāng)前區(qū)塊難度,全網(wǎng)難度一致。
MAXTARGET/Diff即通常所說的當(dāng)前目標(biāo)值,可見難度Diff越大,當(dāng)前目標(biāo)值越小,找到一個(gè)合格區(qū)塊的概率就越小。
很顯然,POW的核心要義為算力越大,挖到塊的概率越大,維護(hù)區(qū)塊鏈安全的權(quán)重越大。相對其他共識(shí)機(jī)制而言,POW邏輯簡單,容易實(shí)現(xiàn),容錯(cuò)達(dá)50%,其安全有嚴(yán)格的數(shù)學(xué)論證。
POS
POW缺點(diǎn)也很明顯,其中被指責(zé)最多的主要有兩點(diǎn),一是浪費(fèi)能源,二是風(fēng)險(xiǎn)和收益博弈必然導(dǎo)致聯(lián)合挖礦,而大算力礦池可能會(huì)對系統(tǒng)的去中心化構(gòu)成威脅。
于是在2011年,一個(gè)名為Quantum Mechanic的數(shù)字貨幣愛好者在Bitcointalk論壇提出Proof-of-Stake(POS)證明機(jī)制,該機(jī)制被充分討論之后證明具有可行性。如果說POW主要比拼算力,算力越大,挖到一個(gè)塊的概率越大,POS則是比拼余額,通俗說就是自己的手里的幣越多,挖到一個(gè)塊的概率越大。POS合格區(qū)塊的評(píng)判標(biāo)準(zhǔn)可以表述為
F(Timestamp) < Target × Balance (2)
與POW相比,公式(2)左邊的搜索空間由Nonce變?yōu)門imestamp,Nonce本質(zhì)是無限的,而Timestamp極其有限,一個(gè)合格區(qū)塊的區(qū)塊時(shí)間必須在前一個(gè)區(qū)塊時(shí)間的規(guī)定范圍之內(nèi),時(shí)間太早或者太超前的區(qū)塊都不會(huì)被其他節(jié)點(diǎn)接納。公式(2)右邊的目標(biāo)值引入一個(gè)乘積因子余額,可見余額越大,整體目標(biāo)值(Target × Balance)越大,找到一個(gè)合格區(qū)塊的概率就越大。因?yàn)門imestamp有限,POS鍛造區(qū)塊成功率主要與Balance有關(guān)。
POS只是代表一種共識(shí)機(jī)制理念,具體有多種實(shí)現(xiàn)方式,下面重點(diǎn)解析兩種比較經(jīng)典的實(shí)現(xiàn)思路。
Peercoin
Peercoin(點(diǎn)點(diǎn)幣,PPC)于2012年8月發(fā)布,最大創(chuàng)新是其采礦方式混合了POW及POS兩種方式,其中POW主要用于發(fā)行代幣,未來預(yù)計(jì)隨著挖礦難度上升,產(chǎn)量降低,系統(tǒng)安全主要由POS維護(hù)。目前區(qū)塊鏈中存在兩種類型的區(qū)塊,POW區(qū)塊和POS區(qū)塊。PPC的作者為同樣不愿意公開身份的密碼貨幣極客Sunny King,同時(shí)也是Primecoin的研發(fā)者。
要掌握Peercoin的POS機(jī)制,需要重點(diǎn)理解Sunny King專門為PPC設(shè)計(jì)的幾個(gè)核心概念:Coinstake,Kernel,Stake Modifier,Modifier Interval,StakeReward,Coinage等。
Coinstake
為了實(shí)現(xiàn)POS,Sunny King專門設(shè)計(jì)了一種特殊類型交易,叫Coinstake,Coinstake的設(shè)計(jì)借鑒于中本聰?shù)腃oinbase設(shè)計(jì)。本質(zhì)上Coinbase和Coinsake都是一筆交易,只是對他們的輸入、輸出做了一些硬性限制,這樣才不會(huì)擾亂系統(tǒng)原有的POW機(jī)制。
(1)Coinbase結(jié)構(gòu)要求:
(1)輸入數(shù)量必須等于1,且輸入的Prevout字段(指定前一筆交易的輸出)必須置空值。
(2)輸出數(shù)量必須大于等于1。
(2)Coinstake結(jié)構(gòu)要求(如圖2所示)。
(1)輸入數(shù)量大于等于1,且第一個(gè)輸入的Prevout字段不能為空,即要求Kernel必須存在。
(2)輸出數(shù)量大于等于2,且第一個(gè)輸出必須置空值。
這兩種特殊交易在區(qū)塊鏈中存放的位置也有特殊要求,中本聰規(guī)定每個(gè)區(qū)塊的第一筆交易必須放置Coinbase,反之,Coinbase不能出現(xiàn)在區(qū)塊的其他位置。Sunny King顯然不想破壞這個(gè)規(guī)則,他增加了一條規(guī)則,對于POS區(qū)塊,第二筆交易必須放置Coinstake,反之,Coinstake不能出現(xiàn)在其他地方。換言之,只要第二筆交易是Coinstake,那么這個(gè)區(qū)塊就當(dāng)POS區(qū)塊來處理。
Coinbase和Coinstake都不應(yīng)該被單獨(dú)廣播,而只存在于區(qū)塊中,因此客戶端節(jié)點(diǎn)一般都不允許進(jìn)入內(nèi)存池,當(dāng)花費(fèi)這兩種交易時(shí),都需要檢測是否已經(jīng)成熟。
Kernel Protocal
Coinstake的第一個(gè)輸入(Input 0)叫Kernel,Kernel在POS機(jī)制里確實(shí)起到核心作用,合格區(qū)塊的判定與之息息相關(guān)。合格區(qū)塊表述為
SHA256D(nStakeModifier + txPrev.block.-nTime + txPrev.offset + txPrev.nTime + txPrev.vout.n + nTime)< bnTarget × nCoinDayWeight (3)
公式(3)中的每一個(gè)參數(shù)都有明確的設(shè)計(jì)目的。
nStakeModifier:專門為POS設(shè)計(jì)的調(diào)節(jié)器,按照以上公式,如果沒有參數(shù)nStakeModifier,當(dāng)一個(gè)人收到一筆幣之后,他立即就能提前計(jì)算得知自己在未來何時(shí)可以鍛造區(qū)塊,這顯然不符合設(shè)計(jì)目標(biāo),Sunny King希望POS礦工和POW礦工一樣做盲目探索,以實(shí)時(shí)在線維護(hù)區(qū)塊鏈,nStakeModifier的設(shè)計(jì)就是為了防止POS礦工提前計(jì)算。nStakeModifier可以理解為POS區(qū)塊的一個(gè)屬性,每一個(gè)區(qū)塊對應(yīng)一個(gè)nStakeModifier值,但nStakeModifier并不是每個(gè)區(qū)塊都變動(dòng),不過協(xié)議規(guī)定每隔一定時(shí)間(modifier interval)必須重新計(jì)算一次,取值與前一個(gè)nStakeModifier以及最新區(qū)塊哈希值有關(guān),因此POS礦工無法提前計(jì)算,因?yàn)樗恢牢磥淼膮^(qū)塊哈希值。
也就是說,在PPC系統(tǒng)中,除了存在區(qū)塊鏈、幣鏈(幣的交易簽名歷史),還隱藏著一個(gè)很少被提及的鏈條——權(quán)益調(diào)節(jié)器鏈條。
值得一提的是,Sunny King是在PPC后來的版本才加入這個(gè)調(diào)節(jié)器的,一開始他使用nBits。
txPrev:Kernel對應(yīng)的前一筆交易。
txPrev.block.nTime:txPrev所在區(qū)塊的時(shí)間戳,一筆交易被納入?yún)^(qū)塊的時(shí)間是交易發(fā)起者不能確定的,節(jié)點(diǎn)有可能通過提前計(jì)算預(yù)估到未來對自己有利的時(shí)間戳,這個(gè)參數(shù)就是為了防止節(jié)點(diǎn)利用這種預(yù)估優(yōu)勢提前生成大批交易。
txPrev.offset:txPrev在區(qū)塊中的偏移量,用以降低網(wǎng)路節(jié)點(diǎn)同時(shí)生成Coinstake的概率。
txPrev.nTime:txPrev構(gòu)造時(shí)間,設(shè)計(jì)目標(biāo)如txPrev.offset。
txPrev.vout.n:Kernel在txPrev中的輸出下標(biāo),設(shè)計(jì)目標(biāo)如txPrev.offset。
bnTarget:全網(wǎng)當(dāng)前目標(biāo)難度基準(zhǔn)值,類似POW中的當(dāng)前難度值,由nbits記錄。
nCoinDayWeight:Kernel消耗的幣齡,加入了一個(gè)時(shí)間權(quán)重。
從以上公式可以看出,Sunny King一方面希望能給所有POS礦工足夠的隨機(jī)性,另一方面,搜索空間始終控制在只局限于Coinstake的時(shí)間戳Time,影響找到合格區(qū)塊鏈最大的因素是Kernel消耗的幣齡。
節(jié)點(diǎn)在鍛造區(qū)塊時(shí),首先從自己所有的UTXO中選定一個(gè)作為Kernel,構(gòu)造Coinstake,計(jì)算hash,如果不合格,重新構(gòu)造Coinstake,此時(shí)Time已經(jīng)改變,也可以改變Kernel,以得到不同的Coinstake,如此往復(fù),直到找到合格區(qū)塊。
Coinage
上面提到了幣齡,也叫幣天,假如1.5個(gè)幣存在于區(qū)塊鏈中10天,幣齡數(shù)值為
Coinage = 1.5×10 = 15
PPC采用幣齡,而不是直接采用余額(Balance)來計(jì)算。
stakeReward
權(quán)益激勵(lì),俗稱獲得利息,計(jì)算公式為
stakeReward = Coinage × 33 / (365 ×33 + 8) ×0.01 ×COIN
公式(4)可簡化為
stakeReward = (0.01 ×Coinage / 365) × COIN
其中,Coinage即上文說的幣齡,COIN可理解為“幣”,1 COIN即通常所說的1個(gè)幣,本質(zhì)是一個(gè)常量,中本聰在比特幣系統(tǒng)里定義為100 000 000,如此設(shè)計(jì)主要是為了避免浮點(diǎn)數(shù)運(yùn)算,比特幣支持8位小數(shù)源于此。
由公式(4)、(5)可知,收益按輸入幣齡總和的1%年利率計(jì)算。
POS一并解決了POW浪費(fèi)能源和算力集中兩個(gè)痛點(diǎn),理論上還能縮短了共識(shí)時(shí)間,但同時(shí)也丟棄了POW的某些優(yōu)勢,因此更容易分叉,一筆交易需要等待更多確認(rèn)才能確保安全,而POS最大的問題是其安全性和容錯(cuò)性還沒有得到嚴(yán)格的數(shù)學(xué)論證。
(編輯: 彭遠(yuǎn)紅 )
專欄作者簡介:周鄴飛,男,幣創(chuàng)網(wǎng)聯(lián)合創(chuàng)始人,技術(shù)副總裁,中國科學(xué)院智能控制博士生,DACA區(qū)塊鏈協(xié)會(huì)講師,小企鏈(icochain)研發(fā)者,參與《區(qū)塊鏈講義》一書撰寫,最早一批熱衷區(qū)塊鏈的技術(shù)極客,對比特幣、區(qū)塊鏈及智能合約有深入研究,zhouyefei@bichuang.com。