Solidity
通過使用 Solidity 中的事件讀取更改狀態的函式的結果
我想通過監聽它發出的事件來獲得函式的結果。這是我的契約的兩段程式碼
契約一:
function createTradeableContract() public stopInEmergency returns(address subcontractAddr) { TradeableContract tc = new TradeableContract(msg.sender); contracts.push(tc); return tc; }
契約 2:
function TradeableContract (address ownerAddr) public { owner = ownerAddr; NewOwnerEvent(0x0,owner); }
我正在使用 web3.0 1.0 測試版。我寫了這段程式碼。我不明白為什麼我在日誌中看不到該事件。
self.contractCreator.methods.createTradeableContract().send({from: selectedAccount}) .once('receipt', function(receipt){ console.log("receipt"); console.log(receipt); console.log("eventos..."); console.log(receipt.logs); //it is undefined }) .on('error', function(error){ console.log("erro"); console.log(error); }) .then( receipt => { console.log(receipt); console.log("events..."); console.log(receipt.logs); //it is undefined }) .catch (error => console.warn(error));
如果我使用 Remix,我可以在控制台中看到事件(如下)。
[ { "from": "0x8722aff990eda4d2d11915705076af5823f5f14c", "topic": "0x09f86d61eb5d6904c1fa8e5f071f171ec90eccc6e0a7b61d563a7d693db815f6", "event": "NewOwnerEvent", "args": { "0": "0x0000000000000000000000000000000000000000", "1": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", "old": "0x0000000000000000000000000000000000000000", "current": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c", "length": 2 } } ]
由於我無法獲取更改狀態的函式的返回值,因此我使用了事件。但是……在呼叫函式後獲取emmited事件的最佳方法是什麼?
當您發送交易時,您會獲得交易收據。
下一步是等待交易被探勘,然後檢查交易,您將在那裡看到日誌。
堆棧中的更高級別會混淆這個問題,但它始終存在。
- Remix 為您完成。它還使用重播,因此您可以查看返回值。日誌和返回值只是給出了 - 使用 Web3 編寫自己的程式碼時找不到的兩件事。
- 松露
test
為你做到了。當 you 時return myContract.someFunction()
,它返回探勘交易的承諾。然後,您可以繼續使用then...
,這會使擋風玻璃稍微起霧,因為這些便利功能正在做我們在其他情況下必須為自己做的事情。看看這個返回探勘交易承諾的庫。這樣,可以創建簡潔的程式碼,1)發送交易並等待收據,然後 2)等待交易被探勘並返回交易。https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
你的日誌會在那裡。
該庫早於 Web3 Beta 1.0。也許一個善良的靈魂會插話並描述如何重構。要點是您不應該期望收據中的交易日誌。這並沒有矛盾,但是 Remix 和 truffle test 可以使它看起來如此。
希望能幫助到你。
您可以參考本文件了解如何觀看智能合約事件
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events