吳夢宇,朱國勝,吳善超
(湖北大學(xué)計(jì)算機(jī)與信息工程學(xué)院,武漢430062)
2008 年11 月1 日,一個(gè)化名為中本聰?shù)娜嗽诰W(wǎng)絡(luò)上發(fā)表了一篇名為《比特幣:一種點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)》[1]的論文,首次提出了比特幣的概念,并于2009 年1 月3 日創(chuàng)建了第一個(gè)創(chuàng)世區(qū)塊,獲得了50 枚比特幣的挖礦獎(jiǎng)勵(lì),比特幣由此誕生。在比特幣系統(tǒng)中,沒有中心機(jī)構(gòu),完全開放自治,所有對(duì)等的節(jié)點(diǎn)組成一個(gè)去中心化的分布式賬本,系統(tǒng)內(nèi)的所有交易信息公開透明,每隔10 min創(chuàng)建一個(gè)區(qū)塊,并將這10 min內(nèi)全網(wǎng)的比特幣交易記錄打包并加密[2]存入該區(qū)塊中,寫入?yún)^(qū)塊中的信息不能更改和撤銷,參與競爭的礦工節(jié)點(diǎn)需要進(jìn)行復(fù)雜的哈希計(jì)算來尋找一個(gè)隨機(jī)數(shù)(Nonce),找到該隨機(jī)數(shù)的節(jié)點(diǎn)獲得打包記賬權(quán),并得到一定數(shù)量的比特幣獎(jiǎng)勵(lì)。這種去中心化、公開透明、不可篡改的底層數(shù)據(jù)存儲(chǔ)技術(shù)稱為區(qū)塊鏈[3]。
區(qū)塊鏈的誕生引起了社會(huì)各界的極大興趣[4],各大區(qū)塊鏈平臺(tái)應(yīng)運(yùn)而生,最為熱門的有以太坊[5]、EOS(Enterprise Operation System)、波場等,不管是哪個(gè)區(qū)塊鏈平臺(tái),都離不開共識(shí)機(jī)制,共識(shí)機(jī)制的作用就是使各節(jié)點(diǎn)在沒有中心管理機(jī)構(gòu)的情況下,遵循一定的規(guī)則實(shí)現(xiàn)自治從而保證區(qū)塊鏈的穩(wěn)定運(yùn)行。以太坊采用的是工作量證明(Proof of Work,PoW)機(jī)制,但由于PoW 需要消耗巨大算力和電力并且效率不高,以太坊正在逐步遷移到其他區(qū)塊鏈平臺(tái)廣泛采用的權(quán)益證明(Proof of Stake,PoS)機(jī)制[6],然而PoS 機(jī)制由于其無成本權(quán)益(nothing-at-stake)的特性,很容易被分叉,并且可能存在富者愈富的問題。
針對(duì)PoW 和PoS 共識(shí)機(jī)制的缺陷,本文提出了一種基于PoW 和PoS 改進(jìn)的區(qū)塊鏈共識(shí)機(jī)制PoWaS(Proof of Work and Stake):首先降低哈希計(jì)算的難度,節(jié)點(diǎn)尋找隨機(jī)數(shù)所花費(fèi)的時(shí)間記為fTime;接著設(shè)置最大納入幣齡計(jì)算的持幣時(shí)間,得到的幣齡記為coinAge;然后引入信用值,節(jié)點(diǎn)的信用值記為cPoint;最 后 由fTime、coinAge和cPoint計(jì) 算 的 到 的 值 記 為pStake,pStake最大的礦工節(jié)點(diǎn)獲得打包記賬權(quán)并得到相應(yīng)的虛擬幣和信用值獎(jiǎng)勵(lì)。
作為區(qū)塊鏈的核心組成部分,共識(shí)機(jī)制起著保證區(qū)塊鏈系統(tǒng)穩(wěn)定運(yùn)行的作用,隨著區(qū)塊鏈技術(shù)的不斷發(fā)展,共識(shí)機(jī)制也成為了當(dāng)前國內(nèi)外信息技術(shù)領(lǐng)域的一個(gè)研究熱點(diǎn),主流的區(qū)塊鏈共識(shí)機(jī)制主要有PoW、PoS、委托權(quán)益證明(Delegated Proof of Stake,DPoS)[7]、實(shí)用拜占庭容錯(cuò)(Practical Byzantine Fault Tolerance,PBFT)[8]以及驗(yàn)證池(Pool)等。目前對(duì)共識(shí)機(jī)制的研究主要有四個(gè)方向:對(duì)PoW 的改進(jìn)、對(duì)PoS 的改進(jìn)、將PoW和PoS相結(jié)合以及對(duì)分布式一致性算法的改進(jìn)。
2016 年,英特爾為了改進(jìn)PoW,提出了消逝時(shí)間證明(Proof of Elapsed Time,PoET)[9]機(jī)制,該機(jī)制下,各參與競爭的節(jié)點(diǎn)需要等待一個(gè)隨機(jī)時(shí)間,第一個(gè)完成其等待時(shí)間的節(jié)點(diǎn)獲得記賬權(quán),節(jié)點(diǎn)參與競爭的代價(jià)較低,擁有較為平等競爭的機(jī)會(huì)。為了解決PoW 的資源浪費(fèi)問題,空間證明(Proof of Space,PoSpace)[10]被提出,節(jié)點(diǎn)一次性提供一定的硬盤空間,后續(xù)的記賬權(quán)競爭不需要花費(fèi)算力,該共識(shí)機(jī)制目前已經(jīng)在一些區(qū)塊鏈項(xiàng)目中得到應(yīng)用。2017 年8 月,基于PoS 改進(jìn)的Ouroboros 共識(shí)機(jī)制被提出[11],它使用了新的激勵(lì)機(jī)制,根據(jù)權(quán)益隨機(jī)選出記賬者。行動(dòng)證明(Proof of Activity,PoA)[12]將PoW 和PoS 相結(jié)合,在該機(jī)制下礦工節(jié)點(diǎn)進(jìn)行工作量證明后挖出的塊并不包含交易數(shù)據(jù),只是區(qū)塊頭部,需要將該頭部發(fā)送給其他校驗(yàn)節(jié)點(diǎn)進(jìn)行校驗(yàn),校驗(yàn)者的選取與權(quán)益相關(guān),最后一個(gè)校驗(yàn)者將交易數(shù)據(jù)加入該塊中,完成一個(gè)區(qū)塊的生成。小蟻共識(shí)(delegated BFT,dBFT)對(duì)拜占庭容錯(cuò)機(jī)制進(jìn)行了改進(jìn),借鑒PoS 的思想,利用基于權(quán)益的投票機(jī)制選取參與記賬的節(jié)點(diǎn),將拜占庭容錯(cuò)機(jī)制中的記賬者由靜態(tài)參與轉(zhuǎn)變?yōu)閯?dòng)態(tài)調(diào)整。
PoW 工作量證明機(jī)制是比特幣所采用的共識(shí)機(jī)制[13],礦工節(jié)點(diǎn)通過不斷的哈希(hash)計(jì)算尋找一個(gè)隨機(jī)數(shù)(Nonce),使得Nonce 拼接上前一個(gè)區(qū)塊的哈希值再進(jìn)行哈希計(jì)算所得到的哈希值前n位為零,n的大小對(duì)應(yīng)計(jì)算難度的大小,在比特幣中,難度值的計(jì)算公式為:
其中:newDiff為新區(qū)塊的難度值;oldDiff為前一個(gè)區(qū)塊的難度值;totalTime為創(chuàng)建過去2 016 個(gè)區(qū)塊所花費(fèi)的總時(shí)長,由于比特幣將出塊速度控制在10 min出一個(gè)塊,從式(1)可以看出20 160/totalTime趨近于1,所以新區(qū)塊的難度值與前一個(gè)區(qū)塊的難度值近似相等。如果礦工的算力增強(qiáng),可能出現(xiàn)不到10 min 就出塊的情況,這樣20 160/totalTime就會(huì)大于1,根據(jù)式(1),newsDiff將大于oldDiff,難度值變高了,計(jì)算時(shí)長就會(huì)增加;反之,算力減小,難度值會(huì)降低,計(jì)算時(shí)長也會(huì)減少。這就是PoW 的難度調(diào)整機(jī)制,比特幣通過這種機(jī)制使得不管在什么算力情況下始終保持10 min左右的出塊速度。
在PoW 機(jī)制下,客戶端之間發(fā)生交易后,會(huì)向全網(wǎng)節(jié)點(diǎn)廣播,礦工節(jié)點(diǎn)收到交易信息后將其加入到自己創(chuàng)建的區(qū)塊中,同時(shí)也在不斷地進(jìn)行哈希計(jì)算尋找Nonce,若某個(gè)礦工節(jié)點(diǎn)找到了Nonce,需要將自己打包的區(qū)塊和Nonce 信息向全網(wǎng)節(jié)點(diǎn)廣播。其他節(jié)點(diǎn)收到消息后,立即驗(yàn)證Nonce 是否正確以及區(qū)塊中的所有交易是否有效,若驗(yàn)證通過,則認(rèn)為該區(qū)塊有效,然后停止當(dāng)前的計(jì)算,將該區(qū)塊作為區(qū)塊鏈的最后一個(gè)區(qū)塊進(jìn)行新一輪的哈希計(jì)算,找到Nonce 的礦工會(huì)獲得一定數(shù)量的代幣獎(jiǎng)勵(lì)。
從PoW 的工作流程和其難度調(diào)節(jié)機(jī)制中可以看出,在創(chuàng)建新區(qū)塊時(shí),全網(wǎng)礦工節(jié)點(diǎn)都處于高負(fù)荷的計(jì)算中,算力再好的節(jié)點(diǎn)找到一個(gè)Nonce 也需要10 min 左右的時(shí)間,其他沒有找到Nonce 的節(jié)點(diǎn)花費(fèi)了10 min 的算力卻得不到任何獎(jiǎng)勵(lì)。顯然,產(chǎn)生巨大的算力和電力資源浪費(fèi)是PoW 機(jī)制的重大缺陷。
PoS 權(quán)益證明機(jī)制在2012 年由Sunny King 在點(diǎn)點(diǎn)幣(Peercoin)白皮書中提出,目的是為了解決比特幣的PoW 機(jī)制大量浪費(fèi)算力、電力資源的問題。Sunny King 希望通過一個(gè)可靠的機(jī)制來賦予每個(gè)節(jié)點(diǎn)參與系統(tǒng)中決策的權(quán)利,PoS機(jī)制中引入了幣齡(coinAge)的概念,每個(gè)代幣都有對(duì)應(yīng)的價(jià)值來度量持幣者參與決策的權(quán)重,叫作權(quán)益。幣齡的計(jì)算公式為:
其中:coin為代幣數(shù)量;coinTime為持幣時(shí)間,如果發(fā)生交易,這部分幣齡將會(huì)被消耗。比如,Bob 從Alice 那里收到了10 個(gè)幣,并且持有90 d,那么Bob 就收集到了900 幣天的幣齡。如果Bob使用了從Alice收到的這10個(gè)幣,那么Bob從這10個(gè)幣上積累的幣齡就被消耗了[14],每消耗一定的幣齡都會(huì)產(chǎn)生一定的利息幣。PoS 中是通過權(quán)益來獲得記賬權(quán)的,權(quán)益大的節(jié)點(diǎn)獲得記賬權(quán)的概率較大。
PoS 機(jī)制雖然解決了PoW 大量浪費(fèi)算力和電力資源的問題,但正因?yàn)椴恍枰ㄙM(fèi)算力,記賬權(quán)來源于權(quán)益,所以挖礦幾乎是沒有成本的(nothing-at-stake)[15]。一旦惡意節(jié)點(diǎn)制造分叉鏈,對(duì)于其他節(jié)點(diǎn)來說,不管在哪條鏈上挖礦都沒有成本,他們可能會(huì)選擇在每一條鏈上都進(jìn)行挖礦,這樣無論最終哪條鏈被選作主鏈,都會(huì)獲得收益。如果大多數(shù)的礦工都選擇在所有分叉上挖礦,那么區(qū)塊鏈很可能被分叉,并且更容易遭到雙花攻擊,穩(wěn)定性無法保證。通過幣齡的計(jì)算方式可以看出,只要持幣不交易,幣齡是持續(xù)增長的,對(duì)應(yīng)的權(quán)益也是持續(xù)增長的,那么持幣較多的節(jié)點(diǎn)可能會(huì)選擇大量囤積代幣,一方面持幣吃息,另一方面獲取更大的權(quán)益,這樣就會(huì)導(dǎo)致某些節(jié)點(diǎn)的權(quán)益越來越大,帶來富者愈富的問題[16]。
針對(duì)PoW 出塊速度慢、交易等待時(shí)間長以及算力浪費(fèi)大等問題,PoWaS作出優(yōu)化方案:
1)降低哈希計(jì)算的難度,減少尋找隨機(jī)數(shù)所花費(fèi)的算力。將初始難度設(shè)為1,對(duì)應(yīng)難度值為6,即找到的Nonce拼接前一個(gè)區(qū)塊的hash值再進(jìn)行哈希計(jì)算得到的hash值的前6位為0,這樣礦工節(jié)點(diǎn)基本上只花數(shù)十秒就能找到Nonce,實(shí)驗(yàn)證明將在3.2節(jié)中詳細(xì)闡述。工作量證明算法如算法1所示。
算法1 工作量證明算法。
輸入 前一個(gè)區(qū)塊hash值preHash,難度值n;
輸出 隨機(jī)數(shù)nonce。
def hash(preHash,nonce):
str = f’{preHash}{nonce}’.encode()
return hashlib.sha256(str).hexdigest()
def proof(preHash,n):
nonce = 0
while hash(preHash,nonce)[:n]!= str(0).zfill(n):
nonce + = 1
return nonce
2)將出塊速度保持在1 min 左右,以獲得更快的交易確認(rèn)。設(shè)置一個(gè)競爭等待時(shí)間(wTime)為10 s,第一個(gè)找到Nonce 的節(jié)點(diǎn)立即向全網(wǎng)廣播,此時(shí)觸發(fā)wTime,此后10 s 內(nèi)找到的節(jié)點(diǎn)都有機(jī)會(huì)獲得記賬權(quán),10 s 之后還沒有找到的節(jié)點(diǎn)則失去獲得本次記賬權(quán)的機(jī)會(huì),停止計(jì)算。找到Nonce 所花費(fèi)的時(shí)間記為fTime,作為確定打包記賬權(quán)的一個(gè)因素。
3)將難度調(diào)整機(jī)制改為每創(chuàng)建720 個(gè)區(qū)塊調(diào)整一次,即每12 h左右調(diào)整一次難度。難度計(jì)算公式改為:
其中:newDiff 為新區(qū)塊的難度;oldDiff 為前一個(gè)區(qū)塊的難度;totalTime 為創(chuàng)建過去720 個(gè)區(qū)塊所花費(fèi)的總時(shí)長,單位為s。由于出塊速度在1 min 左右,所以43 200/totalTime 趨近于1,newDiff 和oldDiff 近似相等。如果算力增加,totalTime 就會(huì)小于 43 200 s,43 200/totalTime 大于 1,newDiff 將大于 oldDiff,難度增加;反之,算力減小,難度減小,以此來動(dòng)態(tài)調(diào)整計(jì)算難度。
針對(duì)PoS 可能會(huì)出現(xiàn)的節(jié)點(diǎn)權(quán)益無限增大的問題,PoWaS 設(shè)置了一個(gè)有效持幣時(shí)間(valueTime),并限制最大值為60 d,幣齡的計(jì)算公式為:
若持幣時(shí)間超過有效持幣時(shí)間最大值,則valueTime 停止增長,由式(4)可以看出超出的時(shí)長不會(huì)納入幣齡的計(jì)算,以此來限制幣齡的無限增長,并設(shè)置參與pStake 計(jì)算的幣齡最大值為2 000,防止由于幣齡無限增長而帶來權(quán)益無限增大問題。
引入信用值來反映節(jié)點(diǎn)的信用情況,為每個(gè)節(jié)點(diǎn)賦予一個(gè)信用值(cPoint),作為記賬權(quán)的一個(gè)參考因素,根據(jù)節(jié)點(diǎn)的行為增加和扣除信用值:用信用值獎(jiǎng)勵(lì)來調(diào)動(dòng)礦工節(jié)點(diǎn)的挖礦積極性,信用值扣除來減小節(jié)點(diǎn)作惡的幾率。
信用值采用1 000 分制,最高為1 000,每個(gè)節(jié)點(diǎn)的初始信用值為400,成功記賬后會(huì)獲得0.1 信用值獎(jiǎng)勵(lì),節(jié)點(diǎn)如果發(fā)生惡意行為,比如惡意分叉,將扣除20 信用值。若信用值較低,則對(duì)節(jié)點(diǎn)競爭記賬權(quán)進(jìn)行限制,具體規(guī)則如下:
1)信用值低于 400 高于 300 時(shí),限制 120 輪,即 2 h 左右無法參與記賬權(quán)競爭;
2)信用值低于 300 高于 200 時(shí),限制 720 輪,即 12 h 左右無法參與記賬權(quán)競爭;
3)信用值低于200高于100時(shí),限制4 320輪,即72 h左右無法參與記賬權(quán)競爭;
4)信用值低于100時(shí),剔除該節(jié)點(diǎn),取消其礦工資格。
限制規(guī)則算法如算法2所示。
算法2 根據(jù)信用值限制記賬權(quán)競爭
輸入 信用值cPoint,當(dāng)前區(qū)塊號(hào)begIndex;
輸出 限制狀態(tài)limitStatus,解除限制區(qū)塊號(hào)endIndex。
def limit_behavior(cPoint,begIndex):
if cPoint >= 400:
limitStatus = false
endIndex = begIndex
elif 400 > cPoint >= 300:
limitStatus = true
至此,我終于明白了。她所謂的“怕”,其實(shí)是面對(duì)弱者的遭遇無力提供幫助而產(chǎn)生的自責(zé),繼而形成的逃避行為。
endIndex = begIndex + 120
elif 300 > cPoint >= 200:
limitStatus = true
endIndex = begIndex + 720
elif 200 > cPoint >= 100:
limitStatus = true
endIndex = begIndex + 4320
else:
limitStatus = true
return{’limitStatus’:limitStatus,’endIndex’:endIndex}
記賬權(quán)競爭流程為:各礦工節(jié)點(diǎn)根據(jù)當(dāng)前的難度值進(jìn)行哈希計(jì)算尋找隨機(jī)數(shù)Nonce,使得該Nonce 拼接上前一個(gè)區(qū)塊的hash 值再進(jìn)行哈希計(jì)算后得到的hash 值的前n 位為0,n 等于難度值。當(dāng)某礦工找到Nonce 后,立即向全網(wǎng)廣播,此時(shí)觸發(fā)競爭等待時(shí)間wTime(為10 s),其他節(jié)點(diǎn)收到廣播后還有10 s 的計(jì)算時(shí)間,如果10 s 內(nèi)找到了Nonce,也立即向全網(wǎng)廣播,10 s后仍然沒有找到Nonce的節(jié)點(diǎn)失去本輪記賬機(jī)會(huì)。找到 Nonce 的節(jié)點(diǎn)根據(jù) fTime、coinAge 和 cPoint 這三個(gè)值計(jì)算出所有找到Nonce的節(jié)點(diǎn)的pStake值,pStake的計(jì)算公式為:
pStake = coinAge/1000 +(cPoint - fTime)/100 (5)
由于這里的coinAge 限制了最大值為2 000,cPoint 為100至1 000,fTime 為60 左右,根據(jù)式(5)可知,coinAge/1000 為 0至2,cPoint/100為1至10,fTime/100為0.6左右。這樣就降低了權(quán)益和算力的比重,提高了信用值的比重,強(qiáng)化了信用值對(duì)記賬權(quán)競爭的影響,有利于減少礦工節(jié)點(diǎn)作惡行為的發(fā)生。
若發(fā)現(xiàn)自己的pStake 最大,則將所有的pStake 信息以及自己打包好的區(qū)塊廣播至全網(wǎng),宣布自己獲得打包權(quán),其他節(jié)點(diǎn)收到信息后進(jìn)行驗(yàn)證,若驗(yàn)證通過,將收到信息中的區(qū)塊作為區(qū)塊鏈最后一個(gè)區(qū)塊進(jìn)行下一輪的挖礦計(jì)算;若發(fā)現(xiàn)自己的pStake不是最大的,則競爭失敗,等待獲得打包權(quán)節(jié)點(diǎn)的廣播信息。沒有找到Nonce 的節(jié)點(diǎn)停止計(jì)算,收到獲得記賬權(quán)的節(jié)點(diǎn)的廣播信息后,再進(jìn)行下一輪的計(jì)算。完整的記賬權(quán)競爭過程如圖1所示。
圖2 PoW機(jī)制下50次工作量證明計(jì)算結(jié)果Fig. 2 Work proof results of fifty times under PoW mechanism
圖1 記賬權(quán)競爭過程示意圖Fig. 1 Schematic diagram of accounting right competition process
使用Python3語言和Python Flask Web 框架編寫實(shí)現(xiàn)了一個(gè)區(qū)塊鏈原型,并使用PoWaS 共識(shí)機(jī)制搭建了一個(gè)測試區(qū)塊鏈,實(shí)驗(yàn)室6 臺(tái)配置不同的計(jì)算機(jī)作為區(qū)塊鏈節(jié)點(diǎn),從尋找隨機(jī)數(shù)所花時(shí)間、區(qū)塊鏈出塊時(shí)間以及記賬權(quán)競爭等方面進(jìn)行了實(shí)驗(yàn)。6個(gè)節(jié)點(diǎn)的配置信息如表1所示。
表1 節(jié)點(diǎn)配置信息Tab. 1 Node configuration information
PoWaS 通過調(diào)低難度值來降低PoW 部分尋找Nonce 的時(shí)間花銷,初始難度值設(shè)為6,即Nonce 拼接前一個(gè)區(qū)塊hash 值再進(jìn)行計(jì)算得出的hash值前6位為0,這樣可以將平均計(jì)算時(shí)間控制在1 min以內(nèi)。為了驗(yàn)證,將測試區(qū)塊鏈的共識(shí)機(jī)制修改為只使用難度值為6 的純PoW 機(jī)制,6 個(gè)節(jié)點(diǎn)分別進(jìn)行了50 次的工作量證明計(jì)算,記錄每次計(jì)算所花時(shí)間,統(tǒng)計(jì)后得到的結(jié)果如圖2所示。
從實(shí)驗(yàn)結(jié)果可以看出,在配置不同的6 個(gè)節(jié)點(diǎn)的50 次計(jì)算時(shí)間里,雖然除節(jié)點(diǎn)6以外的5個(gè)節(jié)點(diǎn)均出現(xiàn)了計(jì)算時(shí)間超過60 s 的情況,但絕大多數(shù)還是集中在小于40 s 的區(qū)間內(nèi)。由于哈希碰撞的不確定性,尋找隨機(jī)數(shù)所花時(shí)間并不一致,配置較低節(jié)點(diǎn)存在少數(shù)的計(jì)算時(shí)間超過60 s 的情況在所難免,但從全局來看影響并不大。該實(shí)驗(yàn)可以證明在難度值設(shè)為6的情況下,基本可以保證工作量證明的時(shí)間花銷控制在1 min以內(nèi)。
在實(shí)驗(yàn)所搭建的區(qū)塊鏈運(yùn)行一段時(shí)間后,在前50 個(gè)區(qū)塊中,以5 個(gè)區(qū)塊作為間隔,統(tǒng)計(jì)了10 個(gè)區(qū)塊的出塊時(shí)間,結(jié)果如圖3 所示。從圖3 中可以看出,曲線有輕微波動(dòng),但波動(dòng)幅度并不大,基本都在60 上下,可以證明PoWaS 共識(shí)機(jī)制下區(qū)塊鏈的出塊速度可以保持在1 min左右。
圖3 前50個(gè)區(qū)塊的出塊時(shí)間統(tǒng)計(jì)Fig. 3 Block mining time statistics of top fifty blocks
節(jié)點(diǎn)的初始信用值為400,實(shí)驗(yàn)將節(jié)點(diǎn)中算力最好的節(jié)點(diǎn)6 作為惡意節(jié)點(diǎn),在產(chǎn)生第6 個(gè)區(qū)塊時(shí),發(fā)生了惡意分叉行為,被扣除了20 信用值。統(tǒng)計(jì)前120 個(gè)區(qū)塊中每個(gè)節(jié)點(diǎn)的記賬次數(shù),得到的結(jié)果如圖4 所示。從實(shí)驗(yàn)結(jié)果可以看出,雖然節(jié)點(diǎn)4的算力最弱,但依然獲得了12次的記賬權(quán);算力最好的節(jié)點(diǎn)6 由于惡意分叉行為被扣除20 信用之后,信用值為380.4,低于400,被限制了120 輪的記賬權(quán),所以它的記賬次數(shù)僅為4。由此可以說明信用值和競爭等待時(shí)間的引入在一定程度上平衡了記賬權(quán)的競爭。
圖4 發(fā)生惡意分叉行為時(shí)各節(jié)點(diǎn)記賬次數(shù)統(tǒng)計(jì)Fig. 4 Statistics of node accounting times of various nodes when malicious bifurcation occurs
PoWaS 通過引入信用值來評(píng)估節(jié)點(diǎn)信用狀況,節(jié)點(diǎn)的作惡行為會(huì)被扣除信用值,信用值較低時(shí)就會(huì)受到限制甚至被剔除。通過2.4 節(jié)中對(duì)式(5)的分析可知,信用值在pStake值計(jì)算中的比重高于權(quán)益和算力的比重,這樣就降低了惡意節(jié)點(diǎn)獲得記賬權(quán)的幾率。通過3.4 節(jié)的實(shí)驗(yàn)結(jié)果可知,算力最好的節(jié)點(diǎn)6 因惡意行為被扣除信用值限制記賬權(quán)競爭后,僅獲得了4次記賬權(quán),遠(yuǎn)少于其他節(jié)點(diǎn)。
目前常見的對(duì)區(qū)塊鏈的攻擊方式有雙花攻擊、自私挖礦等。雙花攻擊就是同一筆資金多次交易,根據(jù)攻擊手段的不同又有51%攻擊、賄賂攻擊和重放攻擊等。
在PoW 機(jī)制下,51%攻擊的攻擊者需要擁有全網(wǎng)51%的算力才能制造一個(gè)分叉并使之成為主鏈,使得自己支付給其他節(jié)點(diǎn)的那筆交易失效。而在PoWaS 機(jī)制下,攻擊者不僅需要擁有全網(wǎng)51%的算力,還需要自己的權(quán)益足夠大、信用值足夠高才能順利地進(jìn)行雙花,否則不但會(huì)雙花失敗,而且還會(huì)受到扣除信用值的處罰,這是很難實(shí)現(xiàn)且得不償失的。賄賂攻擊的攻擊者則通過賄賂其他礦工節(jié)點(diǎn)來制造分叉,在PoWaS機(jī)制下,由于礦工都有信用值,在分叉上挖礦的惡意行為會(huì)被扣除信用值影響后續(xù)記賬權(quán)的競爭,礦工收受賄賂進(jìn)行惡意挖礦的意愿會(huì)比較低,也就增大了攻擊者的賄賂成本,很難實(shí)現(xiàn)成功賄賂全網(wǎng)超過51%的節(jié)點(diǎn)。當(dāng)區(qū)塊鏈有分叉鏈時(shí),可能會(huì)遭受重放攻擊,就是攻擊者將在主鏈上的交易到分叉鏈上重新廣播一次,實(shí)現(xiàn)雙花,PoWaS機(jī)制對(duì)于重放攻擊的防范,就是在分叉前盡可能多地改變分叉鏈的交易結(jié)構(gòu),使得主鏈和分叉鏈無法互通。
PoW 機(jī)制下,自私挖礦的攻擊者挖出區(qū)塊后不公開,產(chǎn)生秘密分叉,然后在該分叉上挖礦,待到一定的時(shí)機(jī)再公開并使該秘密分叉成為主鏈,使得在原主鏈上挖礦的誠實(shí)礦工付出算力而得不到收益,自己獲得更高算力比例的收益。在PoWaS機(jī)制下,由于記賬權(quán)受信用值影響,如果礦工選擇不公開新區(qū)塊,并制造分叉,那么自己的信用值也不會(huì)增長,再次獲得記賬權(quán)的幾率不斷降低,很難攻擊成功,反而還會(huì)因惡意分叉行為被扣除信用值。
本文提出的PoWaS 區(qū)塊鏈共識(shí)機(jī)制,針對(duì)PoW 和PoS 的缺陷,通過降低哈希計(jì)算的難度、限制最大有效持幣時(shí)間以及引入節(jié)點(diǎn)信用值的方式來作出改進(jìn)。實(shí)驗(yàn)環(huán)境利用Python3語言和Flask Web 框架搭建的測試區(qū)塊鏈在擁有6 個(gè)算力不同的節(jié)點(diǎn)的情況下,得出的實(shí)驗(yàn)結(jié)果在一定程度上證明了PoWaS 在減少算力浪費(fèi)、加快區(qū)塊出塊速度和平衡記賬權(quán)競爭方面具有一定效果。但PoWaS 仍然存在不足,下一步工作將會(huì)在出塊速度穩(wěn)定性和信用值調(diào)節(jié)方面加深研究,不斷完善該共識(shí)機(jī)制,進(jìn)一步提升其可用性。