了解Cardano共识

Understanding the Cardano Consensus | Cardano Explorer (cexplorer.io)
每个卡尔达诺节点都维护自己的账本版本。 为了能够做到这一点,节点需要与其他节点建立连接,并能够决定是否接受新块。 快来看看如何在账本末尾附加新区块以及如何保护账本的不变性。

为什么卡尔达诺需要共识机制?
每个分布式区块链网络都需要一个共识机制来确保所有诚实节点维护相同版本的账本。 每个节点都自主运行,网络中不能有中央机构来决定哪个版本的账本是正确的。 可以说,权威被规则所取代。 参与者通过在自己的节点上安装客户端来接受规则。

因此,共识机制是一组规则和流程,允许节点在不依赖中央权威的情况下相互协调和合作。 它还为网络提供安全性和可靠性,因为它可以防止恶意行为者篡改账本或创建欺诈交易。

如果大多数参与者安装了相同的卡尔达诺客户端版本,他们就会接受完全相同的规则。 规则是完整且确定的,因此每个人都维护相同版本的账本。

欺诈参与者试图改变其节点上的规则。 然后,他们试图欺骗诚实的参与者。 然而,如果大多数 ADA 币都站在诚实参与者一边,他们的规则就会被遵守。

请注意,分布式网络中区块的传播往往会被延迟,因此在某个时间点,账本版本可能会略有不同,但仅限于最后几个区块。 但是,所有节点上的分类帐历史记录都是相同的。

共识规则是透明的,因为每个人都可以在 GitHub 上的源代码中免费获取其定义。

了解图层
每个卡尔达诺节点根据卡尔达诺客户端中定义的共识规则维护自己的账本版本。 我们将展示共识取决于什么以及账本的具体位置。

您可以将卡尔达诺视为 3 层,其中较高层依赖于较低层。

下图显示了共识层依赖于网络层。 账本层依赖于共识层。 这样,各个层的功能就被分开了。 因此,它们可以彼此独立地升级。

网络层维护卡尔达诺网络中所有分布式节点之间的点对点连接。 每个节点都连接到多个相邻节点。 该层用于通过互联网分发交易和区块。

为了提高安全性,卡尔达诺网络使用两种类型的节点:中继节点和维护账本的节点,我们称它们为共识节点(也是区块生产者节点)。 共识节点连接到一个或多个中继节点。 如果操作者正确建立了中继和共识节点之间的连接,攻击者就无法通过中继节点到达共识节点。

共识层是 Ouroboros PoS 共识运行的地方。 在这一层中,将对传入的块进行验证并决定是否接受它们。 如果发生分叉,则选择获胜链。 如果它是块生产者节点,则在这里铸造一个新块。 在这一层中,节点维护决策所需的本地状态。 例如,活跃池列表、活跃委托证书列表、所有池的活跃权益等。

账本层维护账本的状态,并在每次接受新块时定期更新它。

共识层不需要知道账本的状态(例如,活跃的 UTxO 集)。 PoS共识只需要验证区块头中的某些字段即可进行操作。 新接收到的块要么被接受,在这种情况下它可以更新账本状态,要么被拒绝。

分类帐
卡尔达诺账本由一系列通过哈希值链接的区块组成。 哈希值是代表每个块内容的唯一标识符。 我们稍后会详细讨论这一点。 我们先来看看这个块是什么样子的。

每个块包含一个标头和一个主体。 标头包含元数据,例如槽号、纪元号、协议版本、区块生产者 ID 和前一个区块的哈希值。 主体包含实际交易和影响账本状态的其他信息。

如果 Cardano 节点通过 PoS 共识接受新区块,则区块主体会更新账本状态。 您可以将其视为在区块链的末尾添加一个新块,本质上也接受其中包含的所有交易。 在下文中,我们将重点讨论账本的不变性。

我们上面说过,区块是通过哈希值链接起来的。 哈希是一种唯一且固定长度的标识符,它是使用加密(数学)函数从块的数据中派生出来的。 整个块,即标题和用作密码函数的输入,该函数产生唯一的 256 位输出。 Cardano 使用的哈希函数称为 Blake2b。

散列的工作方式是,如果您采用相同的输入并将其应用于相同的加密函数,它将始终产生相同的输出。 如果您要更改输入(块中)的哪怕一点点信息,函数的输出将完全不同。

前一个区块的哈希值是区块头的重要组成部分,因为它确保了区块链的完整性和连续性。 随着每个新区块添加到区块链中,更改分类账的历史(即之前的区块,包括其内容)变得更加困难。

通过将前一个区块的哈希值包含在当前区块的标头中,卡尔达诺创建了一个可以追溯到创世区块的区块链,创世区块是网络上创建的第一个区块。

Cardano PoS 共识验证节点收到的块头中的数据。 节点必须决定是否接受该块。 共识验证的块头中的字段之一是前一个块的哈希值。

共识必须保证区块链的完整性和连续性。 如果区块意味着破坏连续性,共识就不能接受它。 例如,如果前一个块的哈希引用不存在或太旧的块,就会发生这种情况。

新铸造的区块有一个序列号(区块号)和铸造它们的槽位 ID。 执行验证的节点很容易决定(基于共识规则)是否通过接受区块来保留账本的连续性和完整性。

在下图中,您可以看到时间被划分为多个时段。 20 秒后,ID 为 1000、1020、1040 和 1060 的槽位中正好生成了新块。您可以看到 4 个块仅包含块头中的某些字段。 绿色箭头显示槽 ID,即槽领导者在其中铸造新块的槽。 时隙领导者已将块号 15、16、17 和 18 分配给块。 红色箭头显示了块之间的链接,即前一个块的哈希值。

例如,无法从分类账中删除区块号为 16 的区块,因为这会破坏连续性。 块号为 17 的块必须指向图像中哈希值由字母 Q 指示的块(Q 是块号为 16 的块的哈希值),而不是其他块。

一个区块的哈希值不仅取决于它本身的数据,还取决于前一个区块的哈希值。 因此,如果攻击者更改了历史中某个块中的任何数据,则该块的哈希值将发生变化,因此必须更改下一个块的哈希值,依此类推。 这将在区块链中创建一个分叉,其中攻击者的区块版本将不会被网络的其余部分接受。

这种情况如下图所示。 攻击者更改了区块号 16 的区块主体。但是,通过这样做,他还更改了该区块的哈希值,该哈希值现在的值为 X。因此,攻击者还必须更改区块号 17 和 18 的区块。 在他的节点上创建了一个分叉。 攻击者可以尝试将网络中的欺诈链分发到其他节点。 然而,其他节点在验证块头中的其他字段后拒绝欺诈链。

接下来,我们将展示网络如何处理分叉。

共识
卡尔达诺网络中的区块链分叉有多种常见原因,而不仅仅是在尝试攻击时发生。 在我们的文章中,我们详细描述了如何铸造和验证新区块。 您还将了解有关节点为验证区块而维护的本地状态的更多信息。 现在我们将重点讨论卡尔达诺如何应对分叉。

然而,首先我们需要谈谈区块的最终性。

卡尔达诺使用中本聪风格的权益证明共识。 中本聪共识能够实现所谓的概率终结。 概率最终性是指在对网络参与者的一些假设下,我们只能估计区块最终性的概率。 这不仅适用于最近添加的块,也适用于之前的块。

对于最后一个区块,最终确定性的确定性是最低的(因此具有不确定性)。 区块越旧,该区块最终确定的确定性就越大。

达成最终共识意味着在未来的某个时刻,所有节点将就某组区块的不变性达成一致。 达成最终共识可能需要很长时间。 而且,无法确定需要提前多长时间。

虽然新生成的块可以被网络中的所有节点接受(如果它通过验证),但另一个池(块生产者)决定该块是否是最终的。 最后一个区块的最终性不是由普通节点投票决定的,而是由随机选择的区块投票决定的-生产者节点。 该节点通过决定在该块之后附加自己的块来增强最后一个块的最终性。

添加的每个附加块都是对所有先前块的最终性的又一票。

在下图中,我们看到 5 个块。 每个区块都是由不同的槽领导者(区块生产者)创建的。 区块 1 最有可能是最终的(但是,我们仍然没有绝对的确定性),因为 4 个时隙领导者投票支持它,并且尚未发生分叉。 相反,我们对区块 6 的确定性最低。区块 5 之后仍然有可能发生分叉。除了区块生产者之外,还没有其他人对区块 6 进行投票。

卡尔达诺网络中出现分叉的原因有多种。 在一个时隙中,可以选出 2 位时隙领导者,他们都独立地铸造了一个新区块(他们彼此不认识)。 可能会出现两个槽位领导者在彼此接近的槽位中当选的情况。 第二个时隙领导者不必从前一个领导者那里接收区块,因此不会跟随最后一个区块,而是跟随前一个区块。 这会创建一个叉子。

在下图中,您可以看到区块5之后Cardano网络中区块链分叉是如何发生的。在时隙1058中,选举了时隙领导者Alice,在时隙1060中,选举了时隙领导者Bob。 Alice在区块5之后铸造了一个新的区块6。后来选举了时隙领导者Bob,因为他没有及时收到Alice发来的区块6,所以他也在区块5之后附加了一个新区块。所以有2个区块号为6的区块。

正如我们之前所解释的,共识规则必须是完整的和确定性的。 协议预见到了这种情况的出现,并且能够轻松应对。 该协议将使用以下链选择规则。

最长链法则。
如果两个替代链具有相同数量的区块,则优先选择最后一个区块中 VRF 输出较低的链。
块头包含节点验证的几个字段。 除其他事项外,共识层还验证 VRF 证明和 VRF 输出,以验证节点是否确实被选为时隙领导者并有权铸造区块。 此外,还验证了 KES 签名。

在下图中,您可以看到与上面类似的场景。 我们添加了 VRF 输出和槽位领导者的名称。 Alice 在槽位 1058 中挖出了区块 6,她的 VRF 输出是 39578。Bob 后来在槽位 1060 中挖出了区块 6,他的 VRF 输出是 28887。他们都在区块 5 之后附加了区块 6,从而创建了一个分叉。

两个区块 6 的最终性都很低并且非常不确定,因为只有一个可以保留在区块链中,而另一个将成为孤块。 在图中,您可以看到另一位槽位领导者 Carol,她在槽位 1080 中铸造了一个区块。对她来说,任务很简单,因为她应用了选择链的第二条规则。

Bob 的模块具有较低的 VRF 输出,因此 Carol 选择了他的模块。 爱丽丝的区块将保持孤立状态,包括所有交易。 共识决定反映在账本层中。

当尝试推送欺诈链时也可能会发生分叉。 攻击者可能会尝试更改账本历史深处某个区块的内容,或者完全丢弃部分区块。

值得注意的是,尽管攻击者可能很容易在其节点上本地创建欺诈链,但基本上不可能将欺诈链强制执行到网络中的其他节点。

老虎机领导者是根据矿池的总权益(即 ADA 币的分配)选出的。 只有当选的槽领导者才能将有效的 VRF 证明和 VRF 输出插入到块头中,并使用签名 KES 密钥对块进行签名。

至于执行欺诈链,本质上是尝试进行 51% 攻击。 为此,攻击者需要一半以上的代币用于质押。 攻击者可能无法直接拥有攻击所需的所有 ADA 币,但可以滥用委托币。

结论
共识本质上只是一组决定账本状态的规则。 密钥演化签名(KES)方案和可验证随机函数(VRF)密码学用于对时隙领导者进行投票并保护账本不被覆盖。 文章中没有明确提及,但用于签署区块的 KES 密钥会定期被删除,这是攻击者试图覆盖卡尔达诺账本历史的另一个重大障碍。

每个节点自主运行并维护自己的账本版本和本地状态。 因此,它知道权益如何逐渐变化,知道所有插槽领导者,可以验证块签名,并知道当前(本地)状态。 攻击者与这一切作斗争。