Solidity

如何使用 Python 在乙太坊合約中獲取方法名稱的十六進制等效項?

  • August 4, 2021

要呼叫的函式被呼叫xyz()

我的程式碼:

web3.sha3("xyz()").substr(0,10)

錯誤:

AttributeError:模組“web3”沒有屬性“sha3”

在較新版本的 web3 中,會出現上述錯誤。還有什麼可以用來獲得函式名的十六進制等價物?

程式碼來源: 如何知道數據中使用的十六進制程式碼來呼叫特定的合約函式?(該解決方案不適用於較新版本的 web3)

該方法的十六進制等效項稱為函式選擇器

函式選擇器是函式簽名的 Keccak 散列的前 4 個字節,參數打包為字元串類型。

您可以通過以下方式獲得:

>>> from web3 import Web3
>>> Web3.keccak(text="xyz()")
HexBytes('0x356bc81e51224d094b17ccb8f80b1e659fe334bcf15c6240857cce0568cbb0ba')
>>> hex_bytes = Web3.keccak(text="xyz()")
>>> print(hex_bytes[0:4].hex())
0x356bc81e

你正在尋找這個:

編碼函式簽名

web3.eth.abi.encodeFunctionSignature(functionName);

將函式名稱編碼為其 ABI 簽名,這是函式名稱的 sha3 雜湊的前 4 個字節,包括類型。

https://web3js.readthedocs.io/en/v1.2.11/web3-eth-abi.html

在 python 中應該存在一個等效的呼叫

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