Rollup 是当前以太坊扩容的核心路线,其设计哲学极其简洁:将 L2 上的大量交易压缩为一条批次提交到 L1,同时在 L1 用密码学方式证明这些交易的执行结果正确。这一节剖析两种实现路径—— Optimistic Rollup 的"欺诈证明"与 ZK Rollup 的"零知识证明"——以及它们在经济、延迟和密码学上的深层差异。
8.5.1 Rollup 的通用架构
无论具体方案,所有 Rollup 共享一个三组件架构:
| 组件 | 功能 | 部署位置 |
|---|---|---|
| 定序器(Sequencer) | 接收 L2 交易、执行、生成批次 | L2(中心化/去中心化) |
| 合约桥(Bridge Contract) | 接收存款、验证证明、处理退出 | L1(以太坊主合约) |
| 证明系统 | 向 L1 证明批次状态正确 | 欺诈期或 ZK 证明 |
graph TD
A[用户] -->|L2 交易| B[定序器<br>执行+排序]
B --> C[压缩批次数据
上传 L1]
C --> D[L1 桥接合约]
D -->|验证状态根| E{验证方式?}
E -->|欺诈证明| F[Optimistic Rollup
7 天挑战期]
E -->|ZK 证明| G[ZK Rollup
分钟级确认]
D --> H[存入/提取资产]
style G fill:#ccffcc
style F fill:#ffffcc
8.5.2 Optimistic Rollup:先执行,后质疑
核心假设:定序器提交的状态根默认正确,但在挑战期(通常为 7 天)内,任何人可提交欺诈证明(Fraud Proof)。
争议解决:
- 质疑者锁定押金;
- 链上合约以二分的形式重放交易(Interactive Fraud Proof),找到第一个产生分歧的操作码;
- 输方押金被罚没。
经济设计:
- 诚实节点有动力监控(因可赚罚没金);
- 7 天延迟导致资产提取到 L1 极慢。
sequenceDiagram
participant S as 定序器
participant L1 as 以太坊 L1
participant C as 挑战者
S->>L1: 提交状态根 S_n
Note over L1: 挑战期开始 (7天)
C->>L1: 质疑: S_{i} 不等于正确执行
L1->>L1: 二分查找找到分歧点
L1->>L1: 单步重放 EVM
L1->>L1: 判定: 定序器作弊
L1->>C: 罚没定序器押金
Note over L1: 状态回滚至 S_{i-1}
8.5.3 ZK Rollup:密码学保证即时最终性
核心机制:每笔批次附带有效性证明(Validity Proof),证明"执行这批交易后状态根确实等于 "。
证明系统演进:
| 技术 | 证明大小 | 验证时间 | proof 生成时间 | 通用性 |
|---|---|---|---|---|
| SNARK(Groth16) | ~200 字节 | 1.5 ms | 数秒 | 需可信设置(后可选) |
| STARK | ~50 KB | 10 ms | 数分钟 | 无需可信设置,抗量子 |
| PLONK | ~400 字节 | 3 ms | 数秒 | 通用可信设置 |
| Halo2 | ~500 字节 | 5 ms | 数十秒 | 递归聚合,无需每批次设置 |
ts
// zk-rollup-batch-verify-sim.ts
// 纯内置:模拟 ZK-Rollup 状态根更新与证明数量
function rollupBatch(
prevStateRoot: bigint,
txs: Array<{ from: string; to: string; value: bigint }>,
proofExists: boolean
): { newStateRoot: bigint; valid: boolean; dataSize: number } {
if (!proofExists) return { newStateRoot: prevStateRoot, valid: false, dataSize: 0 };
// 模拟状态根更新(hash(prev + 压缩 txs)
let state = prevStateRoot;
for (const tx of txs) {
state = (state + BigInt(tx.value) * BigInt(tx.from.charCodeAt(0)) * 31n) % (1n << 256n);
}
// 批处理压缩: 100 笔交易在 L1 仅占用约 500 字节 SNARK 证明 + 状态根
return { newStateRoot: state, valid: true, dataSize: 500 };
}
const prevRoot = 0xabcdef1234567890n;
const batch = Array.from({ length: 100 }, (_, i) => ({
from: '0xA', to: '0xB', value: BigInt(i + 1),
}));
const result = rollupBatch(prevRoot, batch, true);
console.log(`新状态根: 0x${result.newStateRoot.toString(16).slice(0, 16)}...`);
console.log(`L1 数据大小: ${result.dataSize} 字节 (替代原约 25000 字节的 100 笔交易)`);
// 压缩比: ~100 倍,验证成本恒定(~113000 gas 配对验证)8.5.4 数据可用性:Rollup 的生死线
Rollup 的安全性依赖于L1 上的数据可用性:
- 场景 A(乐观 Rollup):数据在 L1,任何人可下载并重放交易以发现欺诈;
- 场景 B(Validium):数据在链下(如 DAC 委员会),仅状态根上链;
- 场景 C(数据不可用攻击):定序器提交状态根但不上传交易数据 → 无人可生成欺诈证明。
安全层级:
以太坊通过 EIP-4844 Blob 交易 专门降低了 Rollup 的 L1 数据成本(calldata 成本原为每字节 16 Gas,Blob 数据成本约 1 Gas/字节,且临时存储 4096 个 epoch 后删除)。
8.5.5 项目对比
| 维度 | Optimism | Arbitrum | zkSync Era | StarkNet |
|---|---|---|---|---|
| 类型 | Optimistic | Optimistic | ZK (SNARK) | ZK (STARK) |
| EVM 兼容 | 完全 | 完全 | 自定义字节码 | Stark 语言 |
| 提款延迟 | 7 天 | 7 天 | 分钟级 | 数小时 |
| 证明成本 | 无(挑战期) | 无 | ~350K Gas | ~500K Gas |
| 数据格式 | calldata | calldata | calldata + blobs | blobs |
| 去中心化定序器 | 规划中 | 规划中 | 已部分多签 | 已多签 |
关键认知五:Optimistic Rollup 与 ZK Rollup 不是"哪个更好",而是信任假设与效率的权衡。Optimistic 更兼容现成 EVM 合约,但 7 天提款延迟是硬伤;ZK 提供密码学级即时性,但证明生成成本高、通用 ZK-EVM 仍在成熟中。以太坊的扩容未来不是二选一,而是二者共存——Optimistic 负责迁移兼容,ZK 负责最终安全锚。
← 8.4 状态通道 | 前往 → 8.6 跨链桥与桥安全
评论
0评论加载中…