教程区块链区块链技术ch088.2 分片原理与以太坊设计

本页目录

分片(Sharding)是 database 领域中经典的水平扩展策略:将一个大表按某种键哈希切分成多个子表,每个子表由不同的服务器处理。将其移植到区块链中,核心思想是将全局状态和执行负载切分为 N 个分片,每个节点只需验证自己所属分片的交易。这似乎是解决可扩展性三难困境的"圣杯"——但代价是跨分片通信与安全性保证的复杂化。


8.2.1 数据库分片的基本映射

在分布式数据库中,分片的本质是将键空间 KK 划分为 SS 个子集:

K=K1K2KS,KiKj=(ij)K = K_1 \cup K_2 \cup \dots \cup K_S, \quad K_i \cap K_j = \emptyset (i \neq j)

每个分片 KiK_i 由独立的数据库实例管理。查询键 kk 时,通过分片函数定位到对应实例:

shard(k)=kmodS\text{shard}(k) = k \mod S

区块链分片的额外约束

  1. 去中心化:每个分片不能由单一服务器处理(否则回到中心化);
  2. 安全性:攻击分片的成本必须与攻击整条链相当;
  3. 跨分片原子性:跨分片交易要么全成功、要么全回滚。

8.2.2 分片数量与验证者分配

以太坊 2.0(现称"共识层升级")最初设计 64 个分片。假设全网有 VV 个验证者,每个分片分配 V/64V/64 个验证者子集。

随机分配通过 RANDAO + VRF。验证者不知道自己将在哪个分片,直到分配时刻,防止定向攻击。

攻击成功率单分片(23)V/S\text{攻击成功率}_{\text{单分片}} \approx \left(\frac{2}{3}\right)^{V/S}

V=300,000V = 300{,}000S=64S = 64,则每分片约 4,687 个验证者。攻击者控制 2/3 单个分片需要控制全网约 2/3×1/64=1/962/3 \times 1/64 = 1/96 的质押——这在经济上是不可行的。

graph TD
    A[全网验证者
    V=300000] --> B[随机洗牌
    RANDAO + VRF]
    B --> C1[分片 1
    ~4687 验证者]
    B --> C2[分片 2
    ~4687 验证者]
    B --> C3[...]
    B --> C64[分片 64
    ~4687 验证者]
    C1 --> D1[执行+提议区块]
    C64 --> D64[执行+提议区块]
    style A fill:#e6f3ff
    style B fill:#ffffcc

8.2.3 以太坊分片路线图:从数据分片到 Danksharding

以太坊的分片路线图经历了关键转向:

阶段一:执行分片(原方案)

  • 64 个分片,每个分片有独立的 EVM 执行和状态;
  • 信标链(Beacon Chain)协调跨分片通信;
  • 问题:跨分片通信延迟高、状态同步复杂。

阶段二:数据分片 + Rollup(现方案 / Danksharding)

  • 分片不再执行 EVM,而是成为数据可用性层——只存储 blob 数据;
  • Rollup(L2)在链下执行交易,将压缩数据和 ZK/欺诈证明上传到分片;
  • 验证者只需验证数据确实可用(通过 DAS 采样),无需执行任何交易。
graph TD
    subgraph 执行分片原方案
        A1[分片1: EVM执行] --> B1[信标链协调]
        A2[分片2: EVM执行] --> B1
        A3[分片3: EVM执行] --> B1
    end
    subgraph Danksharding 现方案
        C1[Rollup] --> D1[数据分片1
        仅存储 blob]
        C2[Rollup] --> D2[数据分片2
        仅存储 blob]
        E[信标链] --> D1
        E --> D2
        E --> F[验证者
        数据可用性采样]
    end
    style E fill:#ccffcc

8.2.4 数据可用性采样(DAS):安全与效率的平衡

问题:如果一个 L2 在分片中上传了 1MB 数据,验证者如何在不下载全部 1MB 的情况下确认数据确实被所有节点存储?

方案(DAS):将数据编码为二维矩阵,使用 KZG 多项式承诺。验证者随机采样少量单元格(如 20 个坐标点),通过 KZG 开放证明验证这些单元格属于同一多项式。

C=KZG-commit(P(X,Y)),对 Dm×n 的拉格朗日插值多项式C = KZG\text{-commit}(P(X, Y)), \quad \text{对 } D_{m \times n} \text{ 的拉格朗日插值多项式}

采样安全性

P(验证者错过被隐藏数据块)(1smn)NvalidatorsNsamplesP(\text{验证者错过被隐藏数据块}) \approx \left(1 - \frac{s}{m \cdot n}\right)^{N_{\text{validators}} \cdot N_{\text{samples}}}

若 1/4 数据被隐藏,每个验证者采样 20 个单元格,10000 个验证者参与,漏检概率为天文数字级的小。

ts
// das-sampling-sim.ts
// 纯内置:模拟数据可用性采样的漏检概率

function dasLeakProbability(
  totalCells: number,
  hiddenFraction: number,
  samplesPerValidator: number,
  validatorCount: number
): number {
  const honestValidators = Math.floor(validatorCount * 0.67); // 2/3 假设
  const pMissOne = 1 - (hiddenFraction * totalCells) / totalCells; // = 1 - hiddenFraction
  // 简化为二项式概率
  const pAllMiss = Math.pow(pMissOne, honestValidators * samplesPerValidator);
  return pAllMiss;
}

const totalCells = 512 * 512; // 2D 矩阵
const hidden = 1/4;
const samples = 20;
const validators = 10000;

console.log('DAS 漏检概率:', dasLeakProbability(totalCells, hidden, samples, validators));
// 输出: 极小到近乎于零,验证随机采样在大规模验证者下的安全性

8.2.5 跨分片通信问题

虽然 Danksharding 用 Rollup 替代了跨分片交易,但跨 Rollup 通信仍需解决。核心问题:跨分片交易的原子性

两阶段提交(2PC)在区块链中的困境

  • 分片 A 锁定资金,发送消息到分片 B;
  • 分片 B 接收消息,释放对应资金;
  • 若通信被隔离,资金可能在分片 A 被锁死。

以太坊的解决方案:信标链作为协调者,但执行层(Rollup)通过共享的 L1 数据可用性保证最终一致性。


关键认知二:分片不是"让链变快"的简单操作,而是将验证者的工作重新分配到多个并行轨道。Danksharding 的聪明之处在于:它放弃了让每个分片运行 EVM 的复杂方案,转而让分片只负责"存储数据并证明其可用性",将执行交给专门优化的 L2。这是对三难困境的优雅拆分——L1 保安全与去中心化,L2 保可扩展性,数据分片保 L2 与 L1 的连接安全。


← 8.1 三难困境 | 前往 → 8.3 侧链与双向锚定

评论

0

评论加载中…

发表评论

0/2000