eth.getBalance() 和 eth.getBlock("latest").number 返回 0

eth.getBalance() and eth.getBlock("latest").number returning 0

以下是 geth 的控制台输出:

> eth.syncing
{
  currentBlock: 3935087,
  highestBlock: 3935168,
  knownStates: 6020785,
  pulledStates: 6015769,
  startingBlock: 3935060
}

账户地址为:0x374A7fd1A537646652bc79Ad76B5D4e737373372 TxHash:0x9797923f033a454aac25a7c324b7f37030ebc013cc4f80d85414016653d2e1ab TxReceipt 状态:Success 区块高度:3934618(576个区块确认) 时间戳:2 小时 23 分钟前(Feb-26-2019 02:32:42 AM +UTC)

发件人:0x31b98d14007bdee637298086988a0bbd31184523To:0x374a7fd1a537646652bc79ad76b5d4e737373372 价值:7.5 Ether ($0.00)

> eth.blockNumber

0
> eth.getBalance("0x374a7fd1a537646652bc79ad76b5d4e737373372")

0

现在我很困惑,因为 geth 已经同步到区块“3935087”,但仍然无法获取写入区块“3934618”的状态。

很可能您的本地状态特里仍未同步。你必须考虑默认情况下 Geth 在 fast mode 中被调用,因此它不会从创世块开始并重新执行区块链历史中的每个 txs,它只会同步块头并将它们重新组合成一个链。

不幸的是,由于您没有重播区块链 txs,因此状态 trie 中包含的信息(例如随机数、余额等)将不再可用。一旦您节点下载了每个区块头和 link 它们,它将触发下一阶段,即下载每个区块中包含的 txs 并按顺序执行它们,以便同步您的本地状态 trie。

如果你 运行 在以太坊主网上可能需要一周以上的时间,如果是 TestNet,例如 Rinkeby,大约需要 2-3 天。

在我的团队 Lightstreams 中,我们正在努力实施内部以太坊兼容区块链,其性能比官方以太坊区块链快 10 倍,而且每笔交易的成本要低得多,并确保它们的最终性。如果您想尝试一下,我们很乐意让您参与其中。 our open-sourced repo