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