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。这看起来不正常?!
谢谢。
Geth 默认使用“快速”同步。因此,您必须等到它完全同步区块链数据才能获取所有已知的状态条目,因此需要再等待几个小时是正常的。
在您的示例中,您可以看到最高块是 4507228,当前块是 4507134。
这意味着区块链数据未完全同步,但正如我上面提到的,这不足以让节点提供帐户余额信息或为您提供最新的块信息。
为了获取帐户的更新余额,它还需要同步区块链的状态,显示已经提取了 6004673 个状态,但仍需要获取 15250 个状态才能达到已知状态数 6019923。
这可能看起来很麻烦,但它仍然比运行“完整”同步要快,后者会获取 10 倍以上的数据,因为最大的区别在于它保存每个块的区块链状态,而“快速”同步仅保存最新的数据状态,这就是为什么它不会为 web3.eth 模块返回任何值。