Solidity
使用 nodejs 顯示事件
在我的智能合約中,我有一個函式可以在程式碼末尾觸發一個事件。
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 來處理客戶端和伺服器之間區塊鏈的非同步特性。