链眼社区:专注于区块链安全,区块链数据分析, 区块链信息整合,区块链技术服务和区块链技术咨询。

存管证明(Proofs of Custody)
扫地僧
2022-11-16 12:27:05

监管证明是一种有助于解决“惰性验证者”问题的结构。惰性验证器是这样一种验证器,它不做他们应该做的工作——例如,确保某些数据可用(与数据分片相关)或某些执行正确执行(对于执行链)——他们假装他们已经完成并签署结果,例如声称数据无论如何都可用的证明。

托管证明构造是一种加密经济学原语,它改变了博弈论,因此惰性验证不再是一种有趣的策略。

一. 惰性验证者—博弈论

让我们假设有一个运行良好的以太坊 2.0 链(如果您愿意,可以插入您最喜欢的替代 PoS 区块链)。我们通常不会预料到会发生坏事——数据被隐瞒,产生无效区块。事实上,你可能永远不会看到它们发生,因为只要系统由大多数诚实的验证者运行,就没有必要尝试以这些方式之一攻击它。由于攻击几乎肯定会失败,因此即使这样做也没有意义。

现在假设您运行一个验证器。这带来了不同类型的成本——显然是质押资本,还有硬件成本、电力和互联网带宽,你可能会直接支付(你的供应商按 GB 收费)或间接支付(当你的验证器运行时,你的 netflix 滞后) . 您可以使此成本越低,您从运行验证器中获得的净利润就越多。

作为分片 Eth2 中的验证者,您的任务之一是确保分片数据的可用性。每个认证委员会都分配了一个数据块来检查,大约是 512 kB 到 1 MB。每个验证者的任务是下载它并存储它大约 90 天。

但是,如果您只是简单地为分片 blob 的所有证明签名,而不实际下载数据,会发生什么情况?你仍然会得到你的全部回报,但你的成本突然下降了。我们假设网络处于良好状态,因此您的懒惰不会立即对网络造成任何影响。假设您运行验证器的利润是每次证明 1 美元,下载所有区块的成本是每年 0.10 美元。现在您的利润增加到 1.10 美元。

每份签名证明的利润
诚实的 1.00 美元
懒惰的 1.10 美元

这个问题被称为验证者的困境,由 Luu 等人在Demystifying Incentives in the Consensus Computer中引入。

二. 但我永远不会这样做!谁会这样作弊?

对我们来说,显而易见的是,在这样的游戏中,您肯定不会屈服于贿赂并保持诚实的行为。但它通常比这更微妙。

假设在运行验证器多年后,出现了一个新客户,声称其成本效益提高了 10%。人们运行它并看到它有效,而且它似乎是安全的。它实际执行此操作的方式是不下载分片块。

这甚至可能是偶然发生的。有人在开发过程中偷工减料,看起来一切正常,只是没有加入正确的分片子网,没有人错过,因为它不会导致正常运行出现任何故障。

有些人可能会运行这个客户端。

其他可能发生的事情是服务可以介入为您进行下载。每个分片 blob 0.01 美元,他们将下载数据,将其存储 90 天,然后向您发送一条消息,告知您数据可用,您可以签署证明。这有多糟糕?

这也很糟糕。因为随着越来越多的人开始使用这项服务,它变成了单点故障。或者更糟的是,它可能是攻击的一部分。如果它可以让超过 50% 的验证者投票支持分片 blob 的可用性,而无需发布 blob,那将是一种预扣攻击。

通常情况下,不诚实可以有多种伪装,所以我们最好的办法是努力平衡,使诚实的策略变得理性。

三. 监管证明和博弈论的更新

监管证明是这样工作的:想象一下,我们可以在一个分片 blob 中放置一个“炸弹”:如果你签署这个 blob,你将得到 3,000 美元的巨额罚款(你被削减)。你绝对不想签署这个 blob。

这会让你想要下载它吗?这当然是避免签署炸弹的一种方式。但是,如果任何人都可以检测到炸弹,那么如果它是炸弹,那么有人可以简单地编写一个服务,在签署证明之前警告您。因此炸弹需要特定于单个验证器,并且没有其他人可以计算分片 blob 是否是炸弹。

好的,现在我们有了监护证明的基本要素。我们需要

  • 一个短暂的秘密,每个托管时期(大约 90 天)都会重新计算,每个验证者都单独计算,然后在它过期时披露(以便其他验证者有机会检查托管证明)
  • 一个函数,它获取整个分片 blob 数据以及临时密钥,并输出 0(不是炸弹),或者以很小的概率输出 1(这个 blob 是炸弹)

短暂的秘密不能被其他任何人使用是至关重要的,因此存在三个削减条件:

  • 如果有人知道其当前的临时秘密,则验证器可能会被削减
  • 临时秘密必须在保管期后公布,否则也会导致削减
  • 签署炸弹会导致削减

我们如何创建这个功能?一个简单的结构就是这样工作的。计算叶子的 Merkle 树,(data0, secret, data1, secret, data2, secret, ...)如下所示:

然后取前 10 位的逻辑AND。这为您提供了 1024 次中预期的 1 中的 1。

在不知道秘密和数据的情况下无法计算此函数。

(因为我们确实想要启用秘密共享验证器,所以已经做了很多工作来优化这个函数,以便它可以在 MPC 中有效地计算,而 Merkle 树不能。为此我们建议基于通用哈希的构造函数和勒让德符号:https://ethresear.ch/t/using-the-legendre-symbol-as-a-prf-for-the-proof-of-custody/5169)

新博弈论

好吧,有了保管证明,任何分片 blob 都有 1/1,024 的机会成为炸弹,如果不下载你就不知道它是哪一个。

当 blob 不是炸弹时,惰性验证器就可以正常工作。然而,当它是一个炸弹时,我们看到了很大的不同:诚实的验证者只是简单地跳过这个非常小的证明,只是简单地将利润设置为零。然而,懒惰的验证者签署它并被削减,造成巨大损失。收益矩阵现在看起来像这样:

非炸弹认证的利润 炸弹证明的利润 平均 1,024 个证明
诚实的 1.00 美元 0.00 美元 1,023.00 美元
懒惰的 1.10 美元 $-3,000.00 $-1,873.60

在第三列中,我们看到惰性验证者的预期利润现在为负。由于懒惰的全部原因是通过降低成本增加利润,这意味着懒惰验证器不再是一个有趣的策略。

执行保管证明

验证者的另一项任务是验证块的正确执行。这意味着验证作为块一部分的新状态根是否是应用所有交易产生的正确状态。监管证明的想法也可以应用于此:验证者必须以与上述相同的方式计算监管证明,但数据是执行跟踪。执行跟踪是由块的逐步执行生成的一些输出。它在任何意义上都不必是完整的;我们想要的只是两个属性:

  • 如果不实际执行块,应该很难猜测执行轨迹。
  • 执行跟踪的总大小应该足够大,以至于除了正常块之外简单地分发它是没有吸引力的。

有一些简单的选择可以做到这一点;例如,简单地输出 EVM 执行的每个指令字节可能会导致每个执行块有几 MB 的执行跟踪。另一种选择是使用堆栈的顶部。

有了欺诈证明,执行还需要存管证明吗?

当我们将执行链升级为无状态时,这意味着可以在没有当前状态的情况下验证块,欺诈证明变得容易。(如果没有无状态,它们就很难:欺诈证明总是必须包含在与欺诈发生的链不同的链上,因此当必须验证它们时,实际的预状态将不可用。)

这意味着可以削减产生无效执行块的验证器。此外,我们还可以惩罚任何已证明此块的验证器。这是否意味着不再需要监护证明?

它确实改变了平衡。但即使存在这种惩罚,惰性验证仍然是一种理性的策略。验证者在不验证执行情况的情况下简单地签署每个块可能不是一个好主意,因为攻击者只需要牺牲他们自己的一个验证者就可以让你被削减。

但是,您可以采用以下策略:在每个新块上,您在自己签名之前等待一小部分其他验证者对其进行签名。那些先签名的人不太可能是懒惰的验证者,因为他们会采用相同的策略。在大多数情况下,这会给你很好的保护,但在系统层面上,它仍然会使链在极端情况下容易受到攻击。

欺诈证明的情况因此得到改善,但监管证明仍然优于确保懒惰验证不能成为理性策略。

它与数据可用性检查有何不同?

看起来分片 blob 的保管证明试图解决一个非常相似的问题:确保分片 blob 标头中提交的数据在网络上实际可用。

所以我们可能会想:我们是否需要保管证明和数据可用性检查?

但是,这两种结构之间有一个重要的区别:

数据可用性检查确保数据的可用性独立于诚实多数假设。即使是控制全部股权的强大攻击者也无法欺骗全节点接受实际上被保留的可用数据 相比之下,如果大部分股份都在进行攻击,那么保管证明就无济于事。大多数人可以计算保管证明,而无需将数据透露给任何其他人。 因此,从理论上讲,数据可用性检查严格优于分片数据的保管证明:它们无条件地持有,而后者仅用于保持理性验证者的诚实,从而降低攻击的可能性。

为什么我们仍然需要分片 blob 的保管证明?它可能不一定需要。然而,数据可用性检查存在一些实际问题,因此希望拥有针对丢失数据的“第一道防线”:

这样做的原因是数据可用性检查通过从分叉选择规则中排除不可用的块来工作。然而,这不可能是永久性的:数据可用性检查只能确保最终每个人都会看到相同的结果,但不会立即看到。

这样做的原因是发布一个部分可用的块,可能会导致一些节点认为它是可用的(他们看到他们所有的样本)而其他一些节点不可用(丢失一些样本)。数据可用性检查可确保在这种情况下始终可以重建数据。但是,这需要某个节点先获得足够的样本来重构数据,然后重新播种样本,让每个人都能看到;这个过程可能需要几个时间段。

为了避免少数攻击者(拥有少于 1/3 的股份)造成这种破坏,我们只想在链完成时而不是立即应用数据可用性检查。同时,保管证明可以确保诚实的多数人只会建立一个可用的链,其中分片数据已经在委员会中播种;由于委员会已准备好重新播种所有样本,即使原始 blob 生产者不这样做,攻击者也无法轻易强制使用部分可用的块。

在这个结构中,保管证明和数据可用性检查有两个正交的功能:

  • 分片数据的保管证明可确保诚实的大多数验证者只会构建一条链,其中所有分片数据都可用并在委员会之间得到良好播种。少数攻击者无法轻易对此造成破坏。
  • 数据可用性检查将保证,即使大多数权益在攻击,他们也无法让剩余的完整节点将具有保留数据的链视为最终确定。

合作伙伴