Web3.js getBalance 始终显示 0

Cur*_*dix 4 ethereum web3js go-ethereum

我想获取我的以太坊钱包余额,因此我使用 web3.js 制作了一个应用程序,并创建了一个使用 go-ethereum 运行的以太坊节点。

我的钱包里有一些以太币,并且节点已同步,但我的余额始终显示 0 以太币。

这是我的应用程序:

var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
balance = web3.eth.getBalance('0x...');
console.log(balance);
Run Code Online (Sandbox Code Playgroud)

使用以下命令启动节点:

geth --rpc --rpccorsdomain "*"
Run Code Online (Sandbox Code Playgroud)

web3.js 节点的状态:

API Version : 0.19.0
Node Version : Geth/v1.7.2-stable-1db4ecdc/darwin-amd64/go1.9.1
Network Version : 1
Ethereum Version : 63
isConnected : true
{host: "http://localhost:8545", timeout: 0}
Listening : true
Peer Count : 25
{currentBlock: 4507134, highestBlock: 4507228, knownStates: 6019923, pulledStates: 6004673, startingBlock: 4506690}
Run Code Online (Sandbox Code Playgroud)

当我获取交易时

web3.eth.getTransaction('0x..')
Run Code Online (Sandbox Code Playgroud)

我可以在我的钱包上看到一些以太币的转账。当我检查 etherscan 时,我的钱包里仍然有这些以太币,但 web3.js 的余额仍然返回 0。

当我检查最后一个块时:

web3.eth.getBlock("latest").number;
Run Code Online (Sandbox Code Playgroud)

或者与:

web3.eth.blockNumber;
Run Code Online (Sandbox Code Playgroud)

它返回0。这看起来不正常?!

谢谢。

Ped*_*mes 6

Geth 默认使用“快速”同步。因此,您必须等到它完全同步区块链数据才能获取所有已知的状态条目,因此需要再等待几个小时是正常的。

在您的示例中,您可以看到最高块是 4507228,当前块是 4507134。

这意味着区块链数据未完全同步,但正如我上面提到的,这不足以让节点提供帐户余额信息或为您提供最新的块信息。

为了获取帐户的更新余额,它还需要同步区块链的状态,显示已经提取了 6004673 个状态,但仍需要获取 15250 个状态才能达到已知状态数 6019923。

这可能看起来很麻烦,但它仍然比运行“完整”同步要快,后者会获取 10 倍以上的数据,因为最大的区别在于它保存每个块的区块链状态,而“快速”同步仅保存最新的数据状态,这就是为什么它不会为 web3.eth 模块返回任何值。

  • 实际上没有任何代码可以演示它,但我已经更新了我的答案以使其更加深入 (3认同)