浮宇麗,任亞唯,2+
(1.北京信息科技大學 信息管理學院,北京 100192; 2.中國科學院信息工程研究所 信息安全國家重點實驗室,北京 100093)
區塊鏈技術是從比特幣系統中提煉出來的底層框架[1],具有去中心化、不可篡改、可以追溯、集體維護等特點[2]。
區塊鏈本質是一個去中心化的數據庫。由于區塊只允許添加、不允許刪除,隨著交易的增加,所需的存儲空間線性增長,造成了區塊鏈存儲可擴展性差問題[3]。到2022年3月16日為止比特幣系統中整個區塊鏈數據占355.69 G,而系統中共計1.1萬余全節點都需存儲一個數據副本,這些冗余副本占用量高達3820.89 TB,造成了存儲空間的嚴重浪費[4-6]。部分全節點由于無法存儲完整的區塊鏈而選擇成為輕節點或退出網絡[7],以及在區塊鏈應用中冗余性存儲造成的空間浪費[8]等問題,對區塊鏈的安全性和去中心化造成嚴重影響,制約了區塊鏈在物聯網、車聯網及輕量級網絡等領域的應用。
近年來,研究者們針對區塊鏈存儲可擴展性問題提出了一些解決方案,這些方案主要歸納為兩大類,一類利用第三方存儲系統存儲區塊鏈數據,另一類則對區塊鏈存儲模型進行優化[9]。使用第三方存儲系統降低了區塊鏈的去中心化。優化區塊鏈存儲模型的方案采用協作式存儲,通過多個節點合作,每個節點存儲部分賬本,提高了區塊鏈的存儲可擴展性。然而這種鏈上協作式存儲易受到惡意節點的影響,造成嚴重的安全問題。
本文針對上述問題提出一種區塊鏈分片存儲模型,主要貢獻為:
(1)提出了一種基于可驗證秘密共享的區塊鏈分片存儲模型。模型使多個節點合作存儲數據區塊,每個節點只需存儲完整區塊的一部分,且節點能夠對收到的分片進行驗證,提高可擴展性和安全性。
(2)本模型提高了區塊鏈存儲的可驗證性。模型在每個分片生成同時計算可驗證序列,并將其廣播,每個節點可對分片進行驗證。本模型在抵御惡意節點欺騙攻擊有顯著優勢。
(3)節點根據區塊的穩定性選擇不同的安全策略。對于高穩定性區塊直接分片存儲,保證存儲效率;對于其它區塊,將區塊和存儲節點的身份綁定,避免惡意節點對存儲系統的影響。
提高區塊鏈存儲可擴展性的研究包括鏈上與鏈下兩種存儲方案。鏈上存儲方案更適合節點眾多的公有鏈與聯盟鏈,提高了可擴展性,但安全問題一直是這種方案需要解決的問題[10]。
賈大宇等[11]提出一種區塊鏈存儲容量可擴展性模型,將區塊鏈中的各區塊存儲在一定比例節點中,而不是所有節點,減少了區塊鏈的存儲空間,降低了區塊鏈的去中心化。
Zhang等[12]提出了一種低開銷的區塊鏈存儲架構,其將原始數據轉化為關鍵詞的語義信息、將低價值數據存儲到中央數據庫、將區塊鏈賬本劃分成多個切片。此方案降低了區塊鏈系統的去中心化。
張國潮等[13]提出一種基于門限秘密共享的區塊鏈分片存儲模型,使用改進后的Shamir門限秘密共享方案將區塊分片并存儲在網絡中的各個節點。此方法雖然降低了區塊數據分片在存儲節點的存儲空間,但計算開銷較大。
Kim等[14]提出一種基于局部秘密共享的分布式區塊鏈存儲模型,根據數據重要性將其分為全局共享和局部共享,局部共享可恢復碼編碼數據,減少存儲空間,但時間開銷大。
卿欣藝等[15]提出基于中國剩余定理的區塊鏈存儲擴展模型,模型將區塊劃分高低安全性,高安全性區塊分布式存儲,低安全性區塊全網保存。
尹芙蓉等[16]提出一種基于糾刪碼的區塊鏈分片存儲系統,采用區間劃分方法將區塊分區,然后使用糾刪碼編碼分布存儲在系統的節點上,但這種方法不具備身份認證機制。
上述鏈上存儲方案都是將區塊鏈的存儲可擴展性作為主要的考慮對象,而忽略了系統的可靠性,同時不能避免網絡惡意節點造成的欺騙攻擊等安全問題。
傳統存儲模型中每一個區塊的產生是礦工在一段時間內將交易信息打包的結果[17]。隨著區塊的不斷產生,每個節點都會保存一份完整的區塊鏈賬本。同時每個區塊的生成都與之前區塊有關,任何一個區塊變動都會使其后所有區塊產生變化。51%共識攻擊[18]主要針對了還未產生的區塊。當攻擊者試圖更改區塊數據時,攻擊者需要比誠實節點更快地產生一條平行鏈代替區塊鏈,攻擊者是否能夠成功趕超誠實鏈可以近似地看成賭徒破產問題[11]。
51%攻擊針對的是傳統區塊鏈的Merkle樹值,而改進之后的區塊鏈結構同樣需要避免此類攻擊。模型需要對分片的區塊進行穩定性判定,并對此區塊的存儲節點進行身份驗證,以保證低穩定性區塊分片后的不可篡改性。
假設p為誠實節點獲得記賬權的概率,q為攻擊節點獲得記賬權的概率 (p+q=1), 那么攻擊者在區塊增加了第z塊時,攻擊者潛在的進展服從泊松分布[19],分布期望為
(1)
攻擊者成功篡改區塊數據的概率Pz為
(2)
由式(2)得,z越大則Pz越小,且隨著z的增加,攻擊者成功篡改區塊數據的概率呈指數趨勢下降,如圖1所示。

圖1 攻擊成功的概率
隨著誠實節點產生區塊的增加,攻擊者越來越難趕超誠實鏈。因此,越原始的區塊中數據被篡改的可能性就越低,區塊的穩定性和安全性也就越高。
Borel定律[20]定義一個事件發生的概率小于1/1050則為不可能事件。因此當區塊高度z增大到一定程度后就不存在被篡改的可能。隨著z的增大,區塊會在鏈中某一位置zL達到“不可被篡改”,即為高穩定性區塊。因此,在本研究中對于那些z不夠大的位置的區塊,使用密鑰協商協議后分片存儲,可對存儲節點進行身份認證,避免惡意節點破壞交易過程。對于z足夠大的位置的區塊,可以直接使用可驗證秘密共享算法[21]進行分片存儲,提高區塊鏈系統的存儲效率。
在本文模型中,根據區塊穩定性判定的結果,對于處在zL后的有被篡改可能性的區塊分片,分片/廣播節點需要和存儲節點進行密鑰協商。
密鑰協商時,分片/廣播節點將對各個存儲節點進行身份驗證,通過計算并驗證節點的唯一標識符cookie完成身份認證。身份認證成功后,分片/廣播節點會和各個存儲節點協商密鑰,接著用協商成功的密鑰衍生一個傳輸密鑰來加密需要傳輸的分片數據。密鑰協商協議可以保證各個節點的安全性以及分片數據傳輸的安全性。
在協商過程中,分片/廣播節點首先生成一個隨機數Ni,并計算其與其中一個存儲節點的唯一標識cookiei=hash(SAD,DAD,Ni,time),SAD是分片/廣播節點的錢包地址(源地址),DAD是某存儲節點的錢包地址(目的地址),time是時間戳。之后將
存儲節點收到后需要進行響應,同樣生成隨機數Nr, 并計算一個cookie并發
分片/廣播節點收到后就需要與存儲節點通過DH算法協商一個對稱密鑰。首先確定p和g,p為一個素數,g為模p的一個原根,生成隨機數Xi
發給存儲節點。
存儲節點收到后,也生成一個隨機數Xr, 根據收到的參數計算Yr=gXrmodp, 將
(3)
根據第一步協商指定的認證方法,雙方都能計算一個KEY=HMAC(auth,Ni|Nr),auth為認證密鑰。為了驗證彼此身份,需要通過KEY再衍生一個密鑰用來對傳輸的區塊數據分片進行加密傳輸
本礦區面積較大,各礦體分布分散,位于孔隙含水層系統內的礦體影響區域巖溶地下水流動系統與局部孔隙地下水流動系統的補、徑、排路徑。根據礦區地勘報告,大部分礦體位于地下水最高水位以上,極少部分礦體位于地下水水位變動帶內。
KEY0=HMAC(KEY,K|cookiei|cookier|0)
(4)
接著,分片/廣播節點計算HASHi, 其表達如式(5)所示,并將KEY0作為對稱密碼的密鑰加密HASHi, 此后將結果發給存儲節點進行身份認證。存儲節點同樣計算HASHr, 并解密收到的內容,將結果與HASHr進行比對
HASHi=HMAC(KEY,K|cookiei|cookier|SAD)
(5)
按相同方法,存儲節點也發送相關計算結果到分片/廣播節點進行身份驗證。若此時驗證都成功,則分片/廣播節點就將加密分片數據發送到存儲節點。
傳統區塊鏈存儲架構采用冗余性存儲方案,即區塊鏈網絡中的每一個節點都存有完整的區塊鏈數據。本文提出的存儲模型將傳統的基于Merkle樹的冗余式存儲結構改為分片存儲結構,每個存儲節點只需存儲每個區塊的一部分即可,其具體數據結構如圖2所示。改變的主要部分為區塊頭的Merkle根的值以及區塊體的結構。區塊體結構包括交易數量、分片/廣播節點地址、分片大小和門限參數 (k,n) 拼接hash后存儲在區塊頭中。由于每一個分片數據區塊的交易數量、分片/廣播節點地址和門限參數是一樣的,所以屬于同一個原始區塊的分片數據區塊的hash值是一致的。

圖2 區塊數據存儲新模型
在提出的模型中,節點主要包括分片/廣播節點、存儲節點、驗證/恢復節點。任何節點都可以作為分片/廣播節點,在某一時刻獲得記賬權限的節點便是此時的分片/廣播節點。存儲節點是本模型中存儲分片數據的節點(分片/廣播節點也可以是一個存儲節點)。驗證/恢復節點是網絡中的用戶在需要恢復原始數據時的節點,是存儲節點的子集。
在本文模型中,分片/廣播節點首先判定區塊安全性,之后將該時刻的數據打包并用可驗證秘密共享算法分成n片,再根據區塊安全性選擇相應安全策略,在協商完相關參數后將n-1個分片數據私密發送給網絡中n-1個存儲節點(每個存儲節點存儲一個分片數據)。接著利用可驗證秘密共享算法中選取的隨機數計算可驗證參數并廣播至網絡中全部節點。存儲節點在與分片/廣播節點協商完相關參數,并接收分片/廣播節點發送來的屬于自己的分片數據和可驗證參數后,完成驗證操作并將分片數據存儲。模型存儲過程整體如圖3所示。

圖3 模型分片存儲過程整體
驗證/恢復節點在恢復數據時首先需要提供身份信息和需要恢復數據的標識,然后廣播需要恢復數據的索引值(索引值為1表示創世區塊),并驗證存儲節點的身份以及收到的分片數據。在驗證成功后,驗證/恢復節點使用拉格朗日插值法恢復原始數據。模型恢復過程的整體如圖4所示。

圖4 模型分片恢復過程整體
分片數據區塊產生要經過以下步驟:交易數據分片、廣播、分片數據區塊產生、分片數據區塊分發。
3.1.1 交易數據分片產生階段
如圖5為利用可驗證秘密共享算法進行區塊數據分片的流程。記分片/廣播節點T需要分片的交易數據為D, 則在T采用可驗證秘密共享算法對D進行分片的具體步驟如下:
(2)利用對稱密碼算法將D進行加密,再將加密后的結果轉化為十進制,記為SD為轉化完成后的交易數據,同時將KS轉化為十進制得到a0;
(3)存在n,k∈R且k (5)T根據上述步驟確定的參數生成如下多項式 f(x)=ak-1xk-1+ak-2xk-2+…+a1x+a0 (6) (6)計算生成的交易數據分片 (xi,yi), 其滿足 yi≡f(xi)modp,1≤i≤n (7) (7)T首先將交易數量、分片/廣播節點地址、分片大小、門限參數(k,n)進行哈希函數計算得到一個哈希值,接著將區塊大小、前一區塊地址、后一區塊地址、版本號、時間戳、難度值、隨機數以及計算得到的哈希值封裝成一個區塊,并將區塊數據和多項式的各個系數刪除,只保留集合B。 (8)按照步驟(7)的方法,將剩余交易數據分片依次封裝成分片數據區塊BCi,1≤i≤n, 每個分片數據區塊BCi可以直接作為數據區塊上鏈; (9)T將生成的n個分片數據區塊秘密分發給存儲節點SNi(T也作為一個存儲節點),即對于每一個給定的xi,SNi存儲的分片數據區塊為BCi。 圖5 交易數據分片流程 3.1.2 廣播 T利用3.1.1節步驟(3)中得到的ai計算出bi,bi∈{1,2,…,k-1},bi的計算表達式為 bi≡gaimodp (8) 然后將計算所得結果記為B,B={b1,b2,…,bk-1}, 將B廣播給網絡的其余n-1個節點。 存儲節點SNi會在收到分片數據區塊后對其進行驗證,具體驗證步驟如下: (1)SNi在收到分片數據區塊BCi后,將區塊的交易數量、分片/廣播節點地址、分片大小、門限參數(k,n)進行哈希函數計算得到其哈希值,并將此哈希值與區塊頭中的哈希值進行比對驗證; (2)如果兩個哈希值比對不相等,則說明BCi不具有正確性,將其舍棄并廣播一個對T的抱怨;如果兩個哈希值比對相等,則說明此區塊正確,再對分片數據進行驗證; (3)對于分片數據(xi,yi),SNi需要驗證其是否滿足 (9) (4)如果 (xi,yi) 滿足上述表達式,則SNi就將BCi進行存儲;如果不能滿足條件,則丟棄BCi并廣播驗證失敗的信息。 數據區塊恢復流程如圖6所示。數據區塊恢復階段主要包括3個步驟:分片數據區塊獲取、驗證分片數據區塊以及恢復數據區塊。 網絡中任意用戶都能作為驗證/恢復節點對交易數據進行恢復。在網絡中某驗證/恢復節點R需要恢復交易數據時,首先要向其余的存儲節點獲取分片數據區塊。具體為,R廣播所需區塊的索引值index。 其余存儲節點根據收到的索引值將其存儲的對應分片數據區塊傳輸至R。 最終R收到大于或等于k個分片數據區塊即可。 之后R要驗證所收到的分片數據區塊,驗證方法采用3.2節步驟(3)所述方法。若收到的分片數據區塊能夠通過驗證,則將其作為恢復交易數據所需分片進行恢復;否則就不能將此分片數據區塊作為用于恢復的分片。通過驗證的分片數據區塊需要滿足不少于k個。 在R得到能夠用于恢復數據區塊的k個分片數據區塊后,利用拉格朗日插值法,將交易數據區塊進行恢復。 具體步驟為,R首先按式(10)求出多項式f(x) (10) 然后獲取多項式系數ak-1,ak-2,…,a1, 并將ak-1,ak-2,…,a1拼接后轉化為SD, 并將a0轉化為密鑰KS, 最后通過對稱密碼算法對SD解密得到恢復的交易數據區塊。 基于可驗證秘密共享的區塊鏈分片存儲模型具有可驗證性、抗合謀性和抗單點失效性。 密鑰KS只能通過利用原始內容D計算或合法的驗證/恢復節點恢復分片數據區塊的方式得到。 分片/廣播節點將密鑰KS轉化為十進制得到a0, 并作為多項式f(x) 的常數項進行計算,得到n個分片數據 (xi,yi),i∈{1,2,…,n}, 并封裝為分片數據區塊BCi。 在分發過程中,僅廣播驗證集合B和分發BCi, 而不將KS直接傳輸,避免了攻擊者截獲、篡改KS的發生。在恢復過程中,具有合法身份的驗證/恢復節點通過獲取其余存儲節點存儲的BCi, 利用拉格朗日插值法取得多項式常數項系數a0, 得到恢復的密鑰KS, 同樣消除了KS′被攻擊者截獲、篡改的可能。 模型的可驗證性是指存儲節點能夠驗證分片/廣播節點分發的分片數據區塊,以及驗證/恢復節點能夠驗證存儲節點返回的分片數據區塊。 在分發過程的驗證中,設網絡中一個存儲節點SNt收到了分片/廣播節點T的分片數據區塊BCt, 在滿足對區塊頭部的hash值驗證條件下,SNt還需要對分片數據進行驗證。已知SNt已經獲得T廣播發送的驗證集合B={b1,b2,…,bk-1} 且bt∈B, 根據式(9)對分片數據進行驗證,將式(7)代入得 因此模型總可以通過驗證計算檢測出數據內容被篡改。 已知網絡中存在m個存儲節點,想通過共享各自存儲的分片數據區塊獲得原始數據內容,m滿足m 設網絡的n個節點中存在c個失效節點,失效節點表示此節點存儲的分片數據區塊出現異常,在滿足c≤n-k的條件下,不影響網絡中恢復節點對原始數據的恢復。 主要分析密鑰協商在受到拒絕服務攻擊和中間人攻擊兩種主要攻擊手段時的抵御能力。 (1)拒絕服務攻擊 為了避免惡意攻擊者通過發送大量初始請求消息耗費節點內存資源,以及連帶的DH算法模冪運算占用的較大計算資源,密鑰協商方法利用Cookie交換來提供一定程度的抵抗能力。當有大量請求消息發來,節點不接收這些消息,只響應一個包含其Cookie的消息。收到確認消息才更新狀態,以這種方式避免惡意攻擊者對節點內存資源與計算資源的損耗。 (2)中間人攻擊 密鑰協商過程抵御中間人攻擊的方法主要是用共享密鑰對雙方生成的偽隨機數進行加密,則中間人就不能獲得協商的密鑰,也無法獲得協商雙方的身份信息。 本文對基于可驗證秘密共享的區塊鏈分片存儲模型進行了仿真實驗。實驗是在配置為Intel(R)Core(TM)i7-10875H CPU @ 2.30 GHz RAM 16.0 GB的PC上進行的。每個共識節點均運行搭建的區塊鏈代碼,并且共識節點建立在服務器的不同端口上。所有的節點都可以作為存儲節點、分片/廣播節點、驗證/恢復節點。實驗中大素數q=244497-1, 規定每10筆交易進行一次打包,一筆交易大小約為4 K,未分片時平均每個區塊大小約為40 K。 同時,實驗主要記錄存儲模型的時間和存儲空間占用量,簡化了其工作量證明,將實驗涉及的幾種模型POW的難度值設為2,即隨機數匹配整個區塊哈希值前2位為0時得到記賬權。 實驗分別測試了本文模型的平均區塊生成時間、平均區塊處理時間,以及節點所需的存儲空間。在存儲相同數量區塊的條件下,實驗比較了不同門限參數值下區塊的平均生成時間、總處理時間和所需存儲空間,并與基于Merkle樹的傳統區塊鏈存儲模型進行比較。實驗測試進行10次并取平均值,實驗結果見表1、表2。 在不同門限條件下,模型在區塊生成時間上的差距不大,而對于分片計算和密鑰協商上的時間消耗有較大影響。由表2可知協商過程的時間開銷隨生成區塊的數量以及門限參數的大小成正比,但協商過程在總體處理時間的占比逐漸降低,例如在門限參數為(20,40)的本文模型中,生成50、100和200個區塊的過程中,協商過程的時間開銷分別占總體處理時間開銷的19.01%、11.16%和7.85%。 表1 計算開銷 表2 協商過程時間開銷 實驗將本文存儲模型與傳統模型的存儲空間占用量進行了對比。在不同門限參數的條件下,每組實驗生成100個區塊,存儲節點每存儲5個區塊分片就將這一時刻的完整區塊鏈寫入文件中,并記錄其大小,以此衡量每個存儲節點的存儲空間占用量。在所有節點都正常運行且不被攻擊的情況下,得到如圖7所示結果。 圖7 存儲空間占用量對比 增大模型的門限參數需要消耗更多的時間開銷,門限參數為(5,10)、(10,20)和(20,40)的本文存儲模型分別比傳統模型的時間開銷提高了36.89%、80.74%和148.78%,但同時通過增加模型的門限能夠降低存儲節點的存儲空間占用量,其分別比傳統模型的存儲占用量降低了69.66%、86.52%和93.60%,對降低存儲節點的存儲空間占用量具有顯著效果,以此提高存儲模型的可擴展性。 同時對4.1節模型可驗證性進行了模擬測試。針對(10,20)區塊鏈可驗證分片存儲模型中惡意節點篡改分片數據為例,分片/廣播節點發送給某一存儲節點的分片數據內容如圖8(a)所示,而此存儲節點收到的分片數據被多個惡意節點合謀改為其它數據,因此多項式系數有改變,致使存儲節點的分片數據改變,篡改為如圖8(b)所示的內容,在存儲節點收到分片/廣播節點發送的分片區塊后,首先會對分片區塊的頭部hash值進行驗證確保其正確性。通過此驗證后,存儲節點會再通過式(9)對分片數據進行驗證,存儲節點驗證的計算結果應如圖9(a)中所示結果一致,此時能夠通過驗證。而在內容已經被篡改的情況下,對y1驗證的計算結果如圖9(b)所示,驗證失敗。因此,模型能夠發現惡意節點的欺騙攻擊。 圖9 驗證結果 記哈希函數運算時間消耗為Ehash, 模運算時間消耗為Emod, 模逆運算時間消耗為Er, 多項式計算時間消耗為Ep, 對稱加密開銷為Ee, 解密開銷為Ed。 經實驗測試,一次加解密的開銷約為一次hash運算的1.5倍,即Ee+Ed=1.5Ehash。 對于一個含有n個共識節點網絡的基于可驗證秘密共享的區塊鏈分片存儲模型,其計算開銷主要在于分片數據區塊的生成、分片廣播、穩定性判定、協商、存儲和恢復階段。其中模運算、hash運算、模逆運算、對稱加密和多項式計算為主要影響因素,同時為了提高模型整體計算效率,模運算采用位運算方法。同時將本文方法與最具有可比性的文獻[11]和文獻[13]進行了定量比較,記一次穩定性判定的開銷為Es。 則本文模型、文獻[11]所提方法以及文獻[13]所提方法的性能見表3,其中n為節點數量,k為門限參數 (k,n) 中的k。 表3 性能定量對比 對于文獻[13]方法,其在門限參數k>4時,時間開銷大于本文的可驗證分片存儲模型。文獻[11]中所提出的模型在存儲節點較少的環境中能達到較少的時間開銷,但隨著環境中存儲節點數量的增加,其時間開銷則會大于可驗證分片存儲模型,并且其恢復數據存在恢復失敗的可能。 同時根據分析,幾種存儲模型的安全屬性比較見表4。 表4 安全屬性對比 本文針對區塊鏈的鏈上存儲方案面臨的安全問題,提出了基于可驗證秘密共享的區塊鏈分片存儲模型。首先,該模型判定區塊穩定性,對于低穩定性區塊,節點在收到分片時能對分片及其發送節點身份進行認證,避免了網絡惡意節點對分片和恢復過程的影響,提高了低穩定性區塊的安全性。其次,模型通過節點協作式存儲將區塊分片存儲,降低了節點的存儲空間占用量。最后由理論分析與實驗結果,本文提出的區塊鏈分片存儲模型在保證區塊存儲可擴展的前提下,能夠抵御惡意節點的欺騙攻擊,因而具有更高的安全性。在今后的研究中,在保證區塊鏈分片存儲系統的安全性和可擴展性的前提下,將進一步提高模型的存儲效率,以擴展此模型的應用。

3.2 分片數據區塊存儲階段
3.3 數據區塊恢復階段
4 安全性分析
4.1 可驗證性分析



4.2 抗合謀性分析
4.3 抗單點失效性

4.4 密鑰協商安全分析
5 實驗分析
5.1 實驗環境
5.2 實驗結果




5.3 性能分析




6 結束語