本文探讨了在智能合约中使用预言机和价格信息源时常犯的错误,并提出了缓解措施。文章详细分析了诸如闪电贷攻击、操纵预言机、时间延迟攻击、Gas 费用拥堵、错误的价格假设和流动性不足等问题,并提供了相应的解决方案,旨在帮助开发者在DeFi应用中更安全有效地使用预言机。
去中心化金融的核心优势之一是合约的可组合性,这使得不同的 Dapp 能够从彼此那里获取数据。 仅仅这一点就实现了许多链上数据的新颖用例,例如代币金融衍生品、博彩平台和保险。 凭借通过预言机将数据引入链上的能力,这些用途进一步扩展到政治博彩、股票市场衍生品等。
在本文中,我们将探讨在尝试利用智能合约中的预言机和定价 feed 时所犯的一些常见错误,以及可以采取的缓解措施。
由于区块链的伪匿名性和无需许可的性质,在尝试读取链上价格时必须更加小心。 一个常见的攻击向量是利用 闪电贷,即瞬时、任意大小、无抵押的贷款,来影响 DeFi 交易所(如 Uniswap 或其他场所)上代币的价格。 虽然大多数开发者现在都知道这种愚蠢行为,但对于那些措手不及的人来说,它们一直是一个反复出现的难题。 2020 年,借贷协议 Harvest Finance 在将 Curve Finance 池代币集成作为抵押品时,为此付出了惨痛的代价。 黑客使用 闪电贷 扭曲抵押品价格,并提取了大于存款规模的贷款。 尽管 Harvest Finance 实施了 3% 的滑点检查,但攻击者还是能够通过重复的攻击周期获得 2400 万美元的收益。
虽然在基于 EVM 的链上最为常见,但现货定价漏洞也发生在其他链上。 即使缺乏 闪电贷 也不足以防止此类攻击,Solana 上的 Mango Finance 在一位交易员发现“高利润交易策略”时就发现了这一点。 也就是说,使用大量资金操纵 MNGO 的现货价格,同时在 Mango 永续市场上持有大量杠杆反向头寸。 这产生了大约 1.1 亿美元的利润,这似乎是一生难得的交易,直到这位交易员也在美国法院被起诉并被判有罪。
对于许多 DeFi 应用程序而言,上市时间可能至关重要。 对于新市场,编写自己的价格预言机以获得先发优势可能很诱人。 但是,这样做时,由于缺乏可采用的标准,很容易犯错误。 合成资产交易平台 Synthetix 在 2019 年遇到了这个问题,他们的合成 Maker 协议代币 sMKR 旨在追踪 DeFi 代币 MKR 的价格。
攻击者发现,虽然 Synthetix 使用了多个价格 feed,包括链下来源,但这些 feed 中的大多数都受到 UniswapV1 MKR/ETH 池 的严重影响。 因此,他们可以通过交易该池来影响 sMKR 的交易价格。 将其与 Synthetix 协议上由多头或空头 sMKR/iMKR 组成的头寸 结合起来,他们就可以合成利润。
一旦创建了可接受的价格 feed,就很容易认为工作已经完成,但正如 DeFi 中经常发生的那样,这仅仅是开始。 虽然价格来源可能很严格,但这些并不是协议需要考虑的唯一属性 - 时机也很重要。 由于区块的离散性质以及区块链的普遍去中心化性质,与 TradFi 等价物相比,链上事件发生得相当缓慢。
区块传播的速度使得时机攻击成为可能。 最常见于价格 feed 的是抢先交易或滞后交易,即在价格更新之前或之后立即进行交易,以从价格 delta 中获利。 Synthetix 再次作为 DeFi 的先驱之一,长期以来一直在与这个问题作斗争。 虽然没有单一的攻击,但通过协议监控和仔细分析,Synthetix 发现了交易模式,表明一些用户正在操纵链上价格预言机更新的延迟,从而从 Synthetix 质押者那里获取价值。
解决此问题的最初方法是集成结算期,在此期间的价格偏差将在交易者的帐户上结算。 虽然这有助于解决问题,但它阻止了相关的代币转账,并产生了糟糕的用户体验。 Synthetix 后来将其大部分交易转移到更快的 Layer 2 链,并采用了拉取式价格预言机,因为这些有助于通过以更高的频率更新预言机值来消除价格差异。
另一种形式的链上定价时间延迟是由于需要为交易支付 gas 而产生的。 在交易需求量大时,用户将为每笔交易的出价更高的 gas 价格,以实现快速包含。 价格波动通常与高网络 gas 价格齐头并进,因为如果接受的价格在其他地方发生了变化,许多合约突然变得有利可图。 如果 Dapp 及其支持软件不是为此而设计的,这可能会成为问题。
2020 年 3 月 12 日,加密货币的黑色星期四发生了。 这一天,加密货币的价格大幅下跌,ETH 经历了 40% 的跌幅(股市也面临重大损失)。
这给 Maker 协议 带来了特殊的问题,因为他们的 DAI 稳定币当时仅由 ETH 支持。 通常,如果贷款接近在 Maker 系统中处于水下状态,它将触发抵押 ETH 的拍卖,投标人提供越来越多的 DAI,以换取被选中接收处于风险中的抵押品。
由于当时非常高的 gas 价格,从之前每天大约 10 gwei 的平均值达到大约 200 gwei 的峰值,因此发生了两件事:
此次拍卖结果的发生主要是因为大多数投标人都在运行由 Maker 设计的参考投标软件,该软件无法处理如此高的 gas 费,这意味着由于 gas 不足,网络忽略了许多投标。 价格波动进一步加剧了这个问题,因为其他通常的投标人不愿出价,担心进一步的闪崩。
黑色星期四的崩溃也导致了 Maker 的其他系统性问题,因为许多幸存的用户现在接近被清算。 为了巩固他们的头寸,债务持有人在二级市场上购买 DAI 来偿还贷款。 这种需求的突然增加导致 DAI 代币价格上涨至 1.20 美元。 作为一种旨在保持美元稳定的稳定币,这简直是不可接受的。 由于缺乏快速调整定价的算法机制,Maker 转而允许更多替代抵押品,特别是更多 USDC。 随着时间的推移,这使得 DAI 的价值能够回升至Hook水平,并总体上降低了其价格波动性。
虽然不是漏洞,但这种情况凸显了预言机的一个重要问题 - 即使是流动性很强且据称稳定的代币(如 DAI 或 USDC)也可能会经历价格冲击,开发人员应避免硬编码价格假设,即使它们在大多数情况下可能是正确的。
这种情况通常发生在 USDC 或据称与 ETH Hook的代币上。 然而,我们经常看到这些代币由于市场力量而脱钩。 例如,2023 年 3 月硅谷银行的倒闭导致了对 USDC 母公司 Circle 的支持的不确定性,并看到其价值跌至每个 USDC 0.88 美元的低点。
虽然不是硬编码,但另一种代币 USDR 遭受了预言机的困扰,该预言机需要通过多重签名交易进行手动调整。 USDR 是一种算法稳定币,与美元软Hook,由房地产和 Tangible 公司拥有的其他实际资产支持。
当为其 TNGBL 治理代币提供下限时,延迟的价值更新就像是硬编码一样。这导致用户能够将 TNGBL 的市场价格翻倍,从 5 美元涨到 10 美元,然后不久之后,他们利用这种膨胀的 TNGBL 来铸造 USDR。
价格 feed 通常被视为一维数字,但重要的是不要忘记在流动性中看到并在滑点中感受到的市场的另一个主要特征。 这对于流动性不足的资产(如 NFT)尤其重要,在这些资产中,价格的连续性可能会中断。 也就是说,它对于同质化代币也很重要,正如 Tangible 的 USDR 用户在 2023 年 10 月发现的那样。 链上赎回主要通过与 DAI 的交换储备进行。 然而,该池只有大约 1200 万美元的 DAI,并且存在大约 5000 万美元的 USDR,因此很明显,如果发生银行挤兑,则无法实现全部预期价值。
一些评论员预测了这个问题,并在 2023 年 10 月 12 日得到了证实。 在大量交易耗尽了 DAI 储备后,用户感到恐慌,并试图从剩余的流动性池中提取 USDR,从而导致 USDR 跌至 0.50 美元。 虽然这没有在其他智能合约中引起任何定价问题,但许多其他 USDR 用户措手不及,他们基于许多其他集成它的平台上提供的高回报投资了该项目。 这表明,虽然代币可能名义上以与小批量交易Hook的价值进行交易,但如果进行更大的交易,则不能这样说。
计算价格的方式可能会引入问题。 出于极端谨慎的考虑,明智的做法是使用均值、中位数或更复杂的定价方法,例如时间加权平均价格。 在这样做时,开发人员必须小心确保正确实施数学公式并使其能够抵抗攻击。
2020 年 4 月,Pegnet 成为了对其定价预言机的攻击的受害者。 Pegnet 是建立在 Factom 网络之上的合成货币和资产平台,其中工作量证明挖矿被用作预言机系统的一部分。 当攻击者集中了足够的挖矿能力对 Pegnet 的预言机系统执行 51% 的攻击时,问题就出现了。 利用这种控制,他们在一个钱包中使用了 1,265.79 pJPY,价值约为 11 美元,并在将其交换为 pUSD 之前将其价值膨胀到 670 万 pUSD。 这是通过控制 50 个预言机值中的 35 个并提交 5306 pUSD/pJPY 的汇率来实现的,而真实汇率约为 0.09 pUSD/pJPY。
幸运的是,对于 Pegnet 来说,利用人后来声称这只是一个概念验证,并通过发送到被称为 “FA2BURNBABYBURNooooooo” 的销毁地址来烧毁生成的 pUSD,从而减轻了攻击的影响。
公式也可以在其他预言机解决方案中发挥作用。 早些时候,我们建议使用 TWAP 预言机,虽然这些预言机可能很有用,但明智的做法是了解它们的局限性。 例如,由于其价格价值更新存在时间滞后,因此它们可能会增加协议的套利机会。
由于 TWAP 是由几个不同价格读数的平均值组成的,因此如果一个读数差异很大或仅使用少数几个读数,仍然可以对其进行操纵。 一个基本的例子是,如果我们有四个价格读数 [10、9999、12、11],那么平均价格 TWAP 将为 2508,尽管 75% 的价格远低于此。 如果流动性池缺乏流动性或代币的唯一交易场所,则这种影响会特别明显,因为其他参与者可能无法将突然的价格差异套利回基线。
一旦为你的用例选择了正确的预言机,阅读你正在集成的平台的文档和设置说明至关重要。 错误可能会付出高昂的代价并且会很快发生,正如 Morpho 的一位用户在为 PAXG(一种追踪黄金价格的链上代币)创建借贷池时发现的那样。 虽然借贷池的代码是安全的,但它的设置却不是,它是以抵押 PAXG 和贷款代币 USDC 之间不正确的十进制转换因子部署的。 这使得攻击者能够耗尽所有池化的 USDC 并获得 230,000 美元的利润。
虽然对预言机的通常第一反应倾向于价格和数字 feed,但我们已经越来越多地看到它们用于其他产品中,例如保险解决方案和以体育和政治为中心的博彩市场。
此类用途可能很棘手,并导致主观结果,正如 Polymarket 的用户在下注委内瑞拉选举结果时发现的那样。 选举在现实世界中存在争议,数字结果也同样具有争议。 最初,市场似乎偏向一位候选人马杜罗,他获得了 51.2% 的选票,但随后,争议机制启动,并使用底层 UMA 预言机,投票结果判定 González 胜出。
由于现实世界的结果不明确,UMA 设置的解决方案系统中出现了裂缝。 作为一种经济激励,如果 UMA 选民的决定占多数,他们将获得奖励,如果他们投票支持少数人的决定,他们将受到惩罚。 更重要的是对所下赌注的措辞以及哪些标准符合每个结果的资格进行剖析。 虽然对实际选举结果的政治接受度因受访者的立场而异,但马杜罗于 2025 年 1 月 10 日宣誓就任委内瑞拉总统。 这与 Polymarket 赌注的最终结果相冲突。
显然,这是一个有争议的问题,但它说明了在处理非金融预言机时需要考虑的一些模糊之处。 即使是争议较少的议题,例如是否应为智能合约黑客攻击支付保险金,也可能面临类似的挑战,因为多个当事方可能具有不同的经济动机。
如你所见,在将定价功能和预言机实现到项目中时,需要考虑许多因素。 通常,最好审查与你自己的协议类似的现有协议的做法,并在设计新应用程序时作为一个团队讨论潜在的陷阱。 在集成 Uniswap 或 Curve 等特定项目时,必须阅读它们关于交换和预言机的文档,如有疑问,请务必联系你正在集成的协议以获取建议。
祝你开发顺利!
- 原文链接: blog.sigmaprime.io/oracl...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!