Events

在事件的 abi 編碼數據中找不到地址

  • March 31, 2020

我有一個帶有簽名 Event(address, uint256, string) 的事件,我的智能合約會不時發出它。我正在 ganache 測試網上測試所說的合約,當 Ganache 接收到這些事件時,它會完美地解碼它們。然而,當我嘗試使用 rpc-json 響應解碼所述事件的 abi 編碼時,即使其他所有內容(tx-hash 等)都排成一行,編碼似乎也有問題:

我測試地址為 0xa96403a52c4b63fefda2f24734a7c1f69a36b24a,uint256 為 1,字元串為 hello,得到以下結果:

0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000

這是 1 的 uint256:

0x0000000000000000000000000000000000000000000000000000000000000001

我不知道這是什麼:

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000 

這是字元串的長度,後跟“hello”的 utf8 編碼,正確地加上 27 個字節的填充,使其總共 32 個字節:

568656c6c6f000000000000000000000000000000000000000000000000000000

誰能幫我解碼這裡的地址並糾正我,以防我在解碼其他東西時做錯了什麼?非常感謝您!

從您發布的詳細資訊來看,我相信address您事件中的參數是indexed. 因此,它不會在data字元串中提供,而是在topics第二個條目(即topics[1])的數組中提供。

如果你想要實際地址,那麼你可以這樣做:

const address = "0x" + topics[1].slice(26); // get rid of 24 leading zeros

由於地址是從事件中獲取的,所以它都是小寫的。

因此,如果您打算將其與其他地址進行比較,那麼您最好使用:

const address = Web3.utils.toChecksumAddress("0x" + topics[1].slice(26));

至於您對(0x00...40)感到困惑的數據部分,它與動態類型(string在您的情況下)的編碼方式有關;您可以在文件中找到完整的解釋。

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