Haven深入研究:破解xUSD代码
我和Neac(Haven的协议负责人)在过去的几个月中一直在为xUSD的主网发布做准备。在整个测试过程中,我们一直专注于如何最安全地验证xUSD交易,以确保第一个私有稳定币的平稳启动和长期成功。
这项工作导致对Haven的代码库进行了广泛的重新设计。正如我们在测试网络中了解到的那样,门罗币的结构在签名和验证xUSD交易方面具有独特的挑战。这很乏味,缓慢,有时甚至令人沮丧。但是我们很自豪地说我们已经开发出一种创新的解决方案,可以确保现在和将来xUSD交易的准确性,可靠性和私密性。以下是导致我们找到该解决方案的过程的深入探讨。
避风港的 第一个测试网 计算出一个近似值,以告诉用户对于他们请求兑换的XHV,他们将收到多少xUSD。这是因为在Monero(和Cryptonote)中,当用户提交交易时,他们正在发送 承诺 到许多硬币:输入和输出。这些输入和输出必须相等,否则事务将始终失败。
当我们开始实现xUSD交换时,这种Monero结构成为Haven的问题。最初,我们不能保证 最后 xUSD的兑换金额等于 近似 提交交易前报价的xUSD金额。这是因为XHV价格动态变化。 XHV价格(因此xUSD汇率)可能在用户提交交易的时间与确认交易的时间之间发生变化。
我们解决这一挑战的第一种方法是不再寻求投入和产出的平等。但是为了防止操纵,我们需要发件人无法指定错误的金额。因此,我们决定将这一步骤完全从发件人手中移开,并将这一责任交给矿工。
此解决方案在 后续测试网,增加了提供确切xUSD汇率的延迟。发送方将必须等待要开采的区块,并且矿工必须在区块头中包含交易价格。但是,此解决方案中存在漏洞-令人讨厌的漏洞。
想象一下既有金钱又有Haven代码这一部分知识的对抗攻击者。建立基础结构以获取Haven的哈希值中的51%之后,他们既可以成为矿工,也可以成为发送方,从而可以设置自己的xUSD汇率。我们可以说这种可能性不是最佳的!
所以在 下一个测试网,我们决定将责任移回发件人,但这仅是为了使他们可以获取Haven链中已经存在的最后一个经过验证的价格记录(顶部记录的价格记录),并指定他们在交易中使用的是哪个块。可以由矿工和守护程序检查和验证,他们还可以检查输入与输出的相等性,不是硬币,而是美元价值(对于xUSD至关重要)。
这个 价值证明 成为Haven成功的关键。但是上述模型也被证明容易受到攻击。在与我们的团队和社区进行的接下来的xUSD测试网中,得出了一些教训。首先,我们了解到较短的链条可以博弈该系统。其次,我们了解到我们需要一种方法来显示xUSD(和将来的xAssets)的循环供应,否则我们将无法确定Haven网络的运行状况。
下一阶段的发展使我们走了一条不同的道路。如上所述,证明交易的价值是关键,我们需要用xUSD交易所的美元价值证明代替门罗币输入=输出证明。
我们尝试了十几种不同的证明,检查和验证。但是我们发现,除非您实际发送XHV和 没有其他类型的资产,这是我们在私人测试中所做的事情,整个系统在进行了一些前后交易后变得很困惑。交易越复杂,验证交易的美元价值就越困难。然后进行多次交易,这需要跨越大量的输入,事情变得很复杂。
这些挑战都与承诺签名的工作方式有关,这在门罗币中是绝对必要的。除非您的承诺有效,否则您将永远无法验证这笔钱并非来自任何地方。
在这一点上,我们决定回顾一下“彩色的硬币”(之前已放置在比特币的顶部)上,从而创建了一组有关正在交换的硬币的新信息。使用彩色硬币,可以对交易进行特定属性的“彩色化”。这有效地将彩色硬币变成令牌,可以用来表示任何东西。但是,这很关键,有色硬币只有在不依赖门罗币的承诺结构的情况下才能起作用。
因此,这就是我们所面临的挑战:修改Monero的承诺结构,以允许使用“彩色硬币”,从而可以区分基于单个Monero链的XHV,xUSD和未来的xAsset。我很自豪地第一次分享这一点,我们已经做到了。
我们不得不更换门罗币 多层可链接的自发匿名组 (MLSAG)签名与更新 紧凑的可链接自发匿名组 (CLSAG)签名来完成此操作。但是在Monero的顶级开发人员之一的帮助下, 萨朗·诺瑟(Sarang Noether),该解决方案现在可以按预期运行。我们要感谢Sarang在帮助我们导航这种新加密方案方面所提供的帮助。
因此,所有这些测试和修改的结果如下:我们创建了一个新的交易结构,其真实输入为XHV,真实输出为xUSD。为了从XHV转换为xUSD,我们实际上将XHV作为输入,将xUSD作为输出。然后,守护程序根据发送方指定为定价记录的块中给出的汇率检查输出数量是否相等。这纯粹是通过将承诺掩码和验证者独立获取的汇率相加来完成的。
逻辑是验证者将始终获得自己的汇率。因此,发送者通过交易进行交易的唯一方法是既要知道确切的汇率,也要知道确切的输入数(只有他们知道,因为它在钱包里,在其他地方不可读)。然后,验证者对输出承诺进行求和,并考虑其独立获得的汇率,然后将其与输入进行比较。他们必须等于合格。当然,所有值都是加密的,因此没有人可以看到或更改金额。
注意:寄件者只能使用已经通过验证的价格记录,这些记录当前都是通过 Chainlink的XHV甲骨文。守护程序读取交易中的定价记录号,并从块头获取记录(实际价格)。这意味着价格在使用时已经是不可变的。
这正是我们在第一个测试网中考虑如何应对与xUSD交易验证相关的挑战之后正在寻找的解决方案类型。该解决方案在我们的私人测试中运行良好,并将在未来几天内在我们的下一个公共stagenet中共享。
假设在测试中没有发现其他问题,这就是我们将用来在Haven的主网上实时启动xUSD的解决方案。作为发布过程的一部分,我们希望公开共享我们去年私下开发的xUSD交换代码,以创建有史以来第一个私有稳定币。