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

web3.py如何对合约创建交易的input数据进行解码?

web3.py合约创建交易input解码及报错解决方案

首先排查你当前代码的核心错误

你代码中event变量存储的是事件日志哈希,而web3.eth.get_transaction()仅支持传入交易哈希作为参数,两者不属于同一类哈希值,因此第一步获取交易对象就会失败,自然无法完成后续解码。
修复方法:

  • 如果你是通过日志查询接口拿到的事件对象,从事件对象的transactionHash字段提取对应交易哈希,再获取交易数据:
# 示例:从事件日志中提取交易哈希
event_log = web3.eth.get_log({"hash": "0x1113a21473aa89fcce64835d267dd480c9f0339411c676b1f22f11ae8e876b63"})[0]
txn_hash = event_log["transactionHash"]
txn = web3.eth.get_transaction(txn_hash)

合约创建交易input解码方法

你之前使用的decode_function_input仅适用于普通合约调用交易,这类交易的input以函数选择器开头;而合约创建交易的to字段为None,input结构为「合约部署字节码 + 构造函数参数编码」,没有函数选择器,因此需要用专门的构造函数解码方法:

  1. 首先确认你持有被部署合约的完整ABI,解码必须使用该ABI,不可复用其他合约(比如你代码中的routerContract)的ABI
  2. 使用合约类的decode_constructor_input方法解码,示例代码如下:
# 先判断交易类型
if txn["to"] is None:
    # 用被部署合约的ABI初始化合约对象
    target_contract = web3.eth.contract(abi=被部署合约的ABI变量)
    # 解码构造参数,返回值为构造函数字段名和参数值的映射
    constructor_input = target_contract.decode_constructor_input(txn.input)
    print(constructor_input)
else:
    # 普通调用交易沿用原有方法即可
    txnInput = routerContract.decode_function_input(txn.input)

注意:如果没有被部署合约的ABI,无法直接解码构造函数的结构化参数,只能拿到原始的十六进制字节码内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:06:03