Как инициировать перевод в следующем блоке после текущей транзакции? - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 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 голосов
/ 05 марта 2019

Давайте начнем с самого начала, когда вы отправите транзакцию в блокчейн, вы сразу получите transactionHash.txHash Вы можете использовать его, чтобы проверить, когда ваш tx был принят (включен в блок) или отклонен,

Есть несколько альтернатив, которые вы можете использовать, как вы видите из официального документа web3

Одним из них может быть:

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 с:)

0 голосов
/ 04 марта 2019

Когда транзакция добывается, вы получаете идентификатор квитанции, это означает, что транзакция выполнена.Таким образом, вы можете выполнить следующую функцию после получения идентификатора квитанции.Incase, если вы хотите выполнить его в следующем блоке, одним из способов может быть то, что в dapp вы создаете среднее время задержки блока 14-15 секунд ( Reference ) и после 14-15 секунд задержки выполняетедругая функция

...