Web3.js getBalance всегда показывает 0

Я хотел бы получить баланс своего кошелька ethereum, поэтому я сделал приложение с web3.js и узлом ethereum, работающим с 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, у меня все еще есть эти эфиры в моем кошельке, но баланс от web3.js все еще возвращает 0.

Когда я проверяю последний блок:

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

Или с:

web3.eth.blockNumber;

Возвращает 0. Это не нормально?!

Спасибо.


person Curdix    schedule 07.11.2017    source источник
comment
Возможно, вам нужно дождаться своего баланса, например await web3.eth.getBalance('0x...');   -  person Moe Elsharif    schedule 14.11.2017


Ответы (1)


Geth по умолчанию использует «быструю» синхронизацию. Таким образом, вам нужно дождаться полной синхронизации данных блокчейна, чтобы получить все известные записи состояния, так что это нормально, если придется ждать еще пару часов.

В вашем примере вы можете видеть, что самый высокий блок — 4507228, а текущий блок — 4507134.

Это означает, что данные блокчейна не полностью синхронизированы, но, как я упоминал выше, этого будет недостаточно для того, чтобы узел предоставил информацию о балансе учетной записи или дал вам последнюю информацию о блоке.

Чтобы получить обновленный баланс для учетной записи, также необходимо синхронизировать состояние блокчейна, который показывает, что уже получил 6004673 состояния, но ему все еще необходимо получить 15250 состояний, чтобы достичь числа известных состояний 6019923.

Это может показаться громоздким, но все же быстрее, чем запуск «полной» синхронизации, которая будет извлекать в 10 раз больше данных, поскольку большая разница в том, что она сохраняет состояние блокчейна для каждого отдельного блока, в то время как «быстрая» синхронизация сохраняет только последние state, поэтому он не возвращает никаких значений для модуля web3.eth.

person Pedro Gomes    schedule 16.01.2018
comment
Этот ответ можно улучшить, показав пример кода, который работает. В противном случае это должен быть комментарий. - person Evan Weissburg; 17.01.2018
comment
На самом деле нет никакого кода, чтобы продемонстрировать это, но я обновил свой ответ, чтобы он был более подробным. - person Pedro Gomes; 18.01.2018