Understanding block minting in Cardano | Cardano Explorer (cexplorer.io)
在卡尔达诺网络中,只有在给定槽位中随机抽取且其注册证书已存储在区块链中的节点才能创建区块。 必须可以验证新提议的区块是由中奖并获得授权的节点铸造的。 快来了解如何铸造新区块以及如何验证它们。
为什么需要验证区块?
每个公共区块链网络都具有去中心化和安全性要求。 在区块生产的背景下,这意味着必须建立用于选择区块生产者的随机抽签和区块验证机制。
此外,区块链网络是开放的,因此任何人都可以自愿且完全匿名地加入并开始生产区块。 想要故意攻击网络的实体也可以这样做。 因此有必要定义网络运行的规则(协议)。 只要网络中的大多数节点按照(协议)规则运行,网络就很容易消除攻击并定期向区块链添加新的有效块。
当前大多数区块链的工作方式是,在给定时间段内,一个节点生成一个块,然后所有其他节点验证该块。 提议的区块可以被接受(如果有效)或被丢弃。 如果在给定时间段内出现更多块,则必须有一个规则来确定哪个块应添加到区块链的末尾(它将成为最后一个块)。 该规则可以依赖于多个新块的添加(较长链规则)。
区块验证通常包括验证该区块是由中奖节点创建的具体密码证明。 可以验证块头中的附加数据。 例如,验证区块的真实性和完整性。
每个块由标头和主体(内容)组成。 区块的内容也被验证,即交易被验证。 一个块可以有一个有效的头,但如果块的内容无效,则该块也不能有效。 本文主要讨论区块生产,因此我们不会对区块内容感兴趣。 我们只需要块头中的数据。
如果大量独立节点能够附加区块并且攻击者无法以任何方式破坏此过程,则区块链可以被认为是去中心化和安全的。 诚实的节点能够定期达成网络共识。
卡尔达诺如何划分时间
卡尔达诺将时间分为持续 1 秒的时段和持续 5 天的纪元。 一个 epoch 持续 432,000 个插槽。
当在纪元之间转换时,会拍摄所谓的快照。
快照是由积极参与卡尔达诺共识(即区块生产)的节点制作的。 快照是在每个 epoch 结束时拍摄的,记录网络的权益分配和委托状态。
质押者可以在纪元内的任何时间进行委托,因此各个矿池的权益及其数量(新权益池注册)可能会不断变化。 反映变化的状态称为实时权益。 参与网络共识的节点使用快照期间拍摄的状态,这称为主动权益。 快照为系统提供安全性、稳定性和可预测性。
在下图中,您可以看到在纪元之间转换期间拍摄的快照(活跃质押的候选者)。 请注意按 20 秒间隔划分的时隙。 卡尔达诺中的随机性被设置为大约每二十个槽产生一个新块。 有时块之间的时间间隔(时隙数)可以更短,有时可以更长。
在每个节点上,每个时隙都会独立进行私人抽奖。 如果一个节点(或多个节点)发现它赢得了铸造区块的权利,它就成为所谓的槽领导者。 图中用黄色矩形表示。 我们稍后将返回详细信息。
让我们回到那个时代来解释另一个细节。 在下图中,纪元 N+3 正在进行中(绿色矩形)。 最后一个快照是在纪元 N+2 和 N+3 之间的过渡之间拍摄的,但它不用作活跃权益。 在前一个纪元 N+2 开始时拍摄的快照被用作活跃权益。 该快照反映了纪元 N+1(蓝色矩形)的状态。
上一个纪元开始时拍摄的快照中的权益分配和委托状态在当前纪元中用作活跃权益。 换句话说,之前的快照被用作活跃权益。
制定此规则的主要原因之一是,自上一次快照拍摄以来(5天)已经过去了足够的时间,以保证区块链中的块(包括内容)不会改变。
准备节点以铸造和验证块
随机彩票和区块铸造基于卡尔达诺的密码学。可验证的随机函数加密原语用于随机抽奖。 用于签署区块并确保区块链历史的不变性的密钥演化签名方案。
在本文中,我们不会介绍密码学细节,而只会介绍铸造和验证块的实际用途。 我们知道矿池运营商必须创建几个密钥对就足够了,这将使他们能够为矿池注册和区块生产者节点操作创建必要的证书。
每个矿池运营商必须创建以下密钥对:
权益池密钥对(冷密钥)
密钥演化签名 (KES) 密钥对(热密钥)
验证随机函数 (VRF) 密钥对(热键)
权益地址密钥对(冷密钥)
每对密钥都包含一个私钥(签名密钥),所有者(即矿池运营商)必须对其保密。 进一步从可以公开的公钥(验证密钥)来看。 在图像中,签名密钥将显示为红色,验证密钥将显示为绿色。
所有矿池节点都使用签名 VRF 密钥进行私人抽签,并使用签名 KES 密钥来签署新铸造的区块。
在下图中,您可以看到池操作员创建了操作池所需的所有密钥。 他将签名 VRF 和 KES 密钥插入节点的热存储中。 请注意,验证权益池密钥用于权益池标识 (ID)。 签名质押地址密钥用于从奖励账户中提取奖励。
为了能够进行验证,验证 VRF 和 KES 密钥必须可供网络中的所有节点使用。 此外,密钥必须与特定池运营商正确关联。 这是通过 ID(权益池密钥)实现的。 证书用于分发密钥。
所有矿池运营商必须注册矿池并向其中插入(除其他外)验证 VRF 密钥。 他们还必须创建操作密钥证书并向其中插入验证 KES 密钥(也称为操作密钥)。 所有证书均通过卡尔达诺交易分发并存储在区块链中。
在下图中,您可以看到矿池运营商创建了矿池注册证书和操作密钥证书,并将所需的公钥插入其中。 让我们添加两个证书都必须由签名权益池密钥签名。
ADA 持有者通过一对证书(权益地址注册证书和委托证书)将其权益委托给选定的池。 这些证书也存储在区块链中。 委托的 ADA 币增加了矿池的总权益。
在下图中,您可以看到创建权益委托所需证书的用户。 请注意,权益池密钥 (ID) 包含在委托证书中。
在下图中,您可以看到质押者和矿池运营商如何在一个时期内通过交易向区块链提交证书。 证书将保留存储在单独的块中(包括所有验证密钥)。 该图像仅用于说明目的。 一个块可以包含多个证书。 您还可以看到一个快照,它将反映给定时期网络的权益分配和委托状态。
为了让节点准备好验证网络中其他池提出的块,它必须维护包含所有必要信息的本地状态。 节点必须能够快速验证传入的块,而无需在区块链中搜索信息。
节点跟踪一组活跃的权益地址。 跟踪数据包含来自每个权益地址注册证书的权益凭证(密钥或脚本的哈希值)。 节点根据传入块中交易的验证来更新集合。 节点能够验证从奖励账户(每个注册权益地址的一部分)提取权益奖励的交易。
节点跟踪一组活跃的权益池,它们根据验证权益池密钥(更准确地说,密钥的哈希值)对其进行索引。 此外,节点跟踪与操作密钥证书相关的信息,包括表示证书序列号的计数器。 只有计数器编号最高的证书才有效(计数器编号较低的所有旧证书均无效)。
节点跟踪活动委托证书(委托给验证权益池密钥 (ID) 的哈希值的所有权益地址。
为了玩领导者插槽抽签并计算每个时期的质押奖励,节点必须知道委托给矿池的质押量有多少。 这是委托给每个单独的验证权益池密钥(同样是密钥的哈希值)的所有权益地址的总和。
在下图中,您可以看到一个池节点维护本地状态以及验证块(和交易)所需维护的所有必要信息。 请注意,该节点知道所有已注册的池。 它知道其权益池密钥及其总权益的哈希值。 它还了解所有活动的 KES(操作)和 VRF 密钥。
有些集合会不断更新(例如 UTxO 集合随着每个新添加的块而变化),而其他集合则引用之前的快照(活跃权益)。 为了确保所有节点在区块生产方面都处于相同的状态,不能使用实时权益。
下图展示了 epoch 的快照如何成为构建本地状态的基础。 所有证书(以及权益地址的委托)都被放入集合中,以便它们可用于快速块验证。
现在您知道节点需要什么才能铸造新块并验证其他池提出的块。
区块的铸造
想象一下,在前几个插槽中没有选举出插槽领导者。 当前位置的新一轮抽奖现在正在每个彩池上私下进行。 这是一种私人彩票,因为必须使用仅矿池运营商可用而其他人无法使用的签名 VRF 密钥(如果密钥未泄露)。
为了让节点确定自己是否成为时隙领导者,它必须使用 VRF 功能。 VRF 函数将多个参数作为输入并生成 VRF 输出。 VRF 函数的输入是槽 ID(当前槽)、Nonce 和签名 VRF 密钥(存储在节点上的热存储中)。
随机数计算为两个值的异或:纪元随机数和额外熵。 纪元随机数是通过使用前一个纪元中生成的块的 VRF 输出的前 2/3 创建的哈希值。 额外的熵是一个可选值,任何提交带有非空随机数字段的有效权益池注册证书的人都可以注入该值。 额外的熵可用于增加系统的随机性和安全性,或从受损的纪元随机数中恢复。
每个节点上的 VRF 函数都会生成当前槽的随机输出 (Y) 和证明 (⍴)。 节点将 VRF 输出与取决于其总权益的阈值进行比较。 如果输出低于阈值,则该节点被选为时隙领导者,并且可以在该时隙中铸造一个块。
在下图中,您可以看到网络中的所有池如何在给定槽中玩彩票,并将 VRF 输出与阈值进行比较。 节点 7 成为时隙领导者。
大多数情况下,一个slot中只选举出一个slot领导者。 让我们假设在我们的场景中也是如此。 槽位领导者拥有建造区块的权利。 节点必须构造块头并将有效交易插入块体中。
节点将此信息插入到块头中:
区块号,即区块在链中的顺序号。
铸造区块的槽号(槽 ID)。
前一个区块哈希值,即账本中前一个区块头的哈希值。
区块发行者。 它是铸造该区块的权益池运营商的验证密钥。
VRF 输出 (Y) 和证明 (⍴)。
块大小,即块的大小(以字节为单位)。
块体哈希。 它是主体(交易和数据)的哈希值。
操作证明。
协议版本。 它是用于块验证的协议参数的版本。
您可以在下图中看到该块。 不要被比例大小所迷惑。 实际上,块头明显小于块体。 第一步,VRF 函数用于确定给定节点是否已成为时隙领导者。 如果是,则节点将所有必要的数据插入标头块中,并通过签名 KES 密钥(存储在节点上的热存储中)对块进行签名。
已签名的区块已准备好发送到卡尔达诺网络。 该区块将通过中继节点分发到全球所有其他卡尔达诺节点。 其他节点首先验证块头中的信息,如果正确,则继续验证块体。
区块验证
对于节点来说,验证提议的块是一件非常容易的事情,因为它们在活动集中准备好了所有必要的信息(包括加密材料)。
如果满足以下条件,则块将被视为有效。
VRF 结果是一个随机值,它确定权益池运营商在给定插槽中铸造区块的资格。 VRF 证明是一种加密证明,表明 VRF 结果是由权益池运营商使用其 VRF 密钥对生成的。 两者都可以很容易地验证。
要验证传入块的节点需要知道当前纪元的随机数。 这不是问题,因为所有诚实节点都使用相同的随机数(使用相同的过程来获取它)。 节点使用 VRF 验证算法来检查 VRF 结果和证明是否与公共 VRF 密钥(取自活动集)和纪元随机数匹配。 该节点还会检查 VRF 结果是否低于阈值,该阈值取决于提出该块的节点的权益。 如果检查通过,则节点接受该候选块是由有效的时隙领导者铸造的。
值得注意的是,只有具有相同权益池密钥 (ID) 的权益池已注册,此验证才会成功,并且该验证必须最迟在与所使用的快照(活跃权益)相对应的纪元中进行。
验证的另一部分是KES签名检查。 建议的块必须在标头中包含验证密钥证书。 请记住,节点有一个在其本地状态下可用的活动操作密钥证书列表。
区块中的操作密钥证书的计数器不能小于验证该区块的节点的活动集中的操作密钥证书的计数器。
在下图中,您可以看到节点如何验证新到达的块的标头,为此它使用根据存储在区块链中的证书准备的信息。
图中仅显示了有关 VRF 和 KES 密钥的一些验证。 当然,需要验证标头中的所有参数,即块序列号、块大小、到前一个块的链接等。
结论
区块铸造的设计使得除了时隙领导者之外没有其他人可以在给定时隙中铸造区块。 为此,节点需要通过证书在区块链中注册并拥有足够大的总权益。 此外,它必须在给定的 KES 周期内拥有有效的 KES 密钥(用于签名区块的私钥会定期更改,以保护区块链的历史记录)。 用于区块验证的所有加密材料可供区块链中的所有参与者使用。 节点不接受未通过验证的区块。