如何在当前交易后的下一个区块中启动转帐?

时间:2019-03-03 20:41:49

标签: ethereum solidity smartcontracts web3

我有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个区块)?可以肯定的是,有一些气体从我这边出来。

2 个答案:

答案 0 :(得分:0)

在进行交易时,您会收到收据ID,这表明交易已执行。因此,您可以在获得收据ID后执行下一个功能。 如果要在下一个块中执行它,一种方法是在dapp中创建该块的平均延迟时间为14-15秒(Reference),然后在延迟14-15秒后执行另一个功能

答案 1 :(得分:0)

让我们从一开始就将交易发送到区块链开始,您将立即收到transactionHash。您可以使用txHash来检查您的TX是何时被接受(包含在块中)或被拒绝,

web3 official doc

中可以看到多种选择

其中之一可能是:

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秒来随机等待:)