Kontostand automatisch mit web3.js ohne Abfrage aktualisieren

Ich habe mit web3.js eine Benutzeroberfläche in JavaScript erstellt, in der der Benutzer ein zu verwendendes Konto auswählen kann. Die Konten werden der Einfachheit halber zusammen mit ihrem aktuellen Saldo angezeigt.

Ich lade die Kontoadressen so:

web3.eth.accounts

und ich lade die Salden mit dieser Funktion:

web3.eth.getBalance(account, callback)

Natürlich kann sich der Kontostand des Benutzers während der Verwendung meiner DApp ändern. Immer wenn die Verwendung meiner DApp das Guthaben ändert, aktualisiere ich es, indem ich getBalance(...) aufrufe. Dies ist jedoch keine vollständige Lösung, da sich das Gleichgewicht ändern kann, wenn der Benutzer etwas außerhalb meiner DApp tut.

Im Moment frage ich die getBalance-Funktion alle x Sekunden ab, um den Kontostand einigermaßen aktuell zu halten. Polling ist nicht die sauberste Lösung, da es ständig etwas Strom und einige CPU-Zyklen benötigt. Wenn ich etwas Strom spare, indem ich nur einmal pro Minute abfrage, ist es sehr langsam. Gibt es eine Möglichkeit, Polling zu vermeiden und nur einen Rückruf zu erhalten, wenn sich der Kontostand ändert?

Antworten (2)

Sie können einen Blockfilter installieren und Salden nur aktualisieren, wenn ein neuer Block eintrifft.

const Web3 = require('web3');

const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

const address = "0x9b....";

let balance = web3.eth.getBalance(address);

const filter = web3.eth.filter('latest');
filter.watch((err, res) => {
  if (err) {
    console.log(`Watch error: ${err}`);
  } else {
    // Update balance
    web3.eth.getBalance(address, (err, bal) => {
      if (err) {
        console.log(`getBalance error: ${err}`);
      } else {
        balance = bal;
        console.log(`Balance [${address}]: ${web3.fromWei(balance, "ether")}`);
      }
    });
  }
});

Leider ist ein Push-Ansatz in web3 gerade erst im Entstehen, soweit ich von einem beteiligten Entwickler gehört habe. Web3 stellt in diesem Fall eine Verbindung zu einem Ethereum-Knoten dar. Sie können es um Informationen bitten, aber es hat derzeit keine Möglichkeit, Ihnen etwas proaktiv zu "sagen". Sie müssen die Umfrage vorerst fortsetzen.

Ist diese Antwort noch wahr?
Teilweise. Web3js 1.0.0 unterstützt Websockets, ABER Sie können es nicht in der Produktion verwenden, da es nicht mit Metamask kompatibel ist, was die Hauptmethode ist, mit der Benutzer mit einer dApp interagieren.