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

使用web3.py部署智能合约时调用sign_transaction方法触发TypeError错误的求助

解决web3.py签名交易时的TypeError: Transaction had invalid fields: {'chainId': '1337'}问题

从你给出的错误信息一眼就能定位问题:你传入的chainId是字符串类型"1337",但web3.py在处理交易签名时要求这个参数必须是整数类型。

问题根源

Ganache默认的链ID确实是1337,但当你把它以字符串形式传入buildTransaction的参数中时,web3内部的交易字段校验逻辑会判定这是一个无效字段,直接抛出TypeError。

修复步骤

只需要把chain_id的定义从字符串改成整数即可,有两种方式:

方式1:手动修改为整数

把代码里的这一行:

chain_id = "1337"

改成:

chain_id = 1337

方式2:自动获取链ID(更推荐)

为了避免手动输入链ID出错,你可以让web3自动从连接的节点获取链ID:

chain_id = w3.eth.chain_id

修改后的完整核心代码片段

这里把关键修改的地方标出来了:

# for connecting to Ganache
w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
# 这里改成整数或者自动获取
chain_id = 1337  # 或者 chain_id = w3.eth.chain_id
my_address = "0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1"
private_key = os.getenv("PK")

# ... 其他代码不变 ...

transaction = Simplestorage.constructor().buildTransaction(
    {
        "chainId": chain_id,  # 现在是整数类型了
        "from": my_address,
        "nonce": nonce,
        "gasPrice": 20000000000,
        "gas": 6721975,
    }
)

额外小建议

  1. 关于Gas设置:如果你使用的是web3.py v5及以上版本,可以不用手动指定gasPrice,改用w3.eth.gas_price自动获取当前网络的gas价格,或者干脆去掉这个字段,web3会自动帮你估算。
  2. 检查Private Key:确保你的.env文件里的PK是正确的,带不带0x前缀都可以,web3.py会自动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:12:29