本章主要介绍什么是巴比伦纪元模块及其运作方式。
epoch用于定义区块链上特定事件发生的时间纪元(era of time),如:
- 激励支付的时间
- 新的验证者组负责验证交易的时间 在巴比伦的架构设计中,epoching 模块负责减少和参数化更新巴比伦验证器集的频率。 巴比伦区块链分为多个纪元,每个纪元包含固定数量的连续区块。 所有与质押相关的消息(创建验证器、委托、取消委托和重新委托)都排队到当前纪元的消息队列。 在每个纪元结束时,纪元模块将执行所有与质押相关的消息,然后更新验证人集,即验证者的投票权分布。 之后,检查点模块将生成一个检查点,其中包含对纪元验证器集的承诺,然后将检查点提交给比特币。
问题陈述
在 Cosmos SDK 中,验证器集可以在每个区块上更改:影响验证人集投票权分配的质押相关消息(例如,绑定/取消绑定、委托/取消委托/重新绑定、削减)可以在任何块中执行。 由于检查点设置为比特币的验证器是巴比伦获得比特币安全性所必需的,因此对比特币的检查点频率必须与验证器集更新的频率相同。如果验证者在每个区块上都设置了更改,那么巴比伦必须在每个新区块上对比特币进行检查,考虑到比特币的区块间隔为 10 分钟,这是不切实际的。 此外,Cosmos 社区还观察到,频繁的验证者集更新使得实现阈值加密、轻客户端、公平领导者选举和质押衍生品变得具有挑战性,如 ADR-039 中所述。 为了降低验证人集更新的频率,一个自然的解决方案是实现纪元机制(又名纪元质押),它将区块链划分为纪元并触发每个纪元的验证人集更新。 时代的概念在ADR-039中提出并正式化,并且已经有多种努力(github.com/cosmos/cosm…,github.com/cosmos/cosm…,github.com/cosmos/cosm…)来实现它。 由于巴比伦有一些额外的设计目标(例如,检查点纪元),并且这些努力已经中断,巴比伦实现了自己的划时代模块。 此外,为了实现可削减的安全性,Babylon必须实现比特币辅助的解绑,其中只有当比特币上的相应区块被检查点时,解绑请求才完成。 使用纪元机制,一个纪元中的所有解绑请求都将在这个纪元被检查到比特币时完成。
设计
Babylon实现了纪元模块,以降低验证者集更新的频率,从而降低比特币检查点的频率。具体来说,时代模块负责以下任务:
- 将区块链划分为多个时代
- 禁用质押模块的某些功能
- 禁用质押模块的消息
- 将与质押相关的消息(因此验证器集更新)延迟到纪元结束
- 释放解绑队列,直到在比特币上检查相应的纪元。
将区块链划分为多个时代
纪元机制引入了纪元的概念。 区块链分为多个时代,每个时代由固定数量的连续区块组成。 纪元中的块数称为纪元间隔,这是一个系统参数。 目前,巴比伦使用900个区块的纪元间隔,大约需要30分钟。
禁用质押模块的功能
Babylon禁用了质押模块的两个功能,即验证人集更新机制和21天解绑机制。 在 Cosmos SDK 中,质押模块处理与质押相关的消息,并更新每个区块上的验证器集。 因此,质押模块会更新每个区块上的验证器集。 为了将验证人集更新的频率降低到每个纪元一次,巴比伦禁用了质押模块的验证人集更新机制。 此外,质押模块执行 21 天解绑规则:解绑验证者或委托将在 21 天后解绑(称为*成熟验证人**)。 Babylon通过采用比特币辅助解绑来脱离Cosmos SDK,该解绑利用比特币安全性来实现可砍的安全性,如果执行安全攻击,则必须砍掉验证器。 为了实现比特币辅助的解绑,巴比伦也禁用了21天的解绑机制。 为了禁用这两个功能,Babylon禁用了质押模块的功能,该功能在区块结束时更新验证器集并解绑成熟的验证者。 相反,在纪元结束时,纪元模块将调用质押模块的函数来更新验证器集。 此外,当一个纪元被检查点到比特币时,纪元模块将调用质押模块的函数,解除绑定成熟的验证者。
禁用质押模块的消息
为了在纪元中间保持验证器集不变,纪元模块通过 AnteHandler 拦截并拒绝影响验证人集的质押相关消息,而是定义它们的包装版本,并在纪元结束时将其解包形式转发到质押模块。
回想一下,Cosmos SDK 模块包含事务中消息的 protobuf 文件。 在质押模块中,这些消息包括
MsgCreateValidator用于创建新的验证器MsgEditValidator用于编辑现有验证器MsgDelegate用于将硬币从委托人委托给验证人MsgBeginRedelegate用于将硬币从委托人和源验证器重新委派到目标验证者。MsgUndelegate用于从委托人和验证人取消委派。MsgCancelUnbondingDelegation用于取消委托人的取消绑定委派
在这些消息中,MsgCreateValidator 和 MsgEditValidator影响验证程序集。 由于巴比伦要求验证器集在一个纪元内保持不变,因此它必须避免在纪元中间处理这些消息。 为此,纪元模块定义了一个 AnteHandler 来拒绝这些消息。 相反,它会在纪元模块中为它们定义包装的版本:MsgDelegate、MsgBeginRedelegate、 MsgUndelegate和MsgCancelUnbondingDelegation。纪元模块随时接收这些消息,但只会在每个纪元结束时处理它们。
将包装的消息延迟到纪元末尾
纪元模块将在每个纪元结束时处理与质押相关的包装消息。 为此,纪元模块为每个纪元维护一个消息队列。 在每个包装的消息上,纪元模块执行基本的健全性检查,然后将消息排队到消息队列。 当纪元结束时,纪元模块将解开排队的消息并将其转发到质押模块。 因此,质押模块接收并处理与质押相关的消息,从而在每个纪元结束时执行验证器集更新。
比特币辅助解绑
比特币辅助解绑是一种机制,只有当包含相关解绑请求的区块被比特币检查点时,解绑验证者或委托才会解绑。 该机制对于实现可砍杀的安全性是必要的,如果执行安全攻击,则必须砍掉验证器。
Babylon通过在纪元变为检查点时调用质押模块来实现比特币辅助的解绑机制。 具体来说,质押模块负责识别和解绑已经解绑了21天的成熟验证者和委托,并在每个区块上被调用。 Babylon 禁用了 per block 的调用,并实现了 epochs 的状态管理。 当一个纪元最终确定时,纪元模块将调用以在该纪元结束之前解除绑定所有解除绑定的验证者和委托。