使用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, } )
额外小建议
- 关于Gas设置:如果你使用的是web3.py v5及以上版本,可以不用手动指定
gasPrice,改用w3.eth.gas_price自动获取当前网络的gas价格,或者干脆去掉这个字段,web3会自动帮你估算。 - 检查Private Key:确保你的
.env文件里的PK是正确的,带不带0x前缀都可以,web3.py会自动处理。
内容的提问来源于stack exchange,提问作者madscientist
相关产品推荐
相关产品推荐

