国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于以太坊狀態(tài)數(shù)據(jù)庫的攻擊與防御方案

2022-04-18 01:22高鎮(zhèn)張東彬田瀟
關(guān)鍵詞:以太挖礦哈希

高鎮(zhèn),張東彬,田瀟

(1. 天津大學(xué)電氣自動(dòng)化與信息工程學(xué)院,天津 300072; 2. 南京慧鏈和信數(shù)字信息科技研究院,江蘇 南京 210012)

0 引言

以太坊由Vitalik Buterin于2013年提出[1],被廣泛認(rèn)為是第二代區(qū)塊鏈平臺(tái)[2]。相對(duì)于比特幣系統(tǒng)[3],以太坊引入了賬戶和智能合約的概念[2,4]。每個(gè)賬戶的最新狀態(tài)被稱為世界狀態(tài),并被保存在本地?cái)?shù)據(jù)庫中。通過這種方式,以太坊有效提高了查詢和交易驗(yàn)證的效率。狀態(tài)數(shù)據(jù)記錄著許多有價(jià)值的信息,如賬戶余額和交易計(jì)數(shù)等[5]。而智能合約是分布在區(qū)塊鏈網(wǎng)絡(luò)中的代碼,可以被理解為一個(gè)計(jì)算機(jī)交易協(xié)議[6]。在區(qū)塊鏈提供的可信環(huán)境中,智能合約在每個(gè)節(jié)點(diǎn)上獨(dú)立執(zhí)行,保證執(zhí)行結(jié)果的真實(shí)性和唯一性[4,7]。

由于狀態(tài)數(shù)據(jù)和智能合約的多樣性,以太坊已經(jīng)廣泛應(yīng)用于許多領(lǐng)域。例如,Gems是一個(gè)建立在以太坊基礎(chǔ)上的分布式平臺(tái),任何人都可以發(fā)布任務(wù),并采用在線支付報(bào)酬的方式來雇傭工人完成任務(wù)[8];文獻(xiàn)[9]利用IPFS(inter planetary file system)的優(yōu)勢將文檔存儲(chǔ)在分散的文件系統(tǒng)上,并利用智能合約來管理和規(guī)范創(chuàng)建者與開發(fā)者之間的文檔版本;EdgeBoT是一個(gè)基于概念證明(PoC,proof of concept)和智能合約的物聯(lián)網(wǎng)平臺(tái),可以使邊緣設(shè)備直接與第三方直接交換數(shù)據(jù),而不需要中間商[10]。

然而,以太坊還面臨一些安全問題。除了傳統(tǒng)的自私挖礦(self-mining)[11]和雙重支付(double-spending)攻擊[12]之外,文獻(xiàn)[13]提出通過篡改以太坊中賬戶的狀態(tài)數(shù)據(jù),可以成功地發(fā)布一個(gè)無效交易。本文對(duì)這種攻擊進(jìn)行了詳細(xì)的介紹,并分析了攻擊成功的條件和影響因素;分析了對(duì)這種攻擊的檢測方法和數(shù)據(jù)恢復(fù)方案;通過實(shí)驗(yàn)證明了所提方案的可行性,通過時(shí)間開銷評(píng)估了計(jì)算復(fù)雜度。

1 基于狀態(tài)數(shù)據(jù)庫的攻擊

區(qū)塊鏈的鏈上數(shù)據(jù)采用單向哈希函數(shù)連接在一起,幾乎不可能被篡改。但以太坊的狀態(tài)數(shù)據(jù)存儲(chǔ)于節(jié)點(diǎn)的本地?cái)?shù)據(jù)庫,所以存在被篡改的風(fēng)險(xiǎn)。根據(jù)以太坊的共識(shí)機(jī)制,各個(gè)礦工競爭挖礦,這使得基于被篡改后的余額而發(fā)起的無效交易有隨時(shí)被取消的可能。所以本節(jié)首先介紹了以太坊的共識(shí)算法和狀態(tài)數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),在此基礎(chǔ)上介紹了基于狀態(tài)數(shù)據(jù)庫的攻擊方式和成功條件。

1.1 PoW共識(shí)

以太坊和比特幣系統(tǒng)中使用的共識(shí)協(xié)議是工作量證明(PoW,proof of work)[14]。當(dāng)產(chǎn)生新的區(qū)塊時(shí),網(wǎng)絡(luò)中的礦工需要通過遍歷來找到一個(gè)隨機(jī)數(shù)以滿足哈希值的范圍要求,這個(gè)過程通常被稱為挖礦。成功的礦工會(huì)因付出的算力而得到報(bào)酬。由于挖礦是一系列哈希計(jì)算,所以區(qū)塊鏈礦工的計(jì)算能力通常被稱為哈希率,即每秒計(jì)算的哈希次數(shù)。挖礦速度由哈希率和挖礦難度決定[15]。如果挖礦難度固定,那么算力越高就意味著在較短時(shí)間內(nèi)求解成功的概率越大。

由于網(wǎng)絡(luò)的傳播延遲,在某些時(shí)刻,區(qū)塊鏈網(wǎng)絡(luò)中可能存在具有相同長度的多條鏈(或稱為分支)。當(dāng)其中一條分支超過其他分支后,它將成為規(guī)范鏈,而其他分支中的交易將被退回給交易池,等待被后續(xù)區(qū)塊打包。因此,在交易被區(qū)塊鏈最終承認(rèn)之前,通常需要等待一定數(shù)量的區(qū)塊確認(rèn)[16]。當(dāng)交易被一個(gè)區(qū)塊打包之后,它將獲得第一個(gè)確認(rèn),并且每個(gè)后續(xù)的區(qū)塊都將為它添加一個(gè)新的確認(rèn)。事實(shí)上,一個(gè)交易獲得的確認(rèn)數(shù)越多,那么該交易被撤銷的概率就越小,但它的確認(rèn)時(shí)間會(huì)越長。比特幣和以太坊的確認(rèn)區(qū)塊數(shù)量(記為Nc)分別為6個(gè)和12個(gè)[17-18]。針對(duì)不同的場景,可以對(duì)Nc進(jìn)行優(yōu)化,從而使交易確認(rèn)速度和系統(tǒng)安全性之間達(dá)成平衡[19]。需要注意的是,區(qū)塊鏈用戶只能根據(jù)所依附節(jié)點(diǎn)的賬本進(jìn)行交易確認(rèn)。因?yàn)楣沧R(shí)機(jī)制保證了不同節(jié)點(diǎn)上賬本的一致性,所以這一過程通常是可靠的。

1.2 狀態(tài)樹與狀態(tài)驗(yàn)證

以太坊本質(zhì)上是一個(gè)基于交易的有限狀態(tài)機(jī)。每個(gè)賬戶的狀態(tài)數(shù)據(jù)包含當(dāng)前的余額和交易計(jì)數(shù)器,新的狀態(tài)(σN+1)可以根據(jù)其父狀態(tài)(σN)和交易(T)經(jīng)過轉(zhuǎn)換后獲得[5]。如果將以太坊狀態(tài)轉(zhuǎn)換函數(shù)表示為γ,那么轉(zhuǎn)換關(guān)系就可以表示為

如圖1所示,以太坊中所有賬戶的狀態(tài)數(shù)據(jù)存儲(chǔ)于MPT(Merkle patricia tree)的最底層節(jié)點(diǎn)。狀態(tài)樹的根哈希值(即狀態(tài)樹根(stateRoot))被存儲(chǔ)于區(qū)塊頭中,其計(jì)算過程為:通過遞歸自下而上對(duì)狀態(tài)樹中的節(jié)點(diǎn)逐級(jí)進(jìn)行哈希運(yùn)算,并且每個(gè)節(jié)點(diǎn)以哈希值(hashNode)的形式保存于上一級(jí)節(jié)點(diǎn)中。為實(shí)現(xiàn)持久化存儲(chǔ),每個(gè)節(jié)點(diǎn)的哈希值和節(jié)點(diǎn)數(shù)據(jù)以key-value的形式存儲(chǔ)在數(shù)據(jù)庫中。而在查詢或更改某個(gè)賬戶的狀態(tài)時(shí),需要沿著賬戶地址,根據(jù)上一級(jí)節(jié)點(diǎn)存儲(chǔ)的hashNode從數(shù)據(jù)庫中加載下一級(jí)節(jié)點(diǎn)的數(shù)據(jù),直到找到保存有余額的最底層節(jié)點(diǎn)。

圖1 以太坊狀態(tài)樹架構(gòu)(以4個(gè)賬戶為例) Figure 1 Ethereum state tree structure (taking 4 accounts as an example)

區(qū)塊鏈節(jié)點(diǎn)收到新區(qū)塊后驗(yàn)證其stateRoot的過程可以分為以下幾步。① 加載本地存儲(chǔ)的狀態(tài)樹以獲取并檢查轉(zhuǎn)出賬戶的余額(該過程也會(huì)加載轉(zhuǎn)入賬戶所在的狀態(tài)樹路徑,而除了轉(zhuǎn)入與轉(zhuǎn)出賬戶所在的路徑,其他路徑上存儲(chǔ)的狀態(tài)數(shù)據(jù)不會(huì)發(fā)生改變,那么其中的hashNode也不變,所以不需要加載)。② 按照式(1)更新交易后的狀態(tài)。③ 根據(jù)新的狀態(tài)計(jì)算更新后的狀態(tài)樹根,并與區(qū)塊頭中的stateRoot進(jìn)行比較。當(dāng)兩個(gè)哈希樹根匹配時(shí),節(jié)點(diǎn)才接受該區(qū)塊;否則,該區(qū)塊將被視為無效。例如,圖1中的賬戶“a509e”從一個(gè)交易中獲得兩個(gè)ETH,那么其余額會(huì)從3個(gè)ETH變?yōu)?個(gè)ETH,并且新的狀態(tài)樹根將沿著路徑“e—9—a50”重新計(jì)算出來;但其他路徑,如“6—7—a50”中的子路徑“6—7”就不需要被加載到內(nèi)存中,以hashNode的形式參與“a50”處的運(yùn)算即可。

1.3 傳統(tǒng)的安全問題

PoW共識(shí)下的公有區(qū)塊鏈有兩個(gè)安全威脅,分別是自私挖礦和雙重支付。而它們的相似之處是攻擊者利用最長鏈原則來牟取私人利益。在自私挖礦攻擊中,一個(gè)算力強(qiáng)大的礦工或由多個(gè)礦工組成的采礦池故意囤積一個(gè)或多個(gè)新生成的區(qū)塊,而不把它們廣播給網(wǎng)絡(luò)中的其他節(jié)點(diǎn)。然后,在適當(dāng)?shù)臅r(shí)候再把包含囤積區(qū)塊的秘密鏈通知給其他節(jié)點(diǎn),以取代誠實(shí)礦工的有效區(qū)塊。文獻(xiàn)[11]證明:即使攻擊者不控制大部分的算力,也可以比相同條件下的誠實(shí)挖礦獲取到更多的回報(bào)。文獻(xiàn)[20]的分析表明以太坊比比特幣更容易受到自私挖礦攻擊。雙重支付與之類似:首先,攻擊者在交易確認(rèn)之后,花費(fèi)代幣并獲得相應(yīng)的商品或服務(wù);然后,它通過發(fā)布一個(gè)秘密且更長的鏈迫使網(wǎng)絡(luò)中的節(jié)點(diǎn)撤銷原有的交易[21],于是,攻擊者花費(fèi)的代幣便會(huì)被退回,并可以用于二次消費(fèi)。在上述情況下,攻擊者控制的算力占比越大,則攻擊成功的概率將越高。一旦攻擊者的算力占比超過整個(gè)區(qū)塊鏈網(wǎng)絡(luò)的50%,那么攻擊最終一定會(huì)成功,因此,稱之為51%攻擊[22]。

1.4 基于賬戶狀態(tài)的攻擊

由于狀態(tài)數(shù)據(jù)存儲(chǔ)在每個(gè)節(jié)點(diǎn)的本地?cái)?shù)據(jù)庫中(如LeveldB),因此攻擊者可以通過數(shù)據(jù)庫接口函數(shù)修改其數(shù)值。假設(shè)在攻擊過程中,攻擊者通過數(shù)據(jù)庫接口增加了某些賬戶的余額,并嘗試與其他賬戶進(jìn)行交易,交易金額遠(yuǎn)大于賬戶的實(shí)際余額但小于修改后的余額。接下來,如文獻(xiàn)[13]所述,被篡改狀態(tài)數(shù)據(jù)的賬戶可以成功地發(fā)出無效的交易,而不會(huì)出現(xiàn)任何警告或錯(cuò)誤,并且所有被篡改數(shù)據(jù)的節(jié)點(diǎn)都會(huì)接受該交易。出現(xiàn)此問題的原因是以太坊不檢查用于鏈上交易的狀態(tài)數(shù)據(jù)的正確性,也不將本地狀態(tài)與其他節(jié)點(diǎn)的狀態(tài)進(jìn)行比較。利用此漏洞,攻擊者可以任意增加余額,無節(jié)制地花費(fèi)實(shí)際上并不存在的代幣。Hyperledger Fabric是另一個(gè)使用本地狀態(tài)數(shù)據(jù)庫進(jìn)行高效交易驗(yàn)證的區(qū)塊鏈平臺(tái),文獻(xiàn)[23]證明Fabric也無法避免類似的攻擊。但以上兩篇文獻(xiàn)都只討論了這種基于賬戶狀態(tài)的攻擊的可能性,而沒有分析交易被最終確認(rèn)的條件和恢復(fù)正常數(shù)據(jù)的方法。

1.5 攻擊成功的條件

盡管無效交易能夠被成功地發(fā)布和驗(yàn)證,但它們可能仍無法被最終確認(rèn)。由于轉(zhuǎn)出金額大于實(shí)際余額,誠實(shí)節(jié)點(diǎn)并不會(huì)接受該交易。所以只有被篡改的節(jié)點(diǎn)才能將這筆無效交易打包到新的區(qū)塊中,然后廣播給網(wǎng)絡(luò)中的其他節(jié)點(diǎn)。隨后,其他被篡改的節(jié)點(diǎn)將成功接受該區(qū)塊,并在該區(qū)塊的基礎(chǔ)上繼續(xù)產(chǎn)生下一個(gè)區(qū)塊。但是當(dāng)誠實(shí)節(jié)點(diǎn)收到該區(qū)塊后,由于被篡改賬戶的余額不足以支付交易,所以誠實(shí)節(jié)點(diǎn)將丟棄該區(qū)塊,更不會(huì)接受其子區(qū)塊。如圖2所示,這時(shí)網(wǎng)絡(luò)中會(huì)出現(xiàn)兩條分支,一條由被篡改的節(jié)點(diǎn)發(fā)布(記為chainA),另一條鏈由誠實(shí)節(jié)點(diǎn)發(fā)布(記為chainB)。根據(jù)最長鏈原則,當(dāng)chainB的長度超過chainA時(shí),被篡改的節(jié)點(diǎn)將舍棄chainA并同步chainB。但是,即使chainA的長度大于chainB,由于轉(zhuǎn)出賬戶的余額不足,誠實(shí)節(jié)點(diǎn)仍無法同步chainA。

圖2 在區(qū)塊高度為N處遭到攻擊后,區(qū)塊鏈網(wǎng)絡(luò)出現(xiàn)兩條分支示意 Figure 2 Two branches on tampered nodes with attack at block height N

只有當(dāng)無效交易獲得了足夠多的區(qū)塊確認(rèn)之后,攻擊者才能真正地把代幣花費(fèi)出去,攻擊才能夠成功。所以攻擊成功的首要條件就是被篡改的節(jié)點(diǎn)產(chǎn)生這筆交易的確認(rèn)信息。在此基礎(chǔ)上,該交易能否被確認(rèn)取決于在確認(rèn)之前chainA的區(qū)塊高度能否一直大于或等于chainB的高度。如果chainA新增的區(qū)塊數(shù)達(dá)到了所需要的確認(rèn)數(shù)量(Nc),并且這個(gè)過程中chainA沒有被chainB取代,那么第N+1個(gè)區(qū)塊(即圖2中的A1區(qū)塊)中包含的無效交易將被確認(rèn)。

此外,攻擊能否成功還取決于誠實(shí)節(jié)點(diǎn)的后續(xù)區(qū)塊(區(qū)塊高度大于N)是否包含涉及被篡改賬戶的交易。假設(shè)該筆有效交易由正常節(jié)點(diǎn)打包在區(qū)塊N+n中,其中1

另外,如果chainA在高度達(dá)到N+Nc之前沒有被chainB替換掉,那么即使攻擊者沒有發(fā)起輔助交易,無效交易仍然可以被確認(rèn)。這可以理解為一組被篡改的節(jié)點(diǎn)和正常節(jié)點(diǎn)之間的競爭,單次攻擊的成功概率取決于兩組節(jié)點(diǎn)的計(jì)算能力和所需要的區(qū)塊確認(rèn)數(shù)。被篡改節(jié)點(diǎn)的算力占比越高或者區(qū)塊確認(rèn)數(shù)越少,那么單次攻擊的成功概率就越高。此外,每次攻擊失敗后,無效的交易都將返回到交易池中。由于在沒有人為干預(yù)的情況下,被篡改的節(jié)點(diǎn)無法檢測到攻擊并恢復(fù)被篡改的數(shù)據(jù),所以這些節(jié)點(diǎn)會(huì)重新打包無效的交易,從而再次發(fā)起攻擊?;跔顟B(tài)數(shù)據(jù)庫的攻擊對(duì)于攻擊發(fā)起者而言代價(jià)并不大,所以這種攻擊可以自動(dòng)地?zé)o限進(jìn)行下去,直到最終成功。當(dāng)攻擊的次數(shù)足夠多時(shí),理論上的成功概率將無限趨近于100%。

基于狀態(tài)數(shù)據(jù)庫的攻擊與傳統(tǒng)的自私挖礦和雙重支付在攻擊方式上都需要依賴足夠的算力。如果控制的節(jié)點(diǎn)算力占比較小,那么自私挖礦和雙重支付攻擊成功的概率較低。根據(jù)文獻(xiàn)[12],當(dāng)控制的節(jié)點(diǎn)算力占比為10%并且系統(tǒng)要求的確認(rèn)區(qū)塊數(shù)量為6個(gè)時(shí),雙重支付攻擊成功的概率僅為0.059%。而根據(jù)文獻(xiàn)[11],當(dāng)控制的算力占比大于33%時(shí),自私挖礦才是嚴(yán)格有利的;并且自私挖礦主要影響挖礦收益,其安全威脅相對(duì)雙重支付攻擊更小。但在基于狀態(tài)數(shù)據(jù)庫的攻擊中,攻擊者可以采取輔助交易或者使攻擊無限次發(fā)起的手段,來使攻擊成功,即花費(fèi)比正常余額更多的代幣。所以即使在控制算力較小的情況下,基于狀態(tài)數(shù)據(jù)庫的攻擊也會(huì)造成極高的安全風(fēng)險(xiǎn)。

2 檢測與恢復(fù)方法

本節(jié)首先分析了檢測本地狀態(tài)數(shù)據(jù)的具體方法。而后通過具體的方案證明了:即使?fàn)顟B(tài)數(shù)據(jù)庫被篡改,節(jié)點(diǎn)也可以根據(jù)本地歷史狀態(tài)數(shù)據(jù)和交易恢復(fù)出正確的數(shù)據(jù)。

2.1 檢測方法與流程

以太坊系統(tǒng)沒有檢查歷史狀態(tài)數(shù)據(jù)的正確性,才導(dǎo)致基于狀態(tài)數(shù)據(jù)庫的攻擊能夠成功。因此,解決這個(gè)問題的最好方法就是讓節(jié)點(diǎn)主動(dòng)檢查本地的余額是否正確。如圖3所示,在區(qū)塊高度為N時(shí),賬戶“a5076”的余額遭到篡改,并且隨后的第N+1個(gè)區(qū)塊中包含基于篡改后余額的交易。被篡改的節(jié)點(diǎn)接收到其他礦工傳來的第N+1個(gè)區(qū)塊時(shí),直接檢查新區(qū)塊中的交易和狀態(tài)樹根是否符合要求,而忽略了第N個(gè)區(qū)塊狀態(tài)數(shù)據(jù)的正確性,所以無法檢測出本地的余額已經(jīng)被篡改。

圖3 包含被篡改賬戶的區(qū)塊鏈?zhǔn)疽?Figure 3 A blockchain structure diagram containing a tampered account

因此,一種解決方法是在驗(yàn)證第N+1個(gè)區(qū)塊之前,讓節(jié)點(diǎn)根據(jù)世界狀態(tài)重新計(jì)算當(dāng)前的狀態(tài)樹根,并與存于鏈上的stateRoot進(jìn)行比較,稱這一過程為二次驗(yàn)證。但以太坊網(wǎng)絡(luò)中的賬戶眾多,完整地計(jì)算整個(gè)狀態(tài)樹幾乎不可能。事實(shí)上,參考某一節(jié)點(diǎn)收到并首次驗(yàn)證第N個(gè)區(qū)塊中狀態(tài)樹根的過程,因此另一種方法是只需要計(jì)算必要的賬戶所在的狀態(tài)樹路徑即可,不必對(duì)整個(gè)狀態(tài)樹展開計(jì)算(未展開的狀態(tài)樹路徑以hashNode的形式參與計(jì)算)。而二者的區(qū)別在于:在首次驗(yàn)證第N個(gè)區(qū)塊時(shí),節(jié)點(diǎn)只計(jì)算了第N個(gè)區(qū)塊中交易涉及的賬戶在狀態(tài)樹中的路徑;而在二次驗(yàn)證時(shí),節(jié)點(diǎn)需要重新計(jì)算第N+1個(gè)區(qū)塊中交易涉及的賬戶在區(qū)塊高度為N時(shí)的狀態(tài)樹路徑。檢測方案流程如圖4 所示。

圖4 檢測方案流程 Figure 4 Detection process flow chart

值得注意的是,上述兩種計(jì)算過程都從狀態(tài)樹的最底層算起,雖然計(jì)算路徑可能存在差異,但正常情況下,最終結(jié)果應(yīng)為同一個(gè)狀態(tài)樹根。而如果此時(shí)惡意攻擊者發(fā)起了基于狀態(tài)數(shù)據(jù)庫的攻擊,那么第N+1個(gè)區(qū)塊中將包含惡意交易(即關(guān)于被篡改賬戶的交易),所以被篡改的賬戶所在的狀態(tài)樹路徑也一定在二次驗(yàn)證所校驗(yàn)的路徑范圍之內(nèi)。由于余額被篡改,所以節(jié)點(diǎn)二次計(jì)算出的狀態(tài)樹根與鏈上的狀態(tài)樹根必然不同,以此就可以判斷出本地的余額遭到篡改。即使節(jié)點(diǎn)被攻擊,二次驗(yàn)證也會(huì)按照正常步驟執(zhí)行,檢測結(jié)果并不會(huì)受到影響,所以節(jié)點(diǎn)可以有效發(fā)現(xiàn)潛在的問題。

此外,檢測過程須不間斷地進(jìn)行,即在每一個(gè)區(qū)塊上鏈之前,節(jié)點(diǎn)都需要二次驗(yàn)證前一個(gè)區(qū)塊的狀態(tài)數(shù)根。如果忽略了某個(gè)區(qū)塊,而其恰好包含無效的交易,并且本地節(jié)點(diǎn)的余額遭到了篡改,那么無效的交易和哈希樹根就將寫入本地區(qū)塊鏈。隨后即使該節(jié)點(diǎn)二次驗(yàn)證狀態(tài)數(shù)根,其根據(jù)也是錯(cuò)誤的余額和狀態(tài)樹根,所以就無法通過對(duì)比發(fā)現(xiàn)可能存在的問題。

2.2 恢復(fù)方法與流程

如果該節(jié)點(diǎn)能夠保證二次驗(yàn)證每一個(gè)區(qū)塊的狀態(tài)數(shù)根,那么其鏈上的數(shù)據(jù)一定是正確的。而該節(jié)點(diǎn)一旦發(fā)現(xiàn)二次驗(yàn)證得到的狀態(tài)樹根與鏈上狀態(tài)樹根不一致,就說明當(dāng)前的狀態(tài)數(shù)據(jù)遭到篡改。為了恢復(fù)正常的數(shù)據(jù),節(jié)點(diǎn)可以依據(jù)本地?cái)?shù)據(jù)庫中存儲(chǔ)的歷史狀態(tài)數(shù)據(jù)和區(qū)塊中的交易計(jì)算出當(dāng)前區(qū)塊高度下正確的狀態(tài)數(shù)據(jù)。

因?yàn)殡y以精準(zhǔn)地找到狀態(tài)數(shù)據(jù)被篡改的賬戶,所以需要遍歷區(qū)塊N+1中的全部賬戶,并重新計(jì)算它們當(dāng)前的余額。圖5以賬戶“a5076”為例,描述了恢復(fù)狀態(tài)數(shù)據(jù)的具體方法。首先,節(jié)點(diǎn)需要找到該賬戶上一筆交易所在的區(qū)塊。根據(jù)圖3所示的包含賬戶“a5076”的區(qū)塊鏈?zhǔn)疽猓摴?jié)點(diǎn)需要回滾X1個(gè)區(qū)塊,即上一筆交易所在的區(qū)塊高度為N?X1。回滾X1個(gè)區(qū)塊是因?yàn)槿绻鸑處該賬戶的狀態(tài)數(shù)據(jù)被篡改了,那么不管在N?X1到N之間有多少個(gè)區(qū)塊,這些區(qū)塊高度下查詢到的該賬戶的余額都是被篡改后的。這是由MPT樹的結(jié)構(gòu)決定的:在若干個(gè)區(qū)塊之間,如果一個(gè)賬戶沒有發(fā)生交易,那么這期間它的狀態(tài)樹路徑不變,并且對(duì)應(yīng)相同的狀態(tài)數(shù)據(jù)。所以篡改該賬戶的狀態(tài)數(shù)據(jù)后,只有通過區(qū)塊高度為N?X1?1下的賬戶狀態(tài)數(shù)據(jù),并按照式(1)重新執(zhí)行區(qū)塊N?X1中的交易,才能計(jì)算出該賬戶正確的數(shù)據(jù)。

圖5 單個(gè)賬戶狀態(tài)數(shù)據(jù)恢復(fù)流程 Figure 5 Single account state-data recovery flow chart

但在正式恢復(fù)數(shù)據(jù)之前,節(jié)點(diǎn)還需要按照2.1節(jié)的方法二次驗(yàn)證區(qū)塊N?X1?1下的狀態(tài)數(shù)據(jù)是否正確。如果存在問題,那么節(jié)點(diǎn)需要繼續(xù)向前尋找涉及該賬戶的交易和舊的狀態(tài)數(shù)據(jù)(設(shè)回滾的區(qū)塊數(shù)量為X2),并再次驗(yàn)證;如果數(shù)據(jù)無誤,那么按照式(1)就可以計(jì)算出賬戶“a5076”在N?X1個(gè)區(qū)塊之后正確的余額。

3 方案功能驗(yàn)證與復(fù)雜度評(píng)估

雖然節(jié)點(diǎn)通過檢測能夠及時(shí)發(fā)現(xiàn)本地狀態(tài)數(shù)據(jù)遭到篡改,但前提條件是節(jié)點(diǎn)必須花費(fèi)多余的算力和時(shí)間來對(duì)每一個(gè)區(qū)塊進(jìn)行二次驗(yàn)證。所以實(shí)驗(yàn)部分除了分析所提方案的有效性之外,也對(duì)算法的時(shí)間開銷進(jìn)行了評(píng)估。

本文實(shí)驗(yàn)在以太坊的 Golang版本(geth-windows-amd64-1.9.10)的基礎(chǔ)上增加了二次驗(yàn)證和狀態(tài)數(shù)據(jù)恢復(fù)的功能。實(shí)驗(yàn)的初始化配置如表1所示。本文搭建了一個(gè)具有3個(gè)節(jié)點(diǎn)的小型以太坊網(wǎng)絡(luò),作為進(jìn)程運(yùn)行的每個(gè)節(jié)點(diǎn)都分配有不同的端口號(hào),并直接與其他兩個(gè)節(jié)點(diǎn)連接。其中一個(gè)節(jié)點(diǎn)為誠實(shí)節(jié)點(diǎn),而另外兩個(gè)節(jié)點(diǎn)的狀態(tài)數(shù)據(jù)被篡改。

表1 實(shí)驗(yàn)初始化配置Table 1 Experiment initialization configuration

首先,本實(shí)驗(yàn)驗(yàn)證了所提出的狀態(tài)數(shù)據(jù)篡改檢測方案。在檢測開始之前,其中一個(gè)被篡改的節(jié)點(diǎn)發(fā)起若干交易并將它們打包到區(qū)塊N+1中。隨后,按照程序設(shè)計(jì),當(dāng)另外兩個(gè)節(jié)點(diǎn)接收到新區(qū)塊后,會(huì)二次驗(yàn)證狀態(tài)數(shù)據(jù)。如圖6所示,另外一個(gè)被篡改的節(jié)點(diǎn)在二次驗(yàn)證后,發(fā)現(xiàn)當(dāng)前的狀態(tài)數(shù)據(jù)計(jì)算出的狀態(tài)樹根與區(qū)塊N中存儲(chǔ)的狀態(tài)樹根不一致。此時(shí)該節(jié)點(diǎn)會(huì)按照2.2節(jié)中的介紹恢復(fù)出正確的狀態(tài)數(shù)據(jù),然后再執(zhí)行區(qū)塊N+1中的交易。

圖6 被篡改節(jié)點(diǎn)發(fā)現(xiàn)錯(cuò)誤 Figure 6 A tampered node found error

其次,在200次獨(dú)立實(shí)驗(yàn)的基礎(chǔ)上通過時(shí)間統(tǒng)計(jì)驗(yàn)證了本文方案的復(fù)雜度。如圖7所示,當(dāng)系統(tǒng)中總的賬戶數(shù)量為5 000個(gè)時(shí),分別統(tǒng)計(jì)了二次驗(yàn)證需要的哈希計(jì)算次數(shù)與驗(yàn)證平均所用的計(jì)算時(shí)間。例如,當(dāng)區(qū)塊N+1涉及的賬戶個(gè)數(shù)為200時(shí),哈希計(jì)算次數(shù)為524次,驗(yàn)證所用的平均時(shí)間為2.3 ms。而經(jīng)過測試,此時(shí)系統(tǒng)對(duì)整個(gè)新區(qū)塊的驗(yàn)證時(shí)間(包含狀態(tài)數(shù)根、難度值和余額等數(shù)據(jù)的驗(yàn)證)約為26 ms,可見二次驗(yàn)證帶來的時(shí)間開銷并不顯著。此外,通過觀察可以得出結(jié)論:哈希計(jì)算次數(shù)以及二次驗(yàn)證計(jì)算時(shí)間與區(qū)塊交易涉及的賬戶個(gè)數(shù)大致呈線性關(guān)系。如圖8所示,本文固定了交易涉及的賬戶數(shù)量(100個(gè)),然后在不同的賬戶數(shù)量下,測試了二次驗(yàn)證需要的時(shí)間。結(jié)果表明計(jì)算時(shí)間和哈希計(jì)算次數(shù)與狀態(tài)樹規(guī)模也呈線性關(guān)系。

圖7 哈希計(jì)算次數(shù)/二次驗(yàn)證計(jì)算時(shí)間與 區(qū)塊交易涉及賬戶個(gè)數(shù)的關(guān)系 Figure 7 The relationship between the number of hash calculations/secondary verification calculation time and the number of accounts involved in block’s transactions

圖8 哈希計(jì)算次數(shù)/二次驗(yàn)證計(jì)算時(shí)間與狀態(tài)樹規(guī)模的關(guān)系 Figure 8 The relationship between the number of hash calculations/secondary verification calculation time and the size of the state tree

4 結(jié)束語

以太坊通過引入本地狀態(tài)數(shù)據(jù)庫來提高交易驗(yàn)證效率,并通過存于區(qū)塊頭中的狀態(tài)樹根來保持狀態(tài)數(shù)據(jù)的完整性。但是本地?cái)?shù)據(jù)庫可以通過數(shù)據(jù)庫接口進(jìn)行修改,且目前的以太坊并不會(huì)對(duì)本地狀態(tài)數(shù)據(jù)庫的完整性進(jìn)行驗(yàn)證,這使得基于篡改數(shù)據(jù)庫來發(fā)起非法交易成為可能,并且理論上攻擊成功的概率為100%。針對(duì)這類安全漏洞,本文提出一種可行的狀態(tài)數(shù)據(jù)篡改檢測方案以及相應(yīng)的修復(fù)方案。基于單機(jī)多線程實(shí)驗(yàn)測試,驗(yàn)證了狀態(tài)數(shù)據(jù)篡改檢測方案和恢復(fù)方案的可行性,并對(duì)檢測復(fù)雜度進(jìn)行了評(píng)估。實(shí)驗(yàn)結(jié)果表明,雖然本文提出的檢測方案會(huì)造成一定的算力與時(shí)間開銷,卻可以有效避免本地狀態(tài)數(shù)據(jù)被篡改,并足以抵御攻擊。其中檢測時(shí)間與每個(gè)區(qū)塊中交易所涉及的賬戶個(gè)數(shù)成正比。在具有5 000個(gè)賬戶的以太坊系統(tǒng)中,如果區(qū)塊中的交易涉及200個(gè)賬戶,則二次驗(yàn)證時(shí)間約占整體區(qū)塊上鏈時(shí)間開銷的9%,可見代價(jià)較小。此外,本文所提出的方案同樣適用于其他基于本地狀態(tài)數(shù)據(jù)庫進(jìn)行交易驗(yàn)證的區(qū)塊鏈系統(tǒng)。

猜你喜歡
以太挖礦哈希
瘋狂的“挖礦”
基于特征選擇的局部敏感哈希位選擇算法
礦工“殺紅眼”!一切皆可挖礦
供電緊張,伊朗禁挖比特幣4個(gè)月
哈希值處理 功能全面更易用
自然法則的哲學(xué)原理——以太模型大統(tǒng)一理論續(xù)論
文件哈希值處理一條龍
基于活躍節(jié)點(diǎn)庫的以太坊加密流量識(shí)別方法
以太萬物理論概述
以太坊又爆漏洞黑客大戰(zhàn)一觸即發(fā)
嘉黎县| 寿阳县| 汾阳市| 杭锦旗| 杭锦后旗| 三江| 海丰县| 湘西| 霍山县| 满城县| 江源县| 即墨市| 大关县| 德令哈市| 旅游| 永济市| 岢岚县| 上饶县| 诸城市| 远安县| 通化县| 晋州市| 巴青县| 莱阳市| 黑龙江省| 张北县| 大渡口区| 长寿区| 仁化县| 廊坊市| 云龙县| 伊通| 兴安盟| 施秉县| 清原| 鞍山市| 小金县| 永年县| 宁城县| 太仆寺旗| 尚义县|