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

如何仅通过交易哈希在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:05:24