You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用web3py等工具解码以太坊合约eth_call的返回结果?

如何解码Infura JSON-RPC返回的合约调用结果?

web3py提供了完全匹配你需求的解码工具,能把JSON-RPC返回的result字节串转换成和contract.functions.myFunc().call()一致的格式,核心是利用合约函数的ABI进行解码,以下是两种可行方案:

方法一:利用目标函数对象的decode_output方法

这是最直接的方式,适合你明确知道要解码的目标函数的场景:

  1. 通过合约ABI创建合约对象(仅解码的话不需要合约地址)
  2. 获取目标函数的对象
  3. 调用函数对象的decode_output方法,传入返回的十六进制字节串

示例代码:

from web3 import Web3

# 你的合约ABI,至少包含目标函数myFunc的定义
contract_abi = [
    {
        "inputs": [],
        "name": "myFunc",
        "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "string", "name": "", "type": "string"}],
        "stateMutability": "view",
        "type": "function"
    }
]

# 初始化Web3实例(仅解码无需连接节点,初始化不影响)
w3 = Web3()

# 创建合约对象
contract = w3.eth.contract(abi=contract_abi)
# 获取目标函数对象
target_func = contract.functions.myFunc()

# 假设从Infura拿到的result字段值
rpc_result = "0x000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000"

# 解码返回结果
decoded_result = target_func.decode_output(rpc_result)
print(decoded_result)
# 输出与contract.functions.myFunc().call()一致,例如(42, 'hello')

方法二:使用web3.eth.Abi.decode_function_result工具函数

如果你仅持有目标函数的ABI片段,可直接用这个工具函数解码:

from web3.eth import Abi

# 目标函数的ABI片段
func_abi = {
    "inputs": [],
    "name": "myFunc",
    "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}, {"internalType": "string", "name": "", "type": "string"}],
    "stateMutability": "view",
    "type": "function"
}

# 解码
decoded_result = Abi.decode_function_result(func_abi, rpc_result)
print(decoded_result)
# 输出格式与上述方法完全一致

注意事项

  • 确保rpc_result是带0x前缀的十六进制字符串,若返回结果无前缀,需手动添加0x
  • 若函数返回多个值,解码结果为元组,和call()方法的返回格式完全匹配
  • 两种方法的解码逻辑与contract.functions.myFunc().call()内部逻辑一致,因此结果格式完全相同

内容的提问来源于stack exchange,提问作者testtesteur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:35:18