Warten auf die Bestätigung einer Transaktion

Was ist ein optimaler Ansatz, um auf die Bestätigung einer Transaktion zu warten, wenn Sie die Transaktionsdokumentation von web3.js lesen ?

Die Methode sendTransaction() gibt a zurück

String - The 32 Bytes transaction hash as HEX string.

Aber wenn dies der Fall ist, wird die Transaktion in der Blockchain bestätigt? Wenn nicht, ist ein Ansatz mit einer Schleife, einer Wartezeit und einer Hash-Transaktion optimal?

Übrigens könnte ich schwören, dass dies ein Duplikat ist, aber ich konnte kein Duplikat finden ...

Antworten (7)

Beispiel hier mit Filtern: Woher weiß ich, wann mir das Benzin ausgegangen ist?

und auch hier per fleißigem Polling: https://github.com/barkthins/ether-pudding/blob/master/index.js#L375

Ich verwende Busy Polling, weil ich festgestellt habe, dass die Filter unzuverlässig sind (etwa 1:1000-mal fehlschlägt)

EDIT: Auch, wie VIELE Blöcke auf die Bestätigung warten müssen, ist umstritten, hier ist das Q dafür: Welche Anzahl von Bestätigungen gilt in Ethereum als sicher?

Wir können Ereignisse aus der sendMethode abonnieren . Zum Beispiel müssen wir auf 5 Bestätigungen warten, bevor wir eine abgebaute Transaktion in Betracht ziehen. Wir können Folgendes tun:

return new Promise((resolve, reject) => {
  contract.methods.doWork(1, 2, 3).send({from: account}) 
    .on('confirmation', (confirmationNumber) => {
      if (confirmationNumber === 5) {
        resolve()
      }
    })
    .on('error', (error) => {
      reject(error)
    })
})

Mit web3 1.0-Methoden können Sie jetzt beim Senden einer Transaktion auf die Quittung lauschen.

Sie könnten also eine Sendemethode für einen Vertrag auslösen und dann auf die Quittung warten, indem Sie sie .onwie folgt an das Ende verketten:

_contract.methods.someSendMethod( parameters, go, here ).send().on('receipt', receipt => console.log('receipt', receipt))

web3 1.0 docs => https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html?highlight=send#id12

Wir werden eine Schleifenprüfung auf dem sendenden Knoten durchführen, um zu sehen, ob txpool.status.pending Null ist.

Wenn es keine Transaktionen im ausstehenden Status gibt, können wir sicherstellen, dass alle Transaktionen von diesem Knoten bereits in die Blockchain aufgenommen wurden.

Wenn Sie doppelte Ausgaben in Betracht ziehen müssen, was außerhalb meines Interesses liegt, müssen Sie möglicherweise mehr überprüfen.

Für dieses spezielle Problem wurde ein npm-Modul namens await-transaction-mined erstellt.

const awaitTransactionMined = require ('await-transaction-mined');
(async function() {
   var txHash = '0x6ee5d58c314d183f3ca70e2292b39dca5ae46141fe4e6b1da5b106dd506e589a';
   const minedTxReceipt = await awaitTransactionMined.await(web3, txHash);
})();

Es fragt die Blockchain alle 500 ms ab, um zu prüfen, ob die Transaktion geschürft wurde. Nach dem Mining gibt es den Transaktionsbeleg zurück.

Synchronisierte Transaktionen sind eines der Hauptmerkmale des Truffle-Frameworks, insbesondere der „Truffle-Contract“-Abstraktion, die web3.eth.Contract.

Beispiel:

MyContract.deployed().then(function(instance) {
  var deployed = instance;
  return instance.someFunction(5);
}).then(function(result) {
  // Do something with the result or continue with more transactions.
});

Ein Beispiel und weitere Dokumente finden Sie unter https://github.com/trufflesuite/truffle-contract#full-example .

In ethers.js können Sie einfach Folgendes tun:

var transactionReceipt = await contractInstance.functionCall(parameters)
await transactionReceipt.wait(1)

Mit dem importierten Vertrag wie:

const signer = accounts[0]
const ContractName = await ethers.getContractFactory("ContractName")
const contractInstance = new ethers.Contract(addressOfContract, ContractName.interface, signer)