Cardano多元宇宙

如何以最有效的方式处理Cardano的短命分支。
Milkomeda很高兴开源Multiverse,它是一个多平台的库,专门用于处理Cardano的短时回滚(短时分支)。

Cardano的共识
Cardano使用一个加密工具来确定谁将在一个给定的时段创建一个区块:可验证的随机函数(VRF)。本质上,它是一种加密方案,用于生成随机数,并能够证明该数字是随机生成的。有趣的部分是如何将其用于Cardano。Cardano将时间划分为纪元。每个纪元有432,000个时段,每个时段持续一秒钟。每个槽是一个赌注池提交区块的机会,并识别赌注池是否被选为提交区块。对于一个特定的时段,他们使用VRF(他们的机会与总赌注成正比)。区块时间表对每个赌注池来说是私有的。

有三种情况会发生。

  1. 没有人被允许为这个时段创建一个区块。

  2. 2.只有一个人被允许为这个时段创建一个区块。

  3. 许多人被允许为这个槽位创建一个块。

前两种情况很容易,而后一种情况可能会产生冲突,在这种情况下,网络将不得不决定采取哪种分支。现在节点已经有一个算法来做这个决定,但正如你看到的,这已经产生了一些问题。

此外,区块传播可能会遇到问题。一个桩池有一秒钟的时间来接收最新的区块,创建新的区块,然后将区块传播到整个网络中。之所以出现这种情况,是因为在一秒钟结束时,可能会创建一个新的区块,他们会想确保该区块是参考他们的区块。

有哪些解决方案?
网络会做出决定。然而,可能会出现这样的情况:我的本地节点做出的决定不是网络做出的决定。如果出现这种情况,我的本地节点将检测到它已经偏离了网络关于采取哪个分支的共识,并将进行 “回滚”。如果你像我们一样使用cardano-db-sync,这意味着你将经历一个暂停,同时它从被放弃的分支中删除信息,并应用新的新选择的分支的块。

当这种情况发生时,你可能会感到有点恼火,因为一些数据已经从你的数据库中被删除了,你必须在设计你的代码时考虑到不确定性。通常情况下,你通过在确认数据库中的某个对象之前应用一个延迟来做到这一点。

这就给每个依赖这个工具的人造成了延迟。我可能用一些UTxO作为输入创建了一个交易,而当我的交易到达网络时,这些UTxO将是无效的,因为我犯了一个错误,没有等待达到10个区块确认交易所需的3到5分钟。

我们可以做得更好。我不应该等待三到五分钟才对我的交易得到确认有足够的信心。我也不应该担心索引器在应用回滚时要暂停。事实上,通过Milkomeda基金会,我们提出了一个催化剂提案,以设计和实现一个更好的算法来处理短命的分支。多重宇宙"。

多重宇宙
多重宇宙是一个工具,可以跟踪区块链的每个分支。时间线的每一个变体。事实上,它相当简单。诀窍是不要把区块链看成是一个区块的链接列表,而要看成是一棵树(这就是为什么我们把这些分叉称为 “分支”)。理想情况下,这些分支是短暂的(最多几个区块),只有一个分支是持续增长的。

现在,我们不希望在内存中维护整个区块链和所有分支。因此,我们给自己设定的第一个要求是只管理一个给定的窗口。

我们确保这个视图足够大,以处理区块链的不稳定性。在这个视图之外,我们假设发生分叉的可能性接近0。

让我们来定义一些概念。

顶端是没有任何子块的区块。
根部是父块已经被垃圾回收的区块(它们落在了视图之外)

将一个新的块作为子块添加到其中一个提示中,可能会触发视图向右滑动:根部会落在视图之外,并会被垃圾回收。

现在我们对区块链的头部有了一个看法,我们可以开始添加对我们有用的不同工具。

在编写Milkomeda桥时,我们需要跟踪我们控制的UTxO,但不一定是所有的区块。因此,我们不是为每个区块存储整个区块链的状态,而是简单地存储账本的一个子集。每个快照包含我们在该时间点控制的UTxO列表。


我们考虑过将这些存储在数据库中。然而,要有效地表示两个给定分支之间的不同状态太难了:如果我们处于状态s7而不是s7’,一些UTxO是可用的。于是我们决定把这些保存在内存中会更有效率。天真的方法是使用一个HashMap。UTxOPointer → UTxO。很快,这种方法就开始使用大量的内存。事实上,对于每一个新的区块,我们都在复制父块的状态,然后删除/添加UTxO,以便创建新的状态。

幸运的是,有一种数据结构非常适合这种情况。Hash Array Mapped Tries(HAMT)。一些操作可能会慢一点,但空间上的收益基本都会增加。这种数据结构的优点是在两个副本之间共享内存。因此,在两个副本中添加和删除条目将突变本地副本,但又保持交叉点共享。

这是存储两个区块之间状态的最优化方式。我们只需支付两个区块之间的差异成本。

应用
钱包
可以利用多元宇宙的优势,比起等待区块的加入,更快地确认一笔交易。现在,我们正在监控区块链的所有分支,我们可以检查我们的交易是否在所有这些分支上。例如,两个竞争同一个区块的矿工可能已经在他们各自的区块中添加了我们的交易。

如果我们的交易,T,在以下所有可能的分支上,那么我们的交易很可能在链上得到确认。

或者

探索者
区块链资源管理器中经常缺失的一项内容是,无法识别已被驳回的区块。能够看到网络目前的表现,并在发生(或已经发生)时监测分叉,将证明区块链的稳健性。用户将能够理解,为什么刚才还在探索器上的交易,现在已经被删除。桩池运营商将能够理解为什么他们的区块被网络驳回。