草庐IT

如果DAI遭遇攻击 加密世界会发生什么?

佚名 2023-03-28 原文
目前,大约有 73 亿美元 DAI 在流通。其中只有大约 10 亿美元是由波动资产支持的。这大约是 13.7%。但我们已经看到当资产与固定汇率脱钩时,它们往往会出现条件反射。当它们达到 0.95% 时,会有加速的趋势。

Uniswap 上大约 20% 的仓位也是 USDC/DAI 的范围仓位,其中大部分由 Arrakis Finance 上的自动资金库管理,该资金库有管理者负责其范围,但目前该仓位的范围很窄。

在 Uniswap V3 上,一笔 7.05 亿美元的交易开始超出头寸,但仍然会获得 6.95 亿美元的回报,所以一旦损失 1.4% 会将其推到危险边缘。在 Curve 上,同样的情况大约需要 3.7 亿美元。

当它开始超出头寸时,下一个催化剂点将在价格上偏离大于 17% ,因为 Compound 让 DAI 作为 83% 的质押品。只需再增加 1.95 亿美元的 DAI 就能达到这一水平。

问题是,你能以 DAI 的数量以及想要平仓的人们的买入压力,到达那一水平吗?因为流通中的 DAI 大部分来自于 PSM,所以实际上只有 29 亿的 DAI 债务存在。

注:Maker 系统的锚定稳定模块(PSM,Peg-Stability Module)允许用户以 1:1 的兑换率直接将其他稳定币抵押品兑换为 DAI,而非以质押铸造的方式,PSM 的主要目的是帮助保持 DAI 与美元的挂钩。

所以我们预计上行的买盘压力不会超过这个水平。目前,ETH-A、ETH-C、WBTC-C、WBTC-B 资金库的可用 DAI 总价值约为 4.446 亿美元。USDC 的 PSM 有 12 亿美元可用,Compound 有大约 5.3 亿美元可用。

攻击者可以以 4 亿美元的价格打开 ETH-A、ETH-C、WBTC-C 和 WBTC-B 资金库,使用 Compound 借款 4 亿美元(最高 APY 为每年 34%,这可能会将 DAI 从其他仓位吸引到 Compound 中一两天,使其更容易被盗),通过 PSM 将 USDC 换成 3.5 亿美元的 DAI。

此时,攻击者将针对 UniV3 头寸和 3Pool 进行出售。以 10.7 亿美元计,他们将获得约 105 亿美元的 USDC。PSM 将 2.5 亿美元的 USDC 注入 DAI,并再次交易。这方面的损失将为 2500 万美元。但这将引发另一笔 6.5 亿美元的 DAI 交易,以流动性的形式进入市场。

随着清算的到来,大多数清算机器人都在试图买入和抛售,但稀薄的流动性将意味着他们要么撤回报价,要么进一步压低价格。很难预测随着套利持续下去价格会有多低,但如果是单笔交易(你可以通过捆绑交易来实现),然后它会处于 47% 这一点上,会有其他质押品清算,资金库和用户在倾销 DAI 问题上将面临更大的定价压力。

攻击者可以慢慢开始购买打折的资产。如果他们损失了 3500 万美元,那也不算太糟。单是流动性的以太坊价格下跌 10%,他们就可以收回 4000 万美元的资金库债务。

随着 DAI 的梯级下降 47%,他们也可以用 DAI 来偿还他们的部分 PSM 或 Compound 债务。但可能不需要,因为他们全部都是现金,不想增加上升的压力。DAI 可能会从类似这样的情况中恢复过来,而且这种攻击需要非常快地完成(可能是一次交易 +闪电贷)并且需要额外的资金以防套利机器人的强力反击。

但是,即使其中某种情况发生了,任何对 DAI 的信心都将被彻底摧毁,你会将其视为质押品的衰落,或至少其质押品价值的大幅下降会降低其需求。完成这项工作需要几十亿美元的资金和详细的协调,但在这种市场条件下并非不可能。在很大程度上,这是因为许多 DAI是由 PSM、非流动资产和非多样化质押品发行的。如果我们将 Uniswap 头寸计算为 50/50,这意味着大约 10% 的 DAI 由 DAI 作为质押品支持的。这是产生反射性风险的主要问题。

目前 DAI 使用的主要驱动因素是:杠杆交易费用挖矿和 Curve 基础池的使用。在杠杆和缺乏多样性的基础上建立了太多的风险。为了防止此类风险,Maker 可能会采取以下措施:将协议中的治理最小化,以增加信心;降低对 PSM 的依赖,从而产生规模风险;进一步限制每种质押品类型的上限大小;不使用 DAI 对作为质押品。

在当前的市场条件下,其他协议可能也应该考虑降低 DAI 的 LTV(生命周期总价值)/质押品系数,确保在尾部风险降低之前更难以达到平仓点。我希望 DAI 能够继续成功和发展。但是,它应该以一种负责任、安全和去中心化的方式来实现这一目标,而不仅仅是不断地将风险叠加在风险之上。除非某个大机构黑客出于特定原因决定攻击 DAI,这样的攻击是不太可能发生的,但是,当存在其他生态系统调整时会发生什么?

如果 DAI 脱钩,或者像网络讨论的那样关闭对 USDC 的支持会怎么样?如果 Curve 想用 crvUSD 替换 DAI,会发生什么?我们在 DAI 的基础上做了太多建设,因为它一开始是一个简单的、去中心化的、纯粹的稳定币。随着这种情况的改变,我们需要分散稳定币的使用,或解决造成尾部风险的核心问题。在没有多样化支持的情况下,我们永远不应该创造出一个集中的、零滑动的、1:1 支持的数十亿规模的资产。否则你只是重新发明了我们想要取代的同样破碎的货币体系而已。

在人们尖叫 “FUD” 之前,我要再次强调,我不期望 DAI 被盗这种情况发生,这是非常不切实际的,可能需要更多的资金,因为需要套利。这是一个思想实验,它强调了在我们发展的过程中需要修复系统风险的重要性。

有关如果DAI遭遇攻击 加密世界会发生什么?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  7. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  8. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

随机推荐