3

我想获得我的以太坊钱包余额,所以我用 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);

使用以下命令启动节点:

geth --rpc --rpccorsdomain "*"

带有 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}

当我获取交易时

web3.eth.getTransaction('0x..')

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

当我检查最后一个块时:

web3.eth.getBlock("latest").number;

或与:

web3.eth.blockNumber;

它返回 0。这似乎不正常?!

谢谢。

4

1 回答 1

5

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

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

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

为了获得一个账户的更新余额,它还需要同步区块链的状态,这表明已经提取了 6004673 个状态,但它仍然需要获取 15250 个状态才能达到 6019923 个已知状态的数量。

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

于 2018-01-16T23:38:20.590 回答