Почему Ganache будет вести себя по-разному в зависимости от geth, web3j, web3js и web3.py?

У меня есть токен смарт-контракта, развернутый в экземпляре Ganache. Мое децентрализованное приложение, написанное с помощью React и web3.js, показывает те же 10 учетных записей eth.accounts, что и запуск той же команды в консоли geth.

Если я создам свой объект токена с адресом abi и контрактом в geth, я получу другой баланс accounts[0], чем баланс, который я получаю с моим децентрализованным приложением. Оба создают объект токена с одним и тем же адресом блокчейна. Оба показывают, что eth.accounts[0]это один и тот же адрес!

У меня также есть приложение для Android, использующее web3j. Он использует тот же адрес контракта и отображает те же значения, что и децентрализованное приложение React.

Однако у меня также есть приложение в web3.py, и оно показывает те же значения, что и в geth!

Может кто-нибудь объяснить мне, как один и тот же объект токена может отображать разные выходные данные, .balanceOf("the_same_address")если он находится в одной и той же цепочке блоков? Единственная разница в том, использую ли я geth, web3j, web3.js или web3.py.

РЕДАКТИРОВАТЬ: добавлен браузер изображений с консолью (dapp) и консолью терминала (geth)введите описание изображения здесь

Это дает мне разные балансы для всех счетов. Такое ощущение, что я подключаюсь к двум разным блокчейнам. Однако у них одни и те же 10 учетных записей по умолчанию, и мои контракты развернуты на одних и тех же адресах.

Когда вы говорите, что балансы «разные», вы имеете в виду, что один равен 0?
Нет. Балансы - это совсем другие цифры. Я также получаю разные результаты при проверке сопоставлений в контракте. Web3.js вернет сопоставление, отличное от консоли geth.
Можете ли вы показать балансы в виде целых чисел до сдвига десятичных знаков? Разница кажется слишком большой для этого, но, возможно , это какая-то ошибка округления. Кроме того, если есть шанс, что вы подключены к двум разным цепочкам, лучший способ подтвердить, что вы находитесь в одной и той же, — сравнить хэш последнего блока с: web3.eth.getBlock('latest').hash.
Спасибо @carver, я действительно надеялся, что это покажет два разных хэша. К сожалению, он показал один и тот же хеш в geth и dapp, хотя они показывают разные балансы. Мы создали новый экземпляр, и он показывает одинаковые балансы во всех приложениях. Я до сих пор не уничтожил этот экземпляр в надежде понять, что пошло не так.
Сломанный жетон может дать разный баланс в зависимости от того, кто звонил. (и у разных web3 могут быть разные отправители по умолчанию) Можете ли вы добавить надежность, чтобы убедиться, что в этой функции нет ничего смешного?
Я тоже хочу докопаться до сути! Все эти веб-интерфейсы в конечном итоге подключаются через json-rpc, поэтому давайте повторим тот же вызов через json-rpc:curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to": "<contract_addr>", "data":"0x70a082310000000000000000000000000<non-0x-prefixed-address-to-check-balance-of-here>"}],"id":1}' 127.0.0.1:8545

Ответы (1)

Результаты отображаются в значениях «eth», а не в «wei»? Можете ли вы показать нам различные результаты, которые вы видите в geth/web3j/js/py?

Это в Вэй. Я могу конвертировать из wei, и это не проблема округления. Я добавил изображение к вопросу.
В консоли вы вводите coin.balanceOf(). «Монета» — ваш контракт? Вы вызываете тот же контракт «монета» через web3js (пользовательский интерфейс, где он отображает 599999400)? Я предполагаю, что баланс, который вы получаете в пользовательском интерфейсе, является фактическим балансом учетной записи из вашей сети блокчейна, а coin.balanceOf — это баланс адреса в вашем контракте. Можете ли вы опубликовать здесь свою функцию coin.balanceOf?
Да, «монета» — это контракт с тем же адресом. balanceOf.call(accounts[0]) в React coin.balanceOf(eth.accounts[0]) в geth На картинке видно, что account[0] одинаковы для обоих. Это действительно супер странно. Похоже на 2 разных блокчейна, но оба живут в одной конечной точке и порту...