如何在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
相关产品推荐
相关产品推荐

