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

Python编写Web3区块链交易脚本循环触发执行异常问题求助

现有代码问题分析

第一个版本(if-elif版本)

你对这个版本问题的判断有误。if-elif的分支跳过仅发生在同一次循环的判断流程中,你的代码每0.1秒就会开启一次全新循环,每次循环都会从头校验所有条件。这个版本的实际问题是没有去重逻辑:单个区块的生成时间远大于0.1秒,同一个区块会被查询几十次,会导致run_wallets被重复执行几十上百次,不符合你每个区块仅执行一次的需求。你观测到仅触发第一个区块的问题,大概率是测试时区块增长速度快于查询频率、漏捕获了后续区块导致的。

第二个版本的核心问题

这版逻辑存在根本性错误:

  • 四个if分支里,只要latest_block in list判断为真,你都会固定删除预设的静态区块变量,而不是删除当前匹配到的latest_block。比如当最新区块是two_before时,第一个if判断为真,你直接删除早就过期的three_before,本该删除的two_before还留在列表里,直接导致后续逻辑完全混乱。
  • 用了Python内置关键字list作为变量名,属于语法坏习惯,容易引发不可预知的错误。
  • 四个判断分支完全冗余,没有存在必要。

修复后的正确代码

核心逻辑是:仅判断当前最新区块是否在目标列表中,匹配到就执行一次发交易逻辑,同时将该区块从目标列表移除,直到所有目标区块都执行完毕就停止脚本。

import time
from web3 import Web3

# 按你自己的节点配置初始化web3实例
web3 = Web3(Web3.HTTPProvider('你的区块链节点RPC地址'))

starting_block = 10079310
# 直接定义目标区块列表即可,不需要单独声明四个变量
target_blocks = [starting_block - 3, starting_block - 2, starting_block - 1, starting_block]

def run_wallets():
    # 你原有发送交易的逻辑保留在此处
    pass

def update():
    while target_blocks:
        time.sleep(0.1)
        # 老版本web3.py请用web3.eth.blockNumber
        latest_block = web3.eth.block_number
        print(f"当前最新区块:{latest_block},剩余待执行目标区块:{target_blocks}")
        
        if latest_block in target_blocks:
            run_wallets()
            # 直接移除当前匹配到的区块即可
            target_blocks.remove(latest_block)

if __name__ == "__main__":
    update()

优化建议

  • 公链区块生成时间普遍在1秒以上,你可以把sleep时间调整到0.5-1秒,避免节点请求频率过高被限制。
  • 可以增加RPC请求异常捕获逻辑,避免节点波动导致脚本直接崩溃。
  • 多钱包发交易建议增加执行日志,方便后续排查交易失败问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:45:04