鐘 增 勝
(1.中南大學(xué) 計(jì)算機(jī)學(xué)院,長(zhǎng)沙 410083; 2.重慶工商大學(xué) 招生就業(yè)處,重慶 400067)
化名“中本聰”的學(xué)者在2008年發(fā)表了《比特幣:一種點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)》[1]論文后,在2009年1月開(kāi)發(fā)出比特幣系統(tǒng)。比特幣系統(tǒng)通過(guò)算法實(shí)現(xiàn)了價(jià)值轉(zhuǎn)移,不需要通過(guò)中介機(jī)構(gòu)。2010年5月有人用1萬(wàn)比特幣(BTC)購(gòu)買價(jià)值為25美元的商品,確定了比特幣最初單價(jià)為0.002 5美元[2],在數(shù)字貨幣交易市場(chǎng)上,比特幣價(jià)格在2017年12月達(dá)到2.0萬(wàn)美元,2021年2月達(dá)到5.8萬(wàn)美元[3]。
比特幣的底層支撐技術(shù)是區(qū)塊鏈,“中本聰”巧妙地將相關(guān)技術(shù)結(jié)合在一起構(gòu)成區(qū)塊鏈的核心技術(shù),包括了P2P網(wǎng)絡(luò)技術(shù)、哈希運(yùn)算技術(shù)、非對(duì)稱加密技術(shù)和PoW共識(shí)算法等,比特幣是區(qū)塊鏈系統(tǒng)目前最成功的應(yīng)用,越來(lái)越多的商業(yè)應(yīng)用場(chǎng)景引入?yún)^(qū)塊鏈技術(shù)。
共識(shí)機(jī)制的核心是在共識(shí)算法保障下,在一定的時(shí)間內(nèi),解決分布式系統(tǒng)中狀態(tài)的一致性問(wèn)題,使得各節(jié)點(diǎn)承認(rèn)且不可篡改。在區(qū)塊鏈系統(tǒng)中,主要解決分布式場(chǎng)景下各節(jié)點(diǎn)交易數(shù)據(jù)和交易狀態(tài)的一致性問(wèn)題,實(shí)現(xiàn)去中心化的多方互信,共識(shí)算法是區(qū)塊鏈的核心技術(shù),是實(shí)現(xiàn)互聯(lián)網(wǎng)從信息互聯(lián)到價(jià)值互聯(lián)的關(guān)鍵技術(shù)。
區(qū)塊鏈按節(jié)點(diǎn)權(quán)限可分為公有鏈和許可鏈。公有鏈?zhǔn)侵竻^(qū)塊鏈節(jié)點(diǎn)沒(méi)有準(zhǔn)入機(jī)制,參與節(jié)點(diǎn)能隨時(shí)加入或退出,代表性的共識(shí)算法主要有兩種:一是工作量證明(Proof of Work,PoW),通過(guò)消耗算力去獲取記賬權(quán)的概率,算力越大概率越高,優(yōu)點(diǎn)是隨機(jī)性強(qiáng)、公平性好,缺點(diǎn)是耗能、共識(shí)效率低。二是權(quán)益證明(Proof of Stake,PoS),通過(guò)持有資產(chǎn)去獲取記賬權(quán)的概率,資產(chǎn)越多概率越大,優(yōu)點(diǎn)是節(jié)能環(huán)保,缺點(diǎn)是權(quán)力集中。許可鏈指參與的節(jié)點(diǎn)需要授權(quán),未經(jīng)授權(quán)的節(jié)點(diǎn)無(wú)法接入?yún)^(qū)塊鏈,代表性的共識(shí)算法有RAFT(Replicated and Fault Tolerant),優(yōu)點(diǎn)是效率高、容易理解,缺點(diǎn)是不能容納作惡節(jié)點(diǎn)。
文獻(xiàn)[4]研究了共識(shí)算法的演化歷程,分析了PoW的優(yōu)缺點(diǎn),比較了不同共識(shí)算法的特點(diǎn),但未提出如何解決性能問(wèn)題的建議。文獻(xiàn)[5]將不同共識(shí)協(xié)議分步驟進(jìn)行解耦比較,進(jìn)行了一定的性能分析,缺乏對(duì)PoS深入分析。文獻(xiàn)[6]對(duì)Raft算法進(jìn)行了改進(jìn),但未研究與PoS融合。已研究的成果對(duì)PoS共識(shí)算法的安全和性能進(jìn)行過(guò)分析,但改進(jìn)研究較少。
采用PoS共識(shí)算法的區(qū)塊鏈生成區(qū)塊的時(shí)間具有隨機(jī)性,有些情況下區(qū)塊間隔時(shí)間過(guò)長(zhǎng),不能滿足商業(yè)應(yīng)用場(chǎng)景需要。Silkworm算法能彌補(bǔ)PoS共識(shí)算法的性能局限,同時(shí)提升區(qū)塊鏈的安全性和健壯性。
使用PoW作為共識(shí)機(jī)制典型的公有鏈有比特幣(Bitcoin)[1]、以太坊(Ethreum)[9]等。
比特幣系統(tǒng)中通過(guò)不斷重試nNonce值,nNonce的范圍為0~232,若滿足不等式(1),即滿足生成區(qū)塊條件,尋找到nNonce符合條件的該節(jié)點(diǎn)可以打包交易記錄并組裝到區(qū)塊中,再通過(guò)P2P網(wǎng)絡(luò)將區(qū)塊發(fā)往其他節(jié)點(diǎn)驗(yàn)證。
SHA256(SHA256(version+prev_hash+merkle_root+ (1) 其中,SHA256為生成256位消息摘要的哈希算法[10],version為版本號(hào),prev_hash為前一區(qū)塊哈希值,merkle_root為當(dāng)前區(qū)塊交易樹(shù)根哈希值,ntime為時(shí)間戳,nbits為當(dāng)前難度值,x為區(qū)塊填充信息,TARGET為目標(biāo)值。 比特幣系統(tǒng)通過(guò)前2 016個(gè)區(qū)塊的生成區(qū)塊時(shí)間和單個(gè)區(qū)塊的難度計(jì)算新的TARGET,以保證系統(tǒng)生成區(qū)塊時(shí)間動(dòng)態(tài)維持在10 min。 為避免PoW算法造成大量的算力資源浪費(fèi),PoS算法以節(jié)點(diǎn)持有代幣的數(shù)量和時(shí)間表示權(quán)益,權(quán)益越大越容易獲得生成區(qū)塊條件。 Hash(nStakeModifier+txPrev.block.nTime+ (2) 其中,Hash為哈希算法,nStakeModifier為權(quán)重修正因子,txPrev.block.nTime、txPrev.offset、txPrev.nTime、txPrev.vout.n為未花費(fèi)的交易支出(Unspent Transaction Outputs,UTXO)屬性,nTime為時(shí)間戳,bnTarget為目標(biāo)值,bnCoinDayWeight為幣齡。 節(jié)點(diǎn)通過(guò)不斷重試所持有的UTXO,若滿足不等式(2),即可以打包交易記錄并組裝到區(qū)塊中,再通過(guò)P2P網(wǎng)絡(luò)將區(qū)塊發(fā)往其他節(jié)點(diǎn)驗(yàn)證。 Raft共識(shí)算法的整體原理框架是一個(gè)基于Log復(fù)制機(jī)制的狀態(tài)機(jī)[6]。所有節(jié)點(diǎn)有3種狀態(tài):領(lǐng)導(dǎo)者(Leader)、跟隨者(Follower)和參與者(Candidate),具體流程如圖1所示。 圖1 節(jié)點(diǎn)狀態(tài)轉(zhuǎn)換圖 (1) 起始狀態(tài):節(jié)點(diǎn)剛啟動(dòng)時(shí)自動(dòng)進(jìn)入Follower狀態(tài)。 (2) 發(fā)起選舉:選舉定時(shí)器到期后,節(jié)點(diǎn)切換為Candidate狀態(tài)發(fā)起選舉。 (3) 新選舉:在一次選舉超時(shí)到來(lái)前若還沒(méi)有Leader,則保持在Candidate狀態(tài)開(kāi)始新選舉。 (4) 收取選票:收到超過(guò)半數(shù)節(jié)點(diǎn)選票,切換狀態(tài)為新的Leader。 (5) 發(fā)現(xiàn)領(lǐng)導(dǎo)者:若收到Leader或更高任期消息,切換回Follower狀態(tài)。 (6) 發(fā)現(xiàn)更高任期領(lǐng)導(dǎo)者:若收到更高任期消息,切換回Follower狀態(tài)。 每一個(gè)節(jié)點(diǎn)狀態(tài)中都保存當(dāng)前任期號(hào)(Current Term),節(jié)點(diǎn)在進(jìn)行通信時(shí)都會(huì)帶上本節(jié)點(diǎn)的當(dāng)前任期號(hào)。如果一個(gè)Candidate或者Leader狀態(tài)的節(jié)點(diǎn)發(fā)現(xiàn)自己的當(dāng)前任期號(hào)已經(jīng)小于其他節(jié)點(diǎn)了,那么將切換到Follower狀態(tài)。 衡量區(qū)塊鏈性能的指標(biāo)一般有平均每秒處理的交易數(shù)(Transaction Per Second,TPS)、平均生成區(qū)塊時(shí)間等,采用PoS共識(shí)算法的數(shù)字貨幣,最早有點(diǎn)點(diǎn)幣(Peercoin)[7],TPS為7左右,平均生成區(qū)塊時(shí)間為600 s,量子鏈(QTUM)[8,11],TPS為70左右,平均生成區(qū)塊時(shí)間為128 s。 以量子鏈為例,它結(jié)合了比特幣和以太坊的優(yōu)勢(shì),打通了比特幣的UTXO模型和以太坊的智能合約生態(tài),在5 000個(gè)區(qū)塊前使用PoW算法,其后一直使用PoS算法。 根據(jù)量子鏈官方微信公眾號(hào)發(fā)布的數(shù)據(jù)[8],2019年9月1日—10月15日區(qū)塊438 439~465 623時(shí)間間距分布如圖2所示。 圖2 量子鏈438 439~465 623區(qū)塊間隔時(shí)間圖 通過(guò)量子鏈官方瀏覽器[12]拉取了2020年12月1日區(qū)塊743 647~743 683實(shí)時(shí)數(shù)據(jù),如圖3所示。 圖3 量子鏈743 582~744 257區(qū)塊間隔時(shí)間圖 從圖2和圖3可以看出:量子鏈的最快生成區(qū)塊時(shí)間16 s,最慢生成區(qū)塊時(shí)間752 s,平均生成區(qū)塊時(shí)間為128 s,16 s內(nèi)生成的區(qū)塊數(shù)量占比9%,128 s內(nèi)生成的區(qū)塊數(shù)量占比58%。 PoS共識(shí)算法生成區(qū)塊時(shí)間間隔有較大幅度的變動(dòng),而商業(yè)應(yīng)用場(chǎng)景與區(qū)塊鏈結(jié)合,對(duì)單筆交易而言,往往要求生成區(qū)塊時(shí)間間隔小且穩(wěn)定。因此,改進(jìn)PoS共識(shí)算法的目標(biāo)是減小區(qū)塊間隔,更快速地確認(rèn)鏈上交易和實(shí)現(xiàn)價(jià)值轉(zhuǎn)移。 利用智能合約定義參數(shù),通過(guò)投票選舉出主節(jié)點(diǎn)(Leader),主節(jié)點(diǎn)判斷PoS是否在約定時(shí)間范圍內(nèi)生效,若生效則會(huì)清空內(nèi)存交易池由PoS節(jié)點(diǎn)打包生成區(qū)塊,若未生效則主節(jié)點(diǎn)進(jìn)行打包生成區(qū)塊。改進(jìn)后的算法定義為Silkworm共識(shí)算法。 定義區(qū)塊產(chǎn)生的最小間隔時(shí)間SwMinInterval,默認(rèn)為12 s,定義區(qū)塊產(chǎn)生的最大間隔時(shí)間SwMaxInterval,默認(rèn)為360 s。將智能合約部署到區(qū)塊鏈生效后得到參數(shù)合約ID。 若要改變最小或最大間隔時(shí)間,重新部署智能合約可得到新的參數(shù)合約ID。 定義選舉任期間隔時(shí)間SwElectionInterval,如24 h。 定義節(jié)點(diǎn)參與條件,如持有代幣達(dá)到5萬(wàn)或線下評(píng)審(考慮節(jié)點(diǎn)綜合實(shí)力等),將合約部署到區(qū)塊鏈生效后得到選舉合約ID。 符合條件的節(jié)點(diǎn)調(diào)用智能合約進(jìn)入Follower列表。Follower節(jié)點(diǎn)定時(shí)調(diào)用智能合約競(jìng)選Leader。 定義是否啟用Silkworm算法標(biāo)志SwEnabled,默認(rèn)為True。定義選舉合約ID。定義區(qū)塊高度SwHeight 1,參數(shù)合約ID 1,區(qū)塊高度SwHeight 2,參數(shù)合約ID 2。 區(qū)塊高度SwHeight 1和SwHeight 2用于切換新老參數(shù)合約,以便實(shí)現(xiàn)平穩(wěn)過(guò)渡。 Silkworm共識(shí)算法流程如圖4所示: 圖4 Silkworm共識(shí)算法流程圖 步驟1 任意節(jié)點(diǎn)均有單獨(dú)的進(jìn)程執(zhí)行共識(shí)算法進(jìn)行區(qū)塊打包循環(huán),首先查找主控智能合約,判斷啟用標(biāo)志SwEnabled是否為True,查找主節(jié)點(diǎn)選舉智能合約,判斷本節(jié)點(diǎn)是否Leader狀態(tài)。 步驟2 若步驟1不符合,則按PoS共識(shí)算法規(guī)則,滿足條件就由PoS節(jié)點(diǎn)生成區(qū)塊,組裝交易出塊并清空區(qū)塊鏈節(jié)點(diǎn)的內(nèi)存交易池。 步驟3 若步驟1符合,則取智能合約參數(shù),判斷當(dāng)前時(shí)間戳與前一區(qū)塊的時(shí)間差,是否大于等于最小間隔時(shí)間SwMinInterval。 步驟4 若步驟3不符合,則忽略,若步驟3符合,判斷當(dāng)前內(nèi)存交易池是否存在交易,若存在交易,主節(jié)點(diǎn)直接生成區(qū)塊,組裝交易出塊并清空區(qū)塊鏈節(jié)點(diǎn)的內(nèi)存交易池。 步驟5 若步驟4中沒(méi)有交易,而當(dāng)前時(shí)間戳與前一區(qū)塊的時(shí)間差,大于等于最大間隔時(shí)間SwMaxInterval,主節(jié)點(diǎn)也直接生成區(qū)塊,保證區(qū)塊的后續(xù)確認(rèn)不受影響。 4.1.1 源代碼改造 從https://github.com/qtumproject/qtum下載量子鏈源碼,開(kāi)發(fā)環(huán)境采用vmware+utuntu18.04+Qt5.12.3,按下列步驟改造為一條新的區(qū)塊鏈。 步驟1 修改src/chainparams.cpp中的Create GenesisBlock函數(shù),計(jì)算出的創(chuàng)世紀(jì)塊符合預(yù)設(shè)值。 步驟2 修改src/chainparams.cpp中pchMessage Start網(wǎng)絡(luò)字節(jié)值和src/chainparamsbase.cpp中rpc端口,使其不用于QTUM鏈。 步驟3 適當(dāng)修改其他配置文件,將源碼編譯通過(guò),生成Linux版本的客戶端。 4.1.2 服務(wù)器 在阿里云開(kāi)通10臺(tái)2vCPU8GB內(nèi)存的服務(wù)器,操作系統(tǒng)為Ubuntu18.04 64位,網(wǎng)絡(luò)互通。所有服務(wù)器部署改造后的新區(qū)塊鏈客戶端并啟動(dòng)成功。 4.1.3 初始化區(qū)塊 使用rpc命令generate初始化5 000個(gè)區(qū)塊,這些區(qū)塊是通過(guò)PoW共識(shí)算法生成的,檢查10個(gè)服務(wù)器的區(qū)塊是否同步正常。再等待24 h,新區(qū)塊鏈自動(dòng)使用PoS共識(shí)算法生成675個(gè)區(qū)塊。 4.1.4 部署智能合約 (1) 根據(jù)第3.1節(jié)、第3.2節(jié)、第3.3節(jié)部署相關(guān)智能合約。 (2) 根據(jù)第3.4節(jié)修改src/miner.cpp源碼,重新編譯發(fā)布。 為方便觀察實(shí)驗(yàn)結(jié)果,人工指定Leader節(jié)點(diǎn)。 在不啟用主節(jié)點(diǎn)的情況下,2 h內(nèi)隨機(jī)發(fā)送交易,觀察產(chǎn)生區(qū)塊結(jié)果,共進(jìn)行3組。 在啟用主節(jié)點(diǎn)情況下,2 h內(nèi)隨機(jī)發(fā)送交易,觀察產(chǎn)生區(qū)塊結(jié)果,共進(jìn)行3組。 實(shí)驗(yàn)數(shù)據(jù)對(duì)比情況如表1所示。在不啟用主節(jié)點(diǎn)的情況下,PoS共識(shí)算法生效,區(qū)塊產(chǎn)生的間隔時(shí)間最大、最小和平均與QTUM相近,說(shuō)明新區(qū)塊鏈工作狀態(tài)正常,交易越頻繁,對(duì)生成區(qū)塊間隔平均時(shí)間略增。 表1 在不同條件下發(fā)送交易的比對(duì)情況Table 1 Comparison of transactions sent under different conditions 在啟用主節(jié)點(diǎn)的情況下,Silkworm共識(shí)算法生效,因?yàn)闀r(shí)間參數(shù)智能合約中規(guī)定了區(qū)塊間隔時(shí)間的最大值為360 s,最小值為12 s,在有交易時(shí),區(qū)塊生成區(qū)塊間隔時(shí)間恒定在12 s,在沒(méi)有交易時(shí),生成區(qū)塊間隔時(shí)間有變化,最大不會(huì)超過(guò)360 s,平均時(shí)間在128 s左右。 從實(shí)驗(yàn)結(jié)果可以看出:Silkworm共識(shí)算法使區(qū)塊鏈的性能達(dá)到了預(yù)期的目標(biāo),也能夠滿足商業(yè)應(yīng)用場(chǎng)景的使用。若有必要,也可以通過(guò)智能合約調(diào)小生成區(qū)塊間隔時(shí)間,但不能低于4 s。 在區(qū)塊鏈沒(méi)有交易的情況下,為避免更快生成更多的空塊,節(jié)約存儲(chǔ)資源,Silkworm共識(shí)算法自動(dòng)不生效,由PoS節(jié)點(diǎn)起主導(dǎo)作用。在主節(jié)點(diǎn)因網(wǎng)絡(luò)等原因失效的情況下,PoS節(jié)點(diǎn)仍然發(fā)揮作用,保障了區(qū)塊鏈的穩(wěn)定性和安全性。 給出了一個(gè)PoS共識(shí)算法的改進(jìn)方法,該方法通過(guò)智能合約治理區(qū)塊鏈的網(wǎng)絡(luò)參數(shù),對(duì)最快生成區(qū)塊時(shí)間和最慢生成區(qū)塊時(shí)間進(jìn)行定義,結(jié)合Raft算法選舉主節(jié)點(diǎn),實(shí)現(xiàn)了在有交易的情況下,當(dāng)PoS共識(shí)算法未在定義的最快時(shí)間內(nèi)生成區(qū)塊時(shí),Silkworm算法確保由主節(jié)點(diǎn)自動(dòng)快速生成區(qū)塊;在無(wú)交易情況下,當(dāng)PoS共識(shí)算法未在定義的最慢時(shí)間內(nèi)生成區(qū)塊時(shí),Silkworm算法也由主節(jié)點(diǎn)生成區(qū)塊。而當(dāng)主節(jié)點(diǎn)關(guān)閉或出故障時(shí),PoS共識(shí)算法仍然正常生成區(qū)塊。 通過(guò)實(shí)驗(yàn)驗(yàn)證,啟用主節(jié)點(diǎn)使用Silkworm共識(shí)算法,能保證交易在規(guī)定的最快時(shí)間內(nèi)生成區(qū)塊,沒(méi)有交易時(shí)自動(dòng)降低區(qū)塊生成速度,節(jié)約存儲(chǔ)資源,這種區(qū)塊鏈更能滿足商業(yè)應(yīng)用場(chǎng)景的要求。 Silkworm共識(shí)算法還存在一些不足,當(dāng)主節(jié)點(diǎn)頻繁生效時(shí),PoS節(jié)點(diǎn)生成區(qū)塊的概率有可能會(huì)降低,效率上比純?cè)S可鏈更低。 區(qū)塊鏈共識(shí)算法還在不斷發(fā)展中,Silkworm共識(shí)算法在基于公有鏈PoS共識(shí)算法上進(jìn)行改進(jìn),還需要在安全性、孤立塊和分叉方面進(jìn)行更深入的驗(yàn)證。
ntime+nbits+nNonce+x))1.2 PoS算法原理
txPrev.offset+txPrev.nTime+txPrev.vout.n+nTime)<
bnTarget*bnCoinDayWeight1.3 Raft算法原理
2 PoS算法區(qū)塊鏈性能問(wèn)題
3 PoS共識(shí)算法的改進(jìn)
3.1 部署時(shí)間參數(shù)智能合約
3.2 部署主節(jié)點(diǎn)選舉智能合約
3.3 部署主控智能合約
3.4 Silkworm運(yùn)行流程
4 實(shí)驗(yàn)驗(yàn)證
4.1 實(shí)驗(yàn)準(zhǔn)備
4.2 實(shí)驗(yàn)步驟
4.3 實(shí)驗(yàn)結(jié)果分析
5 結(jié)束語(yǔ)