我有Dapp,用户可以使用web3进行智能合约的付费呼叫。
contract.methods.bet(number).send({
from: accounts[0],
gas: 3000000,
value: web3.utils.toWei(bet.toString(), 'ether')
}, (err, result) => {})
我在Dapp中侦听来自智能合约的事件,所以我知道何时进行交易:
contract.events.blockNumberEvent((error, event) => {
console.log("transaction mined!");
});
但是在交易成功后,我需要在合同内进行转账和一些更改。
是否可以在没有用户交互的情况下延迟调用智能合约(延迟1个区块)?可以肯定的是,有一些气体从我这边出来。
答案 0 :(得分:0)
在进行交易时,您会收到收据ID,这表明交易已执行。因此,您可以在获得收据ID后执行下一个功能。 如果要在下一个块中执行它,一种方法是在dapp中创建该块的平均延迟时间为14-15秒(Reference),然后在延迟14-15秒后执行另一个功能
答案 1 :(得分:0)
让我们从一开始就将交易发送到区块链开始,您将立即收到transactionHash
。您可以使用txHash
来检查您的TX是何时被接受(包含在块中)或被拒绝,
其中之一可能是:
contract.methods.bet(number).send({
from: accounts[0],
gas: 3000000,
value: web3.utils.toWei(bet.toString(), 'ether')
}, (error, transactionHash) => {
if(error) // Handle the error
else {
txReceipt = null;
while(true) {
let txReceipt = web3.eth.getTransactionReceipt(txReceiptId);
if (txReceipt != null && typeof txReceipt !== 'undefined') {
break;
}
}
if (txReceipt.status == "0x1") // Actions to take when tx success
else // Actions to take when tx fails
}
})
另一个更短的选择可能是:
contract.methods.bet(number).send({
from: accounts[0],
gas: 3000000,
value: web3.utils.toWei(bet.toString(), 'ether')
}).on('receipt', (txReceipt) => {
if (txReceipt.status == "0x1") // Actions to take when tx success
else // Actions to take when tx fails
})
因此,您无需使用14-15秒来随机等待:)