唐 飛,劉文婧,馮 卓,凌國瑋
(1.重慶郵電大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,重慶 400065;2.重慶郵電大學(xué) 網(wǎng)絡(luò)空間安全與信息法學(xué)院,重慶 400065)
聯(lián)盟鏈?zhǔn)且活愑啥鄠€組織或機構(gòu)作為共識節(jié)點的區(qū)塊鏈。在保證聯(lián)盟節(jié)點數(shù)據(jù)一致性的基礎(chǔ)上,如何提高共識效率是亟待解決的問題。在區(qū)塊鏈環(huán)境中,一般假定節(jié)點間相互不信任,因此,共識驗證過程中的密鑰由誰生成、如何分發(fā)授權(quán),也是一個重要的問題。
共識機制作為區(qū)塊鏈的核心技術(shù)之一,主要用于節(jié)點對數(shù)據(jù)進行驗證并使全網(wǎng)對該數(shù)據(jù)達成共識。常見的區(qū)塊鏈共識機制有工作量證明(proof of work, PoW)[1]、權(quán)益證明(proof of stake, PoS)[2]、授權(quán)股份證明(delegated proof of stake, DPoS)[3]、實用拜占庭容錯(practical Byzantine fault tolerance, PBFT)[4]等。文獻[4]之后,人們提出了許多改進的共識機制,例如Zyzzyva[5]、FastBFT[6]、Raft[7-8]、DBFT[9-10]等。在PBFT共識機制中,參與共識過程的節(jié)點分為主節(jié)點與副節(jié)點2類。主節(jié)點將決策整理并簽名后廣播給各副節(jié)點。副節(jié)點接收到?jīng)Q策和簽名后,對其進行驗證和簽名,并將自己簽名的消息廣播給其他所有節(jié)點。在這個過程中,節(jié)點將進行多輪驗證及簽名,會消耗大量的時間與算力。因此,需要提高聯(lián)盟鏈節(jié)點達成共識過程的效率。
本文提出一個無需可信中心分布式密鑰授權(quán)及高效驗證的拜占庭容錯共識方案。該方案可支持聯(lián)盟鏈高效共識,各節(jié)點的密鑰不再由密鑰生成中心來負責(zé)管理,而是由聯(lián)盟鏈中選舉出的超級節(jié)點共同生成。每個超級節(jié)點在得到自己的密鑰的同時,也為候選節(jié)點生成部分密鑰,由候選節(jié)點合成自己的私鑰。每個超級節(jié)點只知道候選節(jié)點的部分私鑰,因此,候選節(jié)點的私鑰不會被單個超級節(jié)點獲取,且可以抵抗來自t-1個超級節(jié)點的合謀攻擊(t是分布式密鑰生成機制的門限值)。在共識過程中,副節(jié)點需要對接收到的消息進行驗證,主節(jié)點需要對副節(jié)點發(fā)送的消息進行驗證。利用聚合簽名,參與共識的節(jié)點能將需驗證消息進行聚合,進行批量驗證,從而提高驗證效率,進而提高共識效率。
區(qū)塊鏈本質(zhì)上是一串包含了一段時間內(nèi)產(chǎn)生的所有交易數(shù)據(jù)的數(shù)據(jù)塊,用于驗證信息的真實性和生成下一個區(qū)塊。分布式數(shù)據(jù)庫、非對稱密碼、智能合約等組成了區(qū)塊鏈的主要技術(shù)。
區(qū)塊鏈最突出的特點是去中心化。由于網(wǎng)絡(luò)傳輸延遲等原因,不同節(jié)點在某段時間內(nèi)收到的數(shù)據(jù)不可能完全一致。節(jié)點要判斷一個記錄的有效性,就需要通過共識機制來達成全網(wǎng)數(shù)據(jù)的一致性。不同于傳統(tǒng)中心化的分布式系統(tǒng),區(qū)塊鏈中的共識機制可以使系統(tǒng)實現(xiàn)去中心化,也能夠?qū)崿F(xiàn)更大范圍內(nèi)的協(xié)同合作。區(qū)塊鏈具有防止數(shù)據(jù)篡改和交易可追溯等特性,能夠在用戶匿名和追蹤技術(shù)[11]等領(lǐng)域發(fā)揮作用。
一般說來,區(qū)塊鏈系統(tǒng)[12]由6層結(jié)構(gòu)組成。其中,數(shù)據(jù)層主要對區(qū)塊數(shù)據(jù)進行加密;網(wǎng)絡(luò)層負責(zé)對數(shù)據(jù)進行驗證、傳播;共識層包括PoW、PoS等共識機制;激勵層通過相應(yīng)的經(jīng)濟激勵等方式鼓勵系統(tǒng)中用戶參與,推動區(qū)塊鏈系統(tǒng)運行;合約層實現(xiàn)區(qū)塊鏈系統(tǒng)的各類功能,需要包含智能合約以及腳本等內(nèi)容;應(yīng)用層將區(qū)塊鏈中的不同應(yīng)用場景表現(xiàn)出來。區(qū)塊鏈基礎(chǔ)架構(gòu)如圖1所示。
圖1 區(qū)塊鏈基礎(chǔ)架構(gòu)
共識機制是使多個節(jié)點達成一致的機制,本質(zhì)上來說是多個機器達成共識,目的在于在多個節(jié)點中記錄相同的賬本,解決復(fù)雜環(huán)境下的去中心化網(wǎng)絡(luò)達成數(shù)據(jù)一致性的問題。共識過程的核心是主節(jié)點選取和驗證后數(shù)據(jù)上鏈。共識過程的輸入是節(jié)點數(shù)據(jù)生成時以及驗證后產(chǎn)生的交易或數(shù)據(jù),輸出則是封裝好的數(shù)據(jù)區(qū)塊以及更新后的區(qū)塊鏈。不同場景應(yīng)用需求衍生出了不同的共識機制。以PBFT共識機制為例,它可以較為高效地解決在多節(jié)點參與情況下的典型分布式一致性問題,適用于點對點的區(qū)塊鏈網(wǎng)絡(luò)結(jié)構(gòu)。
區(qū)塊鏈的共識機制有2個顯著特征,即“少數(shù)服從多數(shù)”和“節(jié)點平等”?!吧贁?shù)服從多數(shù)”指節(jié)點數(shù)和節(jié)點計算能力等計量;“節(jié)點平等”是指符合條件的節(jié)點可以針對決策提出自己的結(jié)果,使其他節(jié)點對此結(jié)果進行認證。以比特幣為例,它采用PoW共識機制,要在比特幣系統(tǒng)中偽造或篡改一條數(shù)據(jù),必須控制超過51%的節(jié)點才能達成。而完成PoW共識機制運行所需要的龐大算力需求,使這種情況在節(jié)點數(shù)量足夠多時發(fā)生的概率微乎其微。
設(shè)G1、G2是兩個階為大素數(shù)p的循環(huán)群,映射e:G1×G1→G2滿足以下性質(zhì)。
①雙線性:對于任意a,b∈Zp,和R,S∈G1,有e(Ra,Sb)=e(R,S)ab。
②非退化性:存在R,S∈G1,使得e(R,S)≠1,這里“1”表示G2群G2的單位元。
③可計算性:存在有效算法對任意的R,S∈G1,可計算e(R,S)的值。
則稱e是一個雙線性映射[13]。
分布式密鑰生成(distributed key generation,DKG)技術(shù)主要以分布式方式為群體的密碼系統(tǒng)進行密鑰生成,DKG協(xié)議[14]中密碼系統(tǒng)的公鑰和私鑰由這個系統(tǒng)中的參與者共同生成,公鑰向其他參與者公開,私鑰一般適用于面向無可信中心的密碼系統(tǒng)。DKG通過多方參與,計算共享的公鑰與私鑰。分布式秘鑰產(chǎn)生不依賴任何可信的第三方。在(t,n)-DKG中,t為閾值,n為參與者數(shù)量,DKG協(xié)議允許n個參與者共同產(chǎn)生密鑰,任何數(shù)量大于等于閾值t的參與者子集都能使用該共享密鑰,而任何數(shù)量少于閾值t的參與者子集都沒有對該共享密鑰的任何知識。
分布式密鑰生成技術(shù)可以用于構(gòu)造無可信中心環(huán)境下的密碼算法,從而可用于支撐區(qū)塊鏈安全應(yīng)用。文獻[15-16]均基于分布式密鑰生成技術(shù)構(gòu)造了適用于區(qū)塊鏈的認證方案。
聚合簽名[17]是指在多個用戶對不同消息進行簽名后,將這些簽名通過聚合形成一個短的簽名,用戶只需對聚合后的短簽名進行驗證即可。假定系統(tǒng)中有n個用戶,對應(yīng)地,存在n個公鑰、n個消息以及n個相應(yīng)的簽名,n個不同簽名可以聚合成一個短簽名σ,通過批量驗證,提高簽名驗證的效率。聚合簽名可以縮短簽名長度,減少簽名開銷,以聚合簽名為基礎(chǔ)的無證書聚合簽名[18]、基于身份的聚合簽名[19]等技術(shù)獲得了學(xué)者們的廣泛研究。
在基于身份的密碼方案[20]中,用戶可以利用自己的身份信息來充當(dāng)自己的公鑰,這就意味著用戶的公鑰不再需要與數(shù)字證書進行綁定,從而減少管理資源消耗;用戶可以通過自己的身份簽名對多個消息同時進行驗證,不再需要簽名者之間進行頻繁的交互活動。與現(xiàn)有聚合簽名方案相比,該方案在減少節(jié)點間交互成本等方面有更好的表現(xiàn)。同時,利用身份進行聚合簽名在一定程度上提高了安全性。主要步驟為系統(tǒng)建立、密鑰生成、簽名、驗證、聚合簽名和聚合簽名驗證。前4個步驟和普通基于身份的簽名方案一樣;最后2個步驟提供聚合功能?;谏矸莸木酆虾灻x如下。
①系統(tǒng)初始化:給定一個安全參數(shù)λ∈N,算法生成系統(tǒng)的全局參數(shù)params。
②密鑰提?。簩τ诰哂袠?biāo)識ID的用戶,其公鑰為DID,其私鑰為sID,由密鑰生成中心(KGC)生成。
③簽名:對消息m進行簽名σ。
④驗證:給定一個帶有用戶身份認證的m的簽名σ,驗證其有效性,有效則輸出1;否則,輸出0。
⑤聚合簽名:每個具有身份IDi的用戶ui∈U在消息mi上提供一個簽名,計算得到聚合簽名。
⑥聚合驗證:驗證聚合簽名是否有效。
從基于身份的密碼方案定義不難看出,中心化體系存在過于依賴單個中心的問題,單獨依賴某一中心很容易出現(xiàn)被第三方攻擊或成為攻擊方的情況。因此,以上算法不能直接用于多中心甚至無中心的區(qū)塊鏈中。
本方案中所涉及的節(jié)點關(guān)系如圖2所示。
圖2 節(jié)點間關(guān)系示意圖
聯(lián)盟鏈服務(wù)器隨機選擇一個素數(shù)λ作為安全參數(shù),公開系統(tǒng)公共參數(shù)params。
params={G1,G2,p,g,e,Ppub,H,H1,t,n}
(1)
主節(jié)點的初始超時時間設(shè)置為Tblock,副節(jié)點的初始超時時間設(shè)置為2v+1Tblock;Tblock表示區(qū)塊周期,v表示當(dāng)前視圖編號。
接收系統(tǒng)發(fā)送公共參數(shù)后,聯(lián)盟鏈服務(wù)器中的弱中心生成多項式,根據(jù)該多項式計算其自身的私鑰、公鑰,并廣播。各個弱中心驗證接收到的秘密值的有效性,若無效,則要求錯誤的弱中心重新發(fā)送秘密值;若有效,則通過任意多個秘密值份額恢復(fù)出聯(lián)合生成的隨機秘密值。
步驟1(弱中心初始化):弱中心Pi選擇一個t-1次多項式
(2)
步驟2(節(jié)點密鑰生成):節(jié)點在進入共識時需要向弱中心申請部分密鑰來生成其私鑰。節(jié)點id從第i個弱中心申請部分密鑰pskid,i=H(id)yi后,可以通過驗證等式e(pskid,i,e)=e(H(id),Bi)是否成立進而驗證其有效性。如果部分密鑰無效,候選節(jié)點可以公開部分密鑰請求其他弱中心認證;否則,節(jié)點最后自己合成自己的私鑰skid。
(3)
設(shè)置編號為(h-v)modn的弱中心為本輪共識的主節(jié)點,其他弱中心設(shè)置為副節(jié)點。其中,h為區(qū)塊高度,v為當(dāng)前視圖編號,n為弱中心數(shù)目。
當(dāng)出塊條件滿足后,主節(jié)點向其他副節(jié)點發(fā)送提案請求,在經(jīng)過主節(jié)點的超時時間后,按照共識策略從內(nèi)存池中選取交易,取哈希打包為提案請求并廣播,發(fā)起新一輪共識。同時將主節(jié)點的超時時間設(shè)置為(2(v+1)-k(v))Tblock。副節(jié)點在超時時間范圍內(nèi)未能廣播則進入視圖更改。
其他副節(jié)點驗證主節(jié)點發(fā)送的提案請求合法性,以及是否符合本地共識狀態(tài)。若驗證通過,則廣播提案響應(yīng)信息。副節(jié)點收到其他副節(jié)點發(fā)送的提案響應(yīng)信息后,利用基于身份的聚合簽名算法驗證消息合法性。同時,將副節(jié)點的超時時間延長,并更新本地共識狀態(tài)。對于交易消息包含的交易哈希,從內(nèi)存池或未確認的交易中獲取相應(yīng)交易,并添加至共識模塊。若未在超時前接收到主節(jié)點發(fā)出的提案請求,則進入視圖更改。
每個已收集齊提案請求交易信息的超級節(jié)點,在超時時間范圍前收集到至少M個超級節(jié)點的提交信息,包括驗證消息的合法性以及是否符合本地共識狀態(tài)。這些信息若通過驗證,則將本節(jié)點的超時時間延長和生成,并廣播新塊;若出現(xiàn)錯誤,則廣播警告信息,并將超時時間設(shè)置為2Tblock,返回主節(jié)點選擇步驟。
首先,將主節(jié)點的超時時間設(shè)置為2v+2Tblock,令視圖遞增編號k=1,vk=v+k。副節(jié)點向其他副節(jié)點發(fā)出第vk個視圖更改請求
在拜占庭容錯類共識機制中,一方面,系統(tǒng)中的節(jié)點在互不信任的情況下共同完成共識運行,節(jié)點公鑰與私鑰的生成是否值得信任尤為重要;另一方面,在PBFT共識機制中,節(jié)點間進行驗證與簽名的過程就需要使用密鑰。然而,密鑰的生成卻完全依賴于第三方,共識過程中節(jié)點間的交互效率也并不令人滿意。
區(qū)塊鏈系統(tǒng)一般是去中心或多中心化的系統(tǒng)。如果用于處理區(qū)塊鏈數(shù)據(jù)的密碼算法是中心化的[8,10],那么,在基于區(qū)塊鏈的應(yīng)用系統(tǒng)中,誰來扮演密碼算法中證書頒發(fā)中心或密鑰生成中心的角色將是一個與區(qū)塊鏈相矛盾的問題。本文提出的共識機制改進方案中,超級節(jié)點的密鑰生成采用了DKG技術(shù)。利用DKG技術(shù)來生成節(jié)點的公鑰與私鑰,可以避免密鑰生成中心權(quán)限過高,更能夠使節(jié)點不再受到第三方的影響,從而提高區(qū)塊鏈網(wǎng)絡(luò)的去中心化特性。本文通過基于身份的聚合簽名算法在節(jié)點間進行驗證與簽名,DKG算法利用節(jié)點身份生成密鑰,這樣就使得共識過程中節(jié)點可以對其收到的消息進行批量驗證與簽名,一定程度上提高了共識過程的效率。同時,DKG基于身份生成的密鑰在節(jié)點驗證與簽名的過程中,也確保了一定的安全性。
為了比較PBFT共識機制和本文改進共識算法的效率,本小節(jié)通過仿真測試各共識算法的運行時間。在實驗中設(shè)置節(jié)點最初數(shù)量為4,逐步添加節(jié)點數(shù)量,記錄一定節(jié)點數(shù)量規(guī)模下對1 000條交易提案進行共識所消耗的時間。為簡化分析,本次測試忽略了惡意節(jié)點對數(shù)據(jù)信息傳播的影響。
利用基于Java的密碼庫(java pairing-based cryptography, JPBC)[22],可以度量簽名及驗證相關(guān)操作的運行時間。本實驗考慮4種控制了簽名和驗證算法開銷的操作。用Tpar表示雙線性計算時間,Tmtp表示映射到點的哈希計算時間,Tmul表示群元素乘法運算時間,Texp表示群元素的指數(shù)運算時間。實驗測試平臺為HUAWEI MetaBook 14,處理器為Intel i7-8565 U,主頻為1.8 GHz,內(nèi)存為8 GB,運行環(huán)境為Windows 10。得到如下結(jié)果:Tpar=21.982 7 ms,Tmtp=50.755 9 ms,Tmul=0.243 2 ms和Texp=27.388 ms。
在本文實驗條件下,PBFT和本文方案的效率對比如表1所示。
表1 PBFT與本文方案的效率對比
以Ubuntu 18.04為運行環(huán)境,用Docker容器模擬節(jié)點,Postman作為測試工具,測試吞吐量(tps)。分別在4、8、12和16個節(jié)點下,以1 000條交易量為例,在tps方面進行對比,結(jié)果如圖3所示。
從圖3可以看出本文方案驗證的高效率。與PBFT共識機制相比,本文方案對相同數(shù)量的交易提案進行共識完成時tps比較小。這是由于在提案共識的過程中,節(jié)點與節(jié)點之間不再需要進行多次交互,節(jié)點在收到其他節(jié)點發(fā)送的數(shù)據(jù)后,利用基于身份的聚合簽名算法驗證消息合法性,對消息進行批量驗證及簽名,然后主節(jié)點將通過驗證的信息進行提交,由節(jié)點進行數(shù)據(jù)同步,完成共識過程。而PBFT共識機制中,節(jié)點之間的每一次數(shù)據(jù)確認,都需要進行點對點交互,才能確認節(jié)點間是否對提案達成了共識。從實驗結(jié)果可以得出,當(dāng)節(jié)點數(shù)量逐步增加時,PBFT共識機制對提案進行共識所需時間也更多。隨著節(jié)點數(shù)量增多,聚合驗證的優(yōu)勢將更加明顯,可有效降低節(jié)點本地驗證的計算開銷,從而提高共識效率。因此,本文方案效率整體優(yōu)于PBFT共識機制。
圖3 共識機制效率分析結(jié)果
本文提出了一種基于多中心聚合簽名的拜占庭容錯共識機制。首先,通過DKG算法來生成節(jié)點的密鑰,使節(jié)點密鑰的生成不再依賴第三方,保證區(qū)塊鏈網(wǎng)絡(luò)的安全性;其次,在節(jié)點共識階段,通過基于身份的聚合簽名算法,提高節(jié)點的驗證效率,進而提升了共識達成的效率;最后,對提出的共識機制改進方案進行了安全性與效率分析。與PBFT共識機制相比,本文提出的共識機制具有更高的安全性能和交互效率。