沈 瑞,李玲娟
(南京郵電大學(xué) 計(jì)算機(jī)學(xué)院,江蘇 南京 210023)
比特幣誕生于2008年,由一個(gè)化名為中本聰?shù)膶W(xué)者在論文中首次提出[1],其背后的區(qū)塊鏈技術(shù)得到越來(lái)越多的重視與發(fā)展。區(qū)塊鏈?zhǔn)且环N計(jì)算機(jī)技術(shù)在價(jià)值互聯(lián)網(wǎng)時(shí)代的創(chuàng)新應(yīng)用模式,是數(shù)據(jù)庫(kù)、密碼學(xué)、網(wǎng)絡(luò)技術(shù)等多種技術(shù)整合集成的結(jié)果,具有去中心化、去信任化、集體維護(hù)、不可篡改等特點(diǎn)[2]。從數(shù)據(jù)的角度,可以把區(qū)塊鏈看成由一個(gè)個(gè)區(qū)塊組成,區(qū)塊記錄著經(jīng)過(guò)驗(yàn)證的、區(qū)塊創(chuàng)建過(guò)程中發(fā)生的所有交易記錄。近年來(lái),區(qū)塊鏈技術(shù)的價(jià)值不斷被挖掘,在金融、身份驗(yàn)證、社交通訊等多個(gè)領(lǐng)域都有著廣泛的應(yīng)用,并得到了許多國(guó)家政府的高度重視。
共識(shí)算法是區(qū)塊鏈技術(shù)的核心,用于解決在去中心化的分布式互連網(wǎng)絡(luò)中,如何判斷區(qū)塊數(shù)據(jù)正確性和所有權(quán),以使所有的節(jié)點(diǎn)達(dá)成共識(shí)的問(wèn)題[3]。由于應(yīng)用場(chǎng)景的不同,共識(shí)算法的側(cè)重點(diǎn)也不同。公有鏈大部分采用PoW算法[4]、PoS算法[5]、DPoS算法[6]和它們的變形算法,而目前落地的實(shí)際應(yīng)用大多數(shù)基于聯(lián)盟鏈運(yùn)行,其采用的共識(shí)算法主要是基于消息傳遞,主流算法有PBFT算法[7]、Paxos算法[8]和Raft算法[9]。
PBFT算法在區(qū)塊鏈中得到廣泛應(yīng)用,但也存在一些不足,不能完全適應(yīng)所有的應(yīng)用場(chǎng)景。為了解決PBFT算法通信開(kāi)銷大、節(jié)點(diǎn)參與共識(shí)的積極性不夠高等問(wèn)題,該文提出一種基于積分制的改進(jìn)的實(shí)用拜占庭算法(improved practical Byzantine algorithm based on point system,P-PBFT)。
按照應(yīng)用場(chǎng)景和設(shè)計(jì)體系的不同,區(qū)塊鏈可分為公有鏈、聯(lián)盟鏈、私有鏈[10]。
(1)公有鏈。
公有鏈所有節(jié)點(diǎn)都對(duì)外開(kāi)放,每個(gè)人都可以從公有鏈中讀取數(shù)據(jù),發(fā)送交易。在公有鏈上,每個(gè)節(jié)點(diǎn)都可以自由加入或者退出,網(wǎng)絡(luò)運(yùn)行時(shí)以扁平、無(wú)分層的對(duì)等網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)相互連通,不存在任何中心化的服務(wù)節(jié)點(diǎn),是一種完全去中心化的區(qū)塊鏈[11]。訪問(wèn)門檻低,數(shù)據(jù)公開(kāi)透明且無(wú)法篡改、匿名性等是其主要特點(diǎn),比特幣就是公有鏈的典型代表。
(2)私有鏈。
私有鏈?zhǔn)侵竻^(qū)塊鏈的開(kāi)發(fā)與維護(hù)由一個(gè)組織統(tǒng)一管理,各個(gè)節(jié)點(diǎn)的讀取權(quán)限與寫入權(quán)限由該組織決定,不對(duì)公共網(wǎng)絡(luò)開(kāi)放的區(qū)塊鏈[12]。私有鏈雖然節(jié)點(diǎn)權(quán)限有所限制,但區(qū)塊鏈網(wǎng)絡(luò)仍然運(yùn)行在多個(gè)節(jié)點(diǎn),其數(shù)據(jù)的安全性依舊會(huì)得到一定的保證。與公有鏈相比,私有鏈具有處理交易速度快、交易成本低、隱私保護(hù)好等特點(diǎn)。
(3)聯(lián)盟鏈。
聯(lián)盟鏈?zhǔn)且环N介于公有鏈和私有鏈之間的區(qū)塊鏈,通常應(yīng)用于不同的企業(yè)或組織之間。鏈上節(jié)點(diǎn)都有著相對(duì)應(yīng)的實(shí)體,不同的實(shí)體組成聯(lián)盟,節(jié)點(diǎn)的加入需要聯(lián)盟授權(quán),參與者共同維護(hù)區(qū)塊鏈的運(yùn)行。聯(lián)盟鏈的讀取權(quán)限對(duì)所有節(jié)點(diǎn)開(kāi)放,寫入和驗(yàn)證權(quán)限則需要聯(lián)盟內(nèi)部決定,屬于部分去中心化區(qū)塊鏈。目前已有很多聯(lián)盟鏈,比較知名的有超級(jí)賬本(hyperledger)項(xiàng)目[13]。
共識(shí)算法起源于分布式系統(tǒng)領(lǐng)域,傳統(tǒng)共識(shí)算法一般面向分布式數(shù)據(jù)庫(kù)操作。而在區(qū)塊鏈環(huán)境下,更多的是面對(duì)拜占庭容錯(cuò)問(wèn)題[14],傳統(tǒng)共識(shí)算法不能很好地解決這類問(wèn)題,因此一系列新的共識(shí)算法被提出。常用共識(shí)算法如下:
(1)工作量證明(proof of work,PoW)。
PoW的核心思想是通過(guò)分布式節(jié)點(diǎn)的算力競(jìng)爭(zhēng)來(lái)保證數(shù)據(jù)的一致性和共識(shí)的安全性。而在區(qū)塊鏈中,比特幣系統(tǒng)則是這一算法的最早實(shí)踐者,比特幣系統(tǒng)的各節(jié)點(diǎn)通過(guò)計(jì)算一個(gè)求解復(fù)雜但是驗(yàn)證容易的SHA256數(shù)學(xué)難題來(lái)競(jìng)爭(zhēng)記賬權(quán),最快解決該難題的節(jié)點(diǎn)將獲得下一區(qū)塊的記賬權(quán)和系統(tǒng)自動(dòng)生成的比特幣獎(jiǎng)勵(lì)。
PoW算法雖有效地保證了區(qū)塊鏈網(wǎng)絡(luò)的安全性和去中心化性,但其缺點(diǎn)也十分顯著。PoW算法需要節(jié)點(diǎn)進(jìn)行大量的計(jì)算,但這種計(jì)算不具有現(xiàn)實(shí)意義,只會(huì)帶來(lái)大量的電力資源消耗,且需要的交易確認(rèn)時(shí)間過(guò)長(zhǎng),不適合一般的商業(yè)應(yīng)用。
(2)權(quán)益證明(proof of stake,PoS)。
權(quán)益證明是為了彌補(bǔ)工作量證明的一些不足而誕生的,在權(quán)益證明機(jī)制中,記賬權(quán)的歸屬不再是算力最高的節(jié)點(diǎn),而是具有最高權(quán)益的節(jié)點(diǎn)。權(quán)益體現(xiàn)在節(jié)點(diǎn)對(duì)于虛擬貨幣的所有權(quán),在最早的PoS應(yīng)用Peercoin中,權(quán)益被稱為幣齡。一個(gè)節(jié)點(diǎn)的幣齡越長(zhǎng),其在區(qū)塊鏈系統(tǒng)中的權(quán)力越大,挖礦的難度越低,所獲得獎(jiǎng)勵(lì)也越多。
與PoW算法相比,PoS算法共識(shí)過(guò)程主要依靠系統(tǒng)內(nèi)部的權(quán)益,而不需要消耗太多外部算力和資源,因此可以有效地解決PoW中算力浪費(fèi)的問(wèn)題,并且能夠在一定程度上縮短達(dá)成共識(shí)的時(shí)間,提升系統(tǒng)運(yùn)行性能。
(3)委任權(quán)益證明(delegated proof of stake,DPoS)。
DPoS算法由比特股項(xiàng)目提出,是PoS算法的一種演化版本。DPoS算法采用了類似董事會(huì)投票的機(jī)制,系統(tǒng)中每個(gè)節(jié)點(diǎn)都是股東,權(quán)益相當(dāng)于選舉票,每個(gè)節(jié)點(diǎn)都可以把自己的選舉票投給信任的代表。最后得票最高的一部分節(jié)點(diǎn)成為董事會(huì)成員,按照既定的時(shí)間表輪流對(duì)交易進(jìn)行打包結(jié)算、并且生產(chǎn)新區(qū)塊。相比于PoS算法,DPoS減少了參與驗(yàn)證區(qū)塊的節(jié)點(diǎn)數(shù)量,區(qū)塊可以得到更快的確認(rèn),區(qū)塊鏈系統(tǒng)的性能得到了進(jìn)一步的提升。
(4)實(shí)用拜占庭容錯(cuò)(practical Byzantine fault tolerance,PBFT)。
拜占庭容錯(cuò)算法BFT最早由Pease和Lamport在20世紀(jì)80年代提出,不同于以上幾種共識(shí)算法,BFT類協(xié)議是依靠節(jié)點(diǎn)之間相互傳遞消息來(lái)對(duì)提案達(dá)成確定性共識(shí)結(jié)果,因此早期的拜占庭系統(tǒng)需要指數(shù)級(jí)的操作,所以未能得到實(shí)際應(yīng)用。直到1999年Miguel Castro和 Barbara Liskov提出了PBFT(實(shí)用拜占庭容錯(cuò))算法,解決了原始BFT算法的信息傳輸復(fù)雜度太高的問(wèn)題,由此實(shí)用拜占庭容錯(cuò)算法在實(shí)際系統(tǒng)中變得可行[15]。而在區(qū)塊鏈環(huán)境下,實(shí)用拜占庭容錯(cuò)算法多使用于聯(lián)盟鏈中。
區(qū)塊鏈與P2P的出發(fā)點(diǎn)都是去中心化。
P2P網(wǎng)絡(luò)即對(duì)等網(wǎng)絡(luò),是在同等地位的節(jié)點(diǎn)之間分配計(jì)算任務(wù)與網(wǎng)絡(luò)負(fù)載的分布式網(wǎng)絡(luò)架構(gòu)[16]。P2P網(wǎng)絡(luò)模型與客戶端/服務(wù)器模型不同,P2P網(wǎng)絡(luò)中沒(méi)有客戶端或服務(wù)器的概念,不存在中心節(jié)點(diǎn),只存在對(duì)等的同級(jí)節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)既尋求服務(wù),同時(shí)也提供服務(wù)。P2P網(wǎng)絡(luò)中的節(jié)點(diǎn)沒(méi)有數(shù)量、范圍、時(shí)間或空間上的限制,每個(gè)節(jié)點(diǎn)都可以自由地加入或退出P2P網(wǎng)絡(luò)。
P2P網(wǎng)絡(luò)具有去中心化、可擴(kuò)展性、健壯性、高性價(jià)比、隱私保護(hù)和負(fù)載均衡的特點(diǎn)[17]。在P2P網(wǎng)絡(luò)中,節(jié)點(diǎn)不需要服務(wù)器即可提供資源和服務(wù),避免了中心服務(wù)器的瓶頸,且起到了負(fù)載均衡的效果。
從技術(shù)上來(lái)講,區(qū)塊鏈就是應(yīng)用P2P的網(wǎng)絡(luò)架構(gòu),通過(guò)密碼學(xué)來(lái)保證數(shù)據(jù)的安全,通過(guò)共識(shí)算法來(lái)保證數(shù)據(jù)的一致性。P2P一般存在4種網(wǎng)絡(luò)模型,分別是:集中式、純分布式、混合式和結(jié)構(gòu)化模型。區(qū)塊鏈應(yīng)用依據(jù)自身的實(shí)際情況選擇不同的P2P網(wǎng)絡(luò)模型,比特幣采用的是混合式網(wǎng)絡(luò)模型,而以太坊采用的則是結(jié)構(gòu)化網(wǎng)絡(luò)模型。
Merkle樹屬于區(qū)塊鏈數(shù)據(jù)層,是區(qū)塊鏈中重要的數(shù)據(jù)結(jié)構(gòu),其基本結(jié)構(gòu)如圖1所示。
圖1 Merkle樹
該樹的每個(gè)葉子節(jié)點(diǎn)值是對(duì)應(yīng)數(shù)據(jù)的哈希值,非葉子節(jié)點(diǎn)是它的兩個(gè)子節(jié)點(diǎn)合在一起的哈希值,依次疊加,直到計(jì)算出整棵樹的根節(jié)點(diǎn),最后生成Merkle根。Merkle根是由所有葉子節(jié)點(diǎn)值得到的,因此只要驗(yàn)證Merkle根是否相等,就可以知道葉子節(jié)點(diǎn)的數(shù)據(jù)是否有改動(dòng)。在分布式系統(tǒng)中,Merkle樹可以快速驗(yàn)證在傳輸過(guò)程中數(shù)據(jù)否發(fā)生變化,大大降低了計(jì)算復(fù)雜度。
加密算法是區(qū)塊鏈中不可缺少的一個(gè)環(huán)節(jié),在區(qū)塊鏈中所涉及的加密技術(shù)主要包括非對(duì)稱加密、哈希算法和數(shù)字簽名。
非對(duì)稱加密算法是指在對(duì)數(shù)據(jù)進(jìn)行加密和解密過(guò)程中使用不同密鑰的一種加密算法。非對(duì)稱加密過(guò)程中使用的密鑰成對(duì)產(chǎn)生,其中公開(kāi)的密鑰叫公鑰,任何人都可以獲取,非公開(kāi)的密鑰叫私鑰,對(duì)外是保密的。公鑰與私鑰都可以用來(lái)加解密,如果用私鑰對(duì)信息進(jìn)行加密,只能用公鑰解密信息。如果用公鑰對(duì)信息進(jìn)行加密,只能用私鑰解密信息。與對(duì)稱加密相比,非對(duì)稱加密無(wú)需交換密鑰且算法強(qiáng)度高,所以具有更高的安全性,但是其加解密過(guò)程復(fù)雜度高且耗費(fèi)時(shí)間較長(zhǎng),一般只適合加密少量數(shù)據(jù),適用于數(shù)字簽名、登錄驗(yàn)證等場(chǎng)景。常見(jiàn)的非對(duì)稱加密算法有ECC(橢圓曲線加密)算法和RSA加密算法等。相比RSA,ECC優(yōu)勢(shì)是可以使用更短的密鑰來(lái)實(shí)現(xiàn)與RSA相當(dāng)或更高的安全性。
哈希函數(shù)也稱散列函數(shù),是一種單向映射函數(shù)。哈希函數(shù)將輸入數(shù)據(jù)通過(guò)哈希算法生成特定長(zhǎng)度的值,該值就稱之為哈希值。哈希函數(shù)具有單向性、不可逆等特征,逆向求解哈希函數(shù)十分困難,幾乎不能通過(guò)現(xiàn)有的哈希值反推出原文,因此可以有效保證信息的安全性。通過(guò)散列算法運(yùn)算求得的哈希值具有固定長(zhǎng)度,且哈希值遠(yuǎn)遠(yuǎn)小于輸入長(zhǎng)度,壓縮性保證了任意長(zhǎng)度消息壓縮映射得到確定長(zhǎng)度散列值。哈希函數(shù)具有高度靈敏性,如果輸入的數(shù)據(jù)發(fā)生字節(jié)變化,那通過(guò)哈希運(yùn)算得到的哈希值可能完全不同。哈希函數(shù)在區(qū)塊鏈中發(fā)揮了極其重要的作用,可以進(jìn)行數(shù)據(jù)驗(yàn)證、數(shù)字簽名,保證了區(qū)塊鏈系統(tǒng)中數(shù)據(jù)的安全性和完整性。
數(shù)字簽名是數(shù)字摘要技術(shù)和非對(duì)稱加密技術(shù)相結(jié)合的應(yīng)用,為數(shù)字信息的完整性和發(fā)送者身份的真實(shí)性提供了強(qiáng)有力的保障。數(shù)字簽名的流程是發(fā)送方將自己要傳輸?shù)南⑦M(jìn)行哈希,得到摘要,再用私鑰將哈希值進(jìn)行加密,最終得到加密數(shù)據(jù)。發(fā)送方將數(shù)字信息原文、加密后的數(shù)字摘要和公鑰一同發(fā)給接收方。同時(shí),接收方會(huì)用相同的散列函數(shù)生成數(shù)字信息的數(shù)字摘要。然后接收方使用發(fā)送方的公鑰對(duì)消息和消息摘要進(jìn)行解密,得到數(shù)字摘要。如果發(fā)送方的摘要和接收方的摘要相同,則即可證明數(shù)字信息的完整性和發(fā)送方身份的真實(shí)性。如果不同,則說(shuō)明數(shù)字信息已經(jīng)被篡改。
PBFT算法每次共識(shí)發(fā)生在一個(gè)視圖(view)中,視圖是連續(xù)編號(hào)的整數(shù),每個(gè)視圖對(duì)應(yīng)一個(gè)主節(jié)點(diǎn),其余都是備份節(jié)點(diǎn)。在總節(jié)點(diǎn)數(shù)為n的系統(tǒng)中,PBFT算法所能容忍的錯(cuò)誤節(jié)點(diǎn)數(shù)f最大為(n-1)/3。
(1)PBFT算法流程。
PBFT算法通過(guò)五個(gè)階段達(dá)成共識(shí),如圖2所示。
圖2 PBFT算法共識(shí)流程
各階段的具體流程如下:
請(qǐng)求階段:客戶端節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送請(qǐng)求m。
預(yù)準(zhǔn)備階段:主節(jié)點(diǎn)接收到來(lái)自客戶端的請(qǐng)求后,給該請(qǐng)求分配一個(gè)序列號(hào)n,生成一個(gè)預(yù)準(zhǔn)備消息,預(yù)準(zhǔn)備消息的格式為
準(zhǔn)備階段:備份節(jié)點(diǎn)接收到主節(jié)點(diǎn)的消息并對(duì)預(yù)準(zhǔn)備消息進(jìn)行驗(yàn)證,如果驗(yàn)證通過(guò),生成準(zhǔn)備消息
確認(rèn)階段:節(jié)點(diǎn)收到來(lái)自其他備份節(jié)點(diǎn)的準(zhǔn)備消息,對(duì)消息內(nèi)容進(jìn)行驗(yàn)證,若驗(yàn)證通過(guò)則向所有節(jié)點(diǎn)發(fā)送確認(rèn)消息。
回復(fù)階段:當(dāng)節(jié)點(diǎn)完成確認(rèn)階段后,向客戶端發(fā)送回復(fù)消息,當(dāng)客戶端接收到f+1個(gè)不同的節(jié)點(diǎn)發(fā)來(lái)的相同消息時(shí),回復(fù)階段完成,共識(shí)流程結(jié)束。
(2)視圖切換。
PBFT在視圖中執(zhí)行共識(shí)流程時(shí),如果主節(jié)點(diǎn)發(fā)生宕機(jī)或者成為惡意節(jié)點(diǎn),導(dǎo)致共識(shí)流程無(wú)法進(jìn)行的時(shí)候,系統(tǒng)會(huì)運(yùn)行視圖變更協(xié)議,根據(jù)p=v mod R的規(guī)則重新選舉主節(jié)點(diǎn),其中v是視圖編號(hào),R是節(jié)點(diǎn)個(gè)數(shù)。
(3)PBFT算法的不足。
PBFT算法在節(jié)點(diǎn)數(shù)量較多的情況下,通信開(kāi)銷很大,無(wú)法滿足實(shí)際系統(tǒng)的需要。另外,主節(jié)點(diǎn)選舉隨意,在實(shí)際應(yīng)用中無(wú)法起到激勵(lì)節(jié)點(diǎn)的作用,且增大了主節(jié)點(diǎn)的作惡幾率,降低了系統(tǒng)運(yùn)轉(zhuǎn)的可持續(xù)性和安全性。
針對(duì)PBFT算法的不足,結(jié)合實(shí)際區(qū)塊鏈系統(tǒng)的應(yīng)用情況,該文提出的P-PBFT算法對(duì)PBFT做了以下幾點(diǎn)改進(jìn):
(1)結(jié)合DPOS思想,成立節(jié)點(diǎn)委員會(huì),委員會(huì)里的節(jié)點(diǎn)數(shù)目根據(jù)實(shí)際需要設(shè)置,只有委員會(huì)里的節(jié)點(diǎn)才可以參與共識(shí)和競(jìng)爭(zhēng)主節(jié)點(diǎn),其余的節(jié)點(diǎn)只進(jìn)行投票與結(jié)果保存,可以降低系統(tǒng)的通信開(kāi)銷,提升系統(tǒng)性能。
(2)引入積分制的概念,給每個(gè)節(jié)點(diǎn)設(shè)置積分,節(jié)點(diǎn)的初始積分可根據(jù)實(shí)際應(yīng)用的需要來(lái)設(shè)置。節(jié)點(diǎn)使用積分進(jìn)行投票,選舉參與共識(shí)流程的節(jié)點(diǎn)。當(dāng)主節(jié)點(diǎn)發(fā)生錯(cuò)誤從而觸發(fā)視圖切換協(xié)議的時(shí)候,扣除當(dāng)前主節(jié)點(diǎn)的5%積分作為懲罰,然后根據(jù)積分的排名順次選舉主節(jié)點(diǎn),這樣可以保證主節(jié)點(diǎn)的可靠性,提高節(jié)點(diǎn)競(jìng)爭(zhēng)主節(jié)點(diǎn)的積極性。
(3)設(shè)置積分衰減周期T,按70%的比例減少節(jié)點(diǎn)的積分,防止系統(tǒng)過(guò)度中心化。
P-PBFT算法流程如圖3所示。
圖3 P-PBFT算法流程
具體步驟如下:
第一步:客戶端發(fā)送請(qǐng)求,系統(tǒng)進(jìn)行響應(yīng),如果系統(tǒng)存在主節(jié)點(diǎn),直接進(jìn)入第二步。系統(tǒng)不存在主節(jié)點(diǎn)的時(shí)候,所有節(jié)點(diǎn)投票選舉出委員會(huì)節(jié)點(diǎn)和主節(jié)點(diǎn)。
第二步:委員會(huì)里的節(jié)點(diǎn)走共識(shí)流程,共識(shí)成功,主節(jié)點(diǎn)增加5積分,委員會(huì)節(jié)點(diǎn)增加3積分,其余節(jié)點(diǎn)增加1積分。如果主節(jié)點(diǎn)發(fā)生錯(cuò)誤從而觸發(fā)視圖切換,則進(jìn)行第三步。
第三步:扣除當(dāng)前主節(jié)點(diǎn)的5%積分,積分排名第二的節(jié)點(diǎn)當(dāng)選為主節(jié)點(diǎn)。
此外,每T個(gè)周期后,系統(tǒng)進(jìn)行積分衰減,每個(gè)節(jié)點(diǎn)減少70%的積分,并且重新選舉委員會(huì)成員。
設(shè)定系統(tǒng)的節(jié)點(diǎn)個(gè)數(shù)為N,對(duì)于PBFT算法,參與共識(shí)的節(jié)點(diǎn)個(gè)數(shù)即為N,三階段共識(shí)的通信開(kāi)銷為2N(N-1)。對(duì)于P-PBFT算法,設(shè)定委員會(huì)節(jié)點(diǎn)個(gè)數(shù)為M,則三階段共識(shí)的通信開(kāi)銷為2M(M-1),M≤N,且隨著M/N的減小,通信開(kāi)銷的降低會(huì)更加明顯。
該文基于Go語(yǔ)言實(shí)現(xiàn)了一個(gè)小型區(qū)塊鏈系統(tǒng),分別運(yùn)行PBFT算法和P-PBFT算法,(每秒完成的交易數(shù)量,單位為個(gè)/秒)進(jìn)行對(duì)比,以檢驗(yàn)算法的總體效果。
實(shí)驗(yàn)環(huán)境是:操作系統(tǒng)為Windows10,CPU為Intel (R) Core (TM) i5 - 6300U 2.30 GHz,內(nèi)存為12 GB。算法實(shí)現(xiàn)語(yǔ)言為Go,測(cè)試工具為Apache-JMeter。
(1)固定數(shù)量節(jié)點(diǎn)在不同時(shí)刻的吞吐量測(cè)試。
測(cè)試基于本地10個(gè)服務(wù)端節(jié)點(diǎn),其中委員會(huì)節(jié)點(diǎn)數(shù)量設(shè)置為4個(gè),另開(kāi)一個(gè)客戶端節(jié)點(diǎn),負(fù)責(zé)向服務(wù)端發(fā)送需要共識(shí)的交易。開(kāi)啟Apache-JMeter進(jìn)行壓力測(cè)試,配置50個(gè)線程,創(chuàng)建Http請(qǐng)求,共識(shí)完成則記錄一次請(qǐng)求成功,結(jié)果如圖4所示,橫坐標(biāo)為時(shí)間,縱坐標(biāo)為吞吐量。
圖4 固定數(shù)量節(jié)點(diǎn)在不同時(shí)刻的吞吐量對(duì)比
可以看出,不同時(shí)刻吞吐量略有不同,后續(xù)測(cè)試將觀察平均吞吐量。
(2)不同節(jié)點(diǎn)數(shù)量下的吞吐量測(cè)試。
實(shí)驗(yàn)分別開(kāi)啟6節(jié)點(diǎn)、8節(jié)點(diǎn)、10節(jié)點(diǎn)、12節(jié)點(diǎn)、14節(jié)點(diǎn)、16節(jié)點(diǎn)、18節(jié)點(diǎn),作為服務(wù)器端,其中P-PBFT算法的委員會(huì)節(jié)點(diǎn)個(gè)數(shù)設(shè)置為6,另開(kāi)客戶端接口,取平均數(shù)據(jù)吞吐量,結(jié)果如圖5所示,其中橫坐標(biāo)為節(jié)點(diǎn)數(shù),縱坐標(biāo)為吞吐量。
圖5 不同節(jié)點(diǎn)數(shù)量下的吞吐量對(duì)比
可以看出,在節(jié)點(diǎn)數(shù)量較少的情況下,P-PBFT算法和PBFT算法的吞吐量相差不大。這是因?yàn)楣?jié)點(diǎn)數(shù)量較少的時(shí)候,P-PBFT算法參與共識(shí)的節(jié)點(diǎn)數(shù)量和PBFT算法相近,且選舉委員會(huì)節(jié)點(diǎn)也需要消耗一定的資源和時(shí)間。
(3)積分變化測(cè)試。
對(duì)10個(gè)節(jié)點(diǎn)分別編號(hào)為N1~N10,其中N1、N2、N3、N4的積分賦值為10、8、6、4,其余節(jié)點(diǎn)的積分賦值為1,N1、N2、N3、N4成為委員會(huì)節(jié)點(diǎn),N1節(jié)點(diǎn)擔(dān)任主節(jié)點(diǎn),設(shè)置衰減周期為10分鐘。經(jīng)過(guò)十輪交易之后,各節(jié)點(diǎn)積分如表1所示。
表1 十輪交易前后積分對(duì)比
可以看出,隨著共識(shí)成功的交易量增加,委員會(huì)里的節(jié)點(diǎn)與其他節(jié)點(diǎn)的積分差距擴(kuò)大,可以提高參與共識(shí)的節(jié)點(diǎn)的積極性。
當(dāng)將主節(jié)點(diǎn)端口關(guān)閉(即模擬主節(jié)點(diǎn)發(fā)生錯(cuò)誤的情況)時(shí),客戶端發(fā)送請(qǐng)求,會(huì)觸發(fā)視圖切換協(xié)議,主節(jié)點(diǎn)被扣除5%的積分,積分排名第二的N2就成為新的主節(jié)點(diǎn)。系統(tǒng)運(yùn)行十分鐘后,所有節(jié)點(diǎn)積分全部扣除70%,并重新進(jìn)行委員會(huì)節(jié)點(diǎn)選舉。
針對(duì)實(shí)用拜占庭算法PBFT在聯(lián)盟鏈節(jié)點(diǎn)數(shù)較多的情況下性能欠佳的問(wèn)題,對(duì)其加以改進(jìn),設(shè)計(jì)了一種基于積分制的共識(shí)算法P-PBFT。結(jié)合DPOS思想并引入積分制度,降低了算法通信開(kāi)銷,可以支持更多的節(jié)點(diǎn)。改進(jìn)主節(jié)點(diǎn)的選舉方式,提高了節(jié)點(diǎn)參與共識(shí)的積極性;設(shè)置積分衰減機(jī)制,避免了聯(lián)盟鏈中可能出現(xiàn)的過(guò)度中心化問(wèn)題,使得算法更加適應(yīng)實(shí)際的區(qū)塊鏈系統(tǒng)。實(shí)驗(yàn)與分析表明P-PBFT算法能有效地減少系統(tǒng)通信開(kāi)銷,提高系統(tǒng)吞吐量。