Ожидание подтверждения транзакции

Прочитав документацию по транзакциям web3.js , каков оптимальный подход к ожиданию подтверждения транзакции?

Метод sendTransaction() возвращает

String - The 32 Bytes transaction hash as HEX string.

Но когда это происходит, подтверждается ли транзакция в блокчейне? Если нет, то оптимален ли подход с использованием цикла, ожидания и хеш-транзакции?

Кстати, я мог бы поклясться, что это дубликат, но я не смог найти дубликат...

Ответы (7)

Пример здесь с использованием фильтров: Как я узнаю, что у меня закончился газ программно?

а также здесь по занятому опросу: https://github.com/barkthins/ether-pudding/blob/master/index.js#L375

Я использую опрос занятости, потому что я обнаружил, что фильтры ненадежны (сбой примерно 1: 1000 раз)

РЕДАКТИРОВАТЬ: Кроме того, спорно, сколько блоков ждать подтверждения, вот вопрос: какое количество подтверждений считается безопасным в Ethereum?

Мы можем подписаться на события из sendметода. Например, нам нужно дождаться 5 подтверждений, прежде чем рассматривать транзакцию, мы можем сделать следующее:

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)
    })
})

С помощью методов web3 1.0 теперь вы можете прослушивать квитанцию ​​при отправке транзакции.

Таким образом, вы можете запустить метод отправки в контракте, а затем прослушать квитанцию, связав .onее до конца следующим образом:

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

документы web3 1.0 => https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html?highlight=send#id12

Мы проверим цикл на отправляющем узле, посмотрим, равен ли txpool.status.pending нулю.

Если транзакций в статусе pending нет, мы можем убедиться, что все транзакции с этого узла уже включены в блокчейн.

Если вам нужно подумать о двойных расходах, что не в моих интересах, вам, возможно, придется проверить больше.

Сделал модуль npm под названием await-transaction-mined для этой конкретной проблемы.

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

Он опрашивает блокчейн каждые 500 мс, чтобы проверить, была ли транзакция добыта. После майнинга он возвращает квитанцию ​​о транзакции.

Синхронизированные транзакции — одна из основных особенностей трюфельного фреймворка, в частности, абстракция «трюфельный контракт», обертывающая web3.eth.Contract.

Пример:

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.
});

См. https://github.com/trufflesuite/truffle-contract#full-example для примера и других документов.

В ethers.js вы можете просто сделать следующее:

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

С контрактом, импортированным как:

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