web3.eth调用get_transaction无属性报错及Etherscan API配置问题求助
问题1解决方案
导致该报错的原因有三处:
- 实例引用错误:你初始化Web3连接时将实例赋值给了
w3变量,调用时错误使用了未定义的web3变量,程序无法识别该对象自然找不到对应属性 - 函数名拼写错误:你代码中写的
get_transcation存在拼写错误,正确函数名是get_transaction - 业务方法选择错误:如果你需要获取包含日志(logs)的交易回执,应该使用
get_transaction_receipt方法,get_transaction返回的交易原始对象不包含logs字段
修正后的对应代码行:
receipt = w3.eth.get_transaction_receipt(transaction_hash)
注意transaction_hash是你的交易哈希变量,不能在变量名中加空格。
问题2解决方案
- 你将Etherscan API密钥用双引号包裹赋值给
mykey的写法完全符合Python语法规范,是可行的 - 你当前代码的对应片段存在两个可修正的问题:
- URL拼接时
&和apikey之间多了空格,会导致请求参数识别失败,需要删除空格 - JSON解析方法使用错误:
json.load()仅支持接收文件类对象,解析字符串需要使用json.loads(),也可以直接调用requests响应对象的内置json()方法简化写法
- URL拼接时
完整修正后代码
import json import requests from web3 import Web3 # 请自行替换infura_project、transaction_hash为你的实际参数 infura_project = "你的Infura节点地址" transaction_hash = "你要查询的交易哈希" w3 = Web3(Web3.HTTPProvider(infura_project)) receipt = w3.eth.get_transaction_receipt(transaction_hash) log = receipt["logs"][2] smart_contract = log["address"] mykey = "你的Etherscan API Key" api_endpoint = f"https://api.etherscan.io/api?module=contract&action=getabi&address={smart_contract}&apikey={mykey}" # 简化写法直接解析响应 rsp = requests.get(api_endpoint, timeout=10) abi = json.loads(rsp.text) # 后续解码逻辑
内容的提问来源于stack exchange,提问作者joe Qi
相关产品推荐
相关产品推荐

