Warum würde sich Ganache je nach geth, web3j, web3js und web3.py unterschiedlich verhalten?

Ich habe ein Smart-Contract-Token in einer Ganache-Instanz bereitgestellt. Meine mit React und web3.js geschriebene Dapp zeigt die gleichen 10 Konten, für eth.accountsdie der gleiche Befehl in der Geth-Konsole ausgeführt wird.

Wenn ich mein Token-Objekt mit der abi- und Vertragsadresse in geth erstelle, erhalte ich ein anderes Guthaben accounts[0]als das Guthaben, das ich mit meinem dapp erhalte. Beide erstellen das Token-Objekt mit derselben Blockchain-Adresse. Beide zeigen, dass eth.accounts[0]es sich um dieselbe Adresse handelt!

Ich habe auch eine Android-App mit web3j. Es verwendet dieselbe Vertragsadresse und zeigt dieselben Werte an, die die React-Dapp anzeigt.

Ich habe jedoch auch eine App in web3.py und sie zeigt die gleichen Werte, die in Geth angezeigt werden!

Kann mir bitte jemand erklären, wie das gleiche Token .balanceOf("the_same_address")-Objekt unterschiedliche Ausgaben anzeigen kann, wenn es sich in derselben Blockchain befindet? Der einzige Unterschied besteht darin, ob ich geth, web3j, web3.js oder web3.py verwende

BEARBEITEN: Bild des Browsers mit Konsole (dapp) und Terminalkonsole (geth) hinzugefügtGeben Sie hier die Bildbeschreibung ein

Es gibt mir unterschiedliche Salden für alle Konten. Es fühlt sich an, als würde ich mich mit 2 verschiedenen Blockchains verbinden. Sie haben jedoch dieselben 10 Standardkonten und meine Verträge, die an denselben Adressen bereitgestellt werden.

Wenn Sie sagen, dass die Salden "anders" sind, meinen Sie damit, dass eins 0 ist?
Nein. Guthaben sind ganz andere Zahlen. Ich erhalte auch unterschiedliche Ergebnisse, wenn ich Mappings in einem Vertrag überprüfe. Web3.js gibt eine andere Zuordnung als die Geth-Konsole zurück.
Können Sie die Salden als ganze Zahlen anzeigen, bevor Sie die Dezimalstellen verschieben? Der Unterschied scheint dafür zu groß zu sein, aber vielleicht ist es eine Art Rundungsfehler. Wenn die Möglichkeit besteht, dass Sie mit zwei verschiedenen Ketten verbunden sind, können Sie am besten bestätigen, dass Sie sich auf derselben Kette befinden, indem Sie den neuesten Block-Hash mit vergleichen: web3.eth.getBlock('latest').hash.
Danke @carver Ich hatte wirklich gehofft, dass dies zwei verschiedene Hashes zeigen würde. Leider zeigte es den gleichen Hash in Geth und Dapp, obwohl sie unterschiedliche Salden anzeigen. Wir haben eine neue Instanz erstellt, die in allen Apps die gleichen Salden anzeigt. Ich habe diese Instanz immer noch nicht zerstört, in der Hoffnung zu verstehen, was schief gelaufen ist.
Ein kaputter Token kann je nach Anrufer ein unterschiedliches Guthaben ergeben. (und die verschiedenen Web3s haben möglicherweise unterschiedliche Standardabsender) Können Sie die Solidität hinzufügen, um keine lustigen Geschäfte in dieser Funktion zu verifizieren?
Dem möchte ich auch auf den Grund gehen! Alle diese Web3-Schnittstellen verbinden sich letztendlich über json-rpc, also wiederholen wir denselben Aufruf über 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

Antworten (1)

Werden die Ergebnisse in „eth“-Werten und nicht in „wei“-Werten angezeigt? Können Sie uns die verschiedenen Ergebnisse zeigen, die Sie in geth/ web3j/ js/ py sehen?

Es ist in Weis. Ich kann von wei umwandeln und es ist kein Rundungsproblem. Ich habe der Frage ein Bild hinzugefügt.
In Ihrer Konsole geben Sie coin.balanceOf() ein. Ist „Coin“ Ihr Vertrag? Rufen Sie denselben 'Coin'-Vertrag über web3js auf (UI, wo 599999400 angezeigt wird)? Ich denke, das Guthaben, das Sie in der Benutzeroberfläche erhalten, ist das tatsächliche Kontoguthaben aus Ihrem Blockchain-Netzwerk und coin.balanceOf ist das Guthaben der Adresse in Ihrem Vertrag. Können Sie Ihre Funktion coin.balanceOf hier posten?
Ja, 'Coin' ist der Vertrag mit der gleichen Adresse. balanceOf.call(accounts[0]) in React coin.balanceOf(eth.accounts[0]) in geth Sie können im Bild sehen, dass accounts[0] für beide gleich ist. Es ist wirklich super seltsam. Fühlt sich an wie 2 verschiedene Blockchains, aber beide leben am selben Endpunkt und Port ...