原创 标题:  以太坊实践经验之《eth.blockNumber结果为0》

问题场景

在使用以太坊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可以查到最新区块的高度。

END
朱智胜的个人博客-微信公众号