2021-05-27 13:25

来自未来的科技DFINITY:在互联网计算机上达成共识

安全性和可靠性对于互联网计算机的愿景至关重要。互联网计算机由世界各地数据中心中通过互联网计算机协议(ICP)进行通信的计算机提供动力。通过这种方式的协作,这些机器形成了一个虚拟的互联网计算机。

“安全”是指容器的状态只会根据容器的规则进行更改,并且不能被篡改,“可靠”是指容器不会突然停止运行。

互联网计算机使用一种新颖的共识协议来实现这些特性:不同的机器或副本必须就要处理的输入和以什么顺序达成共识,以使它们保持一致的状态。

另外,我们希望互联网计算机能够扩展,我们可以在平台上以容器的形式运行越来越多的分散式应用程序。为了实现此可扩展性要求,我们将容器分成较小的组,每个组在我们称为子网的网络上运行。

子网由世界各地许多不同的副本提供动力,并且它们都执行在该子网上运行的容器。不同子网中的容器也可以安全地通信。我们总是可以向互联网计算机添加子网,从而增加其容量。

● 为什么共识很重要

只要大多数计算机都能正常运行,任何数量的副本就可能不可用或具有恶意,而不会影响子网的正确状态。这种使用复制获得安全性的方法需要共识协议。子网必须处理不同的消息,即从用户到容器以及从容器到容器的消息。

而且,它们都必须以相同的顺序处理相同的消息,以便所有副本始终以相同的状态结束,但是为子网提供动力的每个副本实际上可能会以不同的顺序看到消息。我们使用共识协议,以便为子网提供动力的所有节点都可以同意要处理的消息的顺序。

我们将通过使用区块链达成共识。子网应处理的消息被分组在一起,并放置在区块中,其中每个区块都指向前一个区块,从而形成了一个区块链。当所有副本都在区块链上达成共识时,就可以实现安全性,从而对要执行的消息进行排序。

我们想要“安全性”、“活跃”、“有效性”,然而困难在于,即使为子网提供动力的某些节点可能出现故障、脱机甚至是恶意活动,我们也要保持这三个属性。

在下面的示例中,我们将经常使用四个节点,这意味着如果其中最多一个是恶意的,我们应该满足这些属性。

我们将放大到单个子网,并了解如何使用区块链达成共识,但是请务必记住,互联网计算机由许多子网组成,因此由许多区块链组成。我们将通过在对等八卦网络之上构建一个共识协议。

我们经常会说副本将“发送此消息”。我们使用八卦网络与子网上的其他副本交换消息。我们还将只关注消息的顺序,我们协议的其他部分将处理这些消息。

我们选择根据互联网计算机的需求来设计共识协议。这个协议包含四个主要部分:

首先,区块制作。这部分创建候选区块,我们可以在其中构建区块链。

其次,公证。这部分负责识别有效的区块,我们可以在其中构建有效的区块链。

第三,随机信标。随机信标将为我们提供一些随机性,可用于进一步增强协议。

最后,最终性。它将告诉我们我们何时真正达成协议。

● 区块制作

子网上的副本可以充当区块制造者,提出一个扩展链的区块。它将具有一些可用消息,这些消息应由在此子网上运行的容器处理。

它可能有一个达到一定高度(例如29)的区块链。它收集等待处理的消息,将它们分组为一个区块,并通过在此八卦网络上将其发送到其他副本来建议对区块链进行扩展。

即使某些参与者实际上行为不当,我们也希望该协议能够正常工作。因此我们不能选择一个单一的区块制造者来扩展区块链,因为这个区块制造者实际上可能是恶意的,而且我们可能会被困住,我们必须有许多副本充当块制造者。

● 公证

为了解决这个问题,我们有一个经过公证的流程,该流程可以轮流工作,并且每轮都确保我们至少有一个可以扩展区块链的有效区块。

例如,假设副本1具有经过公证的区块链,高度一直到29。如果现在看到一个区块将区块链扩展到高度30,它将验证该区块。

如果副本1看到此区块有效,则可能在其上放置一个加密签名,我们将其称为“公证份额”。公证份额将发送到其他副本和子网,表示副本1认为这是一个好区块。

也许副本3和副本4也可能在同一区块上创建公证份额。让我们定义四个副本中的三个是足够的批准。请注意,在这种情况下,四分之三是我们希望获得的最高批准百分比,即使其中一项说明出现问题或脱机,协议也应取得进展。

我们将这三个公证份额合并为一个虚拟制品,我们将其称为公证,这意味着区块30已公证。公证人现在将进入下一个回合,并开始在31号高度寻找区块。

对于这些公证份额,我们使用称为多重签名的特殊签名。

即使我们有一个包含许多公证人的非常大的子网,该公证工作仍将是一个很小的工件。

公证并不总是像刚才描述的那样工作。为了满足活性,公证人现在将实际对两个区块进行签名,并确保至少其中一个将以这种方式进行公证。这意味着我们可以在一个高度上获得多个经过公证的区块。

● 随机信标

区块制造者和公证人可以识别有效的区块,但是我们尚未达成共识,因为在每个高度上可能都有多个经过公证的区块。因此,我们所看到的可能看起来像是由许多有效区块组成的树。

为了最终在区块链上达成协议,我们将通过在协议中添加一些内容:随机信标,来减少每轮获得的经过公证的区块数量。在每个高度,都有一个看起来像是虚拟的随机数,我们称其为随机信标,是一个不可预测的值。

副本可能在高度29处有一个随机信标,并且当第二十九轮的公证过程完成时,它决定是时候创建下一个随机信标了。它将在先前的随机信标值(我们称为随机信标份额)上创建一个特殊签名。这是我们通过八卦网络共享的另一个工件。

如果现在获得另一个随机信标份额,则可以合并这些份额以构造下一个随机信标值。我们通过使用特殊签名(即阈值BLS签名)来做到这一点。

但是,它们也是不可预测的,因为副本无法自行构造该值。这些阈值BLS签名需要特殊的密钥材料,其中各方之间共享密钥,我们通过称为非交互式分布式密钥生成的协议进行了设置。

现在我们有了这种常见的随机性,我们将使用它来对每一轮的区块制造者进行排名。

例如,使用我们在第23轮中创建的随机信标,我们将在第24轮中对区块制造者进行排名。在第24轮中,我们可以同意副本1是最高优先级的区块制造者(即,排名为0的区块制造者)。

我们仍然需要回退,因为副本1可能无法正常工作。例如,副本4可能会被选为第1级区块制造者,这是第一个后备者。如果这不起作用,则副本3是第2级区块制造者。

最后,副本2是不得已的方法。由于随机信标具有共同的随机性,因此所有复制品均同意区块制造者的这种排序。

现在我们将使用该区块制造者排名来进一步增强公证行为。当公证人进入回合时,它将启动一个计时器。在计时周期开始时,它只是希望由第0级区块制造者为该区块创建公证份额。

只有在一定时间后失败,公证人才会退回到第一级区块制造者的区块提案中。再经过一段预设的时间后,它将进一步下降到2级或3级区块制造者。

我们的目标是减少每轮获得的经过公证的公证件的数量。让我们看一个例子:副本1在第30轮中,它收到一个有效的高度建议为30的区块建议,但它只是排名1的区块制造者。

它要等待,因为它尚不愿意对等级1的区块进行签名。如果一切顺利,它现在可能会从第0级区块制造者那里收到一个区块建议。现在,公证人在此区块上而不是在等级1区块上创建公证份额。

现在,在某些回合中我们可能仍然有多个经过公证的区块,但希望在大多数回合中,我们仅从第0级区块制造者那里获得一个经过公证的区块。实际上,如果只有一位公证人,那么我们已经达成协议。

因为每一轮中必须有一个有效的公证区块链,并且如果只有一个候选区块,那么经过该点的每一条链都必须经过该区块。因此,实际上必须商定该区块所隐含的链。

● 最终性

挑战仍然存在:我们如何知道我们已经达成协议?复制品如何知道它们可以接受链?一种选择是让副本仅等待一段时间,并假设在此时间段之后它将看到所有已公证的区块,并且如果仅一个高度的公证区块,则认为该链是同意达到这个高度。

然而这是一种冒险的方法。也许网络无法正常运行,实际上还有其他一些我们尚未看到的经过公证的模块。这意味着如果我们没有等待足够长的时间,则可能会违反安全属性。

我们通过使用不同的机制来遵守协议来避免这种折衷。

现在,我们将让公证人分享一些有关他们公证的区块的信息,如果公证人没有为该轮在该轮收到的第一个经过公证的区块以外的区块创建任何公证份额,它将创建另一种类型的签名,我们称之为最终份额。

副本1的高度30区块上的最终份额从本质上讲意味着副本1没有公证签署除此高度以外的任何高度30区块。这是另一个将散布到其余子网的工件。如果足够多的副本还为同一区块创建最终份额,那么我们可以将它们聚合为一个终结。

每当我们在区块上看到这样的最终确定时,我们都知道我们可以信任区块链,因为最终确定证明了在那个高度上没有其他经过公证的区块可以存在。

如果网络运行良好,这意味着我们实际上可以很快在区块上达成协议,因为我们可以快速创建这些最终份额并在区块链上达成协议。

而且我们没有受到网络攻击的风险。即使网络运行不正常,我们也知道我们是安全的,因为我们仅依赖签名,而不依赖于已经看到所有消息的假设。

总之,我们有一个由四个部分组成的共识协议。区块制造者创建候选区块以扩展区块链。我们有一个公证过程,可确保识别出有效的区块。然后,我们添加一个随机信标,用于对区块制造者进行排名,并减少每轮获得的经过公证的区块数量。最后,我们使用异步终结机制,该机制使我们知道何时真正同意区块链,而不必完全依赖网络假设。

这个共识协议使我们能够在子网内使用复制,从而实现了互联网计算机所需要的安全性和可靠性。

本文链接:https://www.8btc.com/media/6641656
转载请注明文章出处

评论
登录 账号发表你的看法,还没有账号?立即免费 注册
下载
阅读
分享
评论
点赞
上一篇
下一篇