Web3.py

什麼是“ContractTranslator.encode_abi”的好替代品

  • April 6, 2022

由於ethereumPython 庫已於 2019 年 5 月棄用,因此該ContractTranslator.encode_abi函式可能不是將 Python 參數列表轉換為calldata字元串的最佳方法。特別是,它不支持名稱相同但參數列表不同的函式。

有什麼更好的方法來做到這一點?我一直在研究,web3.py _utils但他們沒有一個可重用的功能。在 Python 中使用的任何替代方法?

我正在尋找一個與此具有等效簽名的函式:

def encode_abi(abi, function_name: str, args: List[Any]) -> bytes:

Web3 提供了一個Contract.encodeABI類方法:https ://web3py.readthedocs.io/en/stable/contracts.html#web3.contract.Contract.encodeABI 。

與布朗尼

Brownie允許您使用以下ContractTx.encode_input方法生成 calldata:

>>> token
<Token Contract object '0x79447c97b6543F6eFBC91613C655977806CB18b0'>

>>> token.transfer.encode_input(accounts[0], 1000)
0xa9059cbb0000000000000000000000000d36bdba474b5b442310a5bfb989903020249bba00000000000000000000000000000000000000000000000000000000000003e8

它使用類處理函式重載OverloadedMethod

>>> erc223.transfer
<OverloadedMethod object 'ERC223Token.transfer'>

>>> erc223.transfer['address,uint']
<ContractTx object 'transfer(address,uint256)'>

>>> erc223.transfer['address', 'uint256', 'uint256']
<ContractTx object 'transfer(address,uint256,uint256)'>

eth-abi

如果您不喜歡使用框架,請eth-abi提供幾種編碼方法

>>> import eth_abi

>>> eth_abi.encode_abi(['address', 'uint256'], (web3.eth.accounts[0], 1000)).hex()
0xa9059cbb0000000000000000000000000d36bdba474b5b442310a5bfb989903020249bba00000000000000000000000000000000000000000000000000000000000003e8

披露:我是 Brownie 的首席開發人員。

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