Events
在事件的 abi 編碼數據中找不到地址
我有一個帶有簽名 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
在您的情況下)的編碼方式有關;您可以在文件中找到完整的解釋。