如何仅通过交易哈希在Node.js后端等待以太坊交易上链?
仅通过交易哈希等待以太坊交易上链的实现方案
你原来的代码问题在于只调用了一次getTransactionReceipt,如果交易处于pending状态,这个接口会返回null,函数自然没有返回值;而且这个场景完全不需要signer对象,只需要以太坊节点的provider实例就能实现等待交易上链的功能。
下面是两种可行的实现方式:
1. 自定义轮询查询函数
自己实现循环查询逻辑,直到交易上链或超时:
const waitForTransactionMined = async (provider, transactionHash, timeout = 300000, interval = 5000) => { const startTime = Date.now(); // 循环查询直到超时 while (Date.now() - startTime < timeout) { const txReceipt = await provider.getTransactionReceipt(transactionHash); // 拿到带blockNumber的回执说明已上链 if (txReceipt && txReceipt.blockNumber) { return txReceipt; } // 每隔指定间隔再查一次 await new Promise(resolve => setTimeout(resolve, interval)); } throw new Error(`交易 ${transactionHash} 超时未上链`); };
- 参数说明:
provider:你的以太坊provider实例(比如ethers.js的JsonRpcProvider)transactionHash:目标交易的哈希值timeout:超时时间,默认5分钟(300000毫秒)interval:查询间隔,默认5秒(5000毫秒)
2. 使用ethers.js内置方法
如果用的是ethers.js,其实已经内置了封装好的方法,直接调用即可:
// 等待交易上链,且至少1个区块确认,超时5分钟 const txReceipt = await provider.waitForTransaction(transactionHash, 1, 300000);
- 这个方法内部已经实现了轮询逻辑,pending状态下会持续等待,直到交易上链并达到指定确认数,或者超时抛出错误。
这两种方式都不需要依赖signer对象,仅通过交易哈希和provider就能完成交易上链的等待逻辑。
内容的提问来源于stack exchange,提问作者Sihan Tawsik
相关产品推荐
相关产品推荐

