王瑞錦,郭上銅,邱瑋鴻,張鳳荔
(電子科技大學信息與軟件工程學院 成都 610054)
區塊鏈作為一種分布式數據庫,最基本也是最核心的要求是所有的節點能對所保存的數據達成一致,因此共識機制一直是被研究的重點。區塊鏈共識算法[1-3]主要有工作量證明算法(proof-of-work,PoW)、權益證明算法(proof of stake, PoS)、股權權益證明算法(delegated proof-of-stake, DPoS)及拜占庭容錯算法(practical Byzantine fault tolerance, PBFT)。其中,PBFT 算法不適用于節點規模龐大的公共鏈;DPoS 算法存在周期過長、不能及時清理惡意節點的問題;PoW 算法存在大量算力浪費及電力浪費的問題,同時在交易吞吐量、延遲、確認時間等方面有較大缺陷;PoS 算法在一定程度上減輕了PoW 算法資源浪費、出塊時間長等問題,但“幣齡”[4]的出現也帶來了“富者愈富”的問題,同時該算法對代幣有較大依賴。
現有的區塊鏈可以分為公有鏈、私有鏈及聯盟鏈3 類。在公有鏈中,節點可以自由地加入或退出,無需身份審核,如比特幣、以太坊等平臺。私有鏈搭建在本地,不做公開用途。聯盟鏈的節點接入需要獲得許可,能在一定程度上保證網絡中節點的可靠性。但現有的區塊鏈平臺幾乎都是相互獨立的,每一個平臺之間的數據不能相互傳遞,形成事實上的“信息孤島”,不僅造成資源浪費也不利于區塊鏈整體行業的發展,跨鏈因此成為區塊鏈研究的一個重點方向。
針對上述情況,本文提出了一種基于信用投票共識機制(proof of vote and trust, PoVT)的跨鏈方案,并進行了測試,結果表明PoVT 的交易處理性能有較大提高,同時對權益粉碎攻擊、賄賂攻擊及自私挖礦攻擊等都有較好的防御能力。本文的主要工作有:1) 構建了一個主從多鏈的分層跨鏈模型,實現了從鏈與從鏈之間的數據跨鏈;2) 提出了一種基于信用投票機制的共識算法(PoVT),解決了PoS 共識可能出現的權益粉碎攻擊、“富者愈富”問題以及通過投票和隨機選擇出塊者的方式解決了通過算力競爭記賬權的問題;3) 從鏈的所有區塊信息在主鏈上通過PBFT 算法完成共識,保證了從鏈區塊信息的安全性和不可篡改性,實現從鏈到主鏈的單向數據傳遞。
PoW 算法通過算力競爭將記賬權分配給全網所有節點,獲得記賬權的誠實節點能得到一定的數字貨幣作為貢獻算力等資源的獎勵。但PoW 算法也浪費了大量的算力與電力資源,且10 min 一個的出塊速度也限制了其商業價值。除此之外,PoW算法還容易遭到自私挖礦(selfish mining)[5]攻擊,攻擊者不需要掌握超過51%的算力,只需要掌握全網1/3 的算力即可發起攻擊。本文提出的基于信用投票機制的共識算法通過引入投票機制來決定記賬權的歸屬問題,解決了PoW 中自私挖礦、51%攻擊等問題,在保證系統的穩定性與公平性的同時解決了由算力競爭帶來的資源浪費等問題。
PoS 共識的出現對解決PoW 共識所消耗的大量算力與電力起到了一定的緩解作用,且加速出塊時間也能提高對交易的處理速度和吞吐量,但PoS 本質上還是需要通過哈希運算來競爭記賬權,且“幣齡”的存在也降低了數字貨幣的流通性。對PoS 算法的研究有:文獻[6]提出了PoC(proof of credit)共識機制,在PoS 共識的基礎上引入信用值作為一種特殊的權益,通過提出的選舉人機制、自我審計機制以及混合激勵機制使系統能夠抵御雙花攻擊以及自私挖礦攻擊;文獻[7]提出了一種基于PoS 的抽獎共識機制來選擇出塊者,節點將自己擁有的權益分成更小的單元,然后通過哈希算法得到一個哈希值,而擁有與哈希值最接近的單元的節點成為出塊節點,通過這種方法徹底解決了PoS 本質上還是要通過哈希運算來競爭記賬權的缺點,同時也增加了PoS 的可擴展性。
PoS 通過引入“幣齡”來解決PoW 中的51%攻擊以及資源浪費等問題。原理是,持幣越多的人越希望系統能夠穩定從而使自己的利益不受損害,但“幣齡”的存在同樣也帶來一些問題,如持幣越多的人越容易得到記賬權,導致“富者越富”,從而使得像權益粉碎攻擊、賄賂攻擊等更頻繁發生。而本文提出的基于信用投票機制的共識算法通過給節點賦予信用值的方式降低了權益的影響,同時也降低了上述攻擊對系統產生的影響。
本文提出了PoVT 共識算法。該共識通過引入投票機制和信用值,提高了共識效率的同時保證了系統的安全性。在此基礎上,構建了一個從鏈基于PoVT 共識,主鏈基于PBFT 共識的主從多鏈分層跨鏈模型。
模型中的節點被分成4 種角色:普通節點No、投票節點Nv、生產節點Np、候補節點Nc、代表節點Nm。同時將時間劃分為一個個時間片段,每一個時間片為一個時隙,從鏈在每個時隙完成校驗、出塊到上鏈的全過程,而一個周期則由許多個時隙組成,此外在每一個周期的最后一個時隙結束后,代表節點將該周期所有已確認的區塊數據上傳至主鏈網絡中。在每一個周期開始前會根據節點的權益以及信用值(STrust 值)從希望參與共識的節點中選擇一些節點組成一個共識節點集合N={(A1,S1,STrust1), (A2,S2, STrust2), ···, (An,Sn, STrustn)}。該集合中的節點由生產節點、投票節點、候補節點3 種角色組成。其中生產節點從交易池中取出交易并打包組裝成區塊;投票節點對數據進行驗證并投票;候補節點負責在生產節點或投票節點因為某些原因無法繼續提供服務時,遞補成為該角色繼續行使使命,保證了系統的安全性與穩定性。在集合N形成后,通過PoVT 共識來決定每一個時隙產生區塊的生產節點編號,同時在這個過程中通過運行梅森旋轉算法[8]生成一個偽隨機數來產生組成主鏈的代表節點的編號。集合N中的節點允許同時擁有主鏈和從鏈的雙重身份,主鏈節點負責將其所在主體每一周期內已被確認的區塊數據上傳至主鏈網絡中,主鏈節點之間再通過PBFT 算法對數據達成共識,形成一條主鏈。系統的結構如圖1 所示。

圖1 系統結構圖
2.2.1 準備階段
在集合N={(A1,S1, STrust1), (A2,S2, STrust2), ···,(An,Sn, STrustn)}中,節點的個數|N|=Nump+Numv+Numc,A為節點的公鑰地址,S為節點的權益,STrust 值為節點的信用值,Nump為生產節點的個數,Numv為投票節點的個數,Numc為候補節點的個數。將集合中的節點進行編號,編號1~Nump的節點成為生產節點,編號Nump+1~Nump+Numv的節點為投票節點,剩下的個數為Numc的節點成為候補節點,普通節點No不參與共識但需同步最新數據塊至本地。
2.2.2 基于投票和信用機制的PoVT 共識
PoVT 共識中的投票機制[9]避免了節點之間的算力競爭,引入的信用機制能夠保證參與共識的節點的可靠性,同時降低權益對記賬權分配的影響,從而增大對系統發起權益粉碎攻擊、雙花攻擊、自私挖礦攻擊等的難度。
1)共識流程
網絡中的普通節點產生交易數據,① 在周期開始前,根據節點的權益及STrust 值形成一個共識節點集合。② 在集合中從范圍為(1, 2, ···, Nump)的生產節點中選擇編號與隨機數R相同的節點成為出塊節點,該節點從交易池中取出一些交易打包并組裝成區塊,隨后將區塊廣播給投票節點并準備接受投票節點的反饋消息。在這一階段,如果要產生的區塊是創世區塊的話,則R為1。如果為非創世區塊的話,隨機數由上一生產節點在生成新區塊的過程中產生。③ 投票節點在收到生產節點發出的區塊驗證請求后,對區塊中的數據進行驗證,驗證無誤后簽名并加蓋時間戳(timestamp),并廣播確認信息。若發現數據有誤,則廣播一個拒絕消息。④ 生產節點在收到Numv/2+1 個投票節點的確認消息后則表明已對該區塊達成共識,生成一個記錄此時時間的時間戳,然后對該區塊進行后續的簽名、廣播等操作。反之,若網絡中存在超過Numv/2+1 個投票節點發出拒絕消息則判定該生產節點有惡意行為,立即取消該節點的共識資格并由編號為R+1的生產節點繼續進行共識流程(若R+1>Nump,則從第一個生產節點開始),同時在候補節點中根據編號順序遞補成為新的生產節點。⑤ 每個被選擇的生產節點都被要求在一個時間Tb內完成出塊,若超過這個時間還沒能完成出塊則由編號為R+1(若R+1>Nump,則從第一個生產節點開始)的生產節點繼續完成下一個區塊的產生。⑥ 在每一輪周期結束后,成功參與共識的節點會獲得STrust值獎勵。相應地,有惡意行為的節點也會受到降低STrust 值的懲罰,則該節點后續想要參與共識的難度增加。共識流程如圖2 所示。

圖2 共識流程圖
2)隨機數R的產生
除了生成創世區塊的R值默認為1 之外,每一個生產節點生成區塊的同時也產生一個記錄在區塊中的隨機數R來決定誰是下一個生產節點,隨機數R生成的過程如下:
生產節點在向投票節點提交區塊后同時收集投票節點的反饋消息,即Signature[i](1≤i≤Numv),同時根據時間戳TimeStamp 由式(1)得到Rsource:

通過這種方式隨機地選擇生產節點,避免了當前生產節點出于利益考慮而干擾下一生產節點的選擇,能夠有效地預防節點之間地共謀攻擊,也保證了共識過程的公平與穩定。
信用機制通過綜合考慮一個節點的有效出塊數、有效投票數、參與度等因素,使用STrust 值來定量地描述一個節點的可信度,再結合節點本身的權益來決定節點是否能夠參與共識過程。
1) 節點有效出塊數。即生產節點在整個周期內生成的有效區塊的數量。若一個生產節點在屬于它的時隙內成功生成一個通過驗證的區塊,則認定該節點生成一個有效區塊。反之,為無效區塊。節點有效投票數γ 表示為:

2) 節點有效投票數。即節點在整個周期內投出的有效票數。若節點在正確驗證區塊及數據無誤后按要求簽名確認則認定為有效投票。與此同時,若節點對某一區塊投出了確認票,但在該時隙內網絡中存在超過Numv/2+1 個拒絕消息,則認定該節點的此次投票無效。節點的有效投票數表示為:

式中,Vis表示節點i在第s個時隙內是否投出有效票,若是則為1,不是則為-1;m為該周期內總的時隙數;n為節點i在該周期內實際參與的時隙數;b(b∈[0,1])為權重。
3) 節點參與度。即節點參與交易的情況。節點參與度λ 可表示為:

式中,trans表示的是節點i在第s個時隙內產生的區塊中參與的交易數,若節點i是交易發送者或接收者其中一方則為1,否則為0;f(f∈[0,1])為權重。
4) 歷史信用影響度。節點的歷史信用影響度是指節點的信用值受其歷史信用值與權益的影響。節點的歷史信用影響度ε 可表示為:

5) 懲罰因子。為確保系統能夠安全穩定地運行,需要采取措施對節點的一些惡意行為進行懲罰。懲罰因子θ 表示為:

6) 節點信任度更新公式
周期結束后,系統會根據公式評價共識節點的行為,更新其信用值。信用值更新公式可表示為:

同時,若節點因為作惡而導致STrust 值降至系統設定的閾值以下,則會被限制為每隔若干個周期才能參與一次共識,且若節點持續作惡直至STrust 值降為0,則該節點將會永久喪失參與共識的資格。
主鏈節點從集合N中選擇,利用從鏈生產節點計算隨機數R的過程中得到的中間數據R′作為梅森旋轉算法(MT19937-32)的種子得到一個隨機數Rm,再從集合N中選擇編號與Rm相同的節點作為代表節點構成主鏈。Rm的計算過程如下:
首先將R′作為種子賦值給MT[0],根據式(10)遞推得到剩下的623 個狀態,完成全部624 個狀態的填充。

然后對得到的旋轉鏈進行遍歷并根據式(11)對每一個狀態位進行處理:

式中,m的取值為397;||表示將MT[i]的高1 位和MT[i+1]的低31 位組合,設組合后的數字為x,則xA的運算規則為:


式中,|N|是指集合N中生產節點、投票節點、候補節點的數量總和。選取節點編號與Rm相同的節點成為主鏈節點,再由主鏈節點構建一條主鏈,完成主鏈上的事務處理。
在從鏈的生產節點生成了隨機數Rm后將之寫進新生成的區塊中,在每一周期最后一個從鏈區塊產生后,集合N中所有編號與寫入各區塊中的Rm相同的節點成為代表節點,代表節點將自己所在從鏈中已確認的區塊數據上傳至主鏈網絡中,隨后參與共識并將主鏈區塊保存至本地。為了保證主鏈上保存的從鏈區塊數據都是真實完整、未被篡改的,代表節點在打包之前會檢查被上傳的從鏈區塊數據的上傳次數,只有被不少于其所在從鏈中一半以上的代表節點上傳過的從鏈區塊數據才能被主鏈節點打包上鏈。當主鏈節點確保所打包信息都符合要求后,在主鏈上通過PBFT 共識算法達成共識,完成信息在主鏈上的完整上鏈過程。
如圖1 所示,每一周期被選擇成為主鏈節點的各從鏈代表節點(P1、P2)會將自己所在從鏈本周期產生的區塊(A1、B1、C1、D1)上傳至主鏈網絡中,同時參與主鏈共識,在共識完成后各代表節點同樣保存主鏈區塊至本地網絡中,每一個代表節點(P1、P2)保存的主鏈區塊中都包含來自不同從鏈的區塊數據(A2、B2、A3、B3···)供其所在從鏈其余節點(A1、B1、C1、D1)查詢,從而完成不同從鏈之間的數據跨鏈。
在PoS 網絡中,擁有較低權益的節點挖出區塊的可能性同樣很低。另一方面,擁有較低權益的節點就更有可能去嘗試分叉,因為在PoS 網絡中節點產生區塊并不需要投入大量的算力等資源,即使分叉失敗也只是損失較小的權益,而一旦攻擊成功則能獲取大量利益。在PoVT 中,生產者只負責組裝區塊,還要經過投票節點的確認才能發布區塊,且一個時隙內一個生產者最多只被允許產生一個區塊,所以攻擊者是無法發起權益粉碎攻擊的。
自私挖礦的攻擊者在挖出區塊后選擇不將挖出的區塊發布出去,而是在已挖出的區塊上繼續挖出新的區塊,當自己的秘密分叉超過主鏈的長度時,就將秘密分叉發布出來取代原來的主鏈成為新的最長鏈,使自己獲得更多的收益。這種攻擊不僅嚴重損害了原來主鏈上的誠實礦工的權利,而且還會造成數據丟失等危害區塊鏈穩定性的情況。但在PoVT機制下,出塊者是在生產節點中通過投票機制隨機選擇出來的,同時生產節點的選擇則受到STrust值的影響,且生產節點如果不能在規定的時間內產生區塊的話不僅得不到STrust 值的獎勵反而STrust 值會下降,這樣導致節點之后成為共識節點的概率降低,從而使攻擊難以成功:


雙花攻擊是所有區塊鏈網絡都必須要解決的威脅。傳統的雙花攻擊的步驟是:1) 攻擊者發起一個交易;2) 在交易上鏈后,攻擊者在該交易之前的一個區塊上建立一個包含新交易的分叉;3) 而當分叉的長度超過原主鏈時,攻擊者將其發布從而取代原主鏈成為新的最長鏈,此時原交易被新的交易所取代。而在主從多鏈分層跨鏈系統中,從鏈的區塊數據不僅會被保存在從鏈節點上,還會通過代理節點上傳至主鏈中,在經過主鏈共識后形成主鏈區塊保存至主鏈節點中。若想發起雙花攻擊,不僅需要改變從鏈的區塊信息,同時還要改變相應的主鏈節點上的區塊信息,成本巨大,攻擊難以實現。
實驗在Docker18.10 上搭建了一個從鏈基于PoVT,主鏈基于Fabric 的主從多鏈分層跨鏈原型系統,實驗的操作系統為Ubuntu18.04。實驗的主要測試目的是測試該主從多鏈跨鏈分層共識機制的每秒交易處理速度、節點信用值增加以及節點作惡后信用值受到的懲罰。本文將實驗的節點設置為11 個,分別是5 個投票節點、4 個生產節點、2 個候補節點,同時將一個周期劃分為10 個時隙,每個時隙經歷出塊到上鏈的全過程。將STrust 的閾值設置為30,當節點的STrust 值低于30 時,設定為節點必須要每隔5 個周期才能參與以此共識。
為了能夠更加靈活地調整系統節點的信用值增長,本文對參與信用值評價的參數都設置了權重。每一輪周期參與共識的節點以及節點參與共識所扮演的角色都不盡相同,所以選取了某一個節點在不同的權重下參與共識的信用值增長。
如圖3 所示,本文權重分別取值為1、0.5、0.1??梢缘玫?,權重能對節點STrust 值的增長有一個較好的調節,權重較高時,節點的STrust 值能快速上升,最終達到設定的最大STrust 值300。同時,隨著權重的減小,節點的STrust 值的增長變得緩慢,但最終也能達到最大值。這保障了不同節點規模的系統的穩定性,當節點規模較小時,可以將權重加大,而在節點規模較大的網絡則將權重降低,這樣網絡中的節點的STrust 的增長速度能保持大致相同,不至于產生少數節點的STrust 值增長過快從而危及系統安全性和穩定性的情況。

圖3 節點信用值增長
節點正常參與共識時STrust 值會保持一個增長的狀態,但如果節點在參與共識時有作惡行為,如投票節點未能誠實投票及出塊節點打包的區塊中包含被篡改的交易等情況時,節點會立即喪失本周期共識資格,同時在周期結束時受到STrust 值降低的懲罰。如圖4 所示,Δ 線表示節點正常參與共識時STrust 值的變化情況,可以看到在第40 個周期時節點的STrust 值達到最大值。*線在前15 個周期時正常參與共識,而在第15 個周期時節點開始作惡,這時節點的Strust 值快速下降到30 以下,此后節點被限制為每隔5 個周期才能參與一次共識,此時若節點還是持續作惡,當STrust 值降至0 時節點將被永久剝奪參與共識的資格,而從●線可以看到節點在第35 個周期時開始正常參與共識,但直到第45 個周期才將STrust值升至30 以上,而此時正常參與共識的節點的STrust 早已達到最大值,所以由此可以看出節點若作惡,將付出巨大的STrust 值代價,從而影響節點參與共識的難度,是一種得不償失的行為。

圖4 節點信任度懲罰對比
每秒交易處理量(transaction per second, TPS)即用區塊打包的交易數除以區塊的生成時間,系統的每秒交易處理量能夠衡量系統的交易處理性能。本文一共進行了50 個周期共識,產生500 個區塊。實驗中的以太坊網絡采用標準的設置,平均每15 s 生成一個區塊,同時設置從鏈的Tb值為10,即每10 s 產生一個區塊,實驗結果如圖5 所示。在采用標準以太坊網絡中的TPS 平均值為49,而在采用PoVT 的單挑從鏈中的TPS 在60 左右波動,平均值為63。而在采用PBFT 共識的主鏈網絡中的TPS 在45 左右波動,平均值為47??梢钥吹讲捎肞oVT 的從鏈的交易處理速度是要優于以太坊網絡的以及整個跨鏈模型的交易處理速度是比較理想的。

圖5 節點每秒交易處理量
近年來,區塊鏈的發展取得了長足進步。但單一的共識機制仍然存在一定程度的缺陷,并且單鏈形式已經不足以滿足區塊鏈的發展。本文提出了一種基于信用投票機制的共識算法,能夠在避免算力競爭的條件下更加公平地分配節點的記賬權,并且通過對節點賦予信用值來激勵節點積極參與共識,同時也能對節點的惡意行為做出相應懲罰。但PoVT 共識仍然存在一些不足,下一步的工作將針對信用值調節以及交易處理速度穩定性方面進行優化。
本文研究工作還得到網絡與數據安全四川省重點實驗室開放課題(NDSMS201606)的資助,在此表示感謝。