请求协助获取以太坊Gas耗尽失败交易的交易哈希
如何获取以太坊上因Gas耗尽失败的交易哈希
目前没有直接的Etherscan或Infura API端点可以专门筛选因Gas耗尽失败的交易,但可以通过以下方法实现需求:
一、利用Etherscan API结合交易特征筛选
Etherscan的API可以获取失败交易,再通过**gasUsed等于gasLimit**这一核心特征(Gas耗尽的交易会用完所有设置的Gas)来区分:
- 先调用
eth_getBlockByNumber接口获取目标区块内的所有交易; - 对每个交易调用
eth_getTransactionReceipt获取收据; - 筛选出
status为0x0(交易失败)且gasUsed等于交易原始gas(即gasLimit)的交易哈希。
示例Python代码:
import requests ETHERSCAN_API_KEY = "你的API密钥" TARGET_BLOCK = 18000000 # 替换为目标区块号 # 获取区块内所有交易 block_req = requests.get( f"https://api.etherscan.io/api?module=proxy&action=eth_getBlockByNumber&tag={hex(TARGET_BLOCK)}&boolean=true&apikey={ETHERSCAN_API_KEY}" ) txs = block_req.json()["result"]["transactions"] out_of_gas_hashes = [] for tx in txs: tx_hash = tx["hash"] # 获取交易收据 receipt_req = requests.get( f"https://api.etherscan.io/api?module=proxy&action=eth_getTransactionReceipt&txhash={tx_hash}&apikey={ETHERSCAN_API_KEY}" ) receipt = receipt_req.json()["result"] # 判断是否为Gas耗尽失败 if receipt["status"] == "0x0" and receipt["gasUsed"] == tx["gas"]: out_of_gas_hashes.append(tx_hash) print("Gas耗尽的交易哈希:", out_of_gas_hashes)
注意:Etherscan API有调用速率限制,批量查询时需控制频率,或使用批量请求优化。
二、直接通过以太坊节点(Infura/Alchemy)查询
使用Web3库直接连接节点,逻辑和上述一致,但无需依赖Etherscan API:
示例web3.py代码:
from web3 import Web3 # 连接节点(替换为你的Infura/Alchemy节点地址) w3 = Web3(Web3.HTTPProvider("https://mainnet.infura.io/v3/你的项目ID")) TARGET_BLOCK = 18000000 # 获取包含完整交易的区块数据 block = w3.eth.get_block(TARGET_BLOCK, full_transactions=True) out_of_gas_hashes = [] for tx in block.transactions: receipt = w3.eth.get_transaction_receipt(tx.hash) # 状态为0表示失败,gasUsed等于gasLimit表示耗尽 if receipt.status == 0 and receipt.gasUsed == tx.gas: out_of_gas_hashes.append(tx.hash.hex()) print("Gas耗尽的交易哈希:", out_of_gas_hashes)
三、使用链上数据索引平台
对于大规模数据需求,推荐使用已索引的链上数据平台,无需自行遍历区块:
- Dune Analytics:编写SQL查询
ethereum.transactions表,筛选status=0且gas_used=gas_limit的交易哈希,示例查询:SELECT hash FROM ethereum.transactions WHERE status = 0 AND gas_used = gas_limit AND block_number BETWEEN 18000000 AND 18000100; -- 替换为目标区块范围 - BigQuery以太坊数据集:直接在云端数据库中筛选,适合批量导出数据。
四、优化建议
- 批量请求:使用JSON-RPC批量调用接口,一次性查询多个交易的收据,减少网络开销;
- 数据快照:对于历史数据,下载链上数据快照(如Parity导出的区块数据),本地处理效率更高;
- 速率控制:调用API时遵守服务端的速率限制,避免被封禁。
内容的提问来源于stack exchange,提问作者Maryam Massoud
相关产品推荐
相关产品推荐

