使用Web3 ABI获取以太坊主网合约所有权报execution reverted错误如何解决
问题原因
execution reverted属于合约侧执行回滚错误,和RPC节点兼容性无关,你的猜测方向错误,核心诱因是你使用的ABI和目标合约不匹配,或调用参数不符合合约要求。
排查&解决步骤
- 第一步:替换为正确的调用逻辑
你当前手写的ABI存在匹配问题,可直接通过函数签名调用,不需要依赖手写ABI,示例可运行代码如下:
from web3 import Web3 eth_rpc = "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161" web3 = Web3(Web3.HTTPProvider(eth_rpc)) contract_address = Web3.toChecksumAddress("0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE") # 构造owner()方法的调用数据,取函数签名哈希的前4字节 owner_method_sig = web3.keccak(text="owner()")[:4] # 发起链上调用 response = web3.eth.call({ "to": contract_address, "data": owner_method_sig }) # 解析返回的地址结果 owner_address = web3.toChecksumAddress(response.hex()[-40:]) print(owner_address)
- 第二步:校验节点连通性
如果上述代码依然报错,先运行以下代码验证RPC节点可正常访问:
# 验证节点连接状态 print(web3.isConnected()) # 验证可正常拉取链上数据 print(web3.eth.block_number)
如果返回False或无法获取区块号,说明你的网络无法正常连通Infura节点,替换为可用的以太坊主网RPC节点即可。
- 第三步:适配web3版本
如果你使用的web3.py版本>=6.0.0,toChecksumAddress方法已经迁移到web3.utils.address模块下,需要调整对应导入路径,旧版本的写法会触发调用错误。
内容的提问来源于stack exchange,提问作者giacomomaraglino
相关产品推荐
相关产品推荐

