如何查询ETH交易是否已被发送至以太坊网络
校验已签名ETH交易是否已发送至网络的实现方案
你只需要校验目标交易哈希是否被你发送交易对接的ETH节点接收过即可,不需要关心后续链上状态,核心实现逻辑如下:
web3.js 实现方案
方法1:通用公开接口校验(兼容公共RPC节点)
调用web3.eth.getTransaction即可,只要返回值不为null,就说明交易已经被节点成功接收(无论是暂存在节点交易池,还是已经打包上链,都满足你曾被发送的校验要求):
// 入参为你存储的交易哈希,返回布尔值表示是否已被节点接收 async function isTxSent(txHash) { const transaction = await web3.eth.getTransaction(txHash); return transaction !== null; }
注意:如果交易发送后间隔过久(通常超过几小时),未打包的交易会被节点从交易池自动剔除,此时该接口会返回null,这种情况只能依赖你本地发送交易时的日志记录确认。
方法2:交易池精准校验(需节点开放txpool权限)
如果你对接的是自有节点,且节点开放了txpool相关的RPC调用权限,可以直接查询节点交易池内容匹配交易哈希,确认是否刚被发送还未上链:
async function isTxInNodeMempool(txHash) { // 调用节点原生txpool_content RPC接口 const poolData = await web3.currentProvider.request({ method: "txpool_content", params: [] }); // 合并pending和queued两个交易池的所有交易 const allPoolTxs = [ ...Object.values(poolData.pending), ...Object.values(poolData.queued) ].flat(); // 忽略大小写匹配交易哈希 return allPoolTxs.some(tx => tx.hash.toLowerCase() === txHash.toLowerCase()); }
补充说明
如果你调用
web3.eth.sendSignedTransaction时没有抛出网络异常、节点返回的签名校验错误,本身就可以直接判定交易已经成功发送到节点。上述校验方案仅适用于发送时出现异常、或需要事后二次确认的场景。
内容的提问来源于stack exchange,提问作者Daltrey Waters
相关产品推荐
相关产品推荐

