為什麼某些 ERC20 代幣的 Transfer 事件 ABI 簽名與 Transfer(address,address,uint256) 不同?
查看ChainLink ABI(使用此工具)我看到
{ "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" }, { "indexed": false, "name": "data", "type": "bytes" <----- HERE } ], "name": "Transfer", "type": "event" }
第四場“數據”的結果在簽名傳輸(地址,地址,uint256,字節),轉換的0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16 Keccak-256散列,我希望找這是來自0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef不同。
同時Etherscan顯示正確的函式雜湊。我在這裡做錯了什麼?我正在解析 ABI 並為每個事件生成簽名,這適用於前 10 名的其他 ERC20 令牌。
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" => array:4 [ "anonymous" => false "inputs" => array:3 [ 0 => array:3 [ "indexed" => true "name" => "from" "type" => "address" ] 1 => array:3 [ "indexed" => true "name" => "to" "type" => "address" ] 2 => array:3 [ "indexed" => false "name" => "value" "type" => "uint256" ] ] "name" => "Transfer" "type" => "event" ]
ERC-20 是一個標準。它說明了合約應該具有什麼樣的功能和事件,以便符合 ERC-20。它甚至規定了有關如何實現這些功能的一些小細節。
這些標準的問題在於幾乎不可能強制使用它們。理論上,為了使其與 ERC-20 兼容,應該在合約中做很多事情。實際上,很多合約都聲稱與 ERC-20 兼容,即使它們做一些不同的事情。
一種不同的事情可能是事件簽名。標準 ( https://eips.ethereum.org/EIPS/eip-20 ) 規定該
Transfer
事件必須具有您期望的簽名。但這不可能強制執行。您可能會聲稱該令牌不符合 ERC-20,您可能是對的。不幸的是,對於大多數政黨來說,它已經足夠接近以至於他們接受了它。
此外,幾乎不可能確定哪個契約完全符合 ERC-20,哪個不符合。例如,您不能確定合約每次都發出相同的事件 - 可能每 100 次發出不同的事件。除非您手動分析原始碼。
簡單地說:你只需要接受一些“符合 ERC-20”的代幣只是足夠接近的事實。
LINK 代幣實際上不是 ERC-20 代幣,而是ERC-677 代幣。
這個令牌標準有一個函式 transferAndCall:
function transferAndCall(address receiver, uint amount, bytes data) returns (bool success)
這通過 ERC20 的 transfer(address,uint256) 函式將代幣轉移給接收者。然後它記錄一個事件 Transfer(address,address,uint256,bytes)。傳輸成功並記錄事件後,令牌會在接收方上呼叫 onTokenTransfer(address,uint256,bytes),並將發送方、批准的金額和其他字節數據作為參數。