运行web3投票Python脚本报参数错误、无法识别vota函数排查
Python Web3 合约调用双报错排查
报错信息
运行脚本时触发两类报错:
- 第一类:
Error: Function invocation failed due to improper number of arguments(函数调用参数数量不匹配) - 第二类:
Could not identify the intended function with namevota``(无法识别名为vota的目标函数)
根因分析
两个报错由同一问题链触发,之前修改第68行未生效是因为没有定位到核心问题:
- 核心触发点是合约方法匹配失败:代码第68行
txs.append(chirotonia.vote(vote['name'], voted_ballot))调用合约的vote方法时,Web3.py无法在加载的合约ABI中找到签名完全匹配的方法,报错信息中出现的vota是方法名近似匹配时的截断误识别,并非真的存在名为vota的方法。 - 匹配失败的常见原因有两个:
- 初始化
Contract实例时加载的ABI和实际部署在链上的合约版本不匹配,ABI中根本没有定义vote方法,或者vote方法的入参数量、类型定义和你传入的参数不一致 - 传入的参数类型不符合合约要求,比如合约要求
bytes32类型的投票标识,实际传入了string类型的投票名字符串,Web3.py做类型校验时会判定为方法不匹配,同时抛出参数数量错误。
- 初始化
修复步骤
- 核对合约ABI配置
检查chirotonia.ethereum.contract.Contract类默认加载的ABI文件,确认其中存在vote方法,记录该方法要求的入参数量、每个参数的类型定义。 - 校验合约地址正确性
确认配置文件中mainContract字段填写的地址,和你持有ABI的合约部署地址完全一致,本地/测试网的旧版残留合约没有vote方法也会触发该报错。 - 修正第68行的调用传参
严格对照ABI的参数类型要求调整传入值,例如如果合约要求第一个参数为bytes32类型的投票ID而非字符串类型的投票名,需要先做类型转换再传参:# 按合约要求的编码规则将投票名转为bytes32类型 vote_id = Web3.keccak(text=vote['name']) txs.append(chirotonia.vote(vote_id, voted_ballot)) - 验证方法匹配状态
在合约实例化代码之后加一行调试代码,确认vote方法已经被Web3.py正确识别:
调试输出能看到对应# 打印合约中所有带vote关键字的方法,确认存在目标方法 print([fn for fn in chirotonia.contract.functions if 'vote' in fn])vote方法的完整签名后,再运行脚本即可消除报错。
内容的提问来源于stack exchange,提问作者Son.QAP
相关产品推荐
相关产品推荐

