为什么我的以太坊区块号在 geth 中是 0,即使同步已接近完成?

pan*_*ian 6 ethereum go-ethereum geth

> w3.eth.syncing
AttributeDict({
  'currentBlock': 5787386,
  'highestBlock': 5787491,
  'knownStates': 138355583,
  'pulledStates': 138341120,
  'startingBlock': 5787335,
})

> w3.eth.blockNumber
0
Run Code Online (Sandbox Code Playgroud)

我已经完成了完全同步,但块号始终为 0。

Lan*_*tig 5

首席 geth 开发人员 Peter 在这里发布了对此问题的全面回应:在快速同步模式下,块号始终为零。为了给卡弗的答案增添一点色彩,虽然您可能已经收到了最新的块头(eth.currentBlock),但您的节点可能仍然有很多工作需要下载整个状态树。引用彼得的话:

许多人错误地认为,因为他们拥有区块,所以他们是同步的。不幸的是,情况并非如此,因为没有执行任何交易,所以我们没有任何可用的账户状态(即余额、随机数、智能合约代码和数据)。这些需要单独下载并与最新的块进行交叉检查。此阶段称为状态特里树下载,它实际上与块下载同时运行;唉,现在比下载块要花更长的时间


car*_*ver 0

这与为什么我的以太余额在 geth 中为 0 的情况相同,即使同步已接近完成?但“症状”略有不同。

引用重要的一点:

geth --fast有一个有趣的效果:在同步完全完成之前,geth 无法提供有关帐户或合约的任何信息。

eth.syncing 返回 false 后尝试再次查询余额。

请注意,除了账户和合约之外,在同步完成之前您也无法检索有关区块的任何信息。

当您的同步完全完成时,syncing将返回 false,例如:

> w3.eth.syncing
False
Run Code Online (Sandbox Code Playgroud)