FastWithdrawalPoolV2 — 设计

日期:2026-03-03 状态:已批准 作者:BabyDriver Team


1. 背景与决策

1.1 问题

Phase 2 Oracle 集成完成后,需要增强桥功能。原计划将 FastWithdrawalPool 实现为 era 的 IL1AssetHandler 接口并迁移 L1/L2 Bridge 合约。

1.2 调研结论

深入分析 zksync-era 桥架构后发现:

  • L1BridgeContract / L2BridgeContract 可以废弃 — era 已提供完整的 Bridgehub → L1AssetRouter → L1NativeTokenVault → L1Nullifier 存款/提款/证明验证管线

  • FastWithdrawalPool 是唯一独有价值 — era 没有 LP 即时提款功能

1.3 方案选择

方案
描述
复杂度
安全性

A: IAssetHandler 深度集成

FastPool 实现 era 的 bridgeMint/bridgeBurn

极高

B: Sidecar 模式

FastPool 作为独立 L1 合约

C: NTV 包装器

包装 L1NativeTokenVault

选定方案 B:Sidecar 模式

理由:

  1. 零修改 era 核心桥合约

  2. 行业标准(Across、Hop 均采用此模式)

  3. 独立升级,不受 era 上游更新影响

  4. 安全隔离 — FastPool 的漏洞不影响 era 桥本身

1.4 取消的功能

  • 大额存款 Timelock — era 的 L1Nullifier + ZK proof 已提供足够安全保障

  • L1/L2 BridgeContract 迁移 — era 原生桥已覆盖全部功能


2. 架构

2.1 系统架构图

2.2 合约依赖


3. 合约详细设计

3.1 状态变量

3.2 数据结构

3.3 核心函数

LP 流动性管理

用户快速提款

去信任结算

超时取回


4. 错误处理

场景
Revert 原因

Proof 验证失败

"Invalid L2 message proof"

已结算请求重复结算

"Already settled"

池余额不足

"Insufficient pool liquidity"

超过 500 ETH

"Exceeds max single withdrawal"

l2TxHash 重复申请

"L2 tx already claimed"

超时取回非超时请求

"Settlement not timed out"

Message 金额不匹配

"Amount mismatch"


5. 测试策略

5.1 Mock 合约

  • MockMailbox: 可配置 proveL2MessageInclusion() 返回 true/false,模拟 era proof 验证

5.2 测试覆盖

类别
测试场景

LP 管理

添加/移除流动性, 费用领取, 余额不足

快速提款

正常流程, 上限, 池不足, 重复 l2TxHash

去信任结算

有效 proof, 无效 proof, 重复结算, 金额不匹配

超时

超时取回, 未超时拒绝, 已结算拒绝超时取回

边界

0 金额, MAX_SINGLE_WITHDRAWAL 精确边界


6. 实现范围

任务
描述

FastWithdrawalPool v2

重构合约 (~300 行)

MockMailbox

测试辅助合约 (~50 行)

测试套件

Foundry 测试 (~300 行)

bridge-enhancer

Rust LP 自动结算监控 (~100 行)

不做

功能
原因

动态费率

固定 0.5% MVP 够用

大额 Timelock

era 安全足够

多 LP 匹配

池级匹配 MVP 够用

ERC20 快速提款

初始只支持 ETH

L2 侧合约

纯 L1 Sidecar

修改 era 合约

零耦合原则


7. 与现有代码的关系

文件
处理

contracts/src/bridge/FastWithdrawalPool.sol

v1 保留作参考,v2 新文件

contracts/src/bridge/L1BridgeContract.sol

废弃(era 原生桥替代)

contracts/src/bridge/L2BridgeContract.sol

废弃(era 原生桥替代)

contracts/src/libraries/PriceLib.sol

保留(未来动态费率可用)

contracts/test/Bridge.t.sol

v1 测试保留,新增 v2 测试文件

Last updated