自动结算 — 设计

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


1. 背景

Phase 3 的 Solidity 合约(FastWithdrawalPoolV2)已完成,31 个测试通过。合约支持任何人调用 settleWithdrawal() 提交 era L2→L1 message proof 来结算快速提款并赚取 0.5% 手续费。

现在需要一个 Rust 后台服务自动执行结算,确保:

  • LP 资金不会被长时间锁定

  • 超时请求被自动回收

  • 结算奖励被自动收取

2. 方案选择

方案
描述
复杂度

A: 纯 RPC + ABI 编码

手动 keccak256 编码,reqwest 发 RPC 调用

B: ethers-rs 集成

自动 ABI binding,类型安全

中高

选定方案 A:与 oracle-wiring 模式一致,不引入新重量级依赖。

3. 架构

bridge-enhancer/
├── lib.rs         — 模块导出
├── config.rs      — BridgeEnhancerConfig (TOML 反序列化)
├── monitor.rs     — SettlementMonitor (核心轮询循环)
├── rpc.rs         — L1/L2 RPC 调用封装
└── wiring.rs      — SharedBridgeService + WiringLayer

3.1 核心循环

3.2 系统集成

4. 配置

5. ABI 编码

沿用 oracle-wiring 模式:keccak256 函数选择器 + 手动 32 字节编码。

需要编码的函数:

函数
选择器

nextRequestId()

keccak256("nextRequestId()")[:4]

getRequest(uint256)

keccak256("getRequest(uint256)")[:4]

settleWithdrawal(uint256,uint256,uint256,uint16,bytes32[],bytes)

计算

reclaimTimedOut(uint256)

keccak256("reclaimTimedOut(uint256)")[:4]

proveL2MessageInclusion(uint256,uint256,(uint16,address,bytes),bytes32[])

计算

6. 错误处理

  • RPC 连接失败 → tracing::warn + 继续循环

  • 交易 revert → tracing::error + 跳过该请求

  • 私钥未配置 → 只读模式(仅日志,不发交易)

  • 无未结算请求 → 静默跳过

7. 不做

  • MEV 保护

  • 多 settler 竞争优化

  • Gas price 动态调整

  • WebSocket 订阅(轮询足够)

  • ERC20 token 结算(MVP 仅 ETH)

8. 依赖

9. 测试策略

  • 单元测试:config 解析、ABI 编码/解码、request 状态判断

  • 集成测试依赖本地 anvil + 部署的 FastWithdrawalPoolV2(可选)

Last updated