白皮书解读: Supra 预言机协议——DORA
SupraOracles
2023-08-26 10:30
订阅此专栏
收藏此文章

以下是 DORA 白皮书的解读版本。如需更详尽地了解分布式预言机协议说明,请点击文章末尾原文链接下载白皮书完整版。



写在前面

什么是预言机?为什么需要它?

简单说,预言机是一种将区块链与链外世界连接的机制。区块链是由不可变状态转换序列产生的一个确定性封闭计算机环境,所谓确定性是指这台计算机的每个指令在给定相同输入时产生相同输出。该确定性是计算机里的一个抽象概念,由底层许多运行共识协议的计算机网络实现,以保证指令的顺序和结果。
从非确定性到确定性
在以上描述的计算机封闭环境中,我们能够执行指令“获取特币现货价格”:getCurrentPrice("BTC") 吗?
不能。为什么?因为这个指令的输出是一个变量,会根据执行该指令的时间以及价格获取的来源而产生变化。这是区块链环境里的一个致命问题,因为它违反了其确定性这一基本特性。
解决该问题的方式之一是把补充详细说明作为输入提供给指令,例如,我们执行一个指令,像是 getPrice("BTC","SomeExchange","11:59:59 UTC 7 Dec 2022")。在这个指令中,我们明确指定了应该在什么时间从哪里获取价格。但即便是可以运行,我们还是需要考虑其他潜在问题。
存档
我们设定:无论何时执行该指令,都会获得相同输出。假如我们打算在十年后执行此指令,但指令中提到的“SomeExchange”没有了可用数据怎么办?或者说这些数据发生了损坏怎么办?
实际上我们需要一个可靠且不可变的存档,这样一来即便我们在十年后执行此指令,仍能获得完全相同的输出。因此,我们可以在区块链里设定一个指令:putPrice(CommodityCode,source,time,value),意思是在指定时间从数据源获取 CommodityCode 的值并将其存储在区块链中,以便未来永续的安全检索。
真实性
那么,存档后还有一个问题,我们怎么确认这个值是在指定时间从数据源获取的呢?如果数据源本身有指定时间的数字签名并证明了 CommodityCode 的价格值(value),那该问题就解决了(确实有某些预言机方案就直接采用了这类方式)。
然而这种方式也有弊端,因为并非所有信息源都会对其数据进行数字签名并将其放入区块链中,而且仅仅因为数据源对其数据进行了签名也并不意味着签名数据实际上就是准确的。
为了彻底解决这个问题,我们就需要引入一组实体节点,并加盖真实性的印章,以验证该值 value 确实是 CommodityCode 在数据源和相对应时间的价格。
 聚合
当存在多个交易所和信息源时,同一个商品可能没有单一的真实价格,但许多区块链应用和智能合约需要一种商品价格的单一值。在这种情况下,我们就需要将多个信息源的价格聚合成一个单一的代表性价格。

最后言归正传,什么是预言机?简而言之,预言机是一种机制,以确定性的方式从多个信息源获取信息,并将经过认证的真实代表性信息放入区块链中,以便现代区块链应用和智能合约可以使用这些信息。

01

                 什么是 DORA 

(Distributed ORacle Agreement)?

当存在多个没有对其数据进行签名的信息源时,我们需要一种机制将所有这些信息聚合成一个单一的代表性值,并将其放入区块链中,同时使其具有一定的拜占庭容错性。拜占庭错误是指节点存在故障,要么无响应,要么可以恶意违反协议。
在没有任何拜占庭错误的情况下,只需要一个单一的节点从多个信息源中获取信息即可;但在拜占庭错误情况下,我们将需要多个节点。
当所有节点都能提供一个值作为输入,那么当其中一些节点是拜占庭节点时,其余诚实节点会达成一致并选择一个单一的代表性值而向其发起挑战,该过程被称为 DORA(分布式预言机协议)问题。正式来说:
DORA 协议有 N 个节点(P1,P2,...Pn),每个节点都有一个输入 V(i), 并被给予距离 D, 协议保证:
  • 【终止】:所有诚实节点最终会就某个值达成一致;
  • 【一致】:所有节点的输出值 S 都是相同的;
  • 【有效性】:Hmin≤S≤Hmax,其中 Hmin 和 Hmax 分别表示来自诚实节点的最小值和最大值。我们将 DORA 的输出值称为 Supra-value、S-value 或 S。
代表性值

需要注意的是,我们不仅要求所有节点收敛到单一的值,而且它必须是一个代表性值。上述提到的有效性属性说明了 S 应该在诚实节点的最小值和最大值之间的某个位置。

那么如何在此之间设定一个具备代表性的值呢?
有人可能认为取所有值的平均值是创建代表性值的一个好方案,但问题是我们并不知道哪些是拜占庭节点,哪些是诚实节点。在计算平均值时,相比于所有诚实值的任意平均值,如果有一个拜占庭节点从中渗入便可造成明显偏差。而取中位数则是一个比较理想的替代方案,因为它是一种统计聚合器,可以容忍高达 50% 的数据损坏。

即使有多达 1/3 的拜占庭节点存在,上述有效性属性所提供的保证是目前为止所能提供的最优保证。请参阅 DORA 白皮书以获取关于此的正式证明。

02

Supra 的预言机架构

什么是 SMR?

通俗的说,SMR(状态机复制)提供了一个排序服务,以便发送到该排序服务的任何消息都能成为总体顺序的一部分,而当节点从中读取消息时,也可以完全相同的的总体顺序进行读取。

Tribe & Clan 部落 - 氏族架构

一个部落是一组节点。只要拜占庭节点数少于所有节点的 1/3,这个部落就可以继续安全运行并提供相应的服务。
从一个部落中,我们均匀随机地选择一定数量的节点,并放入子集 --氏族Clan) 。每个氏族都是以这样的方式选取的,并且一个氏族中一半或少于一半的拜占庭节点可以忽略不计。我们的 DORA 协议被设计成在正常情况下,只需要一个氏族来计算并就一个 S-value 达成一致。这意味着 DORA 可以以较少数量的节点运行,并且可以承受更大比例的拜占庭节点。

商品分片

预言机服务提供商需要为许多不同的商品提供代表性值,如 BTC/USD、ETH/USD 等。由于我们只需要一个氏族来运行 DORA 协议,因此能将不同商品值责任平均分配给不同的氏族。例如,在需要聚合并为 100 种不同的商品提供 S-value 的情况下,如果我们有 4 个氏族,那么每个氏族就会被分配计算 25 种商品的 S-value。

03

 DORA 协议

现在,让我们来看看 DORA 协议是如何运行一个轮次的。

数据收集

每个氏族的节点会被分配一组数据源,以获取商品价格的值。如上图所示,每个节点从多个数据源获取数据。为什么这样做呢?嗯,只有当一个氏族里的拜占庭节点少于 1/2 时,氏族才能正常工作。假设,我们的氏族中有 51 个节点,其中 25 个已经变为拜占庭节点,但服务还可以正常进行。现在,想象一下,每个节点只从一个数据源获取数据会怎么样?

如果数据源变为拜占庭节点怎么办?即使是一个诚实的节点,如果它从拜占庭数据源接收数据,也会表现出拜占庭行为,俗称“垃圾进,垃圾出”。因此,明智的做法是不仅仅依赖于单一信息源。在 Supra 的设计中,如果希望抵御 f(d)个数据源的故障,那么我们要求每个节点至少监听 2fd+1 个数据源,以获取商品的价格。

还要注意,多个节点会从每个数据源获取数据。为什么要这样做呢?想象一下,现在的情况是数据源是诚实的,但节点是拜占庭节点,在计算 S-value 时,诚实数据源提供的价格可能会被忽略,这就是为什么我们确保存在多条路径,以保证数据源信息会在计算中被传递。现在,我们还需要探讨一个更微妙的问题。

例如,如果总共有 10 个数据源,每个节点至少监听 3 个数据源,那么我们怎么能确保来自每个数据源的价格会被纳入最终计算?如果所有节点都在监听前 3 个数据源,没有人监听剩余的 7 个数据源怎么办?为了避免这种情况,我们通过VRF(可验证随机函数)将数据源分配给节点,通过这种方式,可确保所有数据源都会被节点监听,且监听节点数大致相同。

 DORA 节点级别的聚合

当一个节点从多个数据源接收到价格后,它会计算它们的中位数。这个中位数值保证会落在诚实数据源的最小值和最大值之间。因此,只要一个节点从诚实数据源接收到多数价格,它计算出的值将会受到诚实值的限制。

聚合器的角色

一旦某个节点计算出一个值,我们就需要采取某种方式让整个氏族就该单一值达成一致。由于不同的节点正在监听不同的数据源集,不同节点计算出的值也会有所不同。在这里就体现出了聚合器的作用,因此我们将在部落中指定一组节点作为聚合器。

氏族的节点会对其值进行数字签名,并发送给聚合器。实际上,我们只需要一个聚合器将氏族节点的所有值合并为一个单一的值。由于不知道哪些节点是拜占庭节点,因此我们将随机从部落中选择一个聚合器家族,以确保家族内在很大概率上至少存在一个诚实的聚合器。

聚合器的作用是将所有节点的值合并为给定商品价格的一个单一代表性值。需要注意的是,几乎有一半的氏族节点可能是拜占庭节点,他们可能永远不会将自己的值发送给聚合器。因此,我们知道一个诚实的聚合器会期望接收到至少 fc+1 个值(其中 fc 是大小为 2fc+1 的氏族中最大的拜占庭节点数)。

假设它首次等到 fc+1 个值,就能提议将这些值的算术平均作为 S-value 吗?不能,因为聚合器不能确定所有这些 fc+1 个值都来自诚实节点。一个希望操纵 S-value 的拜占庭节点可以发送一个任意大的值,并且由于不可预测的网络通信延迟,这个值可能会提前到达而被包括在 fc+1 个值的集合中。算术平均值可能会因为包括了这个单一的不诚实值而变得任意大。

那么,中位数是否有效呢?显然不是。在一个大小为 2fc+1 的氏族中,最多有 fc 个节点可能变为拜占庭节点。因此,如果聚合器等待首个 fc+1 个值来计算 S-value,那么最多 [(fc+1)/2] 个不诚实值可能出现在这个 fc+1 个值的集合中。

即使在最坏的情况下,最多有 fc 个值中的 fc 个可能是拜占庭节点,因此我们需要保证其中至少有一个诚实的值。在第一个接收到的 fc+1 个值中计算均值或中位数的问题在于,与诚实值相比,不诚实的值可能会任意大或任意小。我们可以通过要求即使在最坏的情况下有一个诚实的值,并把这个值作为锚点,然后将其他值固定在一起,使得其他值即使是不诚实的,也无法任意偏离诚实值。

这就是协议距离 D起作用的地方。

协议距离 D

给定一个协议距离 D,我们称两个值 v1 和 v2,如果 |v1–v2|≤D,也就是说,如果两个值的差值小于等于协议距离,那么它们被认为是相互一致的。

如果一个值集合 CC 满足 ∀v1,v2∈CC:|v1–v2|≤D,我们称之为一个一致的聚类。换句话说,一个一致的聚类是一个值的集合,其中该集合中的所有值相互之间是一致的。

在协议距离 D 的基础上,我们将所有的 fc+1 个值锚定起来,以确保它们彼此之间的距离不会太远。与其要求聚合器等待它接收到的第一个 fc+1 值集合,我们要求聚合器等待直到看到一个大小为 fc+1 的一致聚类值集合。这种变种的 DORA 被称为 DORA-CC(带有一致聚类的分布式预言机协议),其形式定义如下:

在具有输入 V(i) 的 n 个节点 p1、p2、…、pn 之间的 DORA-CC 协议,给定的协议距离 D 下,保证:

  • 【终止】:所有诚实节点最终会就某个值达成一致;

  • 【一致】:所有节点的输出值 S 都是相同的;

  • 【有效性】:Hmin–D≤S≤Hmax+/mathcalD,其中 Hmin 和 Hmax 分别表示来自诚实节点的最小值和最大值。

另外我们如何保证能够始终形成一个大小为 fc+1 的一致聚类?嗯,其实是没有绝对的保证。我们观察到在正常情况下,来自不同数据源的给定商品价格非常接近。因此,如果我们将协议距离 D 设置得足够大,以便在正常情况下来自诚实数据源的值在自身之间是一致的,那么就可以形成一个 fc+1 值的一致聚类。至于异常情况,我们稍后再讨论。

投票和值的发布

一旦形成了一个一致的聚类,剩下部分就容易了。因为我们知道任何偏差都受协议距离的限制,所以可以安全地计算聚类的算术平均值。

聚合器将均值以及由节点签名的值发送到所有氏族节点进行验证和批准。对于聚合器来说,将值的聚类和均值发送给氏族中的所有节点验证而不仅仅是贡献到聚类形成的 fc+1 个节点这一步骤是至关重要的,不然如果有一个拜占庭节点贡献到了聚类,它可以通过不投票而影响协议的进展。

因为有数字签名,每个节点都可以验证这些由氏族节点贡献的值,他们还可以验证这些值的集合也确实在协议距离内形成的一个聚类,并且聚合器发送的均值确实是聚类的均值。由于氏族至少有 2fc+1 个节点,我们确保会收到至少 fc+1 个批准票,从而允许聚合器形成法定证书,一旦法定证书形成,均值就会被发布在 SMR 上给定协议轮次的 S-value 中。当所有诚实节点看到该轮次的 S-value 被发布后,结束本轮次。

那现在就万事大吉了?还没有,请记住,所有这一切只在我们处于正常情况下才有效,即大多数数据源的值彼此相近。当情况变得不稳定时,即使是诚实节点的值也可能不足够接近形成一致的聚类。

那么我们该怎么办呢?嗯,当你觉得你无法赢得一场战斗时,你就会撤退。
04

 Fallback 备用协议

发起备用

那么,是哪些节点决定何时退回呢?是所有的节点。所有氏族节点在将值发送给聚合器后将立即启动备用计时器。当情况变得混乱时,比如任何聚合器可能都无法形成大小为 fc+1 的一致聚类时。

最终,备用计时器会耗尽。当节点的计时器耗尽时,它会向所有聚合器发送一个备用投票。最终,我们会有一个至少有 fc+1 个备用投票的聚合器,允许它为备用形成法定证书,并将其发布在 SMR 上。在 SMR 上观察该轮次的备用消息的任何节点都会切换到备用协议。

备用协议

我们知道事情有些不稳定,这就是为什么我们决定退回的原因。那么我们该怎么做呢?我们将采用超级重量级的方案!在这一点上,我们让整个部落参与计算 S-value。

备用协议与之前的协议非常相似。部落节点从数据源收集数据,计算从它们收到的价格集合中的中位数,进行数字签名并将其发送给聚合器。

不同的是,我们已经知道目前处于一个无法形成一致聚类的情况。因此,聚合器现在等待前 2ft+1 个部落节点发送它们的值。在这里,我们假设部落大小为 3ft+1,最多可能有 ft 个节点变为拜占庭节点。在 2ft+1 个值中,至少有 ft+1 个值必须是诚实节点。因此,我们现在使用这些值的中位数,因为我们知道中位数将受到诚实值的限制。

剩下的部分遵循熟悉的轨迹。聚合器将此中位数作为该轮次的 S-value 提出,以及它收到的 2ft+1 个数字签名值的集合。部落节点验证并将它们的批准投票发送回聚合器,聚合器使用 2ft+1 个票形成法定证书,然后将其发布在 SMR 上。

为什么我们会有多个聚合器?

让我们考虑一个只有一个聚合器的模型。假设在这个聚合器恰好是拜占庭节点的情况下,由于需要大多数氏族节点验证和投票支持聚合器计算的 S-value,该聚合器无法发布错误的 S-value。但,该聚合器可以通过不发布 S-value 或者不将协议达成的 S-value 提交给 SMR 以进行正常运作。因此通过多聚合器模型,可确保在聚合器集合中至少有一个诚实的聚合器来规避这个问题。

当我们有多个聚合器可以在 SMR 上发布 S-value,哪一个会被计算?答案是第一个!

如果值是由一个拜占庭聚合器发布的呢?这并不重要。聚合器无法伪造任何诚实节点的签名。因此,发布的 S-value 仍然是:1)要么距离诚实值最远的值 2)要么在两个诚实值之间。

需要注意的是,最远的协议距离可以允许与诚实值更大的偏差。在实践中,协议距离可以非常小,可保持在小于或等于在正常情况下诚实数据源之间能观察到的偏差,以确保我们可以在正常情况下形成一致的聚类。

DORA启动期

您是否注意到单轮协议没有依赖之前的任何轮次?事实上,我们可以很巧妙的利用这一点。

我们可以为新一轮的 DORA设定一个时钟,规定在两个时间值里我们所希望的 S 值发布频次。在现实情况中,可以每隔几秒钟开始一轮新的协议,因为可以在不等待之前的轮次结束的情况下启动新的一轮。

网络延迟就像天气一样不可预测。由于氏族节点之间通信的异步性质,轮次的值可能会不按顺序发布。例如,第 4 轮的值可能会出现在 SMR 上第 3 轮的值之前。实际上,第 4 轮会携带一个更新鲜准确的值,因此在第 4 轮值可用之后,来自第 3 轮的信息可能没有任何用处。基于这个假设,我们可以在一些不必要的计算和通信上节省资源。

因此,出于某种原因,如果较早的轮次需要更长时间才能结束,后面轮次得到的 S 值在 SMR 上可用后,即可终止之前较早的轮次。这样,节点就不必浪费资源和带宽来尝试结束可能没有任何价值的旧轮次。
05

异常检测

断路器

许多股票交易所和加密货币交易所都采用该机制,即在价格剧烈波动时冻结交易


电路断路器是其中一个比较受欢迎的机制,其基本功能非常简单。

设 Sr 表示第 r 轮的 S 值。当 Sr 相对于 Sr−1 偏离超过由阈值 thr 定义的一定百分比阈值时,电路断路器函数 |Sr–Sr−1|Sr−1≥thr 将触发并中断电路(或停止交易)。

历史一致性检查

但以上电路断路器方案也有不足之处,它仅查看前一个 S 值,以确定偏差是否有点失控。当我们想回顾之前数据作趋势判断时就束手无术了。

如果我们查看给定历史窗口 Wh 中的所有 S 值,可根据上图所述提出一个广义的公式。就像 thr 是电路断路器的参数一样,Ch 是一个常数参数,用于控制允许的偏差程度。

上述历史一致性检查函数的好处之一是它包含了历史 σh 的标准偏差。想象一下,由于某种原因,S 值继续迅速上升。虽然人们可能会在初始轮次中认为这是异常现象,但如果这种上升状况持续下去,σh 会自动增加以将其分类为正常。同样地,当 S 值表现出较轻微的波动时,σh 会自动缩小区间。这种通用且灵活的函数可以在各种商品中广泛使用,无需对参数进行精细调整。

例如,流行的加密货币往往保持相对稳定,而不那么流行的加密货币往往波动剧烈。这意味着,在使用上述电路断路器函数时,阈值参数可能需要根据不同货币进行微调,否则可能会出现在正常情况下冻结交易的现象。

我们不必局限于仅使用这两个函数。一旦 SMR 上的 S 值可用,便可以采用各种异常检测技术,例如使用卡方检验或其他统计检验方案来检测统计异常。如果我们在链下处理期间使用这类函数,我们会有很大的选择性。然而,如果这种检测是通过智能合约在链上进行的,那么我们必须考虑执行任何异常检测测试所需的计算量和存储成本。

交叉关系

许多市场商品之间存在关联,因此一个商品的任何变化可能会影响相关商品的价格。例如,假设 x 表示 BTC/USD,y 表示 ETH/USD,z 表示 BTC/ETH。很容易看出,理想情况下,我们会有 x–y=0。

当然,在实际中,我们会有 x–y/z≤Dr,其中 Dr 是某种关联距离,当我们检测到 x–y/z > Dr,就表示检测到了异常。这种多变量分析是我们在法证分析中的重要工具。如果我们将这三种商品分配给不同的族群,对手就必须足够强大,强大到能够控制三个族群以逃避任何检测。

未来,我们计划利用不同商品间存在的这种交叉关联来进行实时异常检测。


随机化
如果预言机网络的配置在长时间内保持不变,可能会出现节点串通现象,并以此攻击我们的预言机服务。

然而在 Supra,我们提出了一种解决方案,引入各种创新随机化技术,把节点操纵这类攻击现象降为最低。

在前文有提到,数据源分配给族群节点是通过 VRF 完成的。我们还提议通过 VRF 对商品与族群之间的映射进行随机化。每个族群负责跟踪一组商品的价格,这些商品是从整个商品集合中均匀随机选择的。

在我们称之为周期的预定时间段结束时,从商品到族群的这种映射会被重新绘制,这在很大程度上降低了攻击者选择其特定商品和时间段而进行不正当操纵的机会。

尽管轮换会定期改变族群的责任,但构成该族群的节点不会改变。让族群配置长时间保持静态对攻击者有利。因此,在协议中预定的一段时间(我们称之为“时代”)结束后我们将会对整个部落进行洗牌式重组,也会重新设置族群。这种对节点进行洗牌式重组模式可以从根本上降低攻击者控制一个族群的可能性。

概率安全性和活性

在每次洗牌时,协议会均匀地从部落中随机选择族群。由于部落可能有多达 1/3 的拜占庭节点,并且一个族群的拜占庭节点要少于 1/2,我们需要确定部落的大小和部落中的族群数量,使得任何一个族群拥有拜占庭多数的概率可以忽略不计。

例如,如果部落中有 625 个节点,部落中有 5 个族群,每个族群有 125 个节点,那么任何一个族群拥有拜占庭多数的概率在一百万中不超过 35。如果一个“时代”的持续时间为 2 天,那么故障频率约为 156 年一次。

随着部落的规模增加,对于固定数量的族群,故障概率会减少。

在每个“时代”中,聚合器的集合也是从部落中均匀随机选择的。在足够大的聚合器集合里确保至少有一个诚实的聚合器的概率非常高。

例如,如果我们从 502 个节点的部落中选择 12 个聚合器,没有一个诚实的聚合器的概率将不超过一百万中的 1.5。即使一个“时代”持续一天,故障频率也会低于 1800 年一次!

随着聚合器数量的增加,故障概率呈指数下降。

请注意,部落、族群和聚合器家族的大小在我们的设计中是参数化的。上面提到的实际数字仅用于说明目的。


Supra 预言机设计亮点

  • 我们的设计考虑到了数据源出现拜占庭故障的可能性。

  • 我们通过使用一致性距离和 SMR 的新颖想法,使得 DORA 协议具有 33% 地拜占庭容错率,相比于更高比例的拜占庭故障(51%)具有一定弹性。

  • 由于 DORA 协议需要更少比例的诚实节点来运作,它允许我们使用商品分片来很好地进行扩展。

  • 多聚合器模型避免了单一聚合器模型是拜占庭聚合器而遭受延迟的可能。

  • 设计中引入随机性大大地限制了攻击者的攻击能力。

  • 我们提供各种异常检测服务,包括交叉关联,以增强异常和欺诈检测能力。

如果您想更深层次地了解我们预言机协议的技术奥秘,请查阅完整的 DORA 白皮书。


(本文为【Supra 中文】原创内容,未经账号授权,禁止随意转载;如需转载,请在公众号消息栏发送“转载”关键字获得相关信息)
免责声明
本文为知识科普交流之用,不作为任何投资建议。

关于 Supra
Supra 是一个具备原生预言机和 VRF 等功能并实现跨链互操作的中间服务层——Intralayer。旨在链接 L1 和 L2,为开发者社区提供全面的中间服务,为保护未来金融市场和推动 Web3 应用落地而打造的高速、安全、可扩展的跨链互操作核心基础设施。【Supra 中文】也将持续为读者提供更有价值、更有深度的区块链行业内容跟干货。

往期推荐

For Better Blockchain

项目进展Supra 最新 Roadmap

一文详解丨以太坊扩容方案:OP vs ZK Rollup

一文详解传统企业撬动 Web3 的杠杆

点击“阅读原文” ,查看更多官方频道

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

SupraOracles
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开