如何使用tonweb等待TON区块链交易确认?
在TON DApp中用TonWeb实现交易确认等待功能
当你通过钱包注入的ton.send('ton_sendTransaction')发送交易后,可以通过轮询TonWeb节点查询交易状态的方式,等待交易在链上确认后再执行后续操作。以下是完整的实现方案:
完整代码示例
// 假设已完成TonWeb初始化(如通过TonConnect或直接连接节点) // const tonWeb = new TonWeb(new TonWeb.HttpProvider('https://toncenter.com/api/v2/jsonRPC')); // 同时已获取钱包注入的ton对象(如TonConnect提供的window.ton) async function sendTransactionAndWait() { // 发送交易 const txResult = await ton.send('ton_sendTransaction', [{ to: 'UQ...', // 目标地址 value: '1000000000' // 注意:单位是nanoTON,此处为1 TON }]); // 提取交易Hash(不同钱包返回字段可能不同,按需调整) const txHash = txResult.txHash || txResult.transaction_hash; if (!txHash) throw new Error('无法获取交易Hash'); // 等待交易确认 await waitForTxConfirmation(txHash, tonWeb); console.log('Done! 交易已确认'); // 在此执行后续业务逻辑 } /** * 等待交易链上确认 * @param {string} txHash - 交易Hash * @param {TonWeb} tonWeb - TonWeb实例 * @param {number} interval - 轮询间隔(毫秒,默认3000) * @param {number} timeout - 超时时间(毫秒,默认60000) */ async function waitForTxConfirmation(txHash, tonWeb, interval = 3000, timeout = 60000) { const start = Date.now(); while (Date.now() - start < timeout) { try { // 查询交易详情 const tx = await tonWeb.provider.getTransaction(txHash); // 判断交易是否确认:存在block_id即表示已上链,或status为finalized if (tx && (tx.block_id || tx.status === 'finalized')) { return; } } catch (err) { // 交易未上链时节点会返回"Transaction not found",忽略该错误继续轮询 if (!err.message.includes('Transaction not found')) throw err; } // 等待指定间隔后再次查询 await new Promise(resolve => setTimeout(resolve, interval)); } throw new Error('等待交易确认超时'); } // 执行流程 sendTransactionAndWait().catch(err => console.error('操作失败:', err));
关键注意事项
- 单位问题:
value参数的单位是nanoTON,1 TON = 10^9 nanoTON,务必注意数值转换 - 钱包返回差异:不同钱包注入的
ton.send返回的交易Hash字段可能不同(如TonConnect返回txHash,部分钱包返回transaction_hash),需根据实际情况调整提取逻辑 - 轮询配置:可根据需求调整
interval(轮询频率)和timeout(最长等待时间),避免过于频繁查询给节点造成压力 - 节点可靠性:确保TonWeb连接的节点是稳定的公共节点或自建节点,否则可能出现查询延迟或失败
内容的提问来源于stack exchange,提问作者Daniil Sedov
相关产品推荐
相关产品推荐

