Abi

為什麼某些 ERC20 代幣的 Transfer 事件 ABI 簽名與 Transfer(address,address,uint256) 不同?

  • September 27, 2021

查看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),並將發送方、批准的金額和其他字節數據作為參數。

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