陳鵬閣,柏粉花,張 弛,江年旗
(1.昆明理工大學(xué) 信息工程與自動(dòng)化學(xué)院,云南 昆明 650500;2.昆明理工大學(xué) 云南省計(jì)算機(jī)技術(shù)應(yīng)用重點(diǎn)實(shí)驗(yàn)室,云南 昆明 650500)
近些年來,物聯(lián)網(wǎng)作為通信行業(yè)的核心領(lǐng)域發(fā)展十分迅速,它具有巨大的技術(shù)、社會(huì)和經(jīng)濟(jì)意義[1]。與此同時(shí),數(shù)據(jù)共享已經(jīng)發(fā)展成為物聯(lián)網(wǎng)的核心應(yīng)用之一,收集于物聯(lián)網(wǎng)的數(shù)據(jù)經(jīng)過有效的處理后可以用于服務(wù)許多不同類型的應(yīng)用。傳統(tǒng)的物聯(lián)網(wǎng)數(shù)據(jù)共享多依托基于云的第三方進(jìn)行,用戶將從各類物聯(lián)網(wǎng)設(shè)備收集到的數(shù)據(jù)上傳到第三方的云,并與其他利益相關(guān)者進(jìn)行數(shù)據(jù)共享[2]。在這種共享機(jī)制下,用戶以及物聯(lián)網(wǎng)設(shè)備都必須信任第三方服務(wù)提供商,可能還需要支付額外的服務(wù)費(fèi)用。此外,這種集中式的數(shù)據(jù)共享方式還需要在第三方服務(wù)提供商、物聯(lián)網(wǎng)設(shè)備以及用戶之間建立協(xié)議,這些協(xié)議大多是靜態(tài)的,需要花費(fèi)大量的時(shí)間和管理才能建立,大大降低了數(shù)據(jù)共享的效率。因此,傳統(tǒng)的集中式數(shù)據(jù)共享機(jī)制難以擴(kuò)展,不能滿足未來物聯(lián)網(wǎng)數(shù)據(jù)共享的需求[3]。
近年來隨著區(qū)塊鏈的發(fā)展,眾多國家政府、企業(yè)和研究機(jī)構(gòu)開始關(guān)注并重視這一新興的信息技術(shù)[4]。在我國“十四五”規(guī)劃綱要中,區(qū)塊鏈被列為七大數(shù)字經(jīng)濟(jì)重點(diǎn)產(chǎn)業(yè)之一,并且目前已經(jīng)被應(yīng)用于數(shù)字資產(chǎn)交易、物流管理、智慧城市和物聯(lián)網(wǎng)等諸多領(lǐng)域,助力實(shí)體經(jīng)濟(jì)轉(zhuǎn)型升級[5]。其中,區(qū)塊鏈和物聯(lián)網(wǎng)共同具備的分布式特性使它們能夠有效地結(jié)合在一起[6,7],在物聯(lián)網(wǎng)數(shù)據(jù)共享場景中,應(yīng)用區(qū)塊鏈技術(shù),可以將相應(yīng)的共享交易通過部署在區(qū)塊鏈上的智能合約自動(dòng)管理,不需要手動(dòng)驗(yàn)證支付和預(yù)定義。與依托第三方的集中式業(yè)務(wù)場景相比,基于區(qū)塊鏈的物聯(lián)網(wǎng)數(shù)據(jù)共享可以有效地提高用戶信任度,降低運(yùn)行成本,提高共享效率。
然而,隨著時(shí)間的推移,區(qū)塊鏈賬本所需的存儲空間在不斷增加,以比特幣系統(tǒng)為例,其每年的存儲開銷在50 GB 以上,經(jīng)過10 年以上的運(yùn)行,其存儲開銷已經(jīng)十分龐大,這個(gè)問題在資源有限的物聯(lián)網(wǎng)中顯得更加突出,愈來愈大的存儲開銷已經(jīng)成為物聯(lián)網(wǎng)設(shè)備加入數(shù)據(jù)共享的阻礙。
研究人員對區(qū)塊鏈的存儲優(yōu)化問題已經(jīng)進(jìn)行了許多研究,其中對于鏈上存儲優(yōu)化方案來說,中本聰最早提出了簡單支付驗(yàn)證(Simplified Payment Verification,SPV)輕節(jié)點(diǎn)方案[8],它允許存儲資源不足的節(jié)點(diǎn)只存儲區(qū)塊頭即可,這類節(jié)點(diǎn)就被稱為輕節(jié)點(diǎn)。后續(xù),又陸續(xù)出現(xiàn)了一些存儲方案,這些都可以歸結(jié)為類輕節(jié)點(diǎn)方案,其中比較著名的方案有Jidar[9]方案和CUB[10]方案。Jidar 方案允許節(jié)點(diǎn)只存儲自己感興趣的交易事務(wù)和Merkle 根,而CUB 方案引入信任單元,使一個(gè)單元的節(jié)點(diǎn)共同維護(hù)一份完整的區(qū)塊鏈數(shù)據(jù)副本。這些方案都能夠在一定程度上減少區(qū)塊鏈節(jié)點(diǎn)的存儲開銷,但是對于基于區(qū)塊鏈的物聯(lián)網(wǎng)數(shù)據(jù)共享場景來說,這些研究方案存在以下不足:
(1)SPV 方案雖然要求網(wǎng)絡(luò)內(nèi)必須存在存儲完整區(qū)塊鏈賬本的全節(jié)點(diǎn),但是輕節(jié)點(diǎn)數(shù)量過多的話,會(huì)出現(xiàn)賬本只由少部分全節(jié)點(diǎn)維護(hù)的情況,這與區(qū)塊鏈的“去中心化”理念并不相符。類輕節(jié)點(diǎn)方案雖然由區(qū)塊鏈中的所有節(jié)點(diǎn)共同維護(hù)區(qū)塊鏈賬本,但是缺乏存儲完整區(qū)塊鏈數(shù)據(jù)的全節(jié)點(diǎn)。在物聯(lián)網(wǎng)數(shù)據(jù)共享場景中,對交易數(shù)據(jù)的驗(yàn)證和溯源是非常必要的,所以其網(wǎng)絡(luò)中必須存在存儲完整區(qū)塊鏈賬本的節(jié)點(diǎn)以方便驗(yàn)證。
(2)現(xiàn)有的區(qū)塊鏈節(jié)點(diǎn)存儲優(yōu)化方案絕大多數(shù)是對經(jīng)過共識并且出塊的區(qū)塊進(jìn)行處理,即只是從區(qū)塊鏈技術(shù)架構(gòu)的網(wǎng)絡(luò)層進(jìn)行改進(jìn),并不涉及區(qū)塊鏈的共識機(jī)制[11],步驟繁瑣,效率不高。
針對上述問題,本文面向基于區(qū)塊鏈的物聯(lián)網(wǎng)數(shù)據(jù)高共享場景,提出一種區(qū)塊鏈節(jié)點(diǎn)存儲優(yōu)化方案,該方案結(jié)合物聯(lián)網(wǎng)數(shù)據(jù)共享場景業(yè)務(wù)需求,利用基于域的區(qū)塊鏈存儲模型,引入部分重復(fù)(Fractional Repetition,F(xiàn)R)碼,對實(shí)用拜占庭容錯(cuò)[12](Practical Byzantine Fault Tolerance,PBFT)算法進(jìn)行改進(jìn),在保證共識效率的前提下,在共識過程中對區(qū)塊鏈賬本進(jìn)行優(yōu)化存儲,大幅降低節(jié)點(diǎn)的存儲開銷。
由于本文在改進(jìn)共識算法時(shí)引入了部分重復(fù)碼的概念,所以在此對其進(jìn)行介紹。
部分重復(fù)碼[13]的概念由Rouayheb 等人在極大距離可分(Maximum Distance Separable,MDS)碼的基礎(chǔ)上提出,可以實(shí)現(xiàn)非編碼的精確修復(fù),簡單來說,就是當(dāng)系統(tǒng)中的某節(jié)點(diǎn)失效時(shí),它可以從其他節(jié)點(diǎn)下載編碼數(shù)據(jù)片段存儲到替換節(jié)點(diǎn),而不需要額外的計(jì)算,適合資源有限的物聯(lián)網(wǎng)場景。
FR 碼的外部采用MDS 碼,內(nèi)部采用重復(fù)碼,其編碼過程可以描述為,首先,原始數(shù)據(jù)被分成j個(gè)數(shù)據(jù)片段后,經(jīng)MDS(m,j)編碼,生成大小相同的m個(gè)編碼數(shù)據(jù)片段;其次,將m個(gè)編碼數(shù)據(jù)片段復(fù)制γ倍,分散放置到系統(tǒng)中的n個(gè)存儲節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)存儲p個(gè)編碼數(shù)據(jù)片段;最后,經(jīng)過該編碼操作即可得到FR(n,p,γ)碼,滿足公式:
式中:r=m-j(m>j)為校驗(yàn)片段。FR碼具備MDS特性,即從m個(gè)片段中任取j個(gè)即可解碼獲得完整數(shù)據(jù)。
以FR(4,3,2)碼為例,其構(gòu)造過程如圖1 所示。當(dāng)FR 碼的重復(fù)率γ=2 時(shí),多采用MacWilliams 提出的基于正則圖的FR 構(gòu)造法,4 個(gè)角落代表4 個(gè)節(jié)點(diǎn),與之連線上對應(yīng)的數(shù)字即表示在此次構(gòu)造中,節(jié)點(diǎn)被分配得到的編碼片段。正則圖構(gòu)造法是最簡單,也是用得最多的一種FR 碼構(gòu)造方式。當(dāng)重復(fù)率γ>2 時(shí),就要選擇其他的構(gòu)造方法,具體參考文獻(xiàn)[14]和文獻(xiàn)[15]。
圖1 基于正則圖的FR(4,3,2)構(gòu)造
為了降低節(jié)點(diǎn)的存儲開銷,同時(shí)滿足基于區(qū)塊鏈的物聯(lián)網(wǎng)數(shù)據(jù)共享場景中交易驗(yàn)證、交易溯源等業(yè)務(wù)需求,本文提出基于域的區(qū)塊鏈存儲模型,如圖2 所示。
在該存儲模型中,節(jié)點(diǎn)類型被分為主節(jié)點(diǎn)、值班節(jié)點(diǎn)和普通節(jié)點(diǎn)。網(wǎng)絡(luò)被劃分成了n個(gè)域,每個(gè)域中的節(jié)點(diǎn)類型包含1 個(gè)值班節(jié)點(diǎn)和k-1 個(gè)普通節(jié)點(diǎn),此時(shí)域的大小記為k。在這個(gè)存儲模型中,由主節(jié)點(diǎn)充當(dāng)編碼器,在共識過程中對上鏈交易數(shù)據(jù)進(jìn)行編碼,將編碼片段廣播給各個(gè)值班節(jié)點(diǎn)和普通節(jié)點(diǎn)。值班節(jié)點(diǎn)和普通節(jié)點(diǎn)負(fù)責(zé)對上鏈數(shù)據(jù)進(jìn)行共識,共識結(jié)束后,值班節(jié)點(diǎn)存儲完整區(qū)塊鏈數(shù)據(jù)和編碼片段,普通節(jié)點(diǎn)只存儲區(qū)塊頭和編碼片段。
在這個(gè)存儲模型中,絕大多數(shù)的節(jié)點(diǎn)類型均為存儲少量數(shù)據(jù)的普通節(jié)點(diǎn),可以大幅降低該區(qū)塊鏈系統(tǒng)的存儲開銷。同時(shí),存在值班節(jié)點(diǎn)存儲完整數(shù)據(jù)和編碼片段,可以提供交易驗(yàn)證和數(shù)據(jù)恢復(fù)的服務(wù)。此外,該存儲模型中的區(qū)塊鏈賬本由所有節(jié)點(diǎn)共同維護(hù),符合區(qū)塊鏈“去中心化”的思想。
區(qū)塊鏈的類型可以根據(jù)其適用場景分為公有鏈、私有鏈和聯(lián)盟鏈3 種。公有鏈即比特幣、以太坊等項(xiàng)目所采用的區(qū)塊鏈,這類區(qū)塊鏈不需要權(quán)限,任何人均可進(jìn)入,去中心化程度最高,但是吞吐量低,并不適用于商業(yè)場景。私有鏈則一般用于組織或企業(yè)內(nèi)部,開放程度低,也不適用于商業(yè)場景。聯(lián)盟鏈的開放程度介于二者之間,多采用PBFT 和其改進(jìn)算法等快速共識算法,具有較高的吞吐量,所以受到各種商業(yè)場景的青睞。本文面向物聯(lián)網(wǎng)數(shù)據(jù)共享場景,引入FR 碼對PBFT 算法進(jìn)行修改,降低節(jié)點(diǎn)的存儲開銷。
改進(jìn)過的PBFT 算法包含主節(jié)點(diǎn)、值班節(jié)點(diǎn)和普通節(jié)點(diǎn)3 種節(jié)點(diǎn)類型,經(jīng)請求(Request)、預(yù)準(zhǔn)備(Pre-prepare)、準(zhǔn)備(Prepare)、提交(Commit)、回復(fù)(Reply)5個(gè)步驟達(dá)成共識。具體步驟描述如下:
(1)Request:由客戶端或其他節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送請求消息
(2)Pre-prepare:主節(jié)點(diǎn)對z進(jìn)行MDS(m,j)編碼,生成m個(gè)編碼片段zf,之后,向網(wǎng)絡(luò)中的其他節(jié)點(diǎn)發(fā)送預(yù)準(zhǔn)備消息<
(3)Prepare:收到預(yù)準(zhǔn)備消息的普通節(jié)點(diǎn)和值班節(jié)點(diǎn)利用j個(gè)編碼數(shù)據(jù)片段進(jìn)行解碼獲得完整上鏈數(shù)據(jù),之后驗(yàn)證預(yù)備消息的合法性,驗(yàn)證通過后向其他節(jié)點(diǎn)廣播準(zhǔn)備消息
(4)Commit:節(jié)點(diǎn)廣播確認(rèn)消息
(5)Reply:每個(gè)節(jié)點(diǎn)向客戶端或請求發(fā)起者,單獨(dú)發(fā)送回復(fù)消息
本文使用JAVA 語言搭建了一個(gè)區(qū)塊鏈系統(tǒng)實(shí)驗(yàn)平臺,系統(tǒng)的底層技術(shù)包括分布式數(shù)據(jù)存儲、Spring 框架、gRPC 通信機(jī)制等。為了減少網(wǎng)絡(luò)問題對本實(shí)驗(yàn)的影響,實(shí)驗(yàn)平臺部署在OpenStack 云平臺中,部署多臺配置相同的虛擬機(jī)作為區(qū)塊鏈網(wǎng)絡(luò)節(jié)點(diǎn),數(shù)據(jù)庫和Redis 分別運(yùn)行在docker 環(huán)境中,具體物理配置如表1 所示。
表1 節(jié)點(diǎn)物理配置
2.1.1 FR 碼的編碼解碼速度測試
在本次測試中,F(xiàn)R 碼的外部MDS 編碼采用RS 碼,這是一種已經(jīng)被廣泛運(yùn)用于存儲系統(tǒng)中的經(jīng)典MDS 碼。區(qū)塊大小被設(shè)置為1.12 MB,其大小與主流區(qū)塊鏈系統(tǒng)的區(qū)塊大小類似。實(shí)驗(yàn)測試了在不同情況編碼參數(shù)下采用FR 碼對區(qū)塊數(shù)據(jù)進(jìn)行編碼和解碼的速度,結(jié)果如圖3 和圖4 所示,其中橫坐標(biāo)代表參數(shù)j,縱坐標(biāo)代表編碼速度與解碼速度。
圖3 FR 碼編碼速度
圖4 FR 碼解碼速度
從實(shí)驗(yàn)結(jié)果可以發(fā)現(xiàn),F(xiàn)R 碼的編碼速度和解碼速度是相當(dāng)快的,在r=2 時(shí),F(xiàn)R 碼的編碼速度能達(dá)到2 200 MB/s,解碼速度最低也在200 MB/s 左右,對于一個(gè)1 MB 左右的區(qū)塊來說,解碼和編碼都在毫秒間完成。由此可以得出結(jié)論,F(xiàn)R 碼的性能優(yōu)越,這不僅有利于FR 碼存儲系統(tǒng)的維護(hù),也說明編碼解碼過程并不會(huì)拖慢PBFT 的共識進(jìn)程。
2.1.2 PBFT 的TPS 測試
實(shí)驗(yàn)通過測試共識算法每秒鐘能夠處理的事務(wù)(Transaction Per Second,TPS)來評估共識算法的性能,定義TPS 的計(jì)算式為:
式中:?t為一個(gè)區(qū)塊的生成時(shí)間;trans_number為一個(gè)區(qū)塊內(nèi)包含的交易數(shù)目。
在測試中,區(qū)塊鏈系統(tǒng)采用原始PBFT 算法和基于FR(4,3,2)碼的改進(jìn)的PBFT 算法對來自Redis緩存數(shù)據(jù)庫的模擬測試數(shù)據(jù)進(jìn)行共識。測試數(shù)據(jù)是模擬物聯(lián)網(wǎng)數(shù)據(jù)共享的交易數(shù)據(jù),設(shè)置為20個(gè)普通非空字段。測試結(jié)果均在共識結(jié)束后,由統(tǒng)一計(jì)算交易數(shù)目和共識時(shí)間得出。單個(gè)區(qū)塊的trans_number被設(shè)置為2 000,此時(shí)區(qū)塊大小約為1.12 MB。實(shí)驗(yàn)對連續(xù)20 輪共識的時(shí)間進(jìn)行測試和分析,結(jié)果如圖5 所示,其中橫坐標(biāo)代表共識輪次,縱坐標(biāo)代表TPS。
從圖5 中可以看出,改進(jìn)過的PBFT 算法的TPS較原始PBFT 算法并未出現(xiàn)下降的情況,這是因?yàn)樵跍y試中發(fā)現(xiàn),PBFT 算法的共識過程用時(shí)在數(shù)秒內(nèi),而FR 碼的編碼解碼過程用時(shí)在毫秒級別。由此可以分析得出,在PBFT 算法中引入FR 碼,對區(qū)塊鏈賬本進(jìn)行優(yōu)化存儲的方案具有可行性。
圖5 PBFT 和改進(jìn)后的PBFT 的TPS 對比
在FR 碼中,當(dāng)失效節(jié)點(diǎn)或者離線節(jié)點(diǎn)的數(shù)量小于等于γ-1 時(shí),F(xiàn)R 碼能夠進(jìn)行非編碼修復(fù),但一旦失效節(jié)點(diǎn)或離線節(jié)點(diǎn)的數(shù)量達(dá)到甚至超過γ,即某編碼數(shù)據(jù)片段的所有副本全部丟失,該存儲系統(tǒng)就丟失了非編碼修復(fù)的特性。本文通過分析本方案中FR碼的非編碼修復(fù)失敗率來評估它的容錯(cuò)性,容錯(cuò)性與非編碼修復(fù)失敗率成反比,即非編碼修復(fù)失敗率越低,該編碼的容錯(cuò)性就越高。
雖然聯(lián)盟鏈嚴(yán)格控制節(jié)點(diǎn)的出入,但是節(jié)點(diǎn)的錯(cuò)誤離線行為是不可控的,本文用作為FR 碼的非編碼修復(fù)失敗率,那么在域大小為k的情況下(不考慮值班節(jié)點(diǎn)),本方案中FR 碼非編碼修復(fù)失敗率表示為F k。本文分析了在不同參數(shù)下,傳統(tǒng)FR 碼與本方案中FR 碼的非編碼修復(fù)失敗率,結(jié)果如表2 所示。
表2 不同參數(shù)下的FR 碼的非編碼修復(fù)率
從表2 可以看出,本方案的非編碼修復(fù)失敗率遠(yuǎn)小于傳統(tǒng)FR 碼,且隨著k增大呈指數(shù)級下降,因此可以得出結(jié)論,本存儲優(yōu)化方案相較于傳統(tǒng)FR 碼具有更高的容錯(cuò)性。
為了更加直觀地評估本存儲優(yōu)化方案的效果,本文在節(jié)點(diǎn)相同的條件下,將本方案與CUB 方案的存儲開銷減少率和數(shù)據(jù)丟失率進(jìn)行對比(不考慮值班節(jié)點(diǎn),r=2,k=4)。本方案的存儲開銷減少率即為1-p/j,而數(shù)據(jù)丟失率即為非編碼修復(fù)失敗率。對比結(jié)果如圖6 所示。
圖6 本方案與CUB 方案效果對比
從圖6 中可以看出,采用FR 碼的本方案與CUB 方案均大幅降低了節(jié)點(diǎn)的存儲開銷。此外,CUB 方案的存儲開銷減少率一直維持在0.9 以上,而本方案的存儲開銷減少率隨著節(jié)點(diǎn)數(shù)量從0.667不斷攀升至0.867,這是因?yàn)樵诒敬螌Ρ戎?,域的大小k被固定為4,隨著節(jié)點(diǎn)的數(shù)量增加,本方案中的域數(shù)量n在不斷增加,節(jié)點(diǎn)的存儲開銷逐漸下降。因此可以得出結(jié)論,在節(jié)點(diǎn)數(shù)量比較少的情況下,CUB 的存儲效率優(yōu)于本方案,但是隨著節(jié)點(diǎn)數(shù)量增加,這個(gè)優(yōu)勢會(huì)逐漸縮短甚至消失,從而凸顯了本方案的一個(gè)優(yōu)勢,即可以根據(jù)實(shí)際應(yīng)用場景調(diào)節(jié)參數(shù)以調(diào)整節(jié)點(diǎn)的存儲成本。同時(shí),從圖6 中還可以看出,本方案的數(shù)據(jù)丟失率明顯優(yōu)于CUB方案,可以提高數(shù)據(jù)的可靠性。此外,本方案的存儲過程在共識過程中完成,相較于CUB,在共識結(jié)束之后處理效率更高。
本文提出了一種適用于物聯(lián)網(wǎng)數(shù)據(jù)共享場景的區(qū)塊倆存儲優(yōu)化方案,該方案給出了一種適用于物聯(lián)網(wǎng)數(shù)據(jù)共享的存儲模型,引入FR 碼的概念對PBFT 算法進(jìn)行修改,在共識過程中完成區(qū)塊鏈賬本的存儲優(yōu)化。仿真結(jié)果表明,本方案在保證算法的共識效率和編碼方案的容錯(cuò)性的前提下,大幅降低了節(jié)點(diǎn)的存儲開銷,為基于區(qū)塊鏈的物聯(lián)網(wǎng)數(shù)據(jù)共享場景下的存儲優(yōu)化提供了一種新思路。