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

web3.py调用get_block获区块交易异常:混入其他区块交易求助

问题分析与解决建议

可能的原因

  • 区块未最终确认:以太坊新区块生成后,需经多节点共识确认才能进入最终状态。若在区块未敲定(确认数不足)时调用get_block,部分节点可能返回临时、未完全同步的数据,导致交易信息混乱,待区块确认完成后数据会恢复正常。
  • 代码逻辑局限性:当前代码仅处理最新区块,同步过程中若新区块快速生成,可能出现获取块号与实际拉取区块数据的时间差,或遗漏中间区块;且未对返回数据做校验,无法及时发现异常。
  • 节点临时同步异常:虽Alchemy节点稳定性较高,但偶尔可能因缓存、同步延迟等问题,导致返回的区块数据异常,这类情况通常是临时的。

解决建议

  • 等待区块确认后再处理:不要同步刚生成的区块,待区块达到至少6个确认数(行业通用安全标准)后再操作。判断逻辑可调整为:当cur_block_num - target_block_num >= 6时,再处理target_block_num对应的区块。
  • 完善区块遍历逻辑:若目标是同步所有区块,应从last_block_num + 1开始,循环遍历到cur_block_num,逐个处理每个区块,避免仅处理最新块导致的遗漏或异常。核心逻辑示例:
    cur_block_num = web3.eth.get_block_number()
    # 遍历所有待同步区块
    for block_num in range(last_block_num + 1, cur_block_num + 1):
        # 跳过未确认的区块
        if cur_block_num - block_num < 6:
            continue
        res = web3.eth.get_block(block_num, full_transactions=True)
        block_info = json.loads(web3.toJSON(res))
        block_info = convert_numeric_to_str(block_info)
        # 校验交易数量是否匹配
        if len(block_info['transactions']) != block_info['transactionCount']:
            # 重新获取异常区块
            res = web3.eth.get_block(block_num, full_transactions=True)
            block_info = json.loads(web3.toJSON(res))
            block_info = convert_numeric_to_str(block_info)
        transactions = block_info.pop('transactions')
        db["block_info"].insert_one(block_info)
        last_block_num = block_num
    
  • 添加数据校验步骤:处理每个区块时,对比transactions数组长度与区块的transactionCount字段,若不一致则重新拉取该区块,确保数据准确性。
  • 单独测试异常区块:针对区块16498524,直接调用指定区块号的方法多次测试:
    res = web3.eth.get_block(16498524, full_transactions=True)
    # 检查所有交易所属区块
    for tx in res.transactions:
        print(tx.blockNumber)
    
    若多次测试结果仍不稳定,可联系Alchemy技术支持排查节点问题;若结果稳定,则大概率是之前处理时区块未确认导致的异常。

内容的提问来源于stack exchange,提问作者zl zero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:15:38