如何使用web3.py等待交易确认且避免多余等待耗时
Web3.py 等待交易确认无额外损耗实现方案
直接使用web3.py内置的交易回执等待方法即可,不需要自定义固定时长的sleep逻辑,该方法会在交易完成确认的第一时间返回结果,几乎无额外等待损耗。
实现代码
修改你的交易发送逻辑,在拿到交易哈希后调用等待方法即可:
sign_txn = web3.eth.account.signTransaction(token_tx, private_key=private_key) tx_hash = web3.eth.sendRawTransaction(sign_txn.rawTransaction) # 等待交易上链确认 tx_receipt = web3.eth.wait_for_transaction_receipt( transaction_hash=tx_hash, timeout=120, # 最长等待超时时间,单位秒,可根据链的出块速度调整 poll_latency=0.1 # 状态查询间隔,单位秒,0.1秒的间隔几乎感知不到等待延迟 ) # 必须校验交易执行状态,链上打包不代表交易执行成功 if tx_receipt.status != 1: raise RuntimeError(f"交易执行失败,哈希: {tx_hash.hex()}") # 后续业务逻辑直接写在此处,交易确认完成后会立刻执行到这一步
参数说明
timeout:超过该时长交易还未被打包则抛出超时异常,以太坊主网可设为180,BSC、Polygon等快链设为60即可poll_latency:轮询链上状态的间隔,设为0.1时,交易确认到脚本继续执行的延迟不超过100毫秒,不会产生可感知的等待损耗- 如果需要多区块确认(比如等6个区块确认保证交易最终性),在拿到交易回执后,监听最新区块高度,当最新区块号 >=
tx_receipt.blockNumber + 目标确认数 - 1时即可判定确认完成,同样没有额外等待。
注意事项
禁止使用固定时长的
time.sleep()逻辑等待交易,这类逻辑要么等待时长不足导致后续逻辑执行时交易还未确认,要么等待时长远超交易实际确认时间,产生无意义的时间损耗。
内容的提问来源于stack exchange,提问作者Wade
相关产品推荐
相关产品推荐

