田有亮,袁延森,高鴻峰,楊旸,熊金波
(1.貴州大學(xué)公共大數(shù)據(jù)國家重點(diǎn)實(shí)驗(yàn)室,貴州 貴陽 550025;2.貴州大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,貴州 貴陽 550025;3.貴州大學(xué)密碼學(xué)與數(shù)據(jù)安全研究所,貴州 貴陽 550025;4.貴州省密碼學(xué)與區(qū)塊鏈技術(shù)特色重點(diǎn)實(shí)驗(yàn)室,貴州 貴陽 550025;5.新加坡管理大學(xué)計(jì)算機(jī)與信息系統(tǒng)學(xué)院,新加坡 188065;6.福建師范大學(xué)計(jì)算機(jī)與網(wǎng)絡(luò)空間安全學(xué)院,福建 福州 350117)
區(qū)塊鏈作為比特幣[1]等加密貨幣的底層技術(shù),自問世以來引起廣泛的關(guān)注。區(qū)塊鏈?zhǔn)窃诜植际健⒉豢尚怒h(huán)境中,所有節(jié)點(diǎn)通過特定的共識(shí)算法就區(qū)塊鏈狀態(tài)的更新達(dá)成一致的技術(shù)。共識(shí)算法為區(qū)塊鏈提供了核心功能[2],從根本上決定了整個(gè)區(qū)塊鏈系統(tǒng)的安全性、可用性等性能[3]。
區(qū)塊鏈系統(tǒng)中涉及的數(shù)據(jù)記錄由全網(wǎng)節(jié)點(diǎn)進(jìn)行維護(hù)和生成,從而實(shí)現(xiàn)了去中心化。由于任何人都可以參與創(chuàng)建和驗(yàn)證區(qū)塊,因此為防止節(jié)點(diǎn)的惡意行為,系統(tǒng)需要參與節(jié)點(diǎn)付出一定代價(jià)。工作量證明(PoW,proof of work)也叫PoW 共識(shí)[1],通過引入節(jié)點(diǎn)間的算力競爭來保證數(shù)據(jù)一致性,使女巫攻擊[4]等惡意行為的作惡成本增加。作為成功挖礦的回報(bào),礦工將獲得與他們投入的計(jì)算能力成比例的獎(jiǎng)勵(lì)。
然而,PoW 共識(shí)的安全性存在一些隱患。首先,由于挖礦過程受到計(jì)算能力和概率因素的影響,導(dǎo)致單個(gè)礦工的期望收入較低,獎(jiǎng)勵(lì)波動(dòng)較高,因此,礦工通過加入礦池聚合計(jì)算能力來穩(wěn)定收入。雖然礦池對(duì)穩(wěn)定礦工收益有利,但大型礦池對(duì)系統(tǒng)來說是有風(fēng)險(xiǎn)的[5-6]。其次,PoW 共識(shí)已被證明是激勵(lì)不相容的[5,7],在某些情況下,礦工的最佳策略是不立即公布他們找到的區(qū)塊,而是將其保留一段時(shí)間,通過偏離協(xié)議來獲得不成比例的利益,即自私挖礦攻擊[8-9]。最后,PoW 共識(shí)在不一致的情況下(即區(qū)塊鏈中的分叉),系統(tǒng)收斂速度會(huì)減緩,浪費(fèi)大量計(jì)算資源[10-11],同時(shí)降低發(fā)動(dòng)自私挖礦攻擊的算力閾值[5,12],嚴(yán)重危害系統(tǒng)安全性。
針對(duì)上述問題,本文提出一種基于搜索空間劃分的工作量證明(SSPoW,proof of work based on spatial segmentation)算法。SSPoW 的核心設(shè)計(jì)是局部解,局部解視為礦工的部分工作量證明,公布該局部解的礦工獲得對(duì)應(yīng)的部分收益。同時(shí)定義了全局解和局部解的算力值,以此來量化最終區(qū)塊的聚合算力,并通過在全局解中附加局部解來提高區(qū)塊算力,以此加快分叉的收斂速度。局部解的引入和附加提高了挖礦的透明度和共識(shí)效率。本文主要貢獻(xiàn)如下。
1) 改進(jìn)挖礦算法:基于搜索空間劃分引入局部解,激勵(lì)礦工合作挖礦提高共識(shí)效率。
2) 重新設(shè)計(jì)獎(jiǎng)勵(lì)方案:通過削減獎(jiǎng)勵(lì)差異來提高礦工挖礦積極性,抑制算力中心化。
3) 更改主鏈選擇協(xié)議:通過量化最終區(qū)塊的聚合算力來加快分叉的收斂速度。
文獻(xiàn)[13]利用不可偽造的時(shí)間戳提出了新鮮度首選(FP,freshness preferred)策略,優(yōu)先選擇較新的區(qū)塊,降低保留區(qū)塊的競爭力從而降低自私挖礦的收益能力,然而,這種方法需要一個(gè)可信的時(shí)間戳機(jī)構(gòu)來生成不可偽造的時(shí)間戳,并要求誠實(shí)的礦工記錄所有最近的時(shí)間戳發(fā)布日志。因此,文獻(xiàn)[14]利用工作量證明的泊松性質(zhì)提出了一種無時(shí)間戳防御策略Zeroblock,通過設(shè)置區(qū)塊的最大接受時(shí)間來限制自私挖礦,但由于哈希率波動(dòng),區(qū)塊的預(yù)期時(shí)間可能會(huì)出現(xiàn)高方差,使有效區(qū)塊失效。文獻(xiàn)[15]引入?yún)^(qū)塊的“真實(shí)狀態(tài)”概念,通過為每個(gè)交易分配一個(gè)預(yù)期的確認(rèn)高度,以檢測(cè)網(wǎng)絡(luò)中的自私挖礦行為,但網(wǎng)絡(luò)中誠實(shí)區(qū)塊傳播的意外時(shí)延會(huì)導(dǎo)致交易實(shí)際高度增大,反而會(huì)有利于自私的礦工。文獻(xiàn)[16]引入透明度并激勵(lì)參與者盡快公布區(qū)塊來避免自私挖礦,但是誠實(shí)礦工的算力仍會(huì)被大量浪費(fèi)。同時(shí)在獎(jiǎng)勵(lì)機(jī)制設(shè)計(jì)方面,文獻(xiàn)[17]證明當(dāng)可用費(fèi)用不足時(shí),理性礦工會(huì)避免挖礦,并會(huì)傾向于加入自私挖礦礦池。文獻(xiàn)[18]提出一種獎(jiǎng)勵(lì)共享方案(RSS,reward sharing scheme),通過適當(dāng)激勵(lì)參與者,實(shí)現(xiàn)效率和安全性的均衡,但是存在富者愈富的現(xiàn)象。文獻(xiàn)[19]基于以太坊提出權(quán)益證明檢查點(diǎn)協(xié)議Casper,其結(jié)果表明該協(xié)議通過激勵(lì)相容確保了區(qū)塊鏈系統(tǒng)的活性,同時(shí)提供了比標(biāo)準(zhǔn)工作量證明協(xié)議更好的安全保證。在分叉處理方面,文獻(xiàn)[20]提出了一種概率驗(yàn)證方案PvScheme,可以有效降低區(qū)塊傳播時(shí)延,從而避免區(qū)塊鏈分叉的發(fā)生,但安全設(shè)計(jì)增加了系統(tǒng)的時(shí)延,隨著驗(yàn)證度的提高,分叉概率也呈現(xiàn)出遞增的趨勢(shì)。上述方案均存在一些缺陷,本文針對(duì)現(xiàn)有共識(shí)算法存在的激勵(lì)不相容等問題,設(shè)計(jì)一種基于激勵(lì)相容的共識(shí)算法,在保證挖礦參與者的積極性的同時(shí),提高共識(shí)效率,且可更快地進(jìn)行分叉處理以及對(duì)抗自私挖礦攻擊,對(duì)區(qū)塊鏈技術(shù)的發(fā)展具有重要意義。
區(qū)塊鏈系統(tǒng)中PoW 共識(shí)算法的常見形式為
其中,param 表示與區(qū)塊頭部信息相關(guān)的數(shù)據(jù),nonce 表示隨機(jī)數(shù),Target 表示目標(biāo)值(由網(wǎng)絡(luò)中當(dāng)前難度值決定)。由哈希函數(shù)的性質(zhì)可知,想要找到符合條件的nonce 就必須通過窮舉的方法來實(shí)現(xiàn)。最先求得滿足式(1)的nonce 值的礦工獲得記賬權(quán),其余礦工僅需將各參數(shù)代入即可驗(yàn)證其正確性。PoW 算法通信復(fù)雜度為O(n),節(jié)點(diǎn)數(shù)可擴(kuò)展,參與過程不需要身份驗(yàn)證。但是,PoW 算法浪費(fèi)算力資源,效率較低,且容易導(dǎo)致算力中心化。
同時(shí),區(qū)塊鏈網(wǎng)絡(luò)的整體哈希率和挖礦難度決定了整個(gè)網(wǎng)絡(luò)生成一個(gè)新區(qū)塊的時(shí)間(區(qū)塊間隔)。以比特幣為例,為了將區(qū)塊間隔穩(wěn)定在10 min 左右,以適應(yīng)不斷變化的總挖礦能力,比特幣網(wǎng)絡(luò)每隔2 016 個(gè)區(qū)塊(即一個(gè)難度窗口)就會(huì)根據(jù)式(2)調(diào)整目標(biāo)Target,即
其中,Timei表示過去第i個(gè)塊的生成時(shí)間,i∈ [1,2016]。如果平均區(qū)塊間隔超過10 min,目標(biāo)值就會(huì)增加,即難度降低。
PoW 共識(shí)算法并不總是激勵(lì)相容的。通過偏離協(xié)議和戰(zhàn)略性地扣留發(fā)現(xiàn)的區(qū)塊,擁有總計(jì)算能力比例α的礦工可能會(huì)占據(jù)區(qū)塊鏈上超過α的區(qū)塊,因此獲得與其算力份額不成比例的高回報(bào)[21-22]。更具體地說,只要區(qū)塊鏈處于比當(dāng)前主鏈分支多一個(gè)或多個(gè)區(qū)塊的有利位置,攻擊者就試圖通過對(duì)發(fā)現(xiàn)的區(qū)塊保密來創(chuàng)建一條私有鏈。只有當(dāng)主鏈幾乎趕上時(shí),他才會(huì)公布他的私有鏈,從而使公有鏈和誠實(shí)的礦工所做的一切努力失效,這種攻擊被稱為自私挖礦。當(dāng)一個(gè)自私礦工的計(jì)算能力超過一定的閾值(約33%)[5]時(shí),會(huì)更有效率。因此,如果算力足夠分散,自私挖礦攻擊對(duì)比誠實(shí)挖礦將無效率優(yōu)勢(shì)。
由于PoW 共識(shí)的挖礦收益取決于算力,因此礦工傾向于集中計(jì)算資源以獲取更高收益。挖礦是零和博弈,只有競爭成功得到記賬權(quán)的幸運(yùn)礦工才會(huì)得到獎(jiǎng)勵(lì),而其他為創(chuàng)造區(qū)塊貢獻(xiàn)計(jì)算資源但未得到記賬權(quán)的礦工則完全無收益。因此礦工會(huì)激烈地競爭區(qū)塊記賬權(quán),導(dǎo)致計(jì)算能力有限的礦工獲得的回報(bào)出現(xiàn)極高的差異,單獨(dú)的礦工可能需要等待極長時(shí)間才能得到回報(bào)?;谏鲜銮闆r,礦工聚合計(jì)算資源形成礦池以提高獲得記賬權(quán)的概率,并根據(jù)礦工的算力貢獻(xiàn)來分享獎(jiǎng)勵(lì)。以比特幣為例,截至2022 年4 月,全球最大的3 個(gè)礦池占據(jù)了整個(gè)網(wǎng)絡(luò)50%以上的算力。礦池不僅破壞了區(qū)塊鏈的去中心化特性,還引發(fā)了各種池內(nèi)或跨池安全問題[23-24]。
最長鏈原則指網(wǎng)絡(luò)中最長的鏈被定義為正確鏈(即主鏈),要求礦工在主鏈上挖礦。礦工在接收一個(gè)新區(qū)塊時(shí),必須停止當(dāng)前挖礦過程,驗(yàn)證新區(qū)塊是否有效,否則無法保證自己始終在主鏈上工作。借助最長鏈原則,保證每個(gè)新區(qū)塊均被誠實(shí)礦工承認(rèn)。然而,由于網(wǎng)絡(luò)時(shí)延等問題,偶爾會(huì)出現(xiàn)分叉現(xiàn)象,即在某個(gè)區(qū)塊高度,多名礦工同時(shí)挖出區(qū)塊,導(dǎo)致礦工對(duì)最新區(qū)塊鏈狀態(tài)做出不同判斷。雖然基于區(qū)塊確認(rèn)機(jī)制,上述沖突最終會(huì)被解決(僅剩一個(gè)分支被承認(rèn),其他競爭失敗的分支鏈被廢棄),但是由于區(qū)塊具有相同的算力權(quán)重,難以進(jìn)行量化比較,導(dǎo)致分叉收斂過程較緩慢。因此從系統(tǒng)一致性角度考慮,區(qū)塊算力的量化具有重要意義。
基于PoW 的挖礦并不是透明的,在產(chǎn)生區(qū)塊前很難快速評(píng)估不同礦工的算力。以比特幣為例,由于生成區(qū)塊的平均時(shí)間是10 min,且每個(gè)區(qū)塊的隱含計(jì)算能力接近相等。因此,出現(xiàn)分叉問題時(shí),比特幣采用最長鏈原則來解決,而該過程相對(duì)耗時(shí),且會(huì)造成自私挖礦等問題。理想情況下,惡意隱藏區(qū)塊應(yīng)該受到懲罰,然而在實(shí)際情況下難以檢測(cè)和證明一個(gè)區(qū)塊是否被隱藏。通過鼓勵(lì)礦工公布當(dāng)前自身計(jì)算狀態(tài)可以顯著增加挖礦透明度。例如,通過給予公布計(jì)算狀態(tài)的礦工一定獎(jiǎng)勵(lì),并要求最終區(qū)塊包含更多的計(jì)算結(jié)果來變相增強(qiáng)自己的算力。隨著時(shí)間的推移,其他礦工可能會(huì)創(chuàng)造出具有更高算力的區(qū)塊,從而給刻意隱藏區(qū)塊的惡意礦工帶來較大的風(fēng)險(xiǎn),這將激勵(lì)礦工立即公布他們的最終區(qū)塊。此外,基于零和博弈的獎(jiǎng)勵(lì)方案會(huì)導(dǎo)致礦工間進(jìn)行激勵(lì)競爭,所引發(fā)的礦池問題會(huì)影響算力分布,進(jìn)而違背區(qū)塊鏈的去中心化特性。為避免此問題,本文重新設(shè)計(jì)了獎(jiǎng)勵(lì)方案。通過引入局部解機(jī)制,鼓勵(lì)礦工間相互合作從而達(dá)到激勵(lì)相容,同時(shí)消除中心化風(fēng)險(xiǎn)。
SSPoW 系統(tǒng)模型如圖1 所示,整個(gè)區(qū)塊鏈網(wǎng)絡(luò)共有n個(gè)礦工{P1,P2,P3,···,Pn},基于礦工數(shù)將整個(gè)隨機(jī)數(shù)搜索空間劃分為N份 {S1,S2,S3,···,SN},每個(gè)空間大小為k。每位礦工選擇一定數(shù)量的搜索空間進(jìn)行隨機(jī)數(shù)Nonce 的哈希計(jì)算,相當(dāng)于整個(gè)系統(tǒng)中的礦工合作進(jìn)行挖礦。為保證挖礦透明性,礦工間交換各自的搜索結(jié)果,從而快速排除無用搜索空間,避免重復(fù)計(jì)算。
圖1 SSPoW 系統(tǒng)模型
本文方案中,礦工對(duì)搜索空間內(nèi)的隨機(jī)數(shù)Nonce進(jìn)行計(jì)算驗(yàn)證,并將未找到正確Nonce 值的搜索空間作為局部解公布。該局部解為礦工已付出算力的工作量證明,同時(shí)避免了其余礦工的重復(fù)無效計(jì)算。找到正確Nonce 值的礦工可將其他礦工已發(fā)布的局部解包含至全局解(最終區(qū)塊)中,從而更好地反映當(dāng)前區(qū)塊的聚合算力。當(dāng)發(fā)生分叉時(shí),包含更多算力的區(qū)塊所在分支將被規(guī)定為主鏈。
此外,本文基于局部解重新設(shè)計(jì)獎(jiǎng)勵(lì)方案,旨在杜絕零和博弈。全局解若包含局部解,則公布該局部解的礦工將獲取一定比例的獎(jiǎng)勵(lì),此獎(jiǎng)勵(lì)的大小取決于所有局部解的算力貢獻(xiàn)程度。局部解的獎(jiǎng)勵(lì)并不會(huì)影響出塊礦工的獎(jiǎng)勵(lì),這將有利于礦工公布區(qū)塊時(shí)包含更多的局部解,以此來增強(qiáng)自身區(qū)塊的聚合算力。
3.2.1區(qū)塊結(jié)構(gòu)
在本文方案中,區(qū)塊由交易列表、局部解列表和全局解頭部組成,其中全局解頭部負(fù)責(zé)驗(yàn)證交易和局部解列表。區(qū)塊頭部字段組成如表1 所示。本文根據(jù)Coinbase 字段對(duì)應(yīng)的地址獎(jiǎng)勵(lì)局部解的公布者(詳見第3.2.4 節(jié))。因?yàn)樗歇?jiǎng)勵(lì)都是由頭部信息決定的,所以交易列表中不再需要Coinbase 交易。為驗(yàn)證局部解的正確性,本文為局部解引入Addresses 字段代表局部解對(duì)應(yīng)的搜索空間起始地址。由于局部解并不包含交易信息,因此局部解刪除了MerkleRoot 字段。局部解作為區(qū)塊的組成部分,需在礦工間進(jìn)行交換,本文利用哈希函數(shù)的抗碰撞性來確保所有相關(guān)局部解的完整性,如式(3)所示。
表1 區(qū)塊頭部字段
利用OP_RETURN 操作來存儲(chǔ)聚合局部解頭部的哈希值,該哈希值作為數(shù)據(jù)項(xiàng)存儲(chǔ)于區(qū)塊中,其中,headeri是一個(gè)指向前一個(gè)全局解頭部的局部解頭部。與全局解區(qū)塊頭相比,局部解區(qū)塊頭并不用于驗(yàn)證交易,包含局部解的主要目的是反映集中在區(qū)塊鏈某個(gè)分支上的聚合算力。SSPoW 區(qū)塊鏈的片段如圖2 所示。每個(gè)區(qū)塊包含一個(gè)單一的全局解頭部、交易列表和聚合局部解的哈希值。在收到一個(gè)新區(qū)塊時(shí),礦工通過檢查以下內(nèi)容來驗(yàn)證該區(qū)塊(見算法 4 中的validateB lock())。
圖2 區(qū)塊鏈結(jié)構(gòu)
1) 全局解頭部哈希值滿足要求,并指向之前的全局解頭部。
2) 頭部字段值正確,即版本、目標(biāo)和時(shí)間戳等都設(shè)置正確。
3) 所有包含的交易均正確,即MerkleRoot 驗(yàn)證正確,且聚合局部解的哈希值驗(yàn)證正確。
4) 所有包含的局部解都是正確的:a) 局部解nonce 值計(jì)算出的頭部哈希值符合要求;b) 局部解的PreHash 字段指向前一個(gè)全局解頭部;c) 局部解的版本、目標(biāo)和時(shí)間戳均正確。如果驗(yàn)證成功,該區(qū)塊被追加上鏈。
3.2.2挖礦算法
與PoW 共識(shí)算法相同,在SSPoW 中,礦工將交易收集到區(qū)塊中進(jìn)行驗(yàn)證。競爭新區(qū)塊的記賬權(quán)時(shí),每個(gè)礦工試圖通過自身算力對(duì)同一哈希難題進(jìn)行窮舉求解,算法1 中的 mineBlo ck()函數(shù)對(duì)SSPoW中的挖礦過程進(jìn)行了簡化描述。礦工通過修改區(qū)塊Nonce 字段不斷改變區(qū)塊頭部header,當(dāng)一個(gè)頭部的哈希值h=H(header)小于目標(biāo)值Target,即h< Target 時(shí),相應(yīng)的區(qū)塊會(huì)被公布到網(wǎng)絡(luò)上,其他礦工驗(yàn)證通過后,將更新本地區(qū)塊鏈狀態(tài),同時(shí)啟動(dòng)下一輪挖礦。
算法1挖礦算法
當(dāng)?shù)V工在搜索空間Si上進(jìn)行挖礦后并未發(fā)現(xiàn)正確的nonce 時(shí),則可以公布關(guān)于該搜索空間的局部解,如算法2 所示。局部解僅包含頭部,不包含區(qū)塊體(交易列表),局部解頭部需要提供該搜索空間上的最小頭部哈希值min(hi)(i∈ [a,a+k],a為該搜索空間起始地址)以及min(hi)對(duì)應(yīng)的Nonce。當(dāng)?shù)V工公布一個(gè)局部解時(shí),除了將其添加到本地局部解列表中,還將在區(qū)塊鏈網(wǎng)絡(luò)中廣播該局部解。每個(gè)礦工對(duì)收到的局部解進(jìn)行驗(yàn)證(見算法 3 中onRecvLoca lBlock()函數(shù)),并檢查該局部解是否指向當(dāng)前最后一個(gè)區(qū)塊的頭部,及其他字段是否正確。另外,本文方案不限制附加的局部解數(shù)量,但同一礦工在同一搜索空間的局部解僅會(huì)被附加一次。
算法2局部解生成算法
算法3局部解驗(yàn)證算法
算法4全局解驗(yàn)證算法
3.2.3分叉處理
通過在區(qū)塊中引入局部解,區(qū)塊能更精確地反映聚合挖礦能力。每個(gè)區(qū)塊包含多個(gè)局部解,這些局部解對(duì)區(qū)塊的聚合算力有貢獻(xiàn)。在分叉的情況下,本文方案依賴于最強(qiáng)鏈原則,即擁有最高聚合算力的分支鏈被選定為主鏈。每條分支鏈的聚合算力根據(jù)算法5 中的 chain PoW()函數(shù)計(jì)算。每條鏈上的每個(gè)區(qū)塊都會(huì)被解析,每個(gè)區(qū)塊的聚合算力分為兩部分。
2) 所有相關(guān)局部解頭部的聚合算力。每個(gè)局部解頭部的算力受搜索空間影響,計(jì)算式為,其中,N為劃分的搜索空間數(shù)量,γ為相對(duì)影響因子,表示局部解的權(quán)重。
該分支鏈的聚合算力被表示為其所有區(qū)塊的算力之和。通過比較各鏈的聚合算力,將具有最大聚合算力的鏈確定為主鏈。假設(shè)一個(gè)區(qū)塊C0包含x個(gè)局部解,同時(shí)存在包含y個(gè)局部解的區(qū)塊C1,那么如果x>y,該礦工將選擇C0而不是C1。如圖3所示,在區(qū)塊鏈分叉時(shí),擁有C0和C1區(qū)塊的礦工將立即決定跟隨C0區(qū)塊,因?yàn)镃0比C1區(qū)塊聚合了更多的算力。上述規(guī)則激勵(lì)礦工盡快公布他們的計(jì)算結(jié)果,避免隨著時(shí)間的推移,競爭區(qū)塊算力更高導(dǎo)致自身區(qū)塊被廢棄。
圖3 分叉示例
算法5聚合算力計(jì)算算法
3.2.4區(qū)塊獎(jiǎng)勵(lì)
SSPoW 共識(shí)算法的獎(jiǎng)勵(lì)分配由算法6 中的rewardBl ock()函數(shù)實(shí)現(xiàn)。在PoW 共識(shí)中,只有成功出塊的礦工才能獲得全額獎(jiǎng)勵(lì),而在本文方案中,所有為區(qū)塊的生成做出貢獻(xiàn)的礦工(發(fā)布局部解的礦工也被包括在內(nèi))都將獲得與其所提供的算力相稱的獎(jiǎng)勵(lì)。一個(gè)局部解的公布者獲得全額出塊獎(jiǎng)勵(lì)R的一部分,即,作為其相應(yīng)的局部解對(duì)特定分支總算力的貢獻(xiàn)獎(jiǎng)勵(lì),其中γ為相對(duì)影響因子,其大小影響局部解的獎(jiǎng)勵(lì)權(quán)重。本文方案不限制局部解的獎(jiǎng)勵(lì)數(shù)量,礦工針對(duì)同一區(qū)塊可獲得其發(fā)布的多個(gè)不同局部解的獎(jiǎng)勵(lì),因此獎(jiǎng)勵(lì)方案不是零和博弈,出塊礦工無法通過舍棄其他礦工的局部解來增加自己的獎(jiǎng)勵(lì);相反,若舍棄其他局部解,將導(dǎo)致自身區(qū)塊的聚合算力減少,從而影響自身收益。
算法6獎(jiǎng)勵(lì)分配算法
基于局部解的機(jī)制使誠實(shí)礦工收入趨于穩(wěn)定,降低了因競爭記賬權(quán)的不確定性所帶來的收益波動(dòng),使系統(tǒng)算力更加分散?;谏鲜銮闆r,同一區(qū)塊中所有不同局部解均被獎(jiǎng)勵(lì),且局部解求解速度與礦工自身算力成正比。為了保證出塊礦工的積極性,將區(qū)塊交易費(fèi)(B.TxFees)歸于全局解頭部的公布者(他也獲得了全部的獎(jiǎng)勵(lì)R)。在本文獎(jiǎng)勵(lì)方案中,新鑄幣的數(shù)量恒定為R,且貨幣的總供應(yīng)量沒有上界。
區(qū)塊鏈分叉、算力中心化以及自私挖礦對(duì)區(qū)塊鏈系統(tǒng)的安全性造成了極大的危害,本節(jié)根據(jù)算法特性對(duì)上述問題的解決過程進(jìn)行詳細(xì)闡述與解釋。
采用SSPoW 共識(shí)算法的挖礦時(shí)間相比于PoW共識(shí)更短,導(dǎo)致分叉概率上升。因此本文引入了聚合算力的概念,當(dāng)出現(xiàn)2 個(gè)或多個(gè)分叉時(shí),礦工優(yōu)先選擇在聚合算力最高的分支鏈上進(jìn)行挖礦。PoW共識(shí)則選擇最長鏈,如圖3 所示,區(qū)塊鏈在C處出現(xiàn)分叉,若采用PoW 共識(shí),新區(qū)塊D則會(huì)在C0和C1之中任選一個(gè)作為父區(qū)塊。由于沒有具體的量化指標(biāo),區(qū)塊鏈最多需要6 個(gè)區(qū)塊的時(shí)間進(jìn)行收斂。如圖4 所示,區(qū)塊C1經(jīng)過后續(xù)6 個(gè)區(qū)塊的確認(rèn)保證其不可更改,因此fork2被選定為主鏈,而fork1上的區(qū)塊則會(huì)成為孤塊,這將導(dǎo)致巨大的資源浪費(fèi)。如果采用本文所提的SSPoW 算法,當(dāng)出現(xiàn)分叉時(shí),由于C0的聚合算力大于C1,因此后續(xù)的區(qū)塊D會(huì)立即選擇C0作為父區(qū)塊,for1k 會(huì)被選定為主鏈,分叉解決僅需一個(gè)區(qū)塊的生成時(shí)間,避免重復(fù)無意義挖礦過程所造成的資源浪費(fèi)。
圖4 分叉展示
礦池導(dǎo)致的算力中心化問題在很大程度上可歸因于單獨(dú)挖礦的高獎(jiǎng)勵(lì)差異。因此,將單個(gè)礦工的獎(jiǎng)勵(lì)差異保持在較低水平是本文的核心設(shè)計(jì)目標(biāo)。設(shè)擁有全網(wǎng)α算力的獨(dú)立礦工P,記M1為采用PoW 共識(shí)進(jìn)行挖礦后每個(gè)區(qū)塊獎(jiǎng)勵(lì)值的隨機(jī)變量,M2為采用SSPoW 共識(shí)進(jìn)行挖礦后每個(gè)區(qū)塊獎(jiǎng)勵(lì)值的隨機(jī)變量。定義隨機(jī)變量X~B(1,α)為
可得E(X)=α和D(X)=α(1 -α),其中,E 和D分別表示隨機(jī)變量X的期望和方差。在PoW 共識(shí)中,出塊礦工獲得固定的控礦獎(jiǎng)勵(lì)R以及交易手續(xù)費(fèi),用隨機(jī)變量T表示交易手續(xù)費(fèi),定義T~U(a,b),可得
對(duì)式(5)求方差可得
由于XR和XT不獨(dú)立,可得
將式(7)代入式(6)可得
設(shè)Y為事件X的示性函數(shù),定義為
代入XT=Y(X=1)T,可得
將式(10)代入式(8)得
在SSPoW 中,假設(shè)區(qū)塊中包含了L個(gè)局部解,隨機(jī)變量L~P(λ),隨機(jī)變量Xi~B(1,α)。為便于與 PoW 共識(shí)進(jìn)行比較,本文引入縮放常數(shù)c(0<c< 1),以確保區(qū)塊總獎(jiǎng)勵(lì)保持不變??傻?/p>
當(dāng)交易手續(xù)費(fèi)用T與挖礦獎(jiǎng)勵(lì)R相比較小時(shí),式(19)將簡化為
顯然,D(M2) <D(M1),SSPoW 算法降低了獎(jiǎng)勵(lì)的差異,因此,在采用本文算法的區(qū)塊鏈系統(tǒng)中,礦工加入大型礦池的動(dòng)機(jī)會(huì)降低,對(duì)系統(tǒng)的算力去中心化有積極影響。
與PoW 共識(shí)不同的是,SSPoW 算法中系統(tǒng)獎(jiǎng)勵(lì)公布局部解的礦工,因此存在著惡意節(jié)點(diǎn)公布虛假局部解的行為。本節(jié)將通過分析針對(duì)局部解的攻擊來論述該算法的安全性。
SSPoW 的另一特點(diǎn)是抑制了自私挖礦攻擊。在自私挖礦中,當(dāng)惡意礦工優(yōu)先于誠實(shí)礦工挖出區(qū)塊時(shí),惡意礦工不立即將挖掘到的區(qū)塊公布到區(qū)塊鏈網(wǎng)絡(luò)中,而是選擇隱瞞。當(dāng)誠實(shí)礦工在原有鏈上挖到新的區(qū)塊時(shí),惡意礦工突然釋放之前所保留的區(qū)塊,增加鏈的長度,使區(qū)塊鏈網(wǎng)絡(luò)出現(xiàn)分叉,根據(jù)最長鏈原則,誠實(shí)礦工挖出的區(qū)塊無效,從而浪費(fèi)了大量的算力資源。與此同時(shí),惡意礦工創(chuàng)造的分支鏈成為最長鏈,誠實(shí)礦工最終也會(huì)趨向于在自私鏈上進(jìn)行挖礦,嚴(yán)重破壞了區(qū)塊鏈系統(tǒng)的安全性。
通過分析得知,自私挖礦是針對(duì)區(qū)塊鏈最長鏈原則的攻擊,而在SSPoW 中引入了基于局部解的新挖礦策略,主鏈選擇的并非最長鏈,而是基于聚合算力的最強(qiáng)鏈。由于更改了鏈選擇協(xié)議,同時(shí)通過獎(jiǎng)勵(lì)方案激勵(lì)礦工盡早公布計(jì)算結(jié)果,提高了挖礦過程的透明度。因此如果惡意礦工不公布任何新發(fā)現(xiàn)的局部解(“隱蔽”挖礦),推遲發(fā)布新區(qū)塊或拒絕包含其他礦工的局部解(“惡意”挖礦),那么在前一種情況下,惡意礦工將無法獲得局部解的收益;而在后一種情況下,若誠實(shí)礦工公布的區(qū)塊聚合算力較高,惡意節(jié)點(diǎn)將面臨著自身區(qū)塊被廢棄的風(fēng)險(xiǎn)。綜上所述,這些策略都會(huì)給惡意礦工帶來利益損失,極大地抑制自私挖礦。
本文仿真實(shí)驗(yàn)主機(jī)配置如下。CPU 為Intel Core i5-9500,內(nèi)存為8 GB,操作系統(tǒng)為Window 10 企業(yè)版。實(shí)驗(yàn)選用Python3.8 為主要編程語言,并使用其Matplotlib3.5.2 模塊實(shí)現(xiàn)數(shù)據(jù)的可視化。
因?yàn)镾SPoW 算法是一個(gè)劃分搜索空間的合作挖礦,所以除了核心的挖礦模塊和通信模塊,還需要有劃分搜索空間模塊。為了簡化實(shí)驗(yàn),仿真實(shí)驗(yàn)指定了各個(gè)節(jié)點(diǎn)的搜索空間。實(shí)驗(yàn)主要比較SSPoW與PoW 的算法效率和挖礦獎(jiǎng)勵(lì)差異。算法效率通過對(duì)比吞吐量和時(shí)延進(jìn)行衡量,獎(jiǎng)勵(lì)差異則通過對(duì)比挖礦獎(jiǎng)勵(lì)的離散系數(shù)進(jìn)行衡量。離散系數(shù)c是度量數(shù)據(jù)離散程度的相對(duì)統(tǒng)計(jì)量,用于比較不同樣本數(shù)據(jù)的離散程度,定義為標(biāo)準(zhǔn)差σ與平均值μ之比,表示為
在本文算法中,挖礦獎(jiǎng)勵(lì)的離散系數(shù)越大,說明挖礦獎(jiǎng)勵(lì)的差異程度也越大。吞吐量指單位時(shí)間內(nèi)區(qū)塊鏈網(wǎng)絡(luò)中的交易從產(chǎn)生到被打包并寫入?yún)^(qū)塊鏈中的交易總數(shù),本文使用每秒交易數(shù)(TPS,transaction per second)來表示吞吐量,表示為
其中,Time 為交易產(chǎn)生到區(qū)塊被確認(rèn)的時(shí)間間隔,NumofTxs 為在時(shí)間間隔Time 內(nèi)被確認(rèn)區(qū)塊中包含的交易總數(shù)。算法的吞吐量越高,則表明算法的性能效率越高。
在區(qū)塊鏈系統(tǒng)中還需考慮算法的使用規(guī)模,使用規(guī)模指算法在系統(tǒng)中運(yùn)用后所能承載的網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)量。本文分別測(cè)試了PoW 和SSPoW 這2 種共識(shí)算法在不同節(jié)點(diǎn)數(shù)量下的吞吐量。為避免誤差,實(shí)驗(yàn)結(jié)果取算法運(yùn)行10 次的平均值,如圖5 所示。通過調(diào)整系統(tǒng)的節(jié)點(diǎn)數(shù)量來測(cè)試不同的使用規(guī)模對(duì)算法吞吐量的影響。由圖5 可知,在同一測(cè)試平臺(tái)下,SSPoW 算法的吞吐量接近400 tps,而PoW 共識(shí)的吞吐量只有100 tps。但是隨著節(jié)點(diǎn)數(shù)量的增多,吞吐量大小存在著較大的波動(dòng)。這是因?yàn)閰^(qū)塊中額外引入了局部解,導(dǎo)致SSPoW 區(qū)塊大小相比PoW 算法有所提高,節(jié)點(diǎn)之間的通信開銷也會(huì)增大,所以隨著節(jié)點(diǎn)數(shù)量的增多,受網(wǎng)絡(luò)因素的影響也會(huì)增大。
圖5 算法吞吐量對(duì)比
由于本文算法為局部解提供一定比例的獎(jiǎng)勵(lì),為模擬不同區(qū)塊鏈網(wǎng)絡(luò)下算法的獎(jiǎng)勵(lì)分配情況,本節(jié)通過在不同節(jié)點(diǎn)規(guī)模下進(jìn)行挖礦,測(cè)試節(jié)點(diǎn)獎(jiǎng)勵(lì)的離散系數(shù)并以此來評(píng)估獎(jiǎng)勵(lì)差異情況。在同一測(cè)試平臺(tái)下,每個(gè)節(jié)點(diǎn)規(guī)模挖礦100 次,設(shè)置搜索空間數(shù)N=256,相對(duì)影響因子γ=1,表示每個(gè)搜索空間對(duì)應(yīng)的局部解獎(jiǎng)勵(lì)之和與全局解獎(jiǎng)勵(lì)相等。每組實(shí)驗(yàn)結(jié)束后,統(tǒng)計(jì)每個(gè)節(jié)點(diǎn)獲得的獎(jiǎng)勵(lì),并由式(21)計(jì)算出該組獎(jiǎng)勵(lì)的離散系數(shù)。由圖6 可知,隨著節(jié)點(diǎn)規(guī)模的增大,PoW算法的獎(jiǎng)勵(lì)離散系數(shù)急劇增大,說明隨著網(wǎng)絡(luò)規(guī)模的增大,節(jié)點(diǎn)的獎(jiǎng)勵(lì)將會(huì)出現(xiàn)較大的差異,因此礦工加入礦池的意愿也會(huì)更強(qiáng)烈。而SSPoW 算法的離散系數(shù)上升則較緩慢,說明本文算法削減了節(jié)點(diǎn)的獎(jiǎng)勵(lì)差異,在一定程度上降低了算力中心化風(fēng)險(xiǎn)。
圖6 算法獎(jiǎng)勵(lì)差異對(duì)比
SSPoW 算法通過引入局部解提高了共識(shí)效率,與此同時(shí),額外字段的引入也會(huì)增加通信開銷,因此本節(jié)通過測(cè)試算法的時(shí)延來評(píng)估通信開銷。本節(jié)實(shí)驗(yàn)對(duì)比選用8 臺(tái)主機(jī),并在同一測(cè)試平臺(tái)上分別運(yùn)行PoW 和SSPoW 算法來測(cè)試挖礦的時(shí)延,評(píng)估指標(biāo)為50 次挖礦的時(shí)間開銷。由圖7 可知,在同一實(shí)驗(yàn)環(huán)境下,SSPoW 算法的時(shí)延明顯低于PoW算法。同時(shí),本節(jié)實(shí)驗(yàn)也計(jì)算了2 種算法挖礦50 次的平均時(shí)延,SSPoW 算法的平均時(shí)延顯著低于PoW算法,說明本文算法在提高共識(shí)速度的同時(shí)并未帶來過大的通信開銷。
圖7 算法時(shí)延對(duì)比
對(duì)于PoW 共識(shí)而言,高獎(jiǎng)勵(lì)差異帶來的中心化問題以及自私挖礦等問題是危害區(qū)塊鏈系統(tǒng)安全的關(guān)鍵因素,因此,本文設(shè)計(jì)并提出了一種新的工作量證明算法——基于PoW共識(shí)的SSPoW算法。本文算法引入局部解,并基于局部解重新設(shè)計(jì)獎(jiǎng)勵(lì)方案,減少了礦工加入礦池的意愿,從而降低了因算力中心化導(dǎo)致的風(fēng)險(xiǎn),對(duì)區(qū)塊鏈的安全屬性有積極貢獻(xiàn)。最后,理論分析與實(shí)驗(yàn)結(jié)果表明,相比于傳統(tǒng)PoW 共識(shí)算法,本文算法的共識(shí)效率和安全性均有提高。未來,筆者希望通過使用新穎的框架和工具來擴(kuò)展本文工作。