Eth2 Staking 系列:在分片内开展共识

2020-04-13 18:56:28 浏览数 (3)

来源 | Unitimes

Sharding (分片) 是 eth2 对于 eth1 的诸多改进之一,此术语源自数据库研究,一个分片 (shard) 代表着一个更大整体的一部分。在数据库和 eth2 中,分片意味着将整个系统的存储和计算分到多个分片 (shards) 中,每个分片将单独处理,并根据需要将处理的结果合并起来。具体来说,eth2 将实现许多条分片链 (shard chains),其中每条分片链都与 eth1 链有着类似的功能。这带来了系统大规模的可扩展性提升。

然而,在 eth2 中有个不那么知名的 sharding 类型。从协议的设计角度,可以说它更令人兴奋。这就是对共识进行分片 (sharded consensus,也即在分片内开展共识)。

在分片内开展共识

就像运行最慢的节点的处理能力会限制整个网络的吞吐量一样,单个验证者 (validator) 的计算资源也会限制可以参与到协议共识中的验证者的总数量。由于每个新增的验证者都会对系统中其他每个验证者带来额外的工作,所以在某个时刻,资源最少的验证者将不再能够参与共识 (因为该验证者将无法再追踪所有其他验证者的投票)。对此,eth2 采用的解决方案是在分片内开展共识

拆分开来

Eth2 将时间分成两个时间段:slot 和 epoch

每个 slot 都是12秒,预计每个 slot 期间会有1个新的区块被添加进 eth2 链中。区块 (block) 是一种将交易 (translactions) 和验证者的投票 (votes) 打包上链的机制,正是这种对交易的处理才使得区块链有了用武之地。

每个 epoch 由 32 个 slots (6.4分钟) 组成,在每个 epoch 期间,信标链将执行与维护整条链相关的所有计算,包括:证明和敲定新区块,给所有验证者发送奖励和惩罚等

正如我们此前中提到的,验证者们将被分配到委员会 (committees) 中来完成他们的工作。在任何时候,每个验证者都是1个信标链委员会和1个分片链委员会的成员,并且在每个 epoch 期间每个验证者都会被要求去进行1次证明 (attestation) – 证明就是对在某个 slot 期间被提议的信标链区块 (beacon chain block) 进行的投票 (vote)。

Eth2在分片中开展共识的安全模型是基于这样的理念:所有委员会中的验证者或多或少代表了整个验证者集合

比如,如果我们遇到了这种情况,即所有验证者中有33%的验证者怀有恶意,那么有可能这部分恶意验证者会被分配到同一个委员会中。对于我们的安全模型来说,这将是一场灾难。

上图中?表示诚实验证者,?表示恶意验证者。图中的红色区域表示被恶意验证者控制的分片,黄色区域表示安全但陷入停滞状态的分片,绿色区域表示正常运行中的分片。图中左半部分表示如果不打乱验证者将可能出现的情况;右半部分表示将验证者打乱之后,恶意验证者将被打乱分配到不同的分片中

因此,我们需要通过某种方式来确保这种灾难性情况不会发生。换句话说,我们需要通过某种方式来确保,如果有33%的验证者是恶意的,那么需要确保单个委员会中只有大约33%的验证者是恶意的[备注:也即需要确保将所有这些33%的恶意验证者打乱并分配到不同的委员会中,从而使他们不会集中在某几个委员会中]

事实证明,我们可以通过做两件事来实现这一点:

  • 确保每个委员会中的验证者分配是随机性的;
  • 设定每个委员会的最少验证者数量;

比如,每个委员会中包含了128个随机分配的验证者,某个拥有 1/3 验证者的攻击者控制某个委员会中的 2/3 以上的验证者的概率是微乎其微的 (概率小于2^-40)

组合起来

验证者的投票称为证明 (attestations)。一个证明由许多元素组成,具体来说包括:

  • 就当前的信标链链头 (beachon chain head) 进行的投票
  • 对哪个信标区块应该被证明/敲定的投票
  • 对信标链的当前状态的投票
  • 同意该投票的所有验证者的签名

通过将尽可能多的组件组合成一个证明 (attestation),可以提高系统的整体效率。这是可能的,因为节点只需要对证明 (attestations) 进行数学运算,就可以知道信标链和每个分片链的状态,而无需对信标区块和分片区块的投票和签名分别进行检查。

如果每个验证者都会产生自己的证明 (attestation),且每个证明都需要由所有其他节点进行验证,那么成为一个 eth2 节点的成本会非常昂贵。这就将我们带向了聚合(aggregation)。

证明 (attestations) 被设计成可以很容易地组合起来,这样如果两个或更多的验证者有着带有相同投票的证明,那么就可以通过将这些证明的签名字段添加进一个证明中,从而将这些证明进行组合。这就是所谓的证明的聚合 (aggregation)。

就其结构而言,委员会 (committees) 将具有易于聚合的投票 (证明),因为分配在同一个分片中的验证者对于该分片状态和信标链应该有着相同的投票。这就是 eth2 扩展验证者数量的机制。通过将验证者分配到委员会中,验证者只需要关心其他被分配到同一个委员会中的验证者,且只需要检查来自其他每个委员会的非常少的聚合证明

签名聚合

Eth2 使用 BLS 签名 -- 这是一种定义在几条椭圆曲线上的签名方案。在特定曲线上,每个签名是 96 字节。

如果有 10% ETH 被质押进 eth2 中,那么 eth2 将大约有 350,000 个验证者。这意味着某个 epoch 期间的签名的大小将是 33.6 MB,这样每天就是大约 7.6 GB。这种情况下,所有关于 eth1 的状态大小在2018年已经达到了 1 TB 的错误说法,将会在 eth2 之后的133天之内成为事实 (仅基于签名而言)。

其中的解决方式在于,BLS 签名是可以被聚合的:如果 Alice 产生了签名 A,且 Bob 的签名 B 是对同一个数据进行的签名,那么 Alice 和 Bob 的签名都可以只需通过存储 C 的方式来进行存储和检查 (其中 C = A B)。通过使用签名聚合,在每个 epoch 期间,每个委员会只需存储和检查 1 个签名就可以。通过这种方式,能够将每天的存储需求减少到 2 MB 以下。

总结

通过将验证者分配到各个委员会中,验证 eth2 所需的工作减少了几个数量级。对于验证信标链和所有分片链的节点来说,只需要查看每个委员会的聚合证明 (aggregated attestations) 即可。通过这种方式,节点可以知晓每个分片的状态,同时知晓验证者认同哪些区块是 (或者不是) eth2 链的一部分。

委员会机制帮助实现了 eth2 的两个设计目标,这两个目标我们在本系列的第一篇文章中提到过:即参与到 eth2 网络必须在消费级笔记本电脑上就可以实现,且 eth2 必须支持尽可能多的验证者来努力实现最大程度的去中心化

说到数字,虽然大多数拜占庭容错式的 PoS 协议都可以扩张至数十个 (在个别情况下,可以扩展到数百个) 验证者,但 eth2 能够扩展至数十万个验证者,这有助于无需就延迟性和吞吐量做出妥协的情况下提升系统安全性

0 人点赞