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

如何在zkSync中等待交易确认?Hardhat合约开发技术问询

zkSync交易确认与Hardhat正确等待方案

关于zkSync区块打包与以太坊确认的说明

zkSync作为Rollup扩容方案,确实会将多笔用户交易打包为单个Rollup区块,之后再将区块的零知识证明提交到以太坊主网完成最终确认,具体流程分两个阶段:

  • 交易提交到zkSync节点后,会先进入**已提交(committed)**状态,此时交易已在zkSync网络内生效,状态变更可在zkSync层面查询;
  • 后续zkSync生成区块的零知识证明并提交至以太坊合约验证,验证通过后区块进入**已确认(verified)**状态,这是以太坊层面的不可逆最终确认。

你听到的说法属实,但需区分两个阶段,按需选择等待目标。

替代setTimeout的正确等待方法

硬编码延迟的setTimeout既不高效也不可靠,推荐用以下两种方式处理:

1. 等待单交易的确认状态

在zkSync Hardhat环境中,交易发送后会返回交易对象,可通过wait()或zkSync专属方法等待指定状态:

修正你的代码并添加等待逻辑(补充了addLiquidity缺失的必要参数):

// 完成授权并等待交易提交
await (await tokenA.approve(router.address, await tokenA.totalSupply())).wait();
await (await tokenB.approve(router.address, await tokenB.totalSupply())).wait();

// 执行添加流动性交易
const addLiqTx = await router.addLiquidity(
  tokenA.address,
  tokenB.address,
  1000000,        // 投入的tokenA数量
  1000000,        // 投入的tokenB数量(需匹配流动性配比)
  0,              // 最小接收LP代币数量
  0,              // 最小接收LP代币数量
  owner.address,  // LP代币接收地址
  Math.floor(Date.now() / 1000) + 600  // 交易截止时间
);

// 等待交易在zkSync上完成提交(committed)
await addLiqTx.wait();

// 若需等待以太坊层面的最终确认(verified),使用zkSync provider方法
const zkSyncProvider = await hre.zkSyncEthers.getProvider();
await zkSyncProvider.waitForTransaction(addLiqTx.hash, "verified");

2. 等待最新区块完成确认

如果需要等待整个当前区块被以太坊确认,可直接等待provider的区块状态:

const zkSyncProvider = await hre.zkSyncEthers.getProvider();
// 等待最新区块达到verified状态
await zkSyncProvider.waitForBlock("verified");

额外注意

  • 仅需在zkSync网络内操作时,等待交易"committed"状态即可,耗时通常仅数秒;
  • 等待"verified"状态的时间取决于zkSync区块打包周期和以太坊确认速度,一般需要数分钟;
  • 确保Hardhat项目已正确配置zkSync插件,使用zkSyncEthers而非普通ethers.js provider,才能调用专属的等待方法。

内容的提问来源于stack exchange,提问作者redfallenstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:22:14