Solidity

使用 nodejs 顯示事件

  • May 21, 2019

在我的智能合約中,我有一個函式可以在程式碼末​​尾觸發一個事件。

   function sendTran(arguments) public {
   *code*  
   emit Event(argument 1,argument 3,argument 3,argument 4);       
}

在 nodejs 我有一個這樣的 API

router.post('/send', function (req, res) {
 contractInstance.methods.sendTran(arguments).send({
   *stuff*  
}).on('transactionHash', function(hash){
 console.log(hash);
}).on('error', console.error);
});

如何修改 API 以便在 res.send 中看到函式 sendTran 發出的事件?

非常感謝你!

日誌包含在交易收據中,但您只能在交易收據被探勘後檢索它。根據許多因素(網路擁塞、gas 價格),交易可能需要幾秒鐘或幾個小時才能被探勘出來。

這就是為什麼我不建議使用同步 HTTP 呼叫來做到這一點。一個好的 API 應該有一個超時時間,在你的情況下,你不能絕對確定你的交易會按時被探勘。

但是,如果你仍然想這樣做,你可以每秒拉一次交易收據,直到你得到它:

waitForReceipt(hash, 1000).then(function (transactionReceipt) {
   console.log(transactionReceipt)
});


function waitForReceipt(hash, millisecondsInterval) {
   var retryCount = 0;
   var retryCountLimit = 100;

   var promise = new Promise((resolve, reject) => {
       var timer = setInterval(function () {

           web3.eth.getTransactionReceipt(hash, function(err, rec) {
               if(err) {
                   console.log(err)
                   clearInterval(interval);
                   reject(err)
               }

               if(rec != null) {
                   clearInterval(timer);
                   resolve(rec);
                   return;
               }

               retryCount++;
               if (retryCount >= retryCountLimit) {
                   clearInterval(timer);
                   reject("retry count exceeded");
               }
           });

       }, millisecondsInterval);
   });

   return promise;
}

我建議寧願使用 WebSocket 來處理客戶端和伺服器之間區塊鏈的非同步特性。

引用自:https://ethereum.stackexchange.com/questions/48753