译者注: 越来越多的项目要依赖价格预言机,而少有项目去认真的思考价格预言机的可靠性,本文用分析多个预言机失败的案例,帮助我们意识到价格预言机不总是可靠的,并提出了一些在其他项目已经实践过用来防止预言机操控的技术。推荐每个 DEFI 开发者读一读。
- 来源:https://samczsun.com/so-you-want-to-use-a-price-oracle/ 作者:SAMCZSUN
- 译文出自:登链翻译计划
- 翻译:Tiny 熊
- 本文永久链接:learnblockchain.cn/article…
译者注: 越来越多的项目要依赖价格预言机,而少有项目去认真的思考价格预言机的可靠性,本文用分析多个预言机失败的案例,帮助我们意识到价格预言机不总是可靠的,并提出了一些在其他项目已经实践过用来防止预言机操控的技术。推荐每个 DEFI 开发者读一读。
在2019年末,我发表了一篇题为“ 为了好玩和牟利去获得抵押不足的贷款 ”。在这篇文章中,我描述了一个对以太坊dApp的经济攻击,该dApp需要依靠一个或多个代币准确的价格数据。当前是2020年末,不幸的是,来那边文章之后依旧还有很多项目在犯了非常相似的错误,最近的例子是Harvest Finance 被黑客攻击,给协议用户造成了超3380万美元的损失。
随着开发人员逐渐熟悉像可重入性攻击之类的漏洞,基于可重入的漏洞数量有所下降,但是开发者还没有仔细思考关于价格预言机操控的问题。最近基于价格预言操纵的问题数量正在上升。因此,是时候发布有关价格预言操纵的权威性资料了。
这篇文章分为三个部分。第一部分,针对那些不熟悉价格预言机的人,介绍有关价格预言机和价格预言机操控。第二部分是回顾了过去与价格预言机相关的漏洞和和攻击事件。最后,我们总结了开发人员可以用来保护其项目免受价格语言操控的一些技术。
一个故事:2015年12月1日,星期三,假设你是David Spargo,你正在澳大利亚墨尔本举行的Peking Duk 音乐会上。你想与乐队见见面,但是在你和后台通道之间隔着两个保安人员,他们是不会让一些普通的观众走进去的。
你想保安肯定会允许其家庭成员在后台探访乐队,因此你要说服保安你是乐队的家属。你在思考之后,先出了一个惊为天人的计划。
安排好一切后,你自信地走向保安人员。你介绍自己为David Duk家族的David Spargo。当保安要求提供证据时,你向他们显示了来自Wikipedia不可辩驳的证据.
保安,请你等待一下。一分钟过去,然后两分钟。五分钟后,你真要考虑要不要逃跑时,Rouben Styles (乐队成员)走上前来介绍自己。你和他一起走到房间,你的机智给乐队留下了深刻的印象,还和你共饮了一些啤酒。后来,他们在Facebook页面上分享了所发生的事情。
宽泛地说,价格预言机就是你咨询价格的对象。当Pam向Dwight 询问Schrute 元的现金时,Dwight充当了价格预言机。
译者注: 来源于美剧《Office》,Dwight 是一个剧中的角色,扮演着一个推销员。
在以太坊上,一切都是智能合约,价格预言机同样也是合约。因此,区分价格预言机如何获取价格更为有用。一种方法是,简单地从在链下从价格API或交易所获取价格数据,并将其上链。另一方法是,通过查询链上去中心化交易所(DEX)来计算出当前价格。
两种方法都有其各自的优点和缺点。链下数据对波动的反应通常较慢,这可能是好事也可能是坏事,具体取决于你要怎么使用它。链下的价格通常是通过少数特权用户把数据推到链上,因此你必须相信这些特权用户不会变坏,也不会被强迫推送错误的更新。链上数据则是公开的(没有特权用户访问限制),并且始终拿到最新的价格,但这意味着攻击者很容易操纵它,这可能会导致灾难性的事故。
让我们看几个案例,糟糕集成预言机导致DeFi项目遭受重大资金损失。
Synthetix是一个资产衍生品平台,使用户可以使用多种货币资产。为了帮助理解,简化了过程,Synthetix(当时)依赖定制的链下价格源实现,它会从一组秘密价格源来合成最终价格并以固定的频率发布在链上。然后,允许用户根据这些价格对支持的资产进行做多或做空。
在2019年6月25日,Synthetix依赖的价格源之一误报了韩元的价格,比实际汇率高出1000倍。加上价格预言系统的还有其他错误,该价格被系统接受并发布在链上,随后一个交易机器人迅速进出这个sKRW市场。
尽管Synthetix团队与交易者协商返还资金以换取漏洞赏金,但该机器人有能力赚取超过10 亿美元的利润。
Synthetix正确执行了价格预言机合约,并从多个价格源获取价格,以防止交易这在链上发布价格之前就预测到价格变化。但是,一个孤立的上游喂价故障导致了毁灭性的攻击。这说明了使用链下数据的价格预言机的风险:你不知道价格的计算方式,因此必须精心设计系统,以便能正确处理所有潜在的故障。
如前所述,我于2019年9月发布了一篇文章,概述了使用依赖链上数据的价格预言机带来的风险。虽然我强烈建议你阅读原文, 这边文章技术细节较为繁重,可能难以消化。因此,我将在此处提供简化的解释 。
假设你想将去中心化贷款引入区块链。允许用户存入资产作为抵押,并借入其他资产,最高借款额度取决于所存资产的价值。假设用户想使用以太坊作为抵押品借入美元,以太坊当前价格为400美元,抵押比率为150%。
如果用户存入375 ETH,相当于存入了15万美元的抵押品。他们按每1.5美元抵押借入1美元,因此最多可以从系统中借入10 万美元。
但是当然,在区块链上不能简单地声明 1 ETH价值400美元,因为恶意用户同样可以声明1 ETH价值1000 美元,然后从系统中偷走所有的资产(译者注:可以通过抵押虚高的 ETH,借走其他的资产)。。因此,对于开发者来说,寻找最适合的喂价预言机是很重要的,比如当前 Uniswap、Kyber 或的其他去中心化交易所的现货价格。
乍一看,这似乎是正确的做法。毕竟,无论何时你想要买卖ETH,Uniswap的价格始终大致正确,因为价格偏差会套利者会迅速纠正。但是,事实证明,去中心化交易所的现货价格在交易过程中可能会非常不正确,如下例所示。
想一下 Uniswap 储备金是如何运作的,价格是根据协议持有储备金的资产数量计算的,但是持有的储备金会随着用户在ETH和USD之间交易而发生变化。如果恶意用户在从你的平台获得贷款之前和之后进行交易怎么办?
在用户贷款之前,他们以 200 万美元的价格购买了5,000 ETH。 Uniswap交易所现在计算价格为1 ETH = 1,733.33美元。现在,他以375 ETH 抵押作为借入高达433,333.33美元的资产。最后,他们用5,000 ETH换回原来的200 万美元,这将重置价格。最终结果是贷款平台让用户多借走了额外的333,333.33 美元,而没有提供其他额外的担保。
通过研究本案例,说明了使用去中心化交易所作为价格预言系统时最常见的错误,攻击者几乎可以完全控制交易期间的价格,而想要准确读取价格就像在物品稳定之前读取重量计的读数一样,你可能会得到错误的号码,依赖这个数据可能会损失你很多钱。
2019年12月,Synthetix 因为预言机价格操纵而再次遭受攻击。值得注意的是,它跨越了链上价格数据和链下价格数据之间的障碍。
Reddit用户u/MusaTheRedGuard 观察到攻击者正在对sMKR和iMKR(反向MKR)进行一些非常可疑的交易。攻击者首先通过购买sMKR来做多MKR,然后从Uniswap ETH/MKR资产交易对中购买大量MKR。在等待一段时间后,攻击者将他们的sMKR换成了iMKR空头仓位,并将他们的MKR卖回Uniswap。并重复这个过程。
在幕后,攻击者通过Uniswap进行的交易使他们可以随意移动Synthetix上的MKR价格。这可能是因为Synthetix所依赖的链下价格源实际上依赖于MKR的链上价格,而且,套利者没有足够的流动性将市场回归到最佳的价格状态。
通过此事件说明了一个事实,即使你认为自己正在使用链下价格数据,但实际上可能仍在使用链上价格数据,仍会面临使用使用这些数据涉及的复杂情况。
2020年2月,bZx在几天的时间内被黑客入侵两次,金额约为100 万美元。在这里你可以读到palkeo写的关于两次攻击的出色技术分析文章,但本文只会讨论第二次黑客攻击。
在第二次黑客攻击中,攻击者首先使用ETH购买了在Kyber上几乎所有sUSD。然后,攻击者从Synthetix本身购买了第二批sUSD,并将其存入bZx。攻击者使用sUSD作为抵押品,借入了他们被允许的最大数量的ETH。然后,他们又把sUSD卖回给Kyber。
如果你一直在关注,你会认识到这同样是抵押不足借贷攻击,但是使用了不同的抵押品和不同的去中心化交易平台。
2020年7月25日,我向yEarn报告了他们新发布的yVault合约的漏洞。你可以在此处阅读有关此漏洞的官方文章。但我在这里简要总结一下。
yVault系统允许用户存入代币并从中获得收益,而无需自己管理。在yVault内部,这个存款金库会跟踪铸造的yVault代币的总数以及所存入的基础代币的总数。单个yVault代币的价值,由铸造的代币与存入的代币的比率来确定。金库赚取的所有收益都会分摊到所有铸造的yVault代币中(即分摊到所有的yVault代币持有者)。
第一个yVault允许用户通过向Balancer 协议的MUSD/USDC储备池提供流动性来赚取USDC收益。当用户向Balancer池提供流动资金时,他们会收到BPT作为凭证(BPT可以用来赎回资产)。因此,yVault根据其BPT可赎回的MUSD/USDC金额计算其持有的价值。
这似乎是正确的实现,但不幸的是,与以前给出的原理相同,在交易期间Balancer池的状态是不稳定的,因此不能被信任。在此案例中,由于Balancer选择的联合曲线,从USDC到MUSD的兑换用户不会获得1:1的汇率,但实际上会在储备池中余留下一些MUSD。这意味着BPT的价值可以暂时膨胀,这使攻击者可以随意操纵价格并随后耗尽金库。
该事件表明,价格预言机并非总是可靠的,并且开发人员需要警惕他们正在使用的数据,并考虑该数据是否可以由非特权用户轻松操纵。
2020年10月26日,一个匿名用户使用(你现在可能已经猜到的)技术入侵了Harvest Finance储备池。你可以阅读官方的分析报告,但是,我再次为你总结一下:攻击者通过执行交易来降低曲线库中USDC的价格,以降低后的价格进入Harvest池,并再次逆向操作之前的交易来恢复价格,然后以更高的价格退出Harvest池。这导致了超过3300万美元的损失。
现在,我希望你意识到价格预言机不总是可靠,如果你没有采取适当的预防措施,则攻击者可能会欺骗你的协议,卷走你的资金。虽然没有能“一劳永逸”的解决方案,但以下是一些过去在其他项目的行之有效的方案。也许其中也会有适用于你的:
就像跳入浅水游泳池一样,跳入浅水市场也是痛苦的,并且可能会导致大量损失,这可能从此改变你的生活。在考虑复杂的价格预言机之前,先想想代币的流动性是否足有保证,才与你的平台集成。
看到Uniswap上的潜在汇率可能会令人着迷,但是直到你单击"trade(交易)"并且代币交易打入了钱包之前,一切都没有定论。同样,确定两个资产的汇率的最佳方法是直接兑换资产。这种方法很棒,因为即不会撤销,也不依靠假设。但是,它可能不适用于要求保留原始资产的协议(例如贷款平台)。
总结依赖链上数据的预言机的问题,会发现,他们的(价格)更新太快,为什么不引入一些人为的延迟呢?编写一份合约,该合约采用Uniswap之类的去中心化交易所的最新价格进行更新,但仅在少数特权用户的请求下进行。现在,即使攻击者可以操纵价格,他们也无法使你的协议采用被操控的价格。
这种方法实现起来很容易,并且很容易见效,但是有一些缺点:在链上拥堵的时候,可能无法像期望的那样快速地更新价格,并且你仍然容易受到三明治攻击(sandwich attacks)。另外,现在需要你的用户相信你实际上会保持价格更新。
操纵价格预言机是一个对时间极为敏感的操作,因为套利者时刻在观察,并希望有机会优化任何次优市场。 如果攻击者想最大程度地降低风险,他们希望在一次交易中完成操纵价格预言机所需的两笔交易(或多笔),因此套利者没有机会跳进中间状态。作为协议开发者,如果你的系统能支持,那么只需要在用户进入和退出系统之间留出短至1个区块的延迟即可。
当然,这可能会影响可组合性,并且矿工与交易者的合作(合谋)正在增加。将来,黑客交易者可能会在多个交易中执行价格预言操作,因为他们知道与他们合作的矿工将确保没有人能跳入中间并从中获利。
Uniswap V2 引入了时间加权平均价格(TWAP) ,供链上开发人员使用。 这个文档进一步详细介绍了价格预言机提供的确切安全性保证,对于长时间没有链上拥堵的大型资金池,这种TWAP预言机对预言机操纵攻击具有很强的抵御能力。但是,由于其实现的原理,它可能无法对市场剧烈波动时刻做出足够迅速的响应,并且仅适用于链上具有流动性的代币资产。
有时他们会说,如果你想做把事情做好,那你自己做。那如果你集合了N个值得信赖的朋友,让他们提交各自认为正确的链上价格,然后取M个最好的答案聚合成当前价格,那会怎么样呢?
如今,许多大型项目都使用这种方法:Maker运行了一组由受信任的实体运营价格源,Compound创建了Open Oracle并有,例如Coinbase这样的报价者, Chainlink 聚合来自Chainlink运营商的价格数据,并在链上公开了这些数据。请记住,如果你选择使用其中的解决方案,那么你就将信任委托给了第三方,你的用户也同样如此。要求报价者手动更新在链上价格还意味着,在市场高度波动及区块链拥堵的时期,价格更新可能无法按时完成。
价格预言机是DeFi安全性的重要组成部分,但经常被忽略。安全地使用价格预言机非常困难,并且有很多方法可以使你和你的用户双双陷入困境。在这篇文章中,我们介绍了过去价格预言机操纵的示例,并确定在交易期间读取价格信息可能是不安全的,并可能导致灾难性的财务损失。我们还讨论了其他项目过去用于防止价格预言操纵的一些技术。最后,每种情况都有独特性,你可能不确定自己是否正确使用了价格预言。如果是这种情况,请随时与我联系寻求咨询!
特别感谢Dan Robinson和Georgios Konstantopoulos对本文的审阅,以及@zdhu_和mongolsteppe指出的错误。
本翻译由 Cell Network 赞助支持。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!