Web3.py
什麼是“ContractTranslator.encode_abi”的好替代品
由於
ethereum
Python 庫已於 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
>>> import eth_abi >>> eth_abi.encode_abi(['address', 'uint256'], (web3.eth.accounts[0], 1000)).hex() 0xa9059cbb0000000000000000000000000d36bdba474b5b442310a5bfb989903020249bba00000000000000000000000000000000000000000000000000000000000003e8
披露:我是 Brownie 的首席開發人員。