You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助获取以太坊Gas耗尽失败交易的交易哈希

如何获取以太坊上因Gas耗尽失败的交易哈希

目前没有直接的Etherscan或Infura API端点可以专门筛选因Gas耗尽失败的交易,但可以通过以下方法实现需求:

一、利用Etherscan API结合交易特征筛选

Etherscan的API可以获取失败交易,再通过**gasUsed等于gasLimit**这一核心特征(Gas耗尽的交易会用完所有设置的Gas)来区分:

  1. 先调用eth_getBlockByNumber接口获取目标区块内的所有交易;
  2. 对每个交易调用eth_getTransactionReceipt获取收据;
  3. 筛选出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:20:26