Contract-Invocation

如何派生方法簽名給出methodId和契約原始碼?

  • June 11, 2022

在智能合約上呼叫方法時,輸入數據的前 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,還有其他服務。

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