分片(Sharding)是 database 领域中经典的水平扩展策略:将一个大表按某种键哈希切分成多个子表,每个子表由不同的服务器处理。将其移植到区块链中,核心思想是将全局状态和执行负载切分为 N 个分片,每个节点只需验证自己所属分片的交易。这似乎是解决可扩展性三难困境的"圣杯"——但代价是跨分片通信与安全性保证的复杂化。
8.2.1 数据库分片的基本映射
在分布式数据库中,分片的本质是将键空间 划分为 个子集:
每个分片 由独立的数据库实例管理。查询键 时,通过分片函数定位到对应实例:
区块链分片的额外约束:
- 去中心化:每个分片不能由单一服务器处理(否则回到中心化);
- 安全性:攻击分片的成本必须与攻击整条链相当;
- 跨分片原子性:跨分片交易要么全成功、要么全回滚。
8.2.2 分片数量与验证者分配
以太坊 2.0(现称"共识层升级")最初设计 64 个分片。假设全网有 个验证者,每个分片分配 个验证者子集。
随机分配通过 RANDAO + VRF。验证者不知道自己将在哪个分片,直到分配时刻,防止定向攻击。
若 ,,则每分片约 4,687 个验证者。攻击者控制 2/3 单个分片需要控制全网约 的质押——这在经济上是不可行的。
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 开放证明验证这些单元格属于同一多项式。
采样安全性:
若 1/4 数据被隐藏,每个验证者采样 20 个单元格,10000 个验证者参与,漏检概率为天文数字级的小。
// 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评论加载中…