Прочитав документацию по транзакциям web3.js , каков оптимальный подход к ожиданию подтверждения транзакции?
Метод sendTransaction() возвращает
String - The 32 Bytes transaction hash as HEX string.
Но когда это происходит, подтверждается ли транзакция в блокчейне? Если нет, то оптимален ли подход с использованием цикла, ожидания и хеш-транзакции?
Пример здесь с использованием фильтров: Как я узнаю, что у меня закончился газ программно?
а также здесь по занятому опросу: 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)
Пол С