2019年年末,我宣告了一篇题为 《Taking undercollateralized loans for fun and for profit》的文章。在其间,我描述了对以太坊 DApp的经济进犯,这些进犯依靠于一个或多个Token的精确价格数据。现在现已到了2020年末,不幸的是,尔后众多项目都犯了十分类似的过错,最近的例子是Harvest Finance黑客事情,导致协议用户团体丢失2400万美元。 尽管开发者对重入等缝隙很熟悉,但预言机操作价格显然不是人们经常考虑的问题。相反,依据重入性的缝隙这些年有所下降,而依据价格预言机操作的缝隙现在却在上升。
因而,我决议是时分有人宣告一篇关于价格预言机操作的权威资源了。 这篇文章分为三个部分。对于不熟悉这个问题的人,有一个关于预言机和预言机操作的介绍。想要测验自己常识的人能够跳到事例研讨,咱们在这里回忆了曩昔与预言机相关的缝隙和运用。最终,咱们总结了一些开发人员能够用来维护他们的项目不受预言机操作的技能。 在现实生活中预言机操作 2015年12月1日,星期三。你的名字叫大卫-斯帕戈,你正在澳大利亚墨尔本的北京公爵演唱会上。你想亲自见见乐队,但你和后台通道之间站着两个保安,他们不行能让一些普通人直接走进去。
你想知道,假如你表现得像个普通人,保安们会有什么反响。乐队的家人们必定会被答应到乐队后台观赏,所以你要做的就是让保安们信赖你是他们的家人。你思考了一瞬间,想出了一个只能用天才或疯子来描述的计划。 敏捷安排好全部后,你自傲地走到保安面前。你毛遂自荐说是大卫-斯帕戈,Peking Duk的家人。当保安要求你供给依据时,你向他们展示了无可辩驳的依据--维基百科。 保安向你招手,让你稍作等候。五分钟往后,你在想是否应该在执法人员呈现之前逃走。当你准备脱离时,鲁本-斯泰尔斯走了过来并做毛遂自荐。你和他一起走到一个绿色房间,乐队对你的聪明才智印象深刻,最终你们一起喝了几瓶啤酒。后来,他们在自己的Facebook页面上共享了发生的事情。 什么是价格预言机? 价格预言机,大略是指任何你能够咨询价格信息的东西。当Pam向Dwight问询Schrute Buck的现金价值时,Dwight就像一个价格预言机。 在以太坊上,全部都是智能合约,价格预言机也是如此。因而,了解价格预言机怎么获取价格信息的办法更有用。一种办法是,你能够简略地从价格API或买卖所获取现有的链外价格数据,并将其带到链上。另一种办法,你能够经过咨询链上去中心化买卖所来计算即时价格。 这两种挑选都有各自的优势和劣势。链外数据对动摇的反响一般较慢,这一特点是好是坏取决于运用它的意图。不过它通常需求少量特权用户来推送链上数据,所以你有必要信赖他们不会变坏,不能被钳制推送不良更新。链上数据不需求任何特权访问,并且总是最新的,但这意味着它很简单被进犯者操作,这或许导致灾难性的后果。 什么或许会出问题呢? 让咱们来看看几个事例,在这些事例中,一个集成度不高的价格预言机导致了DeFi项意图严重经济丢失。
Synthetix sKRW Oracle毛病 Synthetix是一个衍生品渠道,它答应用户触摸其他钱银等财物。为了完成这一方针,Synthetix(其时)依靠定制的链外价格推送完成,其间从一组秘密的价格推送计算出的总价格以固定的时间间隔发布在链上。然后,这些价格答应用户针对支撑的财物进行多头或空头买卖。 2019年6月25日,Synthetix所依靠的其间一个价格推送过错地报告了韩元的价格,比实在汇率高出1000倍。由于价格预言机体系的其他地方呈现了其他的过错,这个价格被体系承受并发布在链上,在链上一个买卖机器人敏捷在sKRW商场上进行了买入和卖出。 理论上讲,该机器人总共能够赚取超过10亿美元的利润,尽管Synthetix团队能够与买卖员商洽,以交换缝隙奖金来返还资金。 Synthetix正确地履行了预言机合约,并从多个来源提取价格,以防止买卖者在链上发布价格变化之前猜测价格变化。但是,一个上游价格源发生毛病的孤立事例导致了毁灭性的进犯。这阐明了运用链外数据的价格预言机的危险:你不知道价格是怎么计算出来的,所以你的体系有必要精心设计,使一切潜在的毛病形式都能得到妥善处理。 典当借款 如前所述,我在2019年9月宣告了一篇文章,概述了运用依靠链上数据的价格预言机的相关危险。尽管我强烈主张阅览原帖,但它相当长,技能细节或许多,或许会让人难以消化。
因而,我将在这里供给一个简化的解释。 幻想一下,你想把去中心化的假贷带到区块链上。答应用户存入财物作为典当品,并借入其他财物,最高金额由他们存入的财物价值决议。假定用户想用ETH作为典当品借入美元,ETH当时价格为400美元,典当率为150%。 假如用户存入375个ETH,相当于存入150000美元的典当品。每1.5美元的典当品能够借到1美元,所以他们最多能够从体系中借到10万美元。 但当然,在区块链上,并不是简略地宣告1个ETH值400美元那么简略,由于一个歹意用户能够简略地宣告1个ETH值1000美元,然后从体系中拿走一切的钱。因而,对于开发者来说,想要获得预言机所读取的最近价格是很有诱惑力的,比如Uniswap、Kyber或其他去中心化买卖所的当时现货价格。 乍一看,这似乎是正确的做法。毕竟,只要你想买入或卖出ETH,Uniswap的价格总是大致正确的,由于任何误差都会被套利者敏捷纠正。但是,事实证明,在买卖过程中,去中心化买卖所的现货价格或许会呈现较大的过错,如下例所示。 考虑一下Uniswap的储藏金是怎么运作的。价格是依据储藏持有的财物数量计算的,但随着用户在ETH和美元之间进行买卖,储藏持有的财物会发生变化。假如一个歹意用户在从你的渠道借款前后进行买卖怎么办? 在用户借款之前,他们用2000000美元购买了5000个ETH。Uniswap买卖所现在计算出的价格是1 ETH=1,733.33美元。现在,他们的375个ETH能够作为价值433,333.33美元财物的典当品,他们借到了这些财物。最终,他们用5,000 ETH换回他们原来的2,000,000美元,从而重置价格。最终的结果是,你的借款渠道只是让用户在没有投入任何典当物的状况下,多借了333,333.33美元。 这个事例研讨阐明了运用去中心化买卖所作为价格预言机时最常见的过错--进犯者在买卖过程中简直彻底控制了价格,而企图精确地读出这个价格就像在秤上读出它完成结算前的重量一样。你很或许会得到过错的数字,依据状况,或许会让你丢失许多钱。 Synthetix MKR操作 2019年12月,Synthetix又遭受进犯,原因是价格预言机操作。这次值得注意的是,它跨过了链上价格数据和链下价格数据之间的妨碍。
Reddit用户u/MusaTheRedGuard观察到,一名进犯者针对sMKR和iMKR(反向MKR)进行了一些十分可疑的买卖。进犯者首要经过买入sMKR购买了MKR的多头头寸,然后从Uniswap ETH/MKR买卖对中购买了大量的MKR。等候一段时间后,进犯者将他们的sMKR卖出换成iMKR,并将他们的MKR卖回Uniswap。然后,他们重复这个过程。 在幕后,进犯者经过Uniswap进行的买卖让他们能够随意改动Synthetix上MKR的价格。这很或许是由于Synthetix所依靠的链外价格推送实际上是依靠于MKR的链上价格,没有足够的流动性让套利者将商场重新设置回最佳状况。 这个事情阐明,即使你以为自己运用的是链下价格数据,但实际上你或许依然在运用链上价格数据,你依然或许暴露在运用这些数据的复杂性之中。 bZx黑客 2020年2月,bZx在几天内被黑了两次,丢失约1百万美元。你能够在这里找到palkeo写的关于两次黑客的优异技能剖析,但咱们只看黑客的第二次进犯。 在第二个黑客进犯中,进犯者首要用ETH购买了Kyber上简直一切的sUSD。然后,进犯者自己从Synthetix购买了第二批sUSD,并将其存放在bZx上。进犯者用sUSD作为典当,借到了他们答应的最大数额的ETH。然后他们将sUSD卖回给Kyber。 假如你一直在关注,你会认识到这本质上是相同的典当借款进犯,但运用不同的典当品和不同的去中心化买卖所。 yVault Bug 2020年7月25日,我向yEarn报告了一个关于他们新的yVault合约推出的bug。我将在下面简略总结一下。 yVault体系答应用户存入Token并在上面赚取收益率,而不需求自己办理。在内部,金库会跟踪yVault Token的总发行量以及存入的根底 Token总量。单个yVault Token的价值由铸造的Token 与存入的Token的份额给出。金库赚取的任何收益都会分摊到一切已发行的yVault Token (因而,也就分摊到一切yVault Token 持有人身上)。
第一个yVault答应用户经过向Balancer MUSD/USDC池供给流动性来赚取USDC的收益率。当用户向Balancer池子供给流动性时,他们会收到BPT作为回报,BPT能够兑换池子的一部分。因而,yVault依据能够用其BPT赎回的MUSD/USDC的数量来计算其持有的价值。 这似乎是正确的完成办法,但不幸的是,与之前给出的原理相同--买卖过程中Balancer池的状况并不稳定,不能被信赖。在这种状况下,由于Balancer挑选的价格曲线,用户从USDC换成MUSD时,不会得到1:1的汇率,但事实上会在池子里留下一些MUSD。这意味着BPT的价值能够暂时被扩大,这使得进犯者能够随意操作价格,随后将金库耗尽。 这一事情标明,价格预言机并不总是清晰的反映价格数据,开发者需求警觉他们摄取的是什么样的数据,并考虑这些数据是否能被无权用户轻易操作。 对于收益率耕耘的黑客进犯 2020年10月26日,一个不知名的用户入侵了流动性挖矿的池子,运用的技能你现在或许现已猜到了。你能够在这里阅览官方的事后报告,但我再一次为你总结一下:进犯者经过履行买卖将曲线池中USDC的价格虚化,以降低的价格进入耕耘池,经过反转之前的买卖恢复价格,并以更高的价格退出耕耘池。这导致了超过3300万美元的丢失。 我该怎么维护自己? 现在,我期望你现已学会了认识到共同点--你运用价格预言机并不总是安全的,假如你不遵从适当的预防措施,进犯者或许会进犯你的协议,将你的钱全部发送给他们。尽管没有一个全能的修正办法能够参阅,但这里有一些曩昔对其他项目有用的解决方案。
或许其间一个也会适用于你。 寻觅有流动性充足的池子 就像跳入游泳池的浅滩一样,跳入流动性不足商场是苦楚的,或许会导致严重的开支,这将永远改动你的生活。在你考虑你计划运用的详细价格预言机的复杂性之前,请考虑该代币的流动性是否足以确保与你的渠道整合。 一鸟在手,胜过两鸟在林 在Uniswap上看到潜在的汇率或许会令人入神,但在你真实点击买卖和代币放在你的钱包里之前,并不意味着那是最终价格。
同样,确认两种财物之间汇率的最好办法是直接交换财物。这种办法很好,由于没有回扣,也没有假如。但是,对于假贷渠道等协议来说,或许就不适用了,由于这些协议是需求持有原始财物的。 去中心化的预言机 有一种办法能够总结出依靠链上数据的预言机的问题,那就是它们有点太新潮了。既然如此,为什么不引入一点人为的延迟呢?写一个合约,它能够用Uniswap这样的去中心化买卖所的最新价格来更新自己,但只有当一小部分特权用户提出恳求时才会更新。现在即使进犯者能够操作价格,他们也无法让你的协议真实运用它。 这种办法完成起来真的很简略,并且是速战速决,但也有一些缺陷--在链路拥堵的时分,你或许无法像你期望的那样快速更新价格,并且你依然简单受到三明治进犯。另外,现在你的用户需求信赖你真的会坚持价格更新。 延迟防护 操作价格预言机是一个时间敏感的操作,由于套利者总是在观察,并期望有时机优化任何次优商场。假如进犯者想把危险降到最低,他们会期望在一次买卖中完成操作价格预言机所需的两次买卖,这样就不会有套利者在中心跳动的时机。作为协议开发者,假如你的体系支撑的话,或许只需求完成用户进入和退出体系之间短至1个block的延迟就能够了。 当然,这或许会影响到可组合性,矿工与买卖员的合作正在上升。在未来,不良行为者或许会在多个买卖中进行价格预言机操作,由于他们知道与他们合作的矿工会确保没有人能够跳到中心,从他们的收益中分一杯羹。 时间加权平均价格(TWAP) Uniswap V2引入了一个TWAP预言机,供链上开发者运用。文档中更详细地介绍了该预言机供给的详细安全保证,但一般来说,对于长时间没有链上拥堵的大池子来说,TWAP预言机对预言机操作进犯有很强的抵抗力。不过,由于其完成的性质,在商场动摇较大的时间,它的响应速度或许不够快,并且只适用于链上现已有流动性代币的财物。
M-of-N 喂价 有时分人们会说,假如你想把一件事做好,你就自己去做。假如你召集N个值得信赖的朋友,让他们提交他们以为合适的链上价格,最好的M个答案就成了当时的价格,会怎么样? 现在许多大型项目都在运用这种办法。Maker运行了一组由可信实体运营的价格源,Compound创建了Open预言机,并具有Coinbase等报告器,Chainlink聚合了Chainlink运营商的价格数据,并在链上公开。
只要记住,假如你挑选运用这些解决方案之一,你现在现已将信赖委托给第三方,你的用户也有必要这样做。要求报告人手动在链上发布更新也意味着,在商场动摇大、链上拥堵的时分,价格更新或许无法及时完成。 结论 价格预言机是 DeFi 安全性的一个重要组成部分,但往往被忽视。安全地运用价格预言机是很难的,并且有许多办法能够让您和您的用户都吃亏。在这篇文章中,咱们介绍了曩昔操作价格预言机的例子,并确认了在买卖中心读取价格信息或许是不安全的,或许会导致灾难性的财政丢失。咱们还评论了一些其他项目曩昔用来打击价格预言机操作的技能。不过最终,每一种状况都是独特的,你或许会发现自己不确认自己是否正确运用了价格预言机。假如是这种状况,请随时联络咱们寻求主张!
视野开拓
归根结底生产并在生产了价值理论本身支配地位所需的条件-《资本的限度》