Geth:余额在 --rinkeby 上始终为 0

Posted

技术标签:

【中文标题】Geth:余额在 --rinkeby 上始终为 0【英文标题】:Geth: balance is always 0 on --rinkeby 【发布时间】:2020-04-24 07:19:00 【问题描述】:

根据 Etherscan 我有 7.5 Ether,但是当我在 javascript 控制台中执行 eth.getBalance(eth.accounts[0]) 时,它总是返回“0”

这就是我将 geth 连接到 rinkeby 的方式(运行时间超过 24 小时)

geth  --rinkeby

这是同步的状态

λ geth --rinkeby attach ipc:\\.\pipe\geth.ipc
Welcome to the Geth JavaScript console!

instance: Geth/v1.9.9-stable-01744997/windows-amd64/go1.13.4
coinbase: 0x7f9153e8fe06c4b3eb10e8457c20d0559921de5c
at block: 0 (Wed, 12 Apr 2017 16:59:06 CEST)
 datadir: C:\Users\andre_000\AppData\Local\Ethereum\rinkeby
 modules: admin:1.0 clique:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

> eth.syncing

  currentBlock: 5746334,
  highestBlock: 5746402,
  knownStates: 32641057,
  pulledStates: 32636964,
  startingBlock: 5746304

> eth.getBalance(eth.accounts[0])
  0
> eth.getBalance(eth.coinbase)
  0
> web3.fromWei(eth.getBalance(eth.coinbase)); 
  0
> eth.getBalance("0x7f9153e8fe06c4b3eb10e8457c20d0559921de5c")
  0
> eth.blockNumber
  0

du -h 30G

【问题讨论】:

【参考方案1】:

听起来 geth 还没有同步。

请在您的 geth 控制台中输入:

eth.getBlock("latest").number

从这篇文章开始,你应该得到 5757199 或更高的值。

“同步以太坊是一个痛点”,正如Péter Szilágyi(以太坊团队负责人)所说。

来自https://github.com/ethereum/go-ethereum/issues/16875:

Geth 当前的默认同步模式称为快速同步。反而 从创世区块开始并重新处理所有 曾经发生的交易(可能需要数周时间),快速同步 下载块,并仅验证相关的工作量证明。 下载所有块是一个简单而快速的过程,并且 将相对快速地重新组装整个链条。

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

那么,什么是 state trie?在以太坊主网上,有大量 已经有账户,跟踪每个账户的余额、随机数等 用户/合同。然而,账户本身不足以运行 一个节点,它们需要以加密方式链接到每个块,以便 节点实际上可以验证帐户没有被篡改。 这种加密链接是通过创建树数据结构来完成的 在账户之上,每一层将它下面的层聚合成一个 越来越小的层,直到你到达单根。这个巨大的 包含所有帐户和中间体的数据结构 密码证明被称为状态树。

好的,为什么这会造成问题?这个 trie 数据结构是一个 数亿个微小密码的错综复杂的互连 证明(特里节点)。要真正拥有一个同步节点,您需要 下载所有帐户数据,以及所有微小的密码 证明网络中没有人试图欺骗您的证据。 这本身就已经是数量惊人的数据项。它所在的部分 更混乱的是,这些数据在不断变化:在每个 块(15s),大约 1000 个节点从这个 trie 中删除,大约 新增2000个。这意味着您的节点需要同步一个 每秒变化 200 次的数据集。最糟糕的是 当你在同步时,网络正在向前移动,并且状态 您开始下载的内容可能会在您下载时消失, 所以你的节点需要不断地跟随网络,同时试图 收集所有最近的数据。但直到你真正收集到所有 数据,您的本地节点不可用,因为它不能加密 证明任何帐户的任何信息。

如果你发现你落后于主网 64 个区块,那么你还没有 同步,甚至没有关闭。你刚刚完成了块 下载阶段并仍在运行状态下载。你可以看到这个 自己通过看似无穷无尽的 Imported state entries [...] 流 的日志。在您的节点真正到来之前,您也需要等待 在线。

【讨论】:

嗨 Diego,非常感谢,但 40 小时后节点似乎还没有同步,您推荐的命令返回“0”有什么想法吗? 在 rinkeby 文件夹上运行命令 du -h,显示 30G 是的......“同步以太坊是一个痛点”,正如 Péter Szilágyi(以太坊负责人)所说。我用 Peter 在github.com/ethereum/go-ethereum/issues/16875 中的帖子更新了我的答案“如果你看到你在主网后面 64 个块,你还没有同步,甚至没有关闭。你刚刚完成了块下载阶段并且仍在运行状态下载. 您可以通过看似无穷无尽的 Imported state entries [...] 日志流自己看到这一点。在您的节点真正上线之前,您也需要等待。” 试试 geth --rinkeby --fast 好的,我会尽快通知您!

以上是关于Geth:余额在 --rinkeby 上始终为 0的主要内容,如果未能解决你的问题,请参考以下文章

搭建Ethereum以太坊测试网络Rinkeby节点

我找不到 web3.eth.personal.newAccount

geth sendTransaction 错误:gas * price + value 资金不足

为啥我基于自己搭建的私链创建代币后,以太坊账户的余额仍然为零?

如何获取以太坊账户的余额?

如何在 rinkeby 和 ropsten 上获取测试令牌