以太坊實踐經驗之《eth.blockNumber結果為0》

朱智勝發表於2017-09-24

問題場景

在使用以太坊ETH的過程中遇到這樣一個問題,就是通過rpc 控制檯呼叫eth.blockNumber獲得的返回結果為0。如果沒有產生區塊或沒有同步到區塊,查詢結果為0並不奇怪,本身區塊高度就是0。然而,在實踐中發現,區塊已經同步一部分之後,在某個時刻呼叫此節點返回的結果依舊是0。那麼,這個問題的原因是什麼呢?

軟體環境

1.7版本的geth客戶端, Linux作業系統 連結公有鏈

原因分析

在Geth1.6和1.7客戶端中預設使用快速(fast)同步,因此在同步的過程中節點只下載最近的狀態,中間區塊的狀態是不可用的。因此,直到同步完成,最新的完整塊都為0,因為所有比較新的塊在同步期間是不完整的。當快速同步完成時,它會下載頭部的關聯狀態,此時頭部塊完整,最新的塊可以關聯到當前的頭部。簡單來說就是在快速同步的過程中,需要構建一個頭部資訊,如果此資訊為構建完成,通過上面的介面查詢到的結果就是0。當同步完成,後續就不會再出現此問題。

相關操作命令

下面附帶一些檢查此問題時使用的相關介面呼叫: 使用eth.syncing檢視當前區塊的同步情況: 返回結果格式如下: { currentBlock: 290584, // 同步到的區塊高度 highestBlock: 891836, // 所連結的節點的最高高度 knownStates: 465886, pulledStates: 361434, startingBlock: 0 } 通過此介面我們可以檢視到區塊的同步情況。

使用eth.getBlock(“latest”).number可以查到最新區塊的高度。

個人區塊相關小密圈(知識星球)

個人小密圈已經建立。最近正在致力於區塊鏈各類數字貨幣節點使用相關工作,在小密圈中會持續分享實踐中遇到的各種常見的問題及解決方案、疑難雜症和各種坑。同時會回答大家一些常見的技術問題。剛剛建立,優惠加入中。希望大家多多支援。
這裡寫圖片描述

相關文章