Warum gibt web3.getBalance manchmal einen alten Wert zurück?

Kann mir bitte jemand folgendes Problem erklären? web3Ich habe einen ziemlich einfachen Code, um das ETH-Guthaben mithilfe der JS-Bibliothek abzurufen . Es ist ungefähr so:

import Web3 form 'web3';

const web3 = new Web3(new Web3.providers.HttpProvider('https://api.myetherapi.com/eth'));
const batch = new web3.eth.BatchRequest();

batch.add(api.eth.getBalance.request('0x...', 'latest', (err, balance) => {
    if (err) {
        console.error(err);
    } else {
        console.log(web3.utils.fromWei(balance, 'ether');
    }
}));

...

batch.execute();

Ich rufe diesen Code alle N Sekunden auf, und er funktioniert die meiste Zeit gut. Wenn jedoch eine Transaktion das Guthaben ändert, passiert etwas Seltsames: Es getBalancekann entweder ein neues oder ein altes Guthaben zurückgegeben werden. Ich meine, ein Aufruf gibt einen neuen Wert zurück, der nächste Aufruf - alter Wert, dann wieder neuer Wert und so weiter.

Gibt es dafür irgendeine Art Workaround?

Antworten (1)

Dieses Verhalten kann aufgrund von Gabelungen in der Kette auftreten. Die beste Vorgehensweise ist, auf eine Transaktion zu warten, bis Sie 12 Bestätigungen (Blöcke) haben. Siehe „ Welche Anzahl an Bestätigungen gilt in Ethereum als sicher?

BEARBEITEN Ethereum implementiert genau wie Bitcoin probabilistische BFT. Das bedeutet, dass Sie zu keinem Zeitpunkt 100,0 % sicher sein können, was Sie von der Kette bekommen. Aus diesem Grund sollten Sie, wenn Sie stabile Werte wünschen, diese von currentBlock-12 abfragen. Dies können Sie über eth.getBalance (addr, eth.blockNumber-12) tun.

Danke für die Antwort. Aber alles, was ich will, ist den aktuellen Kontostand zu bekommen; Ich sehe keine Möglichkeit zu überprüfen, ob alle betroffenen Transaktionen bereits 12 Mal bestätigt wurden.
Ethereum implementiert genau wie Bitcoin probabilistische BFT. Das bedeutet, dass Sie zu keinem Zeitpunkt 100,0 % sicher sein können, was Sie von der Kette bekommen. Aus diesem Grund sollten Sie, wenn Sie stabile Werte wünschen, diese von currentBlock-12 abfragen. Dies können Sie über eth.getBalance (addr, eth.blockNumber-12) tun.