Web3 處理合約事件
處理契約事件似乎存在問題,我不確定它是在 EVM 級別還是只是 web3js。
我有 2 份契約“SomeCoin”和“SomeConcert”。當物品從一個地址轉移到另一個地址時,兩個合約都會發出“轉移”事件。對於“SomeCoin”,轉讓對像是硬幣/代幣,對於“SomeConcert”,轉讓對像是音樂會門票(以“SomeCoins”計價)。
當我呼叫“SomeConcert”方法購票時,邏輯會將一些“SomeCoins”從我的地址轉移到“SomeConcert”地址。除了事件處理之外,一切都很好。我看到 2 個事件發出了“SomeConcert”合約發出的“Buy”事件和“SomeCoin”合約發出的“Transfer”事件。如果我將“SomeCoin”合約中的“Transfer”事件重命名為“TransferCoin”,那麼我只會看到“Buy”事件。
因此,顯然 web3 或底層將內層合約發出的事件與外層合約混淆了。至少這是我得出的結論。
這是一個 web3js 錯誤嗎?我在事件處理中是否遺漏了任何可以防止混淆的東西。我用於事件處理的程式碼相當標準
... return someConcertInstance.buyTickets(3, {from: customer1}); }).then(function(receipt) { assert.equal(receipt.logs.length, 1, "should have received 1 events for buy-ticket)"); assert.equal(receipt.logs[0].args._numberOfTickets, 3, "Number of tix bought must be 3");
測試案例在第一個斷言上失敗,我發現發出了 2 個事件(轉移和購買)。
在上面的評論中整理出來,為未來的讀者提供答案。
問題中的程式碼正在使用
truffle
. 在 truffle 中發送交易時,您返回的結果有一個logs
欄位,該欄位通過以下程式碼組裝:https ://github.com/trufflesuite/truffle-contract/blob/develop/contract.js#L44 。該程式碼會丟棄主題與您呼叫的契約的 ABI 中的已知事件簽名不匹配的日誌。我認為這種行為是一個設計錯誤。