時(shí)間:2023-07-26|瀏覽:206
當(dāng)你運(yùn)行一個(gè)以太坊節(jié)點(diǎn)時(shí),首先必須同步整個(gè)網(wǎng)絡(luò),即下載和計(jì)算構(gòu)建最新區(qū)塊鏈狀態(tài)所需的所有數(shù)據(jù)。Geth支持兩種同步模式:完全同步和快速同步。完全同步是獨(dú)立執(zhí)行整個(gè)同步過(guò)程的模式。它會(huì)下載并驗(yàn)證每個(gè)區(qū)塊的工作量證明,并計(jì)算區(qū)塊中的每個(gè)事務(wù)。這種模式更安全,但速度較慢,可能需要幾天甚至幾周的時(shí)間。
然而,有些用戶可能不想等待那么長(zhǎng)時(shí)間。他們希望更快地完成同步。因此,Geth提供了快速同步模式。在這種模式下,Geth會(huì)下載區(qū)塊,但只隨機(jī)選擇一些區(qū)塊來(lái)驗(yàn)證工作量證明,而不是每個(gè)區(qū)塊都驗(yàn)證。它也不會(huì)自己執(zhí)行事務(wù),而是直接從其他節(jié)點(diǎn)下載狀態(tài)樹,以獲得最終的區(qū)塊鏈狀態(tài)。
然而,為了確保從其他節(jié)點(diǎn)下載的狀態(tài)樹數(shù)據(jù)的正確性,Geth使用了默克爾帕特里夏樹(Merkle-Patriciatrie)。默克爾帕特里夏樹是Geth客戶端中的一種關(guān)鍵數(shù)據(jù)結(jié)構(gòu),將默克爾樹和帕特里夏樹結(jié)合起來(lái),以支持密碼學(xué)驗(yàn)證和運(yùn)行時(shí)性能。
全局狀態(tài)樹存儲(chǔ)了區(qū)塊鏈的絕大部分?jǐn)?shù)據(jù)。為了高效存儲(chǔ)和查詢狀態(tài)樹,Geth使用LevelDB并將每個(gè)節(jié)點(diǎn)編寫為鍵值對(duì),使用節(jié)點(diǎn)的哈希作為鍵,節(jié)點(diǎn)的序列化數(shù)據(jù)作為值。這樣,Geth可以查詢?nèi)我鈪^(qū)塊的狀態(tài)樹。
Geth團(tuán)隊(duì)已通過(guò)修復(fù)漏洞解決了這個(gè)問(wèn)題。他們快速處理了樹讀取錯(cuò)誤,并通過(guò)修復(fù)代碼和樹部分的不同之處來(lái)徹底修復(fù)了這個(gè)漏洞。
這是一個(gè)有趣的漏洞,攻擊者可以在以太坊網(wǎng)絡(luò)上設(shè)置一個(gè)陷阱,隨時(shí)引爆,導(dǎo)致所有使用快速同步的Geth節(jié)點(diǎn)與主網(wǎng)分離。這個(gè)漏洞利用了Geth同步和數(shù)據(jù)存儲(chǔ)代碼中復(fù)雜的邏輯,可能是因?yàn)檫@個(gè)原因長(zhǎng)時(shí)間未被注意到。