Contract-Invocation
如何派生方法簽名給出methodId和契約原始碼?
在智能合約上呼叫方法時,輸入數據的前 4 個字節包含 methodId。
例如,methodId (4 個字節 => 8 個十六進製字元)是ERC-20 合約
0xa9059cbb
的著名簽名的雜湊值。transfer(address to, uint256 value)
與這些短散列的情況一樣,多個方法簽名可以映射到同一個散列。事實上,上面的雜湊
0xa9059cbb
有 4 個已知的(可能還有更多未註冊的)方法簽名,可以在這裡看到問題:如果我同時擁有 methodId(例如:)
0xa9059cbb
和合約原始碼(例如,由 etherscan 下載),我將如何得出明確的方法簽名?這似乎是可能的,因為這正是 etherscan 正在做的事情。例如看看這個交易。列出 methodId 和相應的(非常漂亮的)方法簽名:
Function: shitClaim(uint256[] tokenIds) MethodID: 0x767cf6ee
Etherscan 如何進行翻譯
0x767cf6ee
->shitClaim(uint256[] tokenIds)
?
在某些時候,必須有人驗證了具有
shitClaim(uint256[])
功能的合約。使用
ethers.utils.*
功能:hexDataSlice(keccak256(toUtf8Bytes('shitClaim(uint256[])')), 0, 4) => 0x767cf6ee
因此,現在每次對函式進行交易時
0x767cf6ee
,即使該合約的原始碼尚未經過驗證,Etherscan 也會假定它是shitClaim(uint256[])
.如果你真的用恰好也產生的不同
0x767cf6ee
函式驗證合約,我不知道 Etherscan 是否會“糾正其方式”並開始顯示正確的函式,或者堅持使用shitClaim(uint256[])
. 我想你必須嘗試一下才能知道。也與這個主題相關:4byte.directory,還有其他服務。