Events

查找主題000, 話題111, 話題222

  • February 18, 2019

正如什麼是主題中所建議的那樣$$ 0 $$在事件日誌中?我正在嘗試找出“事件雜湊”,但它與以下事務的輸出不匹配。

輸入數據

Function: transfer(address _to, uint256 _value) ***

MethodID: 0xa9059cbb
[0]:0000000000000000000000000d2b2fb39b10cd50cab7aa8e834879069ab1a8d4
[1]:0000000000000000000000000000000000000000000000000000010e6a06cb00

事件日誌

Topics
[0] 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
[1] 0x0000000000000000000000004dc8f417d4eb731d179a0f08b1feaf25216cefd0
[2] 0x0000000000000000000000000d2b2fb39b10cd50cab7aa8e834879069ab1a8d4

但是,當我嘗試查找keccak雜湊時,它顯示了不同的雜湊。

 from Crypto.Hash import keccak
 keccak_hash = keccak.new(digest_bits=256)
 keccak_hash.update("transfer(address,uint256)")
 print keccak_hash.hexdigest()

>>a9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

正是事件簽名的 sha3 散列Transfer(address,address,uint256)- ERC20 令牌事件簽名。嘗試使用web3 的 sha3 雜湊實用程序來驗證這一點。此外,topics[1]topics[2]是事件的索引參數,在這種情況下,它們是您的from address價值和to address價值。

每個合約都可以定義不同事件的列表。但是,如果合約是基於 ERC20 標準編寫的,它將包含 ERC20 的標準事件,這些事件為所有合約提供相同的簽名,並且肯定會給出相同的事件簽名雜湊值。

回到這個輸入:

MethodID: 0xa9059cbb
[0]:0000000000000000000000000d2b2fb39b10cd50cab7aa8e834879069ab1a8d4
[1]:0000000000000000000000000000000000000000000000000000010e6a06cb00

0000000000000000000000000000000000000000000000000000010e6a06cb00在此轉賬中logs data稱為代幣金額。並且0000000000000000000000000d2b2fb39b10cd50cab7aa8e834879069ab1a8d4顯然是to address在這筆交易中。

topics[0]是事件簽名的雜湊,在您的情況下是Transfer(address,address,uint256)針對 ERC20Transfer事件。如果您採用keccak 雜湊值,您可以確認。

您已經獲取了transfer()函式簽名的雜湊值。它的前四個字節a9059cbb正確地為您提供了函式的 MethodID transfer(),但這是不同的,與TransferEventID 沒有任何關係,即topics[0].

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