Events

是否有可能監聽 MakerDAO 的 LogNote 事件?

  • July 24, 2020

我想知道是否有可能監聽 MakerDAO 的 LogNote 事件,就像我們能夠處理標準事件一樣。

我設法研究的內容:

我看到LogNote 被列為契約詳細資訊中的事件

let contractIntanse = await new web3.eth.Contract(abi, contractAddress);
console.log("contractIntanse.events: ", contractIntanse.events)

contractIntanse.events:  {
 Approval: [Function: bound ],
 '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925': [Function: bound ],
 'Approval(address,address,uint256)': [Function: bound ],

 LogNote: [Function: bound ],
 '0xd3d8bec38a91a5f4411247483bc030a174e77cda9c0351924c759f41453aa5e8': [Function: bound ],
 'LogNote(bytes4,address,bytes32,bytes32,bytes)': [Function: bound ],

 Transfer: [Function: bound ],
 '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef': [Function: bound ],
 'Transfer(address,address,uint256)': [Function: bound ],

 allEvents: [Function: bound ]
}

但是,我無法正確檢查,例如:

1. event.watch對我不起作用,因為 web3 v1

2.我嘗試使用WebsocketProvider

web3.eth.subscribe("logs", { address: "0x23..." },
   function(error, result) {
       console.log("subscribe result:",result);
       console.log("subscribe error:",error);
   })
   .on("connected", function(subscriptionId) {
       console.log("subscriptionId:" + subscriptionId);
   })
   .on("data", function(log) {
       console.log("data:" + log);
   })
   .on("changed", function(log) {
       console.log("changed:" + log);
   });

但是,當我觸發事件時,我看不到 smth

await contractIntanse.methods.rely(address1);

這是我設法找到的相關問題 https://github.com/ethereum/web3.js/issues/1752

3.我也嘗試使用getPastEvents,正如最新issues/1752建議的那樣

const eventOptions = { filter: {}, fromBlock: 0, toBlock: 'latest' };
const events = await contractIntanse.getPastEvents('LogNote', eventOptions);

它適用於標準事件。但是,對於LogNote ,我得到一個錯誤

Error: overflow (operation="setValue", fault="overflow", details="Number can only safely store up to 53 bits")

最後,我很困惑,我們能不能聽 MakerDAO 的 LogNote?感謝任何幫助,連結到文件,討論等。謝謝!

額外的:

我正在使用 DAI 合約 https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f#contracts

這是用於在主網上部署的送出。我用作基礎。 https://github.com/makerdao/dss/blob/6fa55812a5fcfcfa325ad4d9a4d0ca4033c38cab/src/dai.sol

LogNote 取自 LibNote。這是我想听的。 https://github.com/makerdao/dss/blob/6fa55812a5fcfcfa325ad4d9a4d0ca4033c38cab/src/lib.sol

因為LogNote是匿名事件,所以它更便宜,但另一方面,您無法使用主題對其進行過濾。有關更多詳細資訊,請參閱此已回答的問題

無論如何,您可以監聽所有合約事件,然後在 Javascript 中進行過濾。DAI實際上只有 3 種類型的事件:TransferApproval- 帶有 3 個參數 - 和LogNote- 帶有 4 個參數。LogNote僅由relyanddeny函式觸發,因此您可以使用下面的程式碼來監聽這些事件:

const Web3 = require("web3");
const web3 = new Web3("ws://localhost:8546");

web3.eth.subscribe("logs", {
           address: "0x731830527c286469E89b5e43030C1fA3D9d78f03"
       },
       function (error, result) {
           if (error) {
               console.error("subscribe error:", error);
               return;
           }
           if (result.topics.length == 4) {
               // This is a `rely` or `deny` event
               let signature = result.topics[0];
               let sender = result.topics[1];
               let arg1 = result.topics[2];
               let arg2 = result.topics[3]; //this is always 0x0
           }
       })
   .on("connected", function (subscriptionId) {
       console.log("subscriptionId:" + subscriptionId);
   });

請注意,您無法區分relydeny僅查看日誌,但您必須檢查原始事務有效負載。

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