在同步以太坊節(jié)點(diǎn)時將會發(fā)生什么細(xì)節(jié)?為什么同步這么慢?
此文中,我們會來看看同步以太坊節(jié)點(diǎn)過程中,到底會發(fā)生什么樣的細(xì)節(jié)?
同步以太坊節(jié)點(diǎn),對于很多人來說都是非常痛苦的事情。每個和以太坊接觸的人都對這點(diǎn)感覺很不爽。
目前以太坊錢包默認(rèn)的同步模式,叫做快速同步。和從創(chuàng)世區(qū)塊開始,重新處理所有的轉(zhuǎn)賬不同(這會需要好幾個星期),快速同步下載區(qū)塊,然后只是驗證和工作量證明相關(guān)的數(shù)據(jù)。下載所有區(qū)塊是直截了當(dāng)?shù)?,但是快速過程會相對快速地重新組成整個區(qū)塊鏈。很多人錯誤地認(rèn)為,因為他們有區(qū)塊,所以在同步。
不幸地是,這不是問題的關(guān)鍵,因為沒有任何轉(zhuǎn)賬被執(zhí)行了(也就是說,為了驗證區(qū)塊鏈的有效性,沒有轉(zhuǎn)賬進(jìn)行),所以我們沒有任何賬戶的狀態(tài)(也就是,余額,記錄,智能合約代碼以及數(shù)據(jù))。這些需求被分開下載,而且會和最新的區(qū)塊交叉檢測。這個部分叫做狀態(tài)前綴樹的下載,而且它實(shí)際上和區(qū)塊下載同時運(yùn)行;同時它比下載區(qū)塊要花費(fèi)更長的時間。
所以,什么是狀態(tài)前綴樹?在以太坊主網(wǎng)中,有無數(shù)的賬戶,這些會追蹤每個用戶的余額,數(shù)據(jù)等等,
這些賬戶本身是不足夠去運(yùn)行節(jié)點(diǎn),他們需要和每個區(qū)塊進(jìn)行加密連接,從而節(jié)點(diǎn)能夠驗證賬戶沒有被欺詐。這個加密連接是通過在賬戶上創(chuàng)建樹狀的數(shù)據(jù)結(jié)構(gòu)來完成的,每個層級都和下面的層級連接,然后和更小的層級連接,直到你達(dá)到單個根數(shù)據(jù)。這種龐大的數(shù)據(jù)結(jié)構(gòu)包含了所有賬戶和中間的加密證明,被稱為狀態(tài)前綴樹。
那么為什么要提出這個問題?這種樹狀的數(shù)據(jù)結(jié)構(gòu)是幾百萬個很小的加密證明相連接的、為了獲得同步節(jié)點(diǎn),你需要下載所有賬戶的數(shù)據(jù),同時這些加密證明也會驗證網(wǎng)絡(luò)中沒有任何東西嘗試去欺騙你。這本身已經(jīng)是非??鋸埖臄?shù)據(jù)了。它變得更加混亂的部分是這個數(shù)據(jù)不斷地變化:每個區(qū)塊(15秒),大約有1000個節(jié)點(diǎn)會從樹狀結(jié)構(gòu)中刪除,然后大約有2000個新節(jié)點(diǎn)會添加。這意味著需要同步數(shù)據(jù)庫的節(jié)點(diǎn)正在以每秒200次的速度改變。最差的部分是讓你在同步的時候,網(wǎng)絡(luò)還在往前推進(jìn),并且你開始下載的狀態(tài)也許會在你下載的時候小時,所以你的節(jié)點(diǎn)需要一直跟著網(wǎng)絡(luò)進(jìn)行,同時還需要獲得所有最近的數(shù)據(jù)。但是當(dāng)你實(shí)際上獲得所有數(shù)據(jù)的時候,你的本地節(jié)點(diǎn)不能使用,因為它不能加密證明任何賬戶的任何信息。
如果你看到主網(wǎng)后面有64個區(qū)塊,你還沒有完全同步,甚至還差的很遠(yuǎn)。你只是完成了區(qū)塊下載的部分,仍然在進(jìn)行狀態(tài)的下載。你可以通過無窮無盡的Imported state entries [。..] ,來看到你自己的狀態(tài)。當(dāng)你的節(jié)點(diǎn)在線之前,你也需要等到它們出來。
Q:節(jié)點(diǎn)只是取決于輸入的狀態(tài)?
A: 節(jié)點(diǎn)不會暫停,它只是不會提前知道整個狀態(tài)前綴樹有多大,所以它會一直進(jìn)行直到發(fā)現(xiàn)和下載了整個數(shù)據(jù)。
原因是以太坊區(qū)塊中只有狀態(tài)根部,根節(jié)點(diǎn)的單個哈希。當(dāng)節(jié)點(diǎn)開始同步,它會完全直到1個節(jié)點(diǎn),并且嘗試下載。那個節(jié)點(diǎn),可以對標(biāo)高達(dá)16個新節(jié)點(diǎn),并且嘗試下載那些。隨著我們繼續(xù)進(jìn)行下載,大多數(shù)的節(jié)點(diǎn)會和新的節(jié)點(diǎn)對標(biāo),而且我們那時候還不知道它們。這就是為什么你需要想想,為什么它會卡在同樣的數(shù)字。隨著時間,節(jié)點(diǎn)是在發(fā)現(xiàn)和下載樹狀數(shù)據(jù)。
Q: 我卡在了主網(wǎng)后的64個區(qū)塊?
A: 就像上面解釋的,你不是卡主了,是剛剛完成了區(qū)塊下載階段,正在等待狀態(tài)下載完成。這部分花費(fèi)的時間,比下載區(qū)塊要長很多。
Q:為什么下載狀態(tài)需要花費(fèi)這么長時間,我有很高的帶寬?
A: 狀態(tài)同步是受制于磁盤輸入輸出,而不是帶寬。
以太坊的狀態(tài)前綴樹包含了幾百萬個節(jié)點(diǎn),大多數(shù)會是按照單個哈希對應(yīng)至多16個其他哈希。在磁盤上,這是很恐怖的存儲方式,因為其中幾乎沒有結(jié)構(gòu),只是隨機(jī)的數(shù)字來反應(yīng)甚至更多的隨機(jī)數(shù)字。這會讓底層數(shù)據(jù)庫變得混亂,因為它不能優(yōu)化存儲以及使用任何有意義的方式來尋找數(shù)據(jù)。
不僅存儲數(shù)據(jù)是非常不理想的,而且由于每秒200次的改變以及對過去數(shù)據(jù)的修改,我們甚至不能下載,這是一個正確的預(yù)處理方法,使它更快地導(dǎo)入,而底層數(shù)據(jù)庫不太多。最終的結(jié)果甚至是快速的更新導(dǎo)致很高的磁盤輸入輸出費(fèi)用,這對于機(jī)械硬盤來說,是非常大的挑戰(zhàn)。
Q:這么說,我不能用硬盤驅(qū)動器來運(yùn)行全節(jié)點(diǎn)?
A: 很不幸地是,確實(shí)不可以。在硬盤驅(qū)動器上進(jìn)行快速同步,比起你等待目前的數(shù)據(jù),會花費(fèi)更多時間。盡管你確實(shí)等待了,硬盤驅(qū)動器也不能跟上主網(wǎng)轉(zhuǎn)賬處理的讀寫需求。
但是,你應(yīng)該能夠使用硬盤驅(qū)動器在輕客戶端使用,因為會最小化對系統(tǒng)資源的影響。如果你想要運(yùn)行全節(jié)點(diǎn),那么固態(tài)硬盤就是唯一的選擇。