陳 幻 王意潔
(并行與分布處理國家重點實驗室(國防科技大學) 長沙 410073)(國防科技大學計算機學院 長沙 410073)
區(qū)塊鏈技術(shù)[1-3]被視為繼云計算、物聯(lián)網(wǎng)、人工智能之后的又一項顛覆性技術(shù),受到了金融機構(gòu)、政府部門以及各科技企業(yè)的高度關(guān)注,將開啟下一代互聯(lián)網(wǎng)——價值交換網(wǎng)絡(luò)的新時代.區(qū)塊鏈解決了在不可信環(huán)境中建立信任的基礎(chǔ)難題,具有去中心化、不可篡改、不可抵賴、抗審查等特征,能夠廣泛運用于支付清算、物聯(lián)網(wǎng)、政務(wù)服務(wù)、醫(yī)療、物流、博彩娛樂等多種領(lǐng)域.
然而,區(qū)塊鏈存在2個嚴重的問題:1) 系統(tǒng)吞吐率低.目前比特幣每秒處理交易數(shù)量(transactions per second, TPS)在3~7筆之間,以太坊TPS在7~15筆之間.相比之下,主流的中心化支付系統(tǒng),例如Visa和MasterCard,平均每秒能處理2 000筆交易,峰值性能能夠達到56 000 TPS.低吞吐率導(dǎo)致網(wǎng)絡(luò)中未處理的交易無限堆積,交易平均處理時間延長,使得區(qū)塊鏈無法運用于實時領(lǐng)域.此外,隨著越來越多的分布式應(yīng)用(distributed applications, DApps)運行于同一條鏈上,低吞吐率的問題將會越發(fā)嚴重,極大地限制了區(qū)塊鏈的運用.2)每個驗證節(jié)點都需要獨立保存一份完整的歷史數(shù)據(jù)賬本和對應(yīng)的狀態(tài)信息,這將消耗大量的存儲資源.一方面,賬本大小隨著新區(qū)塊的產(chǎn)生持續(xù)增長,存儲全部歷史區(qū)塊需要消耗大量的磁盤空間.可以預(yù)測在不久的將來,區(qū)塊鏈賬本數(shù)據(jù)將輕松到達1TB,超過目前絕大多數(shù)普通商用機的存儲能力.另一方面,由于區(qū)塊鏈歷史數(shù)據(jù)過于龐大,從區(qū)塊中檢索信息需要消耗大量的時間開銷.為了加速對交易和區(qū)塊的驗證,驗證節(jié)點會在內(nèi)存中維護一個叫驗證狀態(tài)的索引結(jié)構(gòu).盡管驗證狀態(tài)相比于歷史區(qū)塊占用的空間較少,但他們需要被快速訪問,通常放在內(nèi)存數(shù)據(jù)庫中(例如LevelDB),對節(jié)點內(nèi)存容量提出了較高要求.如果驗證狀態(tài)大小超過了節(jié)點的內(nèi)存容量,一部分狀態(tài)信息需要保存在磁盤或其他二級存儲器中.由于二級存儲器訪問時間較長,容易遭受分布式拒絕服務(wù)(distributed denial of service, DDoS)攻擊.例如在2016年9月[4],攻擊者利用以太坊EXTCODESIZE指令的漏洞,讓交易頻繁訪問放置在硬盤上的狀態(tài)信息,導(dǎo)致了單個區(qū)塊的驗證時間長達60 s.
區(qū)塊鏈歷史數(shù)據(jù)以及驗證狀態(tài)不斷增長的特點,將帶來以下問題.首先,由于對磁盤和內(nèi)存容量的較高要求,只有少量的“超級”節(jié)點能夠運行完整的區(qū)塊鏈全節(jié)點,將導(dǎo)致中心化的出現(xiàn).其次,大量資源較少的節(jié)點只能運行輕客戶端(例如移動錢包、輕節(jié)點),它們依賴全節(jié)點提供的查詢服務(wù),不能獨立驗證交易和區(qū)塊的有效性,容易遭受長城等類型的攻擊.此外,對于新加入網(wǎng)絡(luò)的全節(jié)點,它們需要同步從創(chuàng)世區(qū)塊到最近的所有歷史區(qū)塊,并建立驗證狀態(tài)的索引結(jié)構(gòu),需要消耗大量的時間開銷.
針對系統(tǒng)吞吐率低的問題,研究人員提出了多種擴容技術(shù).然而,絕大多數(shù)擴容技術(shù)無法完全破除區(qū)塊鏈的三角難題,即同時實現(xiàn)安全、去中心化和可擴展.目前,分片技術(shù)被廣泛視為一種能夠解決區(qū)塊鏈三角難題的有效方法,通過將交易和狀態(tài)進行分割,使得不同的分片能夠并行處理不相關(guān)的交易,線性提升系統(tǒng)的處理能力.然而,為了避免惡意節(jié)點集中到某個特定分片發(fā)起攻擊,需要周期性地將分片節(jié)點進行重組.由于分片節(jié)點只存儲了當前分片的數(shù)據(jù),當被劃分到其他分片后,需要下載新分片的數(shù)據(jù),這個過程被稱為狀態(tài)遷移.狀態(tài)遷移需要下載大量數(shù)據(jù),不僅中斷了系統(tǒng)的處理,同時也限制了分片切換的頻率.
針對節(jié)點存儲資源占用高的問題,研究人員首先提出了賬本剪枝技術(shù)[5],將對于驗證交易和區(qū)塊無用的歷史數(shù)據(jù)進行裁剪,只維護驗證狀態(tài)信息.該方法可以有效降低整個區(qū)塊鏈的賬本大小和歷史區(qū)塊同步問題.然而,賬本剪枝技術(shù)只解決了歷史數(shù)據(jù)對于磁盤的負擔,并不能減輕狀態(tài)對于內(nèi)存的需求.針對內(nèi)存占用高的問題,研究人員進一步提出了無狀態(tài)客戶端[6-10]的概念.無狀態(tài)客戶端利用承諾(commit-ment)技術(shù),將不斷增長的狀態(tài)壓縮到固定字節(jié)的承諾.但與賬本剪枝技術(shù)不同的是,節(jié)點并不需要保留具體的驗證狀態(tài).然而,無狀態(tài)客戶端面臨3個挑戰(zhàn):
1) 證明信息過大,增加網(wǎng)絡(luò)帶寬開銷.基于默克爾樹(Merkle)構(gòu)建的承諾需要提交從葉子節(jié)點到根節(jié)點的Merkle路徑,以目前比特幣未消費交易輸出(unspent transaction outputs, UTXO)集合和以太坊賬戶的規(guī)模,構(gòu)建的Merkle證明分別是交易大小的4倍與20倍.
2) 承諾更新代價高.基于Merkle樹的承諾更新,需要已修改節(jié)點的所有數(shù)據(jù);而基于通用累加器的承諾更新,刪除操作需要進行大量的計算.
3) 由于每個證明只對應(yīng)1個承諾,當承諾更新后,會導(dǎo)致交易有效性證明過期無效.由于網(wǎng)絡(luò)傳輸延遲過高,新發(fā)起的交易并不能得到及時地處理,交易過期將會成為一個常態(tài)問題.讓用戶頻繁提交更新后的證明信息無疑會增加用戶使用的負擔.
基于3個挑戰(zhàn)的問題,構(gòu)建一種可擴展的輕量級區(qū)塊鏈,不僅具有較高的系統(tǒng)吞吐率,同時讓所有節(jié)點只需利用少量的存儲資源(包括磁盤和內(nèi)存),便可以獨立驗證和打包交易,成為了加密貨幣領(lǐng)域一個迫切需要解決的難題.為此,本文提出了PocketChain,一種面向UTXO模型的公有鏈的輕量級擴容技術(shù).首先,PocketChain使用無狀態(tài)客戶端設(shè)計,創(chuàng)新性地提出了基于RSA累加器構(gòu)建的已消費交易輸出(spent transaction outputs, STO)承諾技術(shù),極大提升了狀態(tài)累加器的更新效率,使得驗證節(jié)點只需存儲區(qū)塊頭便可以驗證交易的有效性.其次,將本文提出的無狀態(tài)客戶端與分片技術(shù)相集合,利用無狀態(tài)客戶端低存儲的優(yōu)勢,克服分片周期性隨機重組導(dǎo)致的狀態(tài)遷移問題,從而能進一步提升分片重組頻率,增加分片系統(tǒng)安全性.
綜上所述,本文聚焦區(qū)塊鏈數(shù)據(jù)膨脹和低吞吐的問題,提出了PocketChain,一種面向UTXO模型的可擴展輕量級區(qū)塊鏈.本文的主要貢獻有4個方面:
1) 提出了基于RSA累加器構(gòu)造的具有批處理能力的增量STO承諾技術(shù),將狀態(tài)累加器更新效率從O(n2)提升到O(n);
2) PocketChain使用STO承諾技術(shù)構(gòu)建無狀態(tài)客戶端,驗證節(jié)點只需要保存歷史區(qū)塊頭以及少量的緩存數(shù)據(jù),有效降低了對磁盤和內(nèi)存的負擔;
3) PocketChain將無狀態(tài)客戶端與分片技術(shù)進行結(jié)合,避免了分片周期性隨機重組導(dǎo)致的狀態(tài)遷移問題,從而能進一步提升分片重組頻率,增加了分片系統(tǒng)的安全性;
4) 實驗結(jié)果表明:在不犧牲去中心化與安全性的前提下,PocketChain能夠極大降低節(jié)點的存儲壓力,并且系統(tǒng)吞吐率能夠隨著分片數(shù)量的增加線性增長.
在本節(jié)中,我們主要介紹無狀態(tài)客戶端與分片技術(shù)的相關(guān)概念以及研究現(xiàn)狀.
1.1.1 無狀態(tài)客戶端系統(tǒng)結(jié)構(gòu)
定義1.區(qū)塊鏈狀態(tài).給定一個數(shù)據(jù)結(jié)構(gòu)Sstate={s1,s2,…,sn},表示系統(tǒng)中當前所有賬戶(或地址)的快照.節(jié)點可以通過訪問Sstate來驗證交易的合法性,從而避免遍歷所有歷史區(qū)塊.這樣的數(shù)據(jù)結(jié)構(gòu)稱為區(qū)塊鏈狀態(tài).
需要注意的是,狀態(tài)信息對于區(qū)塊鏈完整性并不是必須的.由于狀態(tài)信息相比歷史區(qū)塊鏈占用的存儲空間較少,可以放入內(nèi)存數(shù)據(jù)庫中,從而提高檢索效率,對于加速交易的驗證具有十分重要的作用.根據(jù)驗證節(jié)點是否保存完整的狀態(tài)信息,區(qū)塊鏈可以分為2類:狀態(tài)區(qū)塊鏈與無狀態(tài)區(qū)塊鏈.
Fig. 1 Stateful blockchain architecture圖1 狀態(tài)區(qū)塊鏈系統(tǒng)結(jié)構(gòu)
狀態(tài)區(qū)塊鏈的系統(tǒng)結(jié)構(gòu)如圖1所示,每個節(jié)點根據(jù)歷史區(qū)塊建立狀態(tài)信息,并用狀態(tài)信息來驗證交易的合法性.當新區(qū)塊產(chǎn)生后,根據(jù)區(qū)塊中的具體交易,對狀態(tài)進行更新.狀態(tài)區(qū)塊鏈的優(yōu)點在于,用戶不需要保存任何狀態(tài)就可以發(fā)起交易.然而,狀態(tài)區(qū)塊鏈存在狀態(tài)“爆炸”的隱患.隨著有效賬戶(或地址)的增加,狀態(tài)空間不斷增長,一方面需要節(jié)點不斷提升內(nèi)存容量,另一方面會降低驗證交易和區(qū)塊的效率.
相比之下,無狀態(tài)區(qū)塊鏈只需要維護狀態(tài)的承諾,不需要保存任何具體的狀態(tài)信息.如圖2所示,每個區(qū)塊頭包含當前狀態(tài)的承諾,每個節(jié)點只需要保存歷史區(qū)塊頭,并根據(jù)用戶提交的交易有效性證明對交易進行驗證.無狀態(tài)區(qū)塊鏈的優(yōu)點在于,不需要保留具體的歷史區(qū)塊和維護狀態(tài)信息,降低了節(jié)點對磁盤和內(nèi)存的需求,使得配置較低的節(jié)點(包括手機等移動設(shè)備)能夠運行完整的驗證節(jié)點.其缺點在于,承諾更新效率低下,無法適用于高吞吐的環(huán)境下.
1.1.2 無狀態(tài)區(qū)塊鏈研究現(xiàn)狀
無狀態(tài)區(qū)塊鏈概念首次由以太坊創(chuàng)始人Buterin[7]提出,用于解決以太坊狀態(tài)爆炸問題.使用默克爾帕特里夏樹(Merkle patricia tree, MPT)存儲所有用戶賬戶的狀態(tài)信息.礦工節(jié)點在打包區(qū)塊時,需要負責生成相關(guān)賬戶狀態(tài)的Merkle證明,并附加在每個區(qū)塊的后面.全節(jié)點只需要存儲狀態(tài)樹根,便可以驗證區(qū)塊.然而,每筆交易的默克爾證明的字節(jié)大小是交易的20倍,極大地增加了網(wǎng)絡(luò)帶寬開銷.
Todd[9]基于默克爾山脈(Merkle mountain range, MMR)提出了交易輸出(transactions outputs, TXO)承諾技術(shù)來解決比特幣UTXO無限增長的問題.它將舊的UTXO進行歸檔,允許全節(jié)點丟棄歸檔的具體數(shù)據(jù).當交易消費已歸檔UTXO時,全節(jié)點(或服務(wù)節(jié)點)生成對應(yīng)的默克爾分支.驗證節(jié)點根據(jù)默克爾分支對MMR進行重建,從而能夠?qū)εf的UTXO進行驗證,并相應(yīng)更新MMR.證明MMR中的任意狀態(tài),可以僅使用大小為lbn的證明.然而,正如作者提到的,檢查承諾是否被正確更新會產(chǎn)生較大的開銷.
Reyzin等人[8]提出使用加密認證數(shù)據(jù)結(jié)構(gòu)來提升交易驗證效率.礦工節(jié)點需要持有完整的狀態(tài),在處理交易時對狀態(tài)進行更新,并發(fā)布每筆交易導(dǎo)致狀態(tài)改變的證明.相比之下,驗證節(jié)點僅需要持有狀態(tài)的簡短摘要,驗證證明并計算出新摘要.由于驗證節(jié)點不需要存儲具體的狀態(tài)信息,使得配置較低的節(jié)點依然能夠獨立驗證交易,提升了系統(tǒng)的安全.
Chepurnoy等人[6]提出了一種無狀態(tài)交易驗證的通用框架,稱為EDRAX.所有節(jié)點,包括礦工和驗證節(jié)點只需持有最新被確認的區(qū)塊,便可以驗證交易并更新狀態(tài).他們提供了EDRAX的2種實例:一種使用稀疏默克爾樹(sparse Merkle tree, SMT)構(gòu)建基于UTXO模型的區(qū)塊鏈;另一種使用代數(shù)向量承諾(vector commitment, VC)構(gòu)建基于賬戶模型的區(qū)塊鏈.然而,EDRAX并沒有考慮證明過期問題導(dǎo)致用戶頻繁提交更新后的證明,增加了用戶使用的負擔.
Boneh等人[10]首先針對通用累加器和向量承諾,提出了多種批處理技術(shù),極大地提升了累加器的驗證效率并降低了傳輸開銷.其次,使用Class Group未知階群構(gòu)建無陷門的通用RSA累加器,避免進行可信的初始化設(shè)置.最后,將以上具有批處理能力、無陷門特征的RSA累加器用于創(chuàng)建基于UTXO模型的無狀態(tài)公有鏈,極大地降低了交易的證明大小和驗證開銷.然而,在不知道群階的情況下,RSA累加器批量刪除操作的復(fù)雜度為O(n2),效率低下.基于RSA累加器構(gòu)建的UTXO承諾,需要進行大量刪除操作,導(dǎo)致累加器更新效率低,無法適用于高吞吐的環(huán)境下.
1.2.1 區(qū)塊鏈分片技術(shù)基礎(chǔ)模型
分片技術(shù)在運用于區(qū)塊鏈之前,已經(jīng)在數(shù)據(jù)庫領(lǐng)域得到了廣泛運用,用于提升數(shù)據(jù)庫的吞吐能力,例如OpenDHT[11],Google spanner[12]等.簡單來說,分片技術(shù)將數(shù)據(jù)庫的不同表(或相同表中的不同行)分別放置在不同的服務(wù)器中,根據(jù)數(shù)據(jù)訪問請求的對象,將請求分發(fā)到對應(yīng)的服務(wù)器.從而,數(shù)據(jù)庫的響應(yīng)能力能隨著服務(wù)器數(shù)量的增加呈線性增長,極大地提升了數(shù)據(jù)庫的服務(wù)能力.類似地,在區(qū)塊鏈中,可以將單鏈拆分多條并行運行的子鏈(分片).從實現(xiàn)的角度,分片可以進一步分為交易分片和狀態(tài)分片.交易分片根據(jù)特定規(guī)則,將網(wǎng)絡(luò)中的交易分發(fā)到不同的子鏈,各子鏈并行驗證和打包交易,從而使區(qū)塊鏈的吞吐量實現(xiàn)質(zhì)的提升.狀態(tài)分片將區(qū)塊鏈的驗證狀態(tài)(廣義上來講,包括歷史數(shù)據(jù))分為多個不相交的子集,各分片只需保存其中的一個狀態(tài)子集和處理與狀態(tài)相關(guān)的交易,從而降低每個節(jié)點的數(shù)據(jù)存儲量,如圖3所示.實現(xiàn)狀態(tài)分片往往意味著同時實現(xiàn)交易分片.
Fig. 3 State sharding architecture圖3 狀態(tài)分片架構(gòu)
1.2.2 區(qū)塊鏈分片技術(shù)研究現(xiàn)狀
Elastico[13]是最早面向公有鏈的交易分片技術(shù).首先,各節(jié)點需要進行第1輪工作量證明(proof of work, PoW)建立身份,避免遭受女巫攻擊.為了防止惡意節(jié)點集中到特定分片中,利用絕對的算力(或權(quán)益)對該分片進行攻擊(稱為1%攻擊),需要將節(jié)點隨機地分配到各個分片.分片形成后,分片內(nèi)部采用PBFT[14]協(xié)議達成共識,形成micro block發(fā)往0號分片.0號分片通過驗證和打包mirco block,再次運行PBFT共識,生成最終區(qū)塊.然而,Elastico不支持跨片交易處理,并且分片內(nèi)部采用傳統(tǒng)的PBFT協(xié)議,參與共識的節(jié)點數(shù)量較少,具有較高的錯誤率.此外,Elastico為了避免1%攻擊,需要周期性地對節(jié)點進行重新分配.為了避免每次分片切換時下載大量新分片的數(shù)據(jù),各節(jié)點需要保存所有分片的數(shù)據(jù),節(jié)點存儲壓力較大.
Zillqa團隊[15]在Elastico的基礎(chǔ)上,進行了架構(gòu)和性能優(yōu)化.在設(shè)計架構(gòu)上,提出雙鏈架構(gòu),一條是交易鏈,一條是目錄服務(wù)鏈.交易鏈上保存交易數(shù)據(jù),目錄服務(wù)鏈存放礦工元數(shù)據(jù)信息.其中最近的c個節(jié)點形成最終委員會,負責劃分分片以及收集各分片的micro block形成final block.在共識方面,Zillqa借鑒了CoSi[16]多重簽名技術(shù),并用數(shù)字簽名代替MAC,極大提升了PBFT的擴展性,使得PBFT可以適用于幾百個節(jié)點.此外,Zillqa第1次創(chuàng)新性地提出數(shù)據(jù)流編程框架,利用全網(wǎng)算力來實現(xiàn)大規(guī)模計算,如MapReduce和神經(jīng)網(wǎng)絡(luò)計算等.雖然Zilliqa在共識方面有較大改善,但是依然沒有實現(xiàn)狀態(tài)分片.
OmniLedger[5]首次實現(xiàn)了狀態(tài)分片并提出了并行共識算法.通過移除塊的全序要求,將塊組織成有向無環(huán)圖(directed acyclic graph, DAG)結(jié)構(gòu),增加了系統(tǒng)的吞吐量、降低了交易確認延遲.此外,OmniLedger使用原子提交協(xié)議來處理跨分片交易;并使用賬本剪枝技術(shù),引入檢查點,將檢查點之前的歷史數(shù)據(jù)進行裁剪,降低節(jié)點的存儲壓力.然而,原子提交協(xié)議采用以用戶為中心的2階段提交方法,需要用戶參與跨分片交易處理;每次分片切換,都會導(dǎo)致狀態(tài)遷移.
RapidChain[17]在OmniLedger的基礎(chǔ)上,加入了基于糾刪碼[18-20]的信息分發(fā)技術(shù)來加快大區(qū)塊的傳播速度,實現(xiàn)了覆蓋通信、計算與存儲的全分片技術(shù).為了降低狀態(tài)遷移代價,RapidChain采用了Cuckoo協(xié)議,每次分片切換只需替換部分節(jié)點.
以太坊2.0[21]在階段0將引入基于權(quán)益證明(proof of stake, PoS)的信標鏈(beacon chain),完成從PoW到PoS共識機制的轉(zhuǎn)變.在階段1將引入分片,分片是以太坊網(wǎng)絡(luò)未來擴容技術(shù)的核心,允許同時進行交易、存儲和信息處理,從而線性地增加整體網(wǎng)絡(luò)的吞吐量.根據(jù)以太坊2.0規(guī)范,信標鏈將支持1 024個分片鏈,每條分片鏈將有128個節(jié)點進行驗證工作.信標鏈的關(guān)鍵功能是管理PoS協(xié)議以及所有的分片鏈:在每一步為每個分片隨機選擇區(qū)塊的提議者,組織驗證者進入委員會,對擬議的區(qū)塊進行投票;對驗證者實施獎勵和處罰;執(zhí)行交聯(lián)(crooslinks)的處理,將整個分片系統(tǒng)連接在一起,并協(xié)助完成跨片交易處理.整體而言,以太坊2.0分片技術(shù)較為完善,能夠同時實現(xiàn)交易分片和狀態(tài)分片,但每個分片依然會面臨數(shù)據(jù)與狀態(tài)增長問題.
針對目前公有鏈系統(tǒng)吞吐率低下和節(jié)點存儲壓力不斷增加的難題,本文提出了PocketChain,它需要滿足3個目標:
1) 低存儲.節(jié)點不需要保留具體的歷史區(qū)塊和狀態(tài)信息便可以驗證交易的有效性,大大降低運行驗證節(jié)點的存儲資源開銷.
2) 高吞吐.系統(tǒng)吞吐率能夠隨著網(wǎng)絡(luò)節(jié)點數(shù)量的增長線性增加.
3) 安全與去中心化.系統(tǒng)不犧牲任何安全性和去中心化的特性.
為了降低驗證節(jié)點的存儲開銷,已有的賬本剪枝技術(shù)只能降低歷史賬本大小.隨著系統(tǒng)中有效地址和賬戶的不斷增加,節(jié)點內(nèi)存開銷逐漸加大.無狀態(tài)客戶端采用累加器將狀態(tài)數(shù)據(jù)壓縮到固定字節(jié)的承諾,能夠同時解決歷史區(qū)塊與狀態(tài)數(shù)據(jù)膨脹問題,但面臨交易證明信息過大(基于Merkle的累加器)、承諾更新代價高(通用累加器)的挑戰(zhàn).
此外,分片技術(shù)被廣泛視為提升區(qū)塊鏈吞吐率最有效的方法之一,已被多個公有鏈采用.然而,為了避免惡意節(jié)點集中到某個特定分片發(fā)起定向攻擊,需要周期性地將節(jié)點隨機分配到各個分片中.由于每個分片只保留了當前分片的數(shù)據(jù),當節(jié)點劃分到其他分片后,需要同步下載新分片的數(shù)據(jù),這個過程稱為狀態(tài)遷移.狀態(tài)遷移需要下載大量數(shù)據(jù),不僅增加了網(wǎng)絡(luò)帶寬開銷,同時限制了分片切換的頻率,對系統(tǒng)安全性造成負面影響.
綜上所述,本文將結(jié)合無狀態(tài)客戶端與分片技術(shù)來解決區(qū)塊鏈數(shù)據(jù)增長與吞吐率低下的雙重難題,其面臨的主要挑戰(zhàn)有2點:1)構(gòu)造證明信息短小、更新效率高的狀態(tài)累加器.2)克服分片技術(shù)周期性隨機重組導(dǎo)致的狀態(tài)遷移問題.
無狀態(tài)客戶端的關(guān)鍵在于構(gòu)造證明信息短小、更新效率高的狀態(tài)累加器.RSA累加器建立在冥模運算之上,具有證明信息短小、固定等優(yōu)點,能夠滿足以上需求.此外,RSA累加器支持批處理操作,多個證明可以合并為一個證明,能有效減少交易證明的字節(jié)大小,并降低驗證的時間開銷.在公有鏈環(huán)境下,沒有任何可信的第三方,需要借助未知階群,構(gòu)造無陷門的RSA累計器.然而,在不知道群階的情況下,RSA累加器刪除操作的復(fù)雜度為O(n2),添加操作的復(fù)雜度為O(n).當需要進行大量刪除操作時,累加器的更新效率將快速下降.例如UTXO承諾技術(shù)需要動態(tài)刪除大量已消費的交易輸出,導(dǎo)致UTXO承諾更新效率低下.
針對以上問題,在3.2節(jié)中,本文首先創(chuàng)新性地提出了STO承諾技術(shù),使用RSA累加器將所有已消費的交易輸出進行壓縮.STO是一個只支持添加操作的數(shù)據(jù)結(jié)構(gòu),從而避免進行代價較高的刪除操作.接著,PocketChain基于STO承諾技術(shù)建構(gòu)無狀態(tài)客戶端.用戶為了證明交易有效,需要提供交易輸入的存在性證明和交易輸入的未花費證明.輸入存在性證明可以通過輸入產(chǎn)生時的Merkle路徑進行自證;輸入的未花費證明可以通過提交STO非成員見證.只要輸入不在STO集合內(nèi),便不存在雙花.最后,在第4節(jié)中將無狀態(tài)客戶端運用于分片技術(shù)架構(gòu)下,利用低存儲的優(yōu)勢,降低分片技術(shù)周期性隨機重組導(dǎo)致的狀態(tài)遷移代價.
無狀態(tài)客戶端設(shè)計將交易驗證的一部分工作分配給用戶,用戶在發(fā)起交易時,需要附加提交交易有效性證明.驗證節(jié)點和礦工節(jié)點只需保存狀態(tài)的簡短摘要,根據(jù)交易有效性證明和當前狀態(tài)摘要進行交易驗證.無狀態(tài)客戶端不需要存儲具體區(qū)塊和狀態(tài)信息,大大降低了節(jié)點的磁盤和內(nèi)存壓力.然而,目前無狀態(tài)客戶端主要面臨交易有效性證明過大、狀態(tài)累加器更新效率低,以及交易頻繁過期問題.
為此,本節(jié)針對UTXO模型的公有鏈,提出了基于RSA累加器的無狀態(tài)客戶端PocketChain.首先,使用無陷門、具有批處理能力的RSA累加器壓縮狀態(tài),使得證明信息簡潔短小,并且能將多個證明合并為一個證明,有效降低了證明的字節(jié)大??;將RSA累加器作用于STO集合,STO是一個只支持添加操作的數(shù)據(jù)結(jié)構(gòu),避免了進行代價較高的RSA累加器的刪除操作,大大提升了累加器的更新效率;最后,引入緩存,使得交易可以在接下來的n個區(qū)塊時間內(nèi)被處理,避免每次新區(qū)塊產(chǎn)生后都需要重新提交更新后的有效性證明.
1993年累加器(accumulator)首次被Benaloh等人[22]提出,能夠?qū)⒁粋€大集合的數(shù)據(jù)壓縮到一個短小的、固定字節(jié)的值,稱為累加值.對于每一個在集合內(nèi)的數(shù)據(jù),都存在一個成員見證(membership witness)證明該數(shù)據(jù)在集合內(nèi).對于不在集合內(nèi)的數(shù)據(jù),無法偽造成員見證.Camenisch等人[23]進一步提出了動態(tài)累加器(dynamic accumulator),能夠高效地向累加值添加或刪除指定元素.在動態(tài)累加器的基礎(chǔ)上,Li等人[24]提出了通用累計器(universal accumulator),不僅支持成員見證,對于不在集合內(nèi)數(shù)據(jù),也能夠生成非成員見證(non-membership witness),證明該數(shù)據(jù)不在集合內(nèi).目前,累加器已廣泛運用到多個領(lǐng)域,包括成員測試、數(shù)據(jù)外包時的隱私保護、匿名電子現(xiàn)金系統(tǒng)等.
RSA累加器是在強RSA的假設(shè)下,基于RSA模數(shù)的模冪運算.其最簡單的形式工作為:累加器的秘鑰是RSA的模數(shù)N=pq的因子,其中p和q為強素數(shù),累加值初始化為g∈ZN.對于任意大小的素數(shù)集合S={x1,x2,…,xn},其累加值為
A(S)=gx1×x2×…×xnmodN.
(1)
對于任何在集合S中的數(shù)據(jù)xi,其成員見證wi為S集合中除去xi的累加值:
wi=gx1×x2×…×xn-1×xn+1×xnmodN.
(2)
驗證成員見證wi是否正確可以通過判斷:
(3)
是否成立.
傳統(tǒng)的RSA累加器在初始化時需要生成2個強素數(shù)p和q,任何知道素數(shù)p和q的人都可以使用歐幾里得定理φ(N)=(p-1)(q-1)計算RSA群的階,從而可以進一步偽造任何成員證明和非成員證明.然而,在公有鏈環(huán)境下,不存在任何可信第三方,如何確保RSA累加器秘鑰不泄露是需要解決的首要問題.這里我們借鑒了Boneh等人[10]的工作,他將動態(tài)累加器建立在未知階的群之上,避免進行可信的初始化設(shè)置.Class Group作為一種虛構(gòu)的二次方階群,可以用于構(gòu)建去信任化的RSA累加器.相關(guān)工作本文不做展開,讀者可以參考Boneh以及其他相關(guān)工作.
在UTXO模型的區(qū)塊鏈中,狀態(tài)由所有的UTXO組成.每筆交易消費已有的UTXO,并產(chǎn)生新的UTXO記錄.已有的工作將RSA累加器作用于UTXO集合上,通過構(gòu)建UTXO承諾來壓縮狀態(tài).當新區(qū)塊產(chǎn)生后,從UTXO承諾中刪除所有已消費的UTXO并添加新產(chǎn)生的UTXO.然而,在不知道群階的情況下,從RSA累加器中刪除元素的復(fù)雜度為O(n2),而添加操作的復(fù)雜度僅為O(n),頻繁地從累加器中刪除元素將導(dǎo)致累加器更新效率低下.
為此,本文提出了STO承諾技術(shù),使用RSA累加器將所有STO進行壓縮.由于STO是一個只支持添加操作的數(shù)據(jù)結(jié)構(gòu),避免了進行代價較高的累加器刪除操作.
PocketChain基于STO承諾技術(shù)構(gòu)建無狀態(tài)客戶端,其系統(tǒng)結(jié)構(gòu)如圖4所示,主要包含3個模塊:STO承諾、證明生成與更新.
Fig. 4 System architecture of PocketChain 圖4 PocketChain系統(tǒng)結(jié)構(gòu)
3.3.1 STO承諾
每個區(qū)塊頭除了包含交易的Merkle樹根(Merkle transactions root, MTR),還包含了由所有已消費的交易輸出組成的STO累加值A(chǔ)CC.當新區(qū)塊產(chǎn)生后,需要向ACC中添加區(qū)塊中已消費的交易輸出,構(gòu)造新的STO累加值.此外,RSA累加器的輸入必須限制為素數(shù)才能保證其無碰撞的特性,為此我們需要將STO轉(zhuǎn)變?yōu)樗財?shù),這可以通過函數(shù)HashToPrime[25]進行轉(zhuǎn)化.具體過程如算法1所示:
算法1.狀態(tài)累加器批處理更新與驗證算法.
FuncGGen(λ):
①GRSA←GGen(λ);
②A0←GRSA;
③ returnA0.
FuncAccUpdate(At,tx):
①p=1;
② for eachuintx.inputsdo
③p*=HashToPrime(u);
④ end for
⑥Q←NI_POE_PROVE(At,p,At+1);
⑦ returnAt+1,Q.
FuncAccVerify(At,tx,At+1,Q):
①p=1;
② for eachuintx.inputsdo
③p*=HashToPrime(u);
④ end for
⑤ returnNI_POE_VERIFY(At,p,At+1,Q).
1)Gen(λ)首先根據(jù)系統(tǒng)安全參數(shù)λ對系統(tǒng)進行初始化,返回累加初始值A(chǔ)0;
2)AccUpdate(At,tx)根據(jù)新區(qū)塊所消耗的交易輸出,對累加器進行批處理更新.首先,使用HashToPrime對每個交易的輸入進行求質(zhì)運算,并計算它們的乘積,然后進行冥模運算更新累加值.最后使用非交互式NI-POE協(xié)議提交正確更新的證明Q.
3)AccVerify(At,tx,At+1,Q)根據(jù)交易和證明Q,使用NI-POE協(xié)議驗證累加值是否被正確更新.
其中,NI-POE[10,26]協(xié)議允許證明人P向驗證人V證明(u,w,x)滿足w=ux,V只需進行少量計算,便可以相信P進行了正確計算.NI-POE協(xié)議能夠很大程度上降低驗證累加器被正確更新的代價.
3.3.2 交易有效性證明生成
交易有效性證明需要包括2個部分:交易輸入的存在性證明和交易輸入的未花費證明.其中,輸入的存在證明可以使用交易輸入產(chǎn)生時的Merkle證明,包含從葉子節(jié)點到MTR的路徑.由于不同的交易輸入可能產(chǎn)生于不同的區(qū)塊,所以無法對存在性證明進行合并.
交易輸入的未花費證明是對當前STO累加值的非成員見證.由于STO包含了所有已消費的輸入,只要能提供非成員見證,就能證明輸入沒有被消費.具體過程如算法2所示.其中,非成員見證生成算法NonMemWitCreate以UTXO生成時所在區(qū)塊的STO累加值作為初始值,獲取之后所有的STO記錄進行求質(zhì)運行并計算乘積,利用通用累加器的非成員見證生成算法進行生成.類似地,NonMemWitVerify算法對非成員見證進行驗證,具體可以參考Li等人[24]關(guān)于通用累加器的非成員見證生成與驗證算法.值得注意的是,交易輸入的未花費證明可以被合并.例如2個分別產(chǎn)生于區(qū)塊t與區(qū)塊t+1的輸入,我們可以構(gòu)造一個從區(qū)塊t開始的合并證明,因為產(chǎn)生于區(qū)塊t+1的輸入并不能提前被消費.
算法2.證明生成、更新和驗證算法.
FuncNonMemWitCreate(An,STOn:m,Am,xn):
①p=1;
②xn←HashToPrime(xn);
③ for eachstoinSTOn:mdo
④p*=HashToPrime(sto);
⑤ end for
⑥a,b←Bezout(xn,p);
⑧ returnum(xn)←(d,b).
FuncNonMemWitVerify(An,Am,xn,um(xn)):
①xn←HashToPrime(xn);
②d,b←um(xn);
FuncNonMemWitUpdate(An,un(xt),x,STOn:m):
①d,b←um(xn),p=1;
② for eachstoinSTOn:mdo
④p*=HashToPrime(sto);
⑤ end for
⑥a0,b0=Bezout(HashToPrime(xt),p);
⑦r=a0b;
3.3.3 交易有效性證明更新
交易輸入的存在性證明使用輸入產(chǎn)生時的Merkle路徑,該證明保持不變,不需要更新.然而,交易輸入的未花費證明是對當前STO集合累加值的非成員見證,當STO累加值更新后,需要同步更新未花費證明.
用戶在發(fā)起交易時提交的最新有效性證明,可能會因為網(wǎng)絡(luò)傳播延遲或礦工無法及時打包交易,導(dǎo)致交易有效性證明會過期.讓用戶重復(fù)提交更新后的有效性證明無疑會增加用戶使用的負擔與體驗.為此,PocketChain引入了STO緩存機制,每個驗證節(jié)點保存最近n個區(qū)塊(例如 1 h或1 d)的數(shù)據(jù)以及對應(yīng)的STO集合,通過驗證輸入存在性證明與未花費證明后,附加驗證輸入不在STO緩存內(nèi),從而允許交易在發(fā)起后的n個區(qū)塊時間內(nèi)被處理,避免用戶重復(fù)提交證明信息.
對于那些長期沒有更新的未花費證明,用戶可以選擇自己更新或交由服務(wù)節(jié)點更新.用戶自己更新的算法見UpdateNonMemWit,通過獲取上次更新之后所有的STO記錄,逐個區(qū)塊地進行更新.然而,在計算資源較少的環(huán)境下,更新非成員證明較為耗時.在忽略網(wǎng)路傳輸延遲的情況下,一個2.6 GHz Intel Core i5 處理核心每秒只能處理150個添加操作.因此,我們引入了服務(wù)節(jié)點,服務(wù)節(jié)點利用算力為用戶更新證明從而獲得報酬.
分片技術(shù)的主要思想可以簡單描述為分而治之,將單鏈結(jié)構(gòu)拆分為多條并行運行的子鏈(分片),通過增加分片數(shù)量來提升系統(tǒng)的處理能力.分片技術(shù)可以分為交易分片和狀態(tài)分片.交易分片僅僅實現(xiàn)交易的并行處理,每個節(jié)點依然需要保存所有分片的數(shù)據(jù).當大量提升系統(tǒng)吞吐后,節(jié)點的存儲壓力極具增大.相比之下,狀態(tài)分片不僅僅將交易的處理并行化,每個分片只需保存與自己處理交易相關(guān)的狀態(tài)信息,降低了分片的存儲壓力.然而,為了防止惡意節(jié)點集中到某個特定分片發(fā)起攻擊,目前的分片技術(shù)通常建立在周期性隨機重組的架構(gòu)下,每次分片重組都需要重新下載新分片的數(shù)據(jù)和狀態(tài),節(jié)點的帶寬開銷增加,并且嚴重限制了分片切換的頻率.為此,本節(jié)將無狀態(tài)客戶端與分片技術(shù)相結(jié)合,利用無狀態(tài)客戶端低存儲的特點,降低分片切換時的狀態(tài)遷移量.介紹了分片周期性隨機重組的系統(tǒng)結(jié)構(gòu),將分片技術(shù)與無狀態(tài)客戶端進行結(jié)合,消除分片周期性隨機重組導(dǎo)致的狀態(tài)遷移問題.
分片技術(shù)將全網(wǎng)算力(或權(quán)益)劃分為多個部分,每個分片只擁有全網(wǎng)算力的一小部分,為了避免惡意節(jié)點集中到某個特定分片發(fā)起定向攻擊,目前絕大部分基于分片的擴容技術(shù)都采用周期性隨機重組的架構(gòu).如圖5所示,每個階段開始,全網(wǎng)節(jié)點都會根據(jù)上一階段末產(chǎn)生的新的隨機數(shù)進行分片重組,節(jié)點無法預(yù)知它將分配到具體哪個分片中.此外,為了防止分片內(nèi)節(jié)點串通作惡,分片切換的周期越短,系統(tǒng)越安全.
Fig. 5 Periodically reshuffling architecture of sharding圖5 分片周期性隨機重組結(jié)構(gòu)
然而,周期性隨機重組的架構(gòu)面臨2矛盾:1)在支持狀態(tài)分片的情況下,每個分片只保留了當前分片的狀態(tài)與數(shù)據(jù),當切換到其他分片后,需要重新下載新分片的狀態(tài)與數(shù)據(jù),這個過程稱為狀態(tài)遷移.狀態(tài)遷移極大地增加了網(wǎng)絡(luò)帶寬開銷,同時也限制了分片切換的頻率;2)在不支持狀態(tài)分片的情況下,節(jié)點存儲每個分片的狀態(tài)與數(shù)據(jù),雖然不存在狀態(tài)遷移問題,但節(jié)點的存儲壓力急劇增大.
在第3節(jié)中,我們介紹了無狀態(tài)客戶端,節(jié)點只需要保存區(qū)塊頭以及最近n個區(qū)塊的數(shù)據(jù),不僅降低了節(jié)點存儲歷史區(qū)塊的開銷,同時將GB級的狀態(tài)壓縮到固定的KB級,降低了節(jié)點對內(nèi)存的開銷.在周期性隨機重組的分片架構(gòu)下,主要面臨分片重組時的狀態(tài)遷移問題,無狀態(tài)客戶端設(shè)計能夠完美解決以上問題.在支持狀態(tài)分片的情況下,每次分片切換只需要下載新分片的區(qū)塊頭和少量的緩存數(shù)據(jù),大大降低狀態(tài)遷移代價.此外,由于區(qū)塊頭占用極少的存儲空間,驗證節(jié)點有能力存儲所有分片的區(qū)塊頭,在每次分片重組后,節(jié)點可以不進行任何狀態(tài)遷移,可以立即切換到新分片開始工作.
在本節(jié)中,我們使用本文提供的技術(shù)構(gòu)建了一個輕量級、可擴展的區(qū)塊鏈模型PocketChain,并測試了系統(tǒng)的吞吐量和節(jié)點的存儲開銷.
我們基于RSA累加器、Merkle樹以及非成員見證的源碼實現(xiàn)了PocketChain的無狀態(tài)客戶端.其中,RSA累加器使用3 072 b的模,素數(shù)采用128 b,Merkle節(jié)點為32 B,這些參數(shù)在密碼領(lǐng)域被公認為安全的.我們使用60個物理節(jié)點構(gòu)建了本地集群,每個節(jié)點配置一個8核Intel Xeon E5-1620 3.6 GHz處理器、48 GB內(nèi)存、3 TB硬盤和10 Gbs的以太網(wǎng)卡.在測試分片的擴展性時,我們使用docker模擬了1 800個節(jié)點.
本節(jié)我們測試了RSA累加器在未知秘鑰的情況下,針對批量刪除和添加操作的更新效率.累加器的更新效率直接影響了系統(tǒng)的吞吐能力.其中,Boneh使用RSA累加器構(gòu)建UTXO承諾,需要進行大量刪除操作,而PocketChain使用RSA累加器構(gòu)建STO承諾,只需要進行添加操作.
圖6展示了PocketChain與Boneh累加器的更新效率對比.實驗結(jié)果表明,PocketChain STO承諾的更新效率遠大于Boneh UTXO承諾的更新效率,并且隨著操作數(shù)量的增加,性能差距越明顯.例如,當操作數(shù)量達到1 000時,Boneh累加器更新時間是PocketChain的50倍.這就導(dǎo)致,依賴于RSA累加器刪除操作的無狀態(tài)客戶端設(shè)計面臨嚴重的性能問題.
Fig. 6 Performance of accumulator update圖6 累加器更新效率
我們綜合考慮累加器更新效率、交易驗證時間開銷,測試了系統(tǒng)支持的最高吞吐.我們假設(shè)每個區(qū)塊包含500筆交易,每筆交易有2個輸入和2個輸出.同樣,我們與Boneh的工作進行了對比.實驗結(jié)果如表1所示,Boneh由于累加器更新效率低,最高吞吐只能實現(xiàn)3.2 TPS,相比之下,PocketChain能實現(xiàn)100 TPS.
Table 1 A Single Chain Maximum TPS表1 單鏈系統(tǒng)最高吞吐
在本節(jié)中,我們測試了單鏈環(huán)境下節(jié)點的存儲壓力.我們獲取了比特幣從2015-01—2019-01的歷史交易數(shù)據(jù),并將其運用到PocketChain中.此外,我們將STO緩存設(shè)置為1 d,足夠絕大多數(shù)交易被處理.
圖7展示了PocketChain和比特幣的內(nèi)存開銷對比.比特幣內(nèi)存開銷從2015—2019年增加了4倍,目前已經(jīng)到達了2.7 GB,相比之下,PocketChain采用無狀態(tài)客戶端設(shè)計,每個節(jié)點只需要保存58 MB(最近一天)的STO緩存數(shù)據(jù).
Fig. 7 RAM usage comparison between Bitcoin and PocketChain圖7 比特幣與PocketChain內(nèi)存使用量對比
Fig. 8 Disk usage comparison between Bitcoin and PocketChain圖8 比特幣與PocketChain磁盤使用量對比
圖8展示了PocketChain與比特幣硬盤使用開銷對比.比特幣需要保存所有歷史區(qū)塊的數(shù)據(jù),目前已經(jīng)占用了233 GB的硬盤存儲空間.相比之下,PocketChain只需要保存區(qū)塊頭,增長速度緩慢,目前僅需0.27 GB的存儲空間.
本節(jié)我們首先測試了分片的擴展能力,然后與最新的分片工作進行了對比,結(jié)果如表2所示.其中:k表示分片數(shù)量.
在TPS方面,所有的工作都能線性提升系統(tǒng)吞吐.在磁盤消耗方面,OmniLedger采用基于檢查點賬本剪枝技術(shù),只需存儲從上一個檢查點到最近的歷史區(qū)塊,能夠大大降低磁盤存儲空間;相比之下,PocketChain僅需要存儲所有歷史區(qū)塊頭,由于區(qū)塊頭占用極少的存儲空間,依然能有效降低磁盤存儲.
Table 2 Comparison of PocketChain with State-of-the-art Sharding-based Blockchain Protocols表2 PocketChain與最新的分片協(xié)議的對比
在內(nèi)存的消耗方面,OmniLedger,RapidChain,SSChain支持狀態(tài)分片,只需存儲1k的狀態(tài),隨著時間的增長,狀態(tài)空間依然保持增長.相比之下,PocketChain使用無狀態(tài)客戶端,節(jié)點只需保存最近n個區(qū)塊的狀態(tài)信息(MB級),內(nèi)存消耗為常數(shù).
在狀態(tài)遷移方面,OmniLedger和RapidChain在分片切換時,都需要下載大量狀態(tài)信息;SSChain在雙層架構(gòu)下,利用經(jīng)濟激勵機制避免了分片重組.PocketChain可以存儲所有分片鏈的區(qū)塊頭,分片切換時不需要下載額外數(shù)據(jù);在沒有保存其他分片鏈的情況下,也只需要同步區(qū)塊頭,大大降低同步帶寬和時間開銷.
PocketChain采用無狀態(tài)客戶端來降低節(jié)點存儲壓力,節(jié)點僅需存儲歷史區(qū)塊頭與最近n個區(qū)塊,硬盤消耗增長緩慢,內(nèi)存開銷固定,大大降低了運行一個礦工節(jié)點和驗證節(jié)點的存儲成本,去中心化程度得到提升.相比之下,目前的公有鏈,例如比特幣和以太坊,硬盤和內(nèi)存資源消耗隨著時間快速增長,運行礦工節(jié)點和驗證節(jié)點的成本不斷增加,可以預(yù)測在不久的將來,只有少數(shù)“超級”節(jié)點能夠完成交易的驗證,系統(tǒng)中心化程度逐漸增加.
在安全性方面,使用Class Group構(gòu)建RSA累加器,避免了可信第三方的初始化設(shè)置.此外,分片重組頻率與分片系統(tǒng)的安全性密切相關(guān),在賄賂攻擊模型下,惡意節(jié)點可以通過賄賂改變?nèi)魏握\實節(jié)點的行為.假設(shè)全網(wǎng)節(jié)點數(shù)量為m,分片數(shù)量為n,惡意節(jié)點數(shù)量為k,分片切換周期為x.在隨機分組下,每個分片初始分配的惡意節(jié)點數(shù)量為kn.假設(shè)攻擊者平均每t時間成功賄賂1個誠實節(jié)點,那么必須保證:
PocketChain將無狀態(tài)客戶端運用于分片技術(shù)架構(gòu)下,由于無狀態(tài)客戶端低存儲的特點,降低了分片周期性隨機重組導(dǎo)致的狀態(tài)遷移代價,從而可以提升分片重組頻率,進一步增加分片系統(tǒng)的安全性.
本文聚焦于公有鏈低吞吐和數(shù)據(jù)增長問題,提出了一種面向UTXO模型的輕量級、可擴展的公有鏈PocketChain.首先,PocketChain使用具有批處理能力的RSA累加器構(gòu)建無狀態(tài)客戶端,驗證節(jié)點只需保存歷史區(qū)塊頭和最近的n個區(qū)塊,避免存儲大量歷史區(qū)塊和狀態(tài)信息.然后,將無狀態(tài)客戶端運用于分片技術(shù)架構(gòu)下,一方面通過增加分片數(shù)量,能大大提升系統(tǒng)的處理能力;另一方面,由于無狀態(tài)客戶端低存儲的特點,克服了分片周期性隨機重組導(dǎo)致的狀態(tài)遷移問題,從而能進一步提升分片重組頻率,增加分片系統(tǒng)安全性.實驗結(jié)果表明,本文提出的PocketChain能有效解決驗證節(jié)點存儲增長問題,并降低分片技術(shù)周期性隨機重組導(dǎo)致的狀態(tài)遷移代價.
本文提出的將無狀態(tài)客戶端與分片技術(shù)相結(jié)合的方法,還遺留2個問題有待進一步研究:1)針對服務(wù)提供者提出恰當?shù)慕?jīng)濟激勵機制.對于那些長久沒有更新未消費證明的用戶,他們依賴服務(wù)提供者的計算服務(wù),如何激勵服務(wù)提供者為用戶服務(wù)是一個有待解決的經(jīng)濟問題;2)進一步降低見證更新頻率.基于RSA累加器的狀態(tài)壓縮方法,每次累加值更新后,對應(yīng)的(非)成員見證都需要同步更新.雖然PocketChain引入了緩存機制,僅僅避免了在交易沒被及時處理的情況下頻繁更新見證的問題.如何設(shè)計更優(yōu)秀的累加器、降低見證的更新頻率,是一個非常值得研究的方向.