作為一名以太坊區(qū)塊鏈技術(shù)的愛(ài)好者和實(shí)踐者,搭建并運(yùn)行自己的Geth節(jié)點(diǎn)一直是我的一個(gè)目標(biāo),這不僅能讓我更深入地理解區(qū)塊鏈的運(yùn)作機(jī)制,也能為網(wǎng)絡(luò)貢獻(xiàn)一份自己的力量,以太坊的全節(jié)點(diǎn)同步,尤其是對(duì)于Geth而言,從來(lái)不是一件輕松的事,我想分享一下我的第六次Geth節(jié)點(diǎn)同步親測(cè)經(jīng)歷,這段歷程充滿了挑戰(zhàn)、學(xué)習(xí)與最終的喜悅。
背景與初衷
在此之前,我已經(jīng)嘗試過(guò)五次同步Geth節(jié)點(diǎn),但都以失敗或中途放棄告終,要么是同步速度過(guò)慢,遙遙無(wú)期;要么是同步過(guò)程中頻繁出錯(cuò),節(jié)點(diǎn)崩潰;要么就是同步完成后,存儲(chǔ)空間告急,系統(tǒng)運(yùn)行緩慢,但第六次,我下定決心,一定要“啃下這塊硬骨頭”,我的初衷很簡(jiǎn)單:獲得一個(gè)完全同步、穩(wěn)定運(yùn)行的Geth全節(jié)點(diǎn),方便進(jìn)行DApp測(cè)試、交易查詢和鏈上數(shù)據(jù)分析。
第六次同步:充分準(zhǔn)備,步步為營(yíng)
吸取了前五次的教訓(xùn),第六次同步我不再急于求成,而是做了更充分的準(zhǔn)備和規(guī)劃:
-
硬件升級(jí):
- CPU:選擇了Intel Core i7-10700K,8核16線程,確保有足夠的算力處理區(qū)塊驗(yàn)證。
- 內(nèi)存:配備了32GB DDR4內(nèi)存,考慮到以太坊狀態(tài)數(shù)據(jù)的增長(zhǎng),大內(nèi)存能有效減少磁盤(pán)I/O,提升同步速度和穩(wěn)定性。
- 存儲(chǔ):這是關(guān)鍵!我放棄了之前的SSD,直接投資了兩塊4TB的NVMe SSD,組建RAID 0陣列(追求速度,且了解數(shù)據(jù)冗余風(fēng)險(xiǎn)),對(duì)于全節(jié)點(diǎn)來(lái)說(shuō),存儲(chǔ)空間真的是“多多益善”,4TB起步,8TB更佳,我預(yù)計(jì)至少需要6TB以上的可用空間。
- 網(wǎng)絡(luò):升級(jí)了千兆寬帶,并確保路由器設(shè)置合理,開(kāi)放了Geth默認(rèn)的端口(30303,30304等),并進(jìn)行了UPnP映射或端口轉(zhuǎn)發(fā),確保節(jié)點(diǎn)能充分與網(wǎng)絡(luò)中的其他節(jié)點(diǎn)連接。
-
軟件與環(huán)境:
- 操作系統(tǒng):選擇了Ubuntu Server 20.04.4 LTS,服務(wù)器版系統(tǒng)更純凈,資源占用更少。
- Geth版本:從以太坊官網(wǎng)下載了最新穩(wěn)定版的Geth二進(jìn)制文件(當(dāng)時(shí)是v1.10.23),并確保其與系統(tǒng)兼容。
- 同步模式選擇:經(jīng)過(guò)權(quán)衡,我決定使用
--syncmode full(全同步),雖然耗時(shí)最長(zhǎng),但能獲得最完整的區(qū)塊鏈數(shù)據(jù)和歷史狀態(tài),這對(duì)于我的研究目的至關(guān)重要,我放棄了看似更快的--syncmode snap(快照同步),因?yàn)樗幌螺d最新的狀態(tài)數(shù)據(jù),對(duì)于需要查詢歷史交易和狀態(tài)的場(chǎng)景不夠友好。
-
同步過(guò)程與波折
-
初次啟動(dòng)與速度: 執(zhí)行
geth --config config.tom --datadir /data/ethereum --syncmode full --gcmode full --http --http.addr "0.0.0.0" --http.port "8545" --http.vhosts "*" --ws --ws.addr "0.0.0.0" --ws.port "8546" --ws.origins "*" --cache 8192 --maxpeers 50命令后,節(jié)點(diǎn)開(kāi)始啟動(dòng)并嘗試連接網(wǎng)絡(luò)。 初始階段,同步速度還算可以,大概在100-200MB/s左右,下載的區(qū)塊數(shù)據(jù)也比較穩(wěn)定,我滿懷期待,以為這次會(huì)順利很多。 -
“卡頓”與焦慮: 好景不長(zhǎng),當(dāng)同步到某個(gè)高度(大約在1500萬(wàn)區(qū)塊左右,接近2022年底的數(shù)據(jù))時(shí),速度開(kāi)始明顯下降,甚至一度降到20-30MB/s,看著進(jìn)度條緩慢移動(dòng),我的心也懸了起來(lái),難道又要重蹈覆轍? 我開(kāi)始排查原因:
- 網(wǎng)絡(luò)問(wèn)題:使用
geth attach進(jìn)入控制臺(tái),執(zhí)行net.peerCount查看連接的節(jié)點(diǎn)數(shù)量,發(fā)現(xiàn)只有寥寥幾個(gè),我嘗試調(diào)整--maxpeers參數(shù)到100,并手動(dòng)連接一些已知的高質(zhì)量節(jié)點(diǎn)(通過(guò)admin.addPeer),但效果甚微。 - 磁盤(pán)I/O瓶頸:使用
iostat命令監(jiān)控磁盤(pán)性能,發(fā)現(xiàn)磁盤(pán)利用率偶爾會(huì)達(dá)到100%,這可能成為了瓶頸,雖然NVMe SSD很快,但全同步時(shí)的隨機(jī)讀寫(xiě)依然巨大。 - 內(nèi)存不足:
free -h查看內(nèi)存使用,發(fā)現(xiàn)Geth進(jìn)程占用了大量?jī)?nèi)存,接近20GB,剩余內(nèi)存也所剩無(wú)幾,我嘗試將--cache參數(shù)從8192MB調(diào)整到4096MB,希望能減少內(nèi)存壓力,但同步速度并未提升,反而略有波動(dòng)。 - Geth版本或已知問(wèn)題:我查閱了Geth的GitHub Issues和社區(qū)論壇,發(fā)現(xiàn)類似“同步卡頓”的抱怨不少,尤其是在某些特定區(qū)塊高度附近,可能與網(wǎng)絡(luò)中的“壞塊”或節(jié)點(diǎn)間數(shù)據(jù)傳輸效率有關(guān)。
- 網(wǎng)絡(luò)問(wèn)題:使用
-
耐心等待與優(yōu)化: 經(jīng)過(guò)一番折騰,沒(méi)有找到立竿見(jiàn)影的解決方案,我意識(shí)到,Geth全同步本身就是一個(gè)“體力活”,需要極大的耐心,我決定不再頻繁干預(yù),讓節(jié)點(diǎn)自己“慢慢來(lái)”,只是每天定期查看同步進(jìn)度和系統(tǒng)資源狀況。 大約過(guò)了三四天,同步速度似乎有所回升,穩(wěn)定在了50-80MB/s,又過(guò)了差不多一周,進(jìn)度條終于走到了100%!
-
同步完成與驗(yàn)證: 當(dāng)看到“Synced new block”的日志,并且
eth.syncing
-