夏 棋,譚敏生,朱 濤,丁 琳
(南華大學 計算機學院/軟件學院,湖南 衡陽 421001)
共識機制是區塊鏈的重要組成部分,它們負責維護區塊鏈[1]的完整性和安全性,使區塊鏈在一個互不信任的環境下各節點達到一致。DPoS共識機制利用權益持有者投票在平等和民主的基礎上解決共識問題,為了提高性能,對去中心化做出了一定的妥協,導致了系統活躍度的降低和“弱中心化”的形成。DPoS共識機制采用鏈式存儲結構,導致系統同步出塊,降低了系統吞吐量。基于DAG圖式的分布式賬本[2]是不同于主流區塊鏈的一種分布式賬本技術,DAG技術給高并發的交易提供了最具前景的解決方案,把區塊鏈二維的模式提升到三維,但其安全性和一致性的問題也亟待解決。針對DPoS共識機制的弱中心化,低吞吐量的缺陷,本文提出了一種全民評分選舉、異步出塊的共識機制模型。
共識機制是區塊鏈的技術基石,解決了區塊鏈如何在分布式場景下達成一致性的問題,實現了在非信任的環境下,傳輸可信信息和轉移有效價值。現有區塊鏈[3]系統中的主要共識算法是工作量證明、權益證明和委托權益證明。共識機制[4]可分為單一共識機制和混合共識機制,文獻[5]對共識機制進行全面分析,將共識機制細化為7類,從各共識機制的去中心化、可擴展性、安全性、一致性、可用性、分區容忍性各方面建立了一套共識算法的評價指標體系[6]。
對共識機制地改進,是區塊鏈技術研究的重點之一。Li等[7]提出了一種基于公平代表的基于委托的可擴展協商一致協議(DSCP)。Lixiang等[8]提出了一種基于信用獎懲的改進投票方法。文獻[7,8]基于權益委托共識機制改進,但從根本上沒有動搖權益在共識機制中的統治地位,權力依然被權益主導。文獻[9]根據其信任值分為記賬、驗證和傳播節點,動搖了權益的地位,但仍然采用同步出塊。
DPoS共識機制[10]存在一定的局限性,Chen等[11]提出了一種基于概率語言術語集改進的DPoS共識機制,降低了惡意節點成為代表的概率,但是投票類型過于單一,不能充分體現一個節點的被信任程度。文獻[12]提出了一種基于DPoS共識機制改進的一致性算法委托賭注證明算法;文獻[13]采用元啟發式算法對基于準則權重集的節點選擇去中心化程度進行優化;文獻[14]引入一個新的區塊擴展方式,系統故障時提升了系統TPS,但系統正常運行時,TPS沒有得到提升。文獻[11-14]采用了同步出塊方式,繼續延用了原共識機制的記賬方式,系統TPS與原共識機制一致,沒有得到提升,文獻[12-14]采用股民選舉,權力被少數人享有,中心化程度過高。
文獻[2]從共識形態出發將現有基于DAG的分布式賬本分為3類:基于主干鏈的DAG賬本、基于平行鏈的DAG賬本、基于樸素DAG的賬本。基于主干鏈的DAG的特殊區塊鏈新模型SDAG[15],該模型使得交易數據的一致性和時序性優于鏈式結構,但是降低了系統的安全性,無法高效維持賬本的一致性。基于信譽度的Hashgraph共識算法[16],設計了節點的信譽度模型,對節點的性能等進行綜合評分。Q. Nguyen等[17]去除了信譽度模型,提出基于DAG的無信任系統達成PoS共識。文獻[16,17]中充分利用了DAG異步記賬的優點,但是DAG的無序性給系統帶來了威脅,使系統中的賬本無法獲得統一。改進DAG的無序性,提升區塊鏈的吞吐量成為了一種主流,文獻[18]就提出了一種基于層的DAG結構,合理利用了DAG異步出塊的高效性。
本文研究了DPoS共識機制已有特性及缺點,分析了DAG區塊鏈結構的優缺點,比較了兩種算法之間的特性,優化了區塊鏈的單鏈結構。針對DPoS共識機制已有特性及缺點,摒棄了DPoS共識機制的權益選舉以及同步出塊,提出了一種改進共識機制,即評分權益證明(scored proof of stake,SPoS)共識機制。SPoS共識機制結合了DAG的優點,改進了DAG圖式的無序性,采用了偽鏈的結構存儲數據。
SPoS共識機制是一種基于DPoS改進的共識機制,是一種評分授權的共識機制,將股民參與制改為全民參與制,去除了基于權益運作的方式,使每個合法節點都有權力參與投票,能夠降低節點的參與門檻,積極推動節點的參與。系統節點分別為普通節點、候選節點以及超級節點。SPoS共識機制中每個普通節點對候選節點都有相同的評分權限,通過普通節點對候選節點打分,分數將產生相應的責任連坐,即責任雙方會被任意一方的行為影響,受到相應的獎勵或懲罰,然后計算評選出平均分加增益分高的節點成為超級節點。超級節點在出塊周期內異步出塊,并且廣播、收集區塊,最后將周期內所有普通區塊統計到收束區塊,周期結束時將系統數據達到共識。
SPoS共識機制可以分為4個階段,即為評分、統計、公示和記賬。評分階段,節點根據對候選節點的信任程度評分;統計階段,系統統計和計算候選節點的信任分;公示階段,候選節點公示節點評分以及節點總分;記賬階段,超級節點異步出塊達到共識。共識流程如圖1所示。在SPoS共識機制中,引入責任連坐的獎懲機制,該機制貫穿系統的4個階段,在評分階段,對節點的行為進行責任相關標記,在后續階段,若責任相關雙方有作惡或誠實行為,將使雙方受到相應的懲罰或者獎勵。
SPoS共識機制中,在該階段,每個擁有合法身份的節點對候選節點的信任程度進行評分,分數的高低決定責任連坐的輕重。SPoS共識機制中每個合法節點都享有相同的評分權,不存在節點貧富程度帶來的權益差距,不需要代幣股權的支持。在評分過程中,節點對候選節點的信任程度進行評分、簽名,產生一個包含了身份與分數的Token,將Token發送給候選節點,并要得到候選節點的反饋信息。若候選節點表示接受投票,系統將對雙方責任進行關聯。SPoS共識機制對比DPoS共識機制將節省大量的股權證明開具時間,只需要驗證節點是否為合法節點。區塊鏈中合法公民都將享有公民投票評分權力,相對于改進前的DPoS共識機制,SPoS共識機制降低了節點投票的準入門檻,節點對候選節點的評分如算法1所示。
算法1:評分算法
輸入:(Scroe,PrivateKey)
輸出:null
(1)/*對候選節點評分*/
(2)初始化:Node /*評分節點*/;
(3)if Node is lawful:
(4)then token←rsa.Encrypt(Score,PrivateKey) /*私鑰加密分數*/
(5)send token to candidate /*將token發送給被支持者*/
(6)wait result←callback(candidate)
(7)if result == true: /*判斷投票是否成功*/
(8)then voting success and mark /*投票成功,并且責任相關*/
(9)else:
(10)if candidate is illegal:/*候選節點非法行為時*/
(11)then decrease candiate weighted/*懲罰候選節點*/
(12)else:
(13)again voting(candidate)
(14)end if
(15)end if
(16)else://評分節點非法時
(17)decrease Node weighted//懲罰評分節點
(18) end if
(19)end
評分結束過后,將關閉評分通道,驗證候選節點的分數真實性,統計評分階段中選取的候選節點分數。在該階段,每個候選節點都持有其它節點的Token,依次驗證候選節點所持有的Token,無效Token將被刪除,并降低無效Token簽名者的權重值。如果公示階段候選節點仍持有無效的Token,該節點將被剔除候選節點隊伍,并根據責任連坐制度懲罰該候選節點及其支持者,剩下的可信節點將進入到下一階段。
經過驗證的有效Token,將被統計計算,評選出平均分加增益分高的候選節點成為超級節點。平均分采用算術加權平均,該分值能顯示出選民對該節點的平均信任程度,但是惡意節點的非法評分,會對節點分值的可信度產生影響。為了防止惡意節點的非法行為影響分值的可信度,設計增益分weighted(x), 增益分是根據節點評分達優的人數計算,當某個節點的評分達優人數過少時,系統認為其可信度低,此時增益分為負值,將降低節點的可信度。為了防止節點的支持者過少卻能獲得記賬權的情況,將節點評分與其權重相乘得到的加權分達優的支持人數換算成相應的增益分,該分數極大地提升了節點的可信度。只有節點評分達優的人數達到一定的數量,該分數才會為正值并對其增益,反之對節點分數進行降低。增益分的存在減少了惡意節點行為對系統的影響,增加了節點分數的可信度。經過驗證的評分將與節點自身權重weighted加權處理,得出該候選節點最終的分數。分數高的節點,可以被認為是優質的值得被信任的節點,換算如式(1)所示
(1)
及格線以上總人數對應的權重如式(2)所示
weighted(x)=MlogmAx
(2)
(3)
式(3)的推導如式(4)~式(6)所示
(4)
(5)

(6)
(7)
式(7)說明weighted(x) 隨人數的增加,上升越來越平緩,weighted(x) 導函數如圖2所示。

圖2 weighted(x)導函數
由圖3所示,人數的增加對分數的增益無限,但是人數的增加對節點信任分數的增加會越來越平緩,人數高達一定值時對信任的增值微乎其微。 weighted(x) 對節點的分數有所增益,人數達不到指定要求反而會降低節點的可信度,但是人數過多,人數增量只能增加越來越少的節點可信度,該公式表達的人數增益如圖3所示。

圖3 人數增益分趨勢
本文基于式(1)提出的新評分算法,能夠準確反應一個節點的可信度,將Tokens作為算法的參數輸入,算法將解密、統計Tokens,最后返回基于式(1)換算的候選節點分數,具體過程如算法2所示。
算法2:信任程度統計算法
輸入:(Tokens)
輸出:(TotalScore)
(1)/*統計候選節點的分數*/
(2)初始化:K /*K為節點的tokens有效token總數*/;
(3)var temp /*記錄分數總值*/
(4)var passedPersonNum /*及格人數權重*/
(5)for k←1 to K do /*統計所有節點評分總和*/
(6)do onceScore←decrypt(Tokens[k])
(7)temp += onceScore
(8)if onceScore is passed: /*分數及格的將被統計到人數權重中*/
(9)do passedPersonNum ++
(10)end if
(11)end for
(12)score←(temp/Tokens.length+
MlogmA*passedNum)*weighted/*式(1)處理*/
(13)return score
(14)end
該階段被選舉出來的候選節點將持有的所有Token進行公示,以防止惡意節點選擇性算分,過濾低分,選擇高分,從而增加平均分的權重。評分節點分為支持者與反對者,根據評分的大小,與其支持的候選節點將產生對應的責任。被舉報成功的節點將失去記賬權,下次共識選舉中降低該候選節點的權重,并將節點列為不可信節點,其評分者也將根據對節點的評分大小受到相應的處理,懲罰支持者,獎勵反對者。反之,候選節點將成為超級節點,并且在任職期誠實工作,其評分者依然會根據分數得到相應的懲罰與獎勵,公示過程具體如算法3所示。
算法3:公示算法
輸入:null
輸出:null
(1)/*公示階段*/
(2)初始化:T, Node /*T為公示期的時長, Node為被公示的節點*/;
(3)listen←net.Listen()
(4)time.After(T,EndProgram()) /*T時間后, 結束程序。*/
(5)while true:
(6)do connNode←listen.Accept() /*監聽節點的舉報*/
(7)if connNode is doubted:
(8)then if connNode is honesty:
(9)then delete Node /*從候選節點隊列刪除該候選節點*/
(10)decrease Node weighted /*懲罰該節點*/
(11)decrease or reward Node Supporter/*獎勵或者懲罰該節點的評分節點*/
(12)else:
(13)decrease connNode weighted /*降低舉報節點權重*/
(14)end if
(15)end
該階段,每個超級節點可生產兩種區塊,分別為普通區塊與收束區塊,普通區塊的作用是存儲系統數據,而收束區塊的作用是將該周期內生成的普通區塊收束為一點。兩種區塊的結構與DPoS區塊結構對比見表1。

表1 區塊結構
針對DPos共識機制的單一隊列出塊,后續節點都在期待上一節點出塊,若節點宕機無法出塊,后一節點將處于期待狀態,超時下才會解除該狀態,并且使用上一成功出塊節點結果打包出塊。針對以上缺點,本文提出全隊列出塊,在每個出塊階段,所有超級節點異步出塊,同時在該階段驗證其它節點所出區塊,如果有節點宕機、超時未出塊,各節點將統一周期內生產的普通區塊,以達到共識。階段結束時,將生產一個收束區塊記錄該階段出塊的所有普通區塊。為滿足異步出塊的形式,本文棄用了區塊鏈的單鏈結構,采用基于DAG圖式改進的有序偽鏈結構,將DAG的無序狀態轉換為有序狀態,能夠延續單鏈結構安全性的同時兼顧DAG圖式的高吞吐量,區塊鏈結構如圖4所示。

圖4 SPoS鏈式結構
每個超級節點同時享有記賬權限,如果節點宕機,超時未出塊,系統將自動跳過該節點,對節點的行為進行評價、記憶,并且在下次選舉過程中懲罰該節點。SPoS共識機制采用周期制異步出塊,在周期內,超級節點打包、廣播普通區塊,監聽、接收其它超級節點廣播的普通區塊,并且統計普通區塊生成收束區塊,周期結束時廣播、統一收束區塊,SPoS共識機制的異步出塊如算法4所示。
算法4:異步出塊算法
輸入:null
輸出:null
(1)/*出塊階段*/
(2)初始化:T/*T為每個出塊周期的時長*/;
(3)var sumBlock /*創建、 初始化收束區塊*/
(4)time.After(T.BroadcastAndUniteSumBlock()) /*周期結束時廣播、 統一收束區塊*/
(5)listen←net.Listen()
(6)block←PackAndBroadcastBlock() /*節點自己生成、 廣播普通區塊*/
(7)AddTo(block,SumBlock) /*將普通區塊記錄到收束區塊*/
(8)while true:
(9)block = listen.Accept()
(10)if block is legal:
(11)then AddTo(block,SumBlock)
(12)else:
(13)FeedbackToSystem(block) /*block不合法時, 向系統舉報該區塊生產節點*/
(14)end if
(15)end
本文實驗在處理器Intel Core i5-4200HCPU@2.80 GH的64位Windows10專業版與Intel Celeron CPU N3450@1.10 GHz的64位Windows企業版平臺進行,采用golang語言進行區塊鏈構建,tcp協議進行P2P網絡傳輸,RSA加密算法生成密鑰、簽名、驗證數據,電腦端口模擬節點,實驗共模擬100個節點。
(1)去中心化
SPoS共識機制中,每個節點都不需要提供代幣及股權證明,各節點享有平等的評分權限。SPoS共識機制比DPoS共識機制門檻更低、權力更平等、去中心化程度更高。DPoS的參與度理論上最高能達到系統擁有股權節點的百分比,SPoS共識機制的參與度理論能夠達到百分百。與原共識機制相比,本文提出的共識機制中全體合法公民享有更加平等的選舉權,系統更加活躍與去中心化,共識機制性能指標對比見表2。

表2 性能指標對比
(2)資源消耗
DPoS共識機制需要代幣及股權的維持,持股節點的數量與代幣交易的總量越多,內存的消耗越多,股權證明花費的資源將大幅提升。改進的SPoS共識機制本身是不需要代幣及股權的支撐,SPoS共識機制對比DPoS共識機制將節省更多的內存資源以及查詢時間。SPoS共識機制的參與門檻低,系統節點活躍的數量急劇增加,使消耗的網絡資源大幅提升。系統模擬DPoS共識機制30%、40%、50%的節點擁有股權,分別采用256 bit、512 bit、1024 bit、2048 bit、4096 bit的密鑰進行網絡信息交互,實驗結果如圖5所示,SPoS共識機制網絡資源比DPoS共識機制分別多消耗230%、150%、100%。DPoS共識機制中擁有股權的節點占比越高,去中心化程度越高,與SPoS共識機制消耗的資源差額越小。

圖5 網絡資源消耗
(3)共識時延
實驗模擬100個節點,在區塊高度分別為10 000、5000、2000的SPoS共識機制和DPoS共識機制中共識選舉10個記賬節點,每個區塊高度均實驗了多次,最后對實驗數據進行求平均值處理。實驗結果表明,不同區塊高度中SPoS共識機制共識時延不變,區塊高度5000、2000時,SPoS共識機制的共識時延是高于DPoS共識機制,隨著區塊高度的增加和交易的產生,SPoS共識機制的共識時延明顯短于DPoS共識機制。隨著系統冗余度的提升,DPoS共識機制開具權益證明的時間越來越長,SPoS共識機制的優勢會越來越明顯,數據高冗余時,共識時延提升了45%左右,實驗結果如圖6所示。

圖6 共識時延
(4)出塊時間對比
實驗設定10個超級節點,每個節點具有相同的出塊周期。DPoS共識機制在每個出塊周期隨機排序出塊隊列,隊列中的節點依次出塊。SPoS共識機制在出塊周期內,超級節點異步同時出塊。每次實驗都采用相同初始環境,并且對最終結果進行數據處理及分析。實驗結果表明,在每個出塊周期內兩種共識機制都能保持穩定的吞吐量,SPoS共識機制隊列中超級節點異步出塊,每個出塊周期都能將區塊收束到收束區塊,相對于DPoS共識機制節省了隊列排序時間與等待其它節點出塊時間,SPoS共識機制的出塊時間明顯優于DPoS共識機制,SPoS共識機制中平均每個區塊的出塊時間縮短40%左右,實驗數據如圖7所示。

圖7 出塊時間
(5)容錯性
為比較共識機制容錯性,即區塊鏈系統部分節點宕機時單位時間出塊數量,實驗模擬10個超級節點,在超級節點宕機概率保持不同的情況下,比較系統的吞吐量。在實驗中節點的宕機概率依次提升,每個宕機率進行多次實驗,最后對比節點出塊時間。實驗結果表明,隨著宕機概率的提升,兩種共識機制的出塊時間成爆炸函數增長,但SPoS共識機制在系統宕機的情況下明顯比原共識機制更能保持系統吞吐量的穩定,而且這種優勢會隨著宕機率的提升越來越明顯,實驗結果如圖8所示。

圖8 宕機穩定性
為降低DPoS共識機制的中心化和提高系統吞吐量,本文提出了一種高并發、去中心化的共識機制。本文提出的SPoS共識機制中,合法節點均享有參與選舉的資格,選舉中根據節點身份進行責任連坐,去除了權益的統治地位,提升了系統去中心化,規范了節點行為,能夠更好地服務于有身份認證的區塊鏈系統。基于DAG圖式的偽鏈結構,創新了存儲結構,解決了DAG圖式結構的安全性問題,保證了系統高并發運行。但是,SPoS共識機制消耗的網絡資源多于DPoS共識機制,對網絡的穩定和帶寬有更高的要求。下一步,我們將研究降低該共識機制對網絡資源的消耗,并探索共識機制的實際應用。