Solidity

通過使用 Solidity 中的事件讀取更改狀態的函式的結果

  • March 18, 2021

我想通過監聽它發出的事件來獲得函式的結果。這是我的契約的兩段程式碼

契約一:

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事件的最佳方法是什麼?

當您發送交易時,您會獲得交易收據。

下一步是等待交易被探勘,然後檢查交易,您將在那裡看到日誌。

堆棧中的更高級別會混淆這個問題,但它始終存在。

  1. Remix 為您完成。它還使用重播,因此您可以查看返回值。日誌和返回值只是給出了 - 使用 Web3 編寫自己的程式碼時找不到的兩件事。
  2. 松露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

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