DeFi 新叙事?无 Oracle 协议的智能合约安全新模式
作者:@Ac-Core, YBB Capital Researcher
前言
Oracle(预言机) 是 DeFi 世界中的一个重要因素,虽然不同协议的安全性通常是由底层智能合约网络来继承,但它的正常运行还是需要依赖预言机,如果一个协议的预言机遭受到攻击或者破坏,那么整个协议就会被操控。近期新的 DeFi 创造者们正通过构思全新的借贷和衍生品架构来制造新的叙事,而这些协议的变化相同点是不再去依赖预言机。
DeFi 的风险与修复
DeFi 的最大魅力来自于:去中心化,它从广义来讲是一种无权限支付协议的开放式金融系统,与传统金融相比,它的规则、利润甚至风险虽都以较为「隐晦」的方式公开,但仍具有非常强的开放度。
但经过几年的发展,DeFi 领域也累计遭到了数十亿美元的盗窃 [1],即使最为狂热的信徒也会不断质疑它是否能成为未来金融的主流。其中仅在 2022 年黑客通过 DeFi 协议和跨链桥盗取的资金就超过了 38 亿美元,2022 这也是加密史中盗窃金额最多的一年。如果想在未来让更庞大的群体进入加密世界并依赖 DeFi,安全性是首要考虑解决的因素。
图源:Chainalysis
Oracle 的风险和「源码」
由建设者组成的机构 Nascent 认为「无 Oracle 协议」的概念将为 DeFi 从根本上提供更加稳健和安全的技术架构。如今 DeFi 更希望将自身定义为「源码(Primitives)」,希望有更多的团队在它们的基础之上构建产品或组合协议。一旦该合约掺杂了任何外部依赖,它们就会继承所有的相关风险,与此同时,该合约为了承载更为庞大的系统生态,会去升级,而这种管理式的升级变量就会涉及到可变更环境的当下及未来,带来更多风险因素。顾名思义 Oracle 的引入产生了外部数据的依赖关系,而这种关系会带来潜在风险。为此 Nascent 成员 Dan Elitzer 提出了一个全新的定义:为符合源码(Primitives)的条件,除了部署在区块链上的合约之外它不能依赖任何外部因素,比如:没有治理、合约可升级性和预言机。
但现实是如今符合这一基本定义的 DeFi 协议是非常稀有的,其中最有代表性的是 Uniswap V1,但从安全性角度考虑,即使是与上述提出的定义保持一致的 Uniswap V2 与 V3 也不符合资格,因为它们允许对某些功能进行治理,例如协议费用的闭合与引入池子的费用层级。
话虽如此,这种狭隘的治理功能并没有因其他协议中存在的大规模升级而引发系统性风险,所以迄今为止所有版本中的 Uniswap 取得巨大成功的原因是没有 Oracle 和全链这两个关键因素。
毋庸置疑 Uniswap 是去中心化交易的主导者,它取得了巨大的成功,并在此基础之上诞生出了很多去中心化交易所的实验。好比 Uniswap V3 引入了非同质化流动性头寸的概念,让流动性提供者(LPs)可以将他们的流动性集中在某个特定范围内,这使 LPs 可以捕获在该范围内交易产生的更大份额交易费,并从中获利,但随着价格波动这里也会产生无偿损失。从而导致了资本更高效的使用和市场中 LP 部分的专业化,随即诞生了一系列头寸管理工具,例如 Arrakis、Gamma 和 Sommelier。虽然这对 DEXs 来说非常友好,但借贷协议仍需要预言机。
时间来到今年 3 月,Euler Finance 借贷协议遭受黑客攻击,损失金额高达 2 亿美元。它可以让用户自行决策抵押品并借款,简而言之它的问题发生在一个特定函数中且没有对它进行安全检查,使用户能破坏借贷市场的基本不变式。此次攻击事件的详细过程请阅读 [2]。
对于借贷协议来说,合格的抵押品仅限于有可靠预言机价格反馈的资产。贷款参数(如贷款价值比 [3])受其协议管理,因此任何坏账都由协议而非单个贷款人负责。同样,依赖于预言机进行定价的衍生品协议如缺乏内部价格发现机制,容易受到价格滞后无更新影响,从而严重限制它们的规模和用户体验。如同前言所述,这也正好解释了为什么交易员 Avraham Eisenberg 能够成功攻击 Mango Markets 并从该加密货币交易平台抽走 1.16 亿美元。
为什么目前 Uniswap 是安全的
AMM 可以具有任何 DeFi 源码(Primitives)中最简单的基本不变式:tokenBalanceX * tokenBalanceY = k(如常数乘积)。例如 Uniswap V2 中 Pair 接口都是基于以下四个函数不变式实现的:
Mint:添加到 k;
Burn:从 k 中减去;
Swap:移动 x 和 y,保持 k 不变;
Skim:重新调整 tokenBalanceX * tokenBalanceY,使其等于 k。
Uniswap V2 的安全之道:一个简单的核心不变式,所有函数都为此服务。唯一值得争议的是它可以切换费用开关的治理模式,但这不会触及核心不变式,只是影响代币余额所有权的分配,也正是由于他们在安全性中的这种简洁性(不可升级的智能合约和基本不变式),Uniswap 本身从未遭受过黑客攻击。
重建贷款协议
图源:作者 Balakov
近期我们发现对无预言机的借贷协议出现了很多项目,例如 Ajna、Ethereum Credit Guild、MetaStreet 的自动化分层协议(Automated Tranche Maker)以及 Blur 和 Paradig 合作推出的混合协议 Blend [4]。
与传统的 DeFi 借贷市场不同,Gauntlet 没有设置抵押,也没有像 Chainlink 这样的单通用预言机为所有用户和协议功能提供「真实」资产价格来源。相反借款人需要评估风险,以此来决定借款人那里要求的抵押品,且必须在资产价格变动时更新他们的借款标准。其工作方式一般是借款人选择他们愿意接受的指定抵押品,例如 BAYC Token 以及个别的 Bored Ape NFT 等,他们愿意提供给借款人用作抵押品的引用资产(如 USDC),以及他们将要求借款人被清算的引用资产与抵押资产的比例。最后借款人可以发布抵押品,并以当前市场利率借入引用资产。
需要注意的是,由于借贷双方已经同意贷款的清算是根据每种资产的单位数量而不是美元价格的比率来确定,因此并不需要预言机。然而,如果任一资产的相对美元价值发生变化,贷款人将调整当下或未来贷款的条款,以达到他们认为安全的抵押比例。
这些方法的最大优势为:协议在实际上是无法破产的。这是因为每个贷款人最终都要对自己贷款的偿付能力负责,因此不存在 "坏账 "的概念,而这种 "坏账 "可能要由 DAO 金库/保险基金来承担,或在贷款人之间进行处理。
Blur 的 Blend 混合协议假定 "存在能够参与复杂的链上和链下协议、评估风险并使用自有资金的更复杂的贷款人"。这在 Blur 作为专业 NFT 交易者的主要交易场所的背景下是有道理的,但对于普通用户来说,这似乎比在 Aave 或 Compound 上借贷要复杂得多。
无 Oracle 的新面孔
根据 Messari 研究员 Chase Devens 的定义,无预言机的定义架构可以分为两类,即点对点(Peer-to-Peer)和基于 AMM 的混合类型。其中它们两者的主要特点如下:
点对点
支持任何的链上抵押品类型
用户承担贷款参数并承担坏账风险(不再是合约承担风险),借款人不再定义利率和 LTV 参数,而是自己决定价值比较,并且从协议的机制中移除预言机意味着这些贷款可以由任何链上抵押品创建。
需要对仓位进行积极管理,为确保提供的流动性得到有效利用,用户必须以类似于 Uniswap V3 的集中流动性位置的方式积极管理他们的仓位。
基于 AMM 的混合类型(借贷/衍生品—LPs 流动性提供者)
支持任何的链上抵押品类型
底层 LP 位置为清算和衍生合约提供定价数据,同时也是清仓主要市场。使协议能够从其底层流动性池中计算清算和衍生合约的结果,从本质上讲,LP 位置自身就像一个预言机。此外,这些 LP 位置在清算或合约到期期间提供了一种主要市场,用于卸载协议库存,而不需要到外部平台清算抵押品。
举例说明:
Ajna.finance
Ajna 是一种专为 EVM 而设计的借贷协议,没有治理、权限或外部价格供给(预言机)。可以用它来借贷我们的整个投资组合(包括 NFT)。其他贷款类项目已达到规模临界值的两个核心问题: (1) 代币治理系统不足以分析复杂的风险 (2) 使用外部价格反馈(预言机)将资产范围限制为具有流动性二级市场的「蓝筹股」。这些缺陷给 DeFi 借贷市场造成了灾难性损失,并限制了对新资产的支持能力。Ajna 通过一些关键创新解决了这些问题:
(1) 贷款方提供资产定价: 当贷款人使用 Ajna 协议时,他们会告诉合约以多少价格抵押资产的意愿。这有效地让他们输入自己的生命周期价值,并将其从治理参数转变为市场参数;
(2) 自动利率发掘: 在每个 Ajna 市场中,都有一个由内部指标决定的均衡状态。如果市场失衡,任何人都可以每 12 小时改变 10% 的汇率。如果没有,则不做任何改变;
(3) 清算保证金: 由于 Ajna 没有预言机,它依赖用户告诉它何时清算贷款。这是通过让清算人缴纳保证金以触发清算来实现的。如果他们诚实,他们就会得到回报。如果没有,他们就会受到惩罚。
那么有什么意义呢?这些创新使 Ajna 能够为「整个」生态系统提供服务。任何人都可以用任何资产(甚至是 NFT)创建借贷市场。不再费力地完成的治理流程且不再担心流动性、二级市场和预言机。
Blend
图源:Achal Srinivasan , Kirby
Blend 是一种点对点的永久借贷协议,支持包括 NFT 的任何抵押品。它通过复杂的链下报价协议将有借款意向的用户与愿意提供有竞争优势利率的贷款人进行匹配。
默认情况下,Blend 贷款的利率是固定的,而且永远不会过期。借款人可以随时还款,而贷款人可以通过触发荷兰拍卖,以新的利率寻找新的贷款人,从而退出其头寸。如果拍卖失败,借款人将被清算,贷款人将占有抵押品。整体具有不依赖预言机、无期限、可流动、点对点这四大特性:
无预言机
很多 DeFi 协议需要预言机来确定清算头寸或确定利率的时机,以 NFT 为例它的价格很难被客观衡量,及时的地板价更新在链上也是非常难被观测,这种解决方案通常需涉及到受信任的一方或交易操纵。而混合协议避免了核心协议中的任何预言机依赖,让利率和贷款比由贷款人意愿条件来决定,最后清算由荷兰拍卖的失败而触发;
无期限
一些 DeFi 协议只支持有期限的债务头寸。这对借款人来说很不方便,他们需要在到期前记得关闭或调整头寸(否则可能面临惩罚,如没收 NFT)。手动调整头寸的过程还需要消耗 Gas,这也减少了借贷所产生的收益。只要有贷款人愿意根据抵押品借出这笔金额,Blend 便会自动调整借款头寸,只有在利率变动或其中一方想要退出头寸时才需要进行链上交易;
可流动
有些协议不支持到期前清算,这样对借款人来说较为方便,并且在很多用例下是合理的。但这实际上是给借款人一个看跌期权,对放款人来说需要在较短的到期时间内从较高的利率/较低的贷款中做出选择,以避免头寸被清算的风险。在 Blend 中,只要贷款人触发再融资拍卖,在没有人愿意以任何利率接手债务的情况下,就可以对 NFT 进行清算;
点对点
其中一些协议是将贷款人的资金集中在一起,并试图为他们管理资产。这意味着会严重依赖链上管理或集中式管理来设置参数。Blend 采用了点对点的模式,且每笔贷款都是单独匹配,它没有优化贷款方式的简单性而是以假定存在更复杂的借款人能力参与到复杂的链上和链下协议的情况下完成,从而有更大的权限来掌握自己的资产。
什么是 FREI-PI 模式
根据 Nascent 成员 Brock Elmore 解释的 FREI - PI 模式为:「功能需求-影响-交互-协议不变式(Function Requirements-Effects-Interactions + Protocol Invariants pattern)」,这里以 dYdX 的 SoloMargin 合约(源代码)为例,这是一个借贷市场和杠杆交易的合约,即为 FREI-PI 模式的绝佳范例。这是早期借贷市场中唯一没有任何市场相关漏洞的借贷市场。
查看下面代码时注意以下的抽象概念:
输入要求 ( _verifyInputs )
操作 ( data transformation, state manipulation )
状态要求 ( _verifyFinalState )
图源:Brock Elmore
这里常用的检查 - 效果 - 交互(Checks-Effects-Interactions)仍在执行。但需要注意的是,带有附加 Checks 的 Checks-Effects-Interactions 并不等同于 FREI-PI,虽然它们相似但服务的是不同目标。为此开发人员应该理解它们的不同: FREI-PI 是针对协议安全的高级抽象,而 CEI 则是针对功能安全的高级抽象。
该合约结构有趣的地方是用户可按自己的意愿连续执行多项操作,包括:存款、借贷、交易、转账、清算等。我们假设存入 3 种不同的 Token,且取出第 4 种 Token 并清算账户,这一系列操作只需一键即可完成。
这就是 FREI-PI 的强大之处:只要核心借贷市场不变式在调用结束时成立,用户就可以在协议内做任何想做的事情。对于本合约,这将在 _verifyFinalState 中执行,检查每个受影响账户的抵押情况,确保协议比交易开始时更好。
该函数中还包含一些额外的不变式,它们是核心不变式的补充,有助于实现关闭市场等辅助功能,但真正保证协议安全的是核心检查。
其中以实体为中心的概念是 FREI-PI 的另一个难题,用借贷市场和假定的核心不变式为例:用户不能采取任何行动让任一账户陷入不安全的抵押品状态。从技术角度讲这不是唯一的不变式,但对用户来说是唯一不变量(可理解为仍是核心协议不变式,因为用户不变式就是核心协议不变式)。在借贷市场中通常还会有两个额外的不变式:
1. 预言机
一般来说 Chainlink 是一个不错的选择,它的主要功能是提供准确和相对准确的实时信息,这可以满足大多数不变式的要求。在极少数被操纵或意外情况下,为保证准确性而降低实时性的保障措施可能是有益的(如检查最后已知值是否比当前值大数百个百分点)。不过 Cream Finance 还是出现了 1.3 亿美元的攻击。关于更多预言机的信息请参考:操纵 Uniswap V3 TWAP 预言机 [5];
2. 治理
治理是最棘手的不变式,因为它难以受到条件约束且大部分作用是改变其他的不变式,且某些治理在操作时无法通过 FREI-PI 进行验证。以 Compound 在 2022 年 8 月发生的破坏 cETH 市场的治理操作为例,此次升级违反了预言机的不变式,内容详情阅读 [6]。
在实际中,每个额外的不变式都使得协议变得更加难以保护,所以应当越少越好。因此复杂是危险的,而最重要的不变式就是协议核心的不变式,但如上文所述也会存在一些以实体为中心的不变式,这些不变式必须满足核心不变式的要求,最简单/最小的不变式集合可能是安全的。
小结:DeFi 的未来
将 DeFi 建立在不可升级的源码(Primitives)之上且脱离预言机是最优的解决方案吗?毕竟目前 DeFi 协议依靠治理、可升级性和预言机而带来的灵活性和易用性也让整个市场规模达到了数千亿美元。据上文提到的 Dan Elitzer 观点:治理、可升级与预言机它们在本质上也并非是不好的,相反这些元素在更广义的环境下都具有非常大的实际价值,但这也会增加协议的攻击概率。
在根据需求更新功能或改进效率的前提下,源码(Primitives)本身也是可以被偶尔替换的。在选择如何创建 DeFi 协议时将会面临着两个重要的选择:将所有用户的数据和外部条件的依赖交给较为中心化的单一协议,并委托给一小部分愿意参与治理的 Token 持有者?还是重视市场中每个参与者的所有权,让用户自己决定协议和服务商?
整个行业的参与者和开发者都致力于建设更为去中心化、无许可、高组合性的 DeFi,以此提升整个行业的安全性和弹性。关于 DeFi 未来的发展方向,我们希望它能以更为安全和高效的运行方式不断占领传统金融的市场份额。
解释及参考文献:
[1] https://rekt.news/leaderboard/
[2] https://medium.com/@omniscia.io/euler-finance-incident-post-mortem-1ce077c28454
[3] https://www.investopedia.com/terms/l/loantovalue.asp
[4] htts://www.paradigm.xyz/2023/05/blend
[5] https://github.com/euler-xyz/uni-v3-twap-manipulation/blob/master/cost-of-attack.pdf
[6] https://medium.com/chainlight/the-suspension-of-compound-finances-ceth-market-causes-and-solutions-b106c2e1c922
http://www.nascent.xyz/idea/youre-writing-require-statements-wrong
https://www.nascent.xyz/idea/why-defi-is-broken-and-how-to-fix-it-pt-1-oracle-free-protocols