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
相关产品推荐
相关产品推荐

