卡尔达诺清算层的区块

这份指南介绍区块设计和区块处理的逻辑。

区块相关类型在 Pos.Block.Core.Main.Types 模块和 Pos.Block.Core.Genesis.Types 模块中定义。在 Pos.Block.Logic.* 模块中定义了使用区块的逻辑。

设计

区块是账本的基础部分。有两种类型的区块:主块生成块

主区块

一个主区块由主体组成。区块头包含块的元信息:

  1. 指向前一个区块签名的头。
  2. 区块主体信息的验证。
  3. 验证共识算法的共识数据。
  4. 一些额外的数据。

区块主体包含的有效载荷和一些额外的数据也是如此。有效载荷包括:

  1. 转账有效载荷。这个有效载荷是最主要的。事务存储在 Merkle 树中。这个有效载荷也包括见证名单,请阅读卡尔达诺结算层的交易,了解交易和见证的更多信息。
  2. SSC 有效载荷。按照跟随中本聪算法使用 SSC(共享种子计算)。在每一个 epoch 中,必须选出下一个 epoch 的领导者。这些 slot 的领导者将能够生成主区块并加入到账本中。所以 SSC 被用作领导者选举过程的随机来源。
  3. 委派的有效载荷。该有效载荷由重量级代理签名密钥列表组成。请阅读关于卡尔达诺结算层的股权委派获取更多信息。
  4. 更新有效载荷。它包含软件更新的建议和特定更新的选项列表。请阅读更新系统模型获得更多信息。

创世块

一个创始块不包含交易,每个 epoch 我们都只有一个创始块。创始块就像主区块一样,只有一个区块头和一个区块主体。该块的主题包括:

  1. 与该区块相关的 epoch 索引
  2. 这个 epoch 的 slot 领导者列表。该列表不能为空
  3. 链复杂度。他表示生成一个链的复杂度,它是链中主块的数量。

区块处理逻辑

我们根据区块和区块头进行处理。基本上,我们可以:

  • 创建一个区块
  • 验证一个区块
  • 申请块
  • 回滚一个块

以及:

  • 按不同的标准获取块头
  • 给区块头分类

创建区块

如上所述,有两种区块:区块和生成块。主区块由 createMainBlock 函数创建,生成块由 createGenesisBlock 创建。

主区块创建

如果可能的话,我们尝试在最佳链的顶部创建一个新的主区块。如果满足以下条件,可以创建一个新区块:

  • 我们知道 epoch 给定 slot ID 的主区块,
  • 最后一个已知的区块不超过给定的 slot 的 slotSecurityParam 个区块。

slotSecurityParam(实际上是 slot 的数量)的值取决于可被回滚区块的最大数量。这个最大数量来自论文中的安全参数。

首先,我们必须检查我们的软件是否可以根据当前的全局状态创建一个区块,如果不能,我们会报告。如果可以的话,我们创建并应用区块

创世纪块的创建

当当前已知最佳链的头 MainBlock 对应于 slotSecurityParam (i-1)个时期的最后一个 slot 之一时,为当前时期创建一个生成块。

首先,我们试图获得 slot 领导者,如果没有领导者LRC 没有足够的区块,则会报告错误。否则,我们试图创建一个新的创始块。然而有时候我们不应该创建。例如,我们不应该在第 0 个 epoch 做这件事情,因为第 0 个 epoch 的生成块是硬编码的。

区块应用

我们使用 applyBlocks 函数应用区块。区块的顺序应该是绝对有效的:我们必须验证关于块的所有谓词和数据检查。

重要: 在这个序列中的所有区块都必须是相同的 epoch!

如果所有的条件都满足了,我们真正应用区块

而且,我们可以在应用程序之前验证区块(即只有在区块有效时才应用区块)。我们使用 verifyAndApplyBlocks 函数的功能,如果在应用程序发生错误,有两个选项:

  1. 在这个函数中应用的所有区块都将回滚
  2. 这个函数将尝试尽可能地多应用区块

区块回滚

您可以把回滚视为应用程序的对立面:当执行回滚时,应用程序所做的所有修改都将被取消,为此,我们使用 rollbackBlocks 函数的功能。

get the tip?第一个区块将回滚。如果他们不匹配,则报告错误。如果他们匹配,我们实际上回滚区块的顺序为:

区块头分类

区块头部可以分为:

  1. 继续
  2. 可选
  3. 无效
  4. 无用

如果验证成功,则头部为继续:头部是主链的直接延续(即,其服务是我们的 tip)。

如果头部的父亲不是我们的 tip,它不太可能是我们的主链,头部为可选

如果头部链中有任何错误,或者没有对应链中最老元素(应该是检查点之一)的父亲的块,那么头部被视为无效

如果在不同的条件下(例如,头部的 slot 小于或等于我们 tip 的 slot,或者头部与主链不连续,复杂度更大),头部为无用