转发原文标题:全面解析 ERC-4626 与 DeFi
ERC-4626 是一个使用单一基础 ERC-20 的代币化金库。
Tokenized Vaults with a single underlying EIP-20 token.
首先,它是一个基于 ERC-20 的提案,并与之完全兼容。
其次,理解金库(vault)的概念,它不是国库(treasury)。现在市面上的国库基本上就是一个合约钱包,大多以 Gnosis Safe 为主,主要提供安全的资金出入功能。但是对于一个组织来说,除了资金出入外,还可以让资金流动产生收益。
该提案产生的动机:代币化的金库缺乏标准,导致市场上的很多金库实现细节不一样,比如借贷市场、聚合器、生息代币等。这使得在协议层面的聚合器和插件集成工作变得困难,容易出错和浪费开发资源。
该提案当前状态:Final,意味着是相对比较稳定的标准了。
遵循 ERC-4626 的代币必须完全实现 ERC-20,用来表示份额(shares)。下面是几个简单的概念。
滑点是指交易的预期价格与实际执行价格之间的差异。当下单交易与执行交易之间存在延迟,交易的资产价格发生变化时,滑点就会出现。
例如,你在 AMM 池中发现有 20 个 ETH 和 80 个 USDT,那么你预期的 ETH 价格为 4 USDT/ETH。然而,如果你计划花费 20 个 USDT 在池子里进行 swap,最终只会得到 4 个 ETH,而不是预期的 5 个 ETH,这意味着你遭受了 1 USDT/ETH 的滑点损失。你的实际购买价格将是 5 USDT,而不是预期的 4 USDT。
滑点在快速变化的市场或高波动性资产以及流动性受限的长尾资产中尤其常见。无论如何,它对交易表现有重大影响,在下单交易时考虑滑点非常重要。
合约代码来自 OpenZeppelin 智能合约代码库:
ERC-4626 合约继承自 ERC-20,这部分就不概述了,它本身也是一个抽象合约,该合约必须实现的接口如下:
接口还是挺丰富的,大多比较简单,可以分为 read 和 write 2 大类。
写数据接口主要是 deposit、mint、withdraw、redeem。
实际上由于滑点的存在,使用 preview 方法查看预计的数字,可能是不准确的,也是业界常见问题,可能会产生一些安全问题,后面会讲到。
前面讲的几个 preview 方法,和公开的 convertToShares,convertToAssets,实际上内部都是调用了 _convertToShares、_convertToAssets 方法。
这 2 个核心方法就是计算资产和份额的比例关系的,这里面涉及到的变量有份额供应量、当前总资产、小数点位数、小数点取整方式。
以上是 ERC-4626 抽象合约的基本实现,实际的金库合约要比它复杂的多。
对于金库合约,有 2 个比较重要的功能实现,一个是存取功能,assets 和 shares 的换算;另一个是获得收益的方式。下面我们会举例讲解。
类似其它一些热门的 EIP,ERC-4626 也有一个专门人维护的联盟生态(https://erc4626.info/),收集了目前市面上已经兼容 ERC-4626 的一些借贷协议和应用,另外还有新闻、开源库、安全等信息。如果你的金库适配了 ERC-4626,也可以在上面提交申请。
下面我们分析一个应用例子,Aladdin DAO 的 AladdinCRVV2 金库(https://concentrator.aladdin.club/vaults/)。Aladdin DAO 有很多个金库合约,这只是其中一个比较活跃的。
该金库通过质押 cvxCRV 代币,来获得收益。
(https://etherscan.io/address/0x2b95A1Dcc3D405535f9ed33c219ab38E8d7e0884),通过github 代码可以查到之前版本是不兼容 ERC-4626 的
(https://etherscan.io/address/0x62B9c7356A2Dc64a1969e19C23e4f579F9810Aa7)。cvxCRV 可以在 Curve 旗下的 Convex 上通过质押 CVX 获得,也可以使用 CRV 转换 cvxCRV(过程不可逆)
以上就是对该金库合约的基本解析,功能还是比较丰富的,它的本质就是 assets 质押生息,为什么要这样设计呢,主要还在在于 cvxCrvStaking 合约的设计,质押 cvxCRV 收益描述“By staking cvxCRV, you’re earning the usual rewards from veCRV (3crv governance fee distribution from Curve + any airdrop), plus a share of 10% of the Convex LPs’ boosted CRV earnings, and CVX tokens on top of that.”,而一起通过金库质押的代币数量越多时,获得的收益也越大。
对于 ERC-4626 金库来说,最主要的安全问题在于防通货膨胀攻击(Inflation attack)。
当用户存入代币时,根据份额计算公式(shares = assets * totalSupply / totalAssets),计算结果是有小数点的,一般是向下取整。
通过下图可以看到,在用户存入 500 代币的资产时,小数取整所损失的资产取决于汇率(每股和代币资产对应关系)。如果汇率是橙色曲线的汇率,我们得到的不到 1 股,损失了100%。但是,如果汇率是绿色曲线的汇率,得到 5000 股,四舍五入损失限制在最多 0.02%。
那如果我们专注于将损失限制在最大 0.5%,我们需要获得至少 200 股。绿色汇率只需要 20 个代币,但橙色汇率需要 200000 个代币。
通过几上例子可以分析出,蓝色和绿色曲线对比黄色和橙色曲线更安全,是设计更加安全的金库。
所以通货膨胀攻击的主要方式就是,通过某些手段将利率曲线向右移动,让少量存款者损失份额,达到攻击目的。
Inflation attack 主要是通过捐赠(donate)。
抵御攻击的措施有 3 种:
具体实现就是重写由 OpenZeppelin 提供的标准库代码 _decimalsOffset() 方法,这种方式即不用设置滑点,也不用注入足够初始资金,是非常好的抵御通胀攻击方式。
RC-4626 作为一个比较基础的金库提案,不可能满足所有需求,有一些提案也对止做出了扩展,比如 ERC-7535、EIP-7540。
前面提到 ERC-4626 只能使用 ERC-20 作为基础资产,这个提案主要是将原生资产(native asset)也可以作为基础资产(underlying asset),比如 ETH 在金库中使用。
这个对 ERC-4626 的扩展引入了对异步存款和赎回过程(称为”请求”)的支持。它包括了用于启动和检查这些请求状态的新方法。现有的从 ERC-4626 中使用的方法,如存款、铸币、提取和赎回,被用于执行可认领的请求。关于是否添加存款、赎回或两者的异步流程,由实现者自行决定。
潜在用例:
以上,就是关于 ERC-4626 相关的全部解析。
因为历史原因,当前市面上有很多金库并不遵循 ERC-4626的,依然在运作,比如 dForce,但没法应用更广。也有一些金库已经升级为遵循 ERC-4626,比如 Aladdin DAO 的一些合约(https://github.com/AladdinDAO/deployments/blob/main/deployments.mainnet.md)。
金库应用除了质押生息外,还可以将 shares 做为抵押物借出或者再质押,从而产生收益。另外通过金库来募资也是一个比较好的应用场景,它的一些基础功能就可以提供很好的支持。
该提案的推出,本质是为了提升金库与 DeFi 生态集成效率,减少开发成本。而金库本身的作用,随着 DeFi 市场的增长,还有更多挖掘的空间。
转发原文标题:全面解析 ERC-4626 与 DeFi
ERC-4626 是一个使用单一基础 ERC-20 的代币化金库。
Tokenized Vaults with a single underlying EIP-20 token.
首先,它是一个基于 ERC-20 的提案,并与之完全兼容。
其次,理解金库(vault)的概念,它不是国库(treasury)。现在市面上的国库基本上就是一个合约钱包,大多以 Gnosis Safe 为主,主要提供安全的资金出入功能。但是对于一个组织来说,除了资金出入外,还可以让资金流动产生收益。
该提案产生的动机:代币化的金库缺乏标准,导致市场上的很多金库实现细节不一样,比如借贷市场、聚合器、生息代币等。这使得在协议层面的聚合器和插件集成工作变得困难,容易出错和浪费开发资源。
该提案当前状态:Final,意味着是相对比较稳定的标准了。
遵循 ERC-4626 的代币必须完全实现 ERC-20,用来表示份额(shares)。下面是几个简单的概念。
滑点是指交易的预期价格与实际执行价格之间的差异。当下单交易与执行交易之间存在延迟,交易的资产价格发生变化时,滑点就会出现。
例如,你在 AMM 池中发现有 20 个 ETH 和 80 个 USDT,那么你预期的 ETH 价格为 4 USDT/ETH。然而,如果你计划花费 20 个 USDT 在池子里进行 swap,最终只会得到 4 个 ETH,而不是预期的 5 个 ETH,这意味着你遭受了 1 USDT/ETH 的滑点损失。你的实际购买价格将是 5 USDT,而不是预期的 4 USDT。
滑点在快速变化的市场或高波动性资产以及流动性受限的长尾资产中尤其常见。无论如何,它对交易表现有重大影响,在下单交易时考虑滑点非常重要。
合约代码来自 OpenZeppelin 智能合约代码库:
ERC-4626 合约继承自 ERC-20,这部分就不概述了,它本身也是一个抽象合约,该合约必须实现的接口如下:
接口还是挺丰富的,大多比较简单,可以分为 read 和 write 2 大类。
写数据接口主要是 deposit、mint、withdraw、redeem。
实际上由于滑点的存在,使用 preview 方法查看预计的数字,可能是不准确的,也是业界常见问题,可能会产生一些安全问题,后面会讲到。
前面讲的几个 preview 方法,和公开的 convertToShares,convertToAssets,实际上内部都是调用了 _convertToShares、_convertToAssets 方法。
这 2 个核心方法就是计算资产和份额的比例关系的,这里面涉及到的变量有份额供应量、当前总资产、小数点位数、小数点取整方式。
以上是 ERC-4626 抽象合约的基本实现,实际的金库合约要比它复杂的多。
对于金库合约,有 2 个比较重要的功能实现,一个是存取功能,assets 和 shares 的换算;另一个是获得收益的方式。下面我们会举例讲解。
类似其它一些热门的 EIP,ERC-4626 也有一个专门人维护的联盟生态(https://erc4626.info/),收集了目前市面上已经兼容 ERC-4626 的一些借贷协议和应用,另外还有新闻、开源库、安全等信息。如果你的金库适配了 ERC-4626,也可以在上面提交申请。
下面我们分析一个应用例子,Aladdin DAO 的 AladdinCRVV2 金库(https://concentrator.aladdin.club/vaults/)。Aladdin DAO 有很多个金库合约,这只是其中一个比较活跃的。
该金库通过质押 cvxCRV 代币,来获得收益。
(https://etherscan.io/address/0x2b95A1Dcc3D405535f9ed33c219ab38E8d7e0884),通过github 代码可以查到之前版本是不兼容 ERC-4626 的
(https://etherscan.io/address/0x62B9c7356A2Dc64a1969e19C23e4f579F9810Aa7)。cvxCRV 可以在 Curve 旗下的 Convex 上通过质押 CVX 获得,也可以使用 CRV 转换 cvxCRV(过程不可逆)
以上就是对该金库合约的基本解析,功能还是比较丰富的,它的本质就是 assets 质押生息,为什么要这样设计呢,主要还在在于 cvxCrvStaking 合约的设计,质押 cvxCRV 收益描述“By staking cvxCRV, you’re earning the usual rewards from veCRV (3crv governance fee distribution from Curve + any airdrop), plus a share of 10% of the Convex LPs’ boosted CRV earnings, and CVX tokens on top of that.”,而一起通过金库质押的代币数量越多时,获得的收益也越大。
对于 ERC-4626 金库来说,最主要的安全问题在于防通货膨胀攻击(Inflation attack)。
当用户存入代币时,根据份额计算公式(shares = assets * totalSupply / totalAssets),计算结果是有小数点的,一般是向下取整。
通过下图可以看到,在用户存入 500 代币的资产时,小数取整所损失的资产取决于汇率(每股和代币资产对应关系)。如果汇率是橙色曲线的汇率,我们得到的不到 1 股,损失了100%。但是,如果汇率是绿色曲线的汇率,得到 5000 股,四舍五入损失限制在最多 0.02%。
那如果我们专注于将损失限制在最大 0.5%,我们需要获得至少 200 股。绿色汇率只需要 20 个代币,但橙色汇率需要 200000 个代币。
通过几上例子可以分析出,蓝色和绿色曲线对比黄色和橙色曲线更安全,是设计更加安全的金库。
所以通货膨胀攻击的主要方式就是,通过某些手段将利率曲线向右移动,让少量存款者损失份额,达到攻击目的。
Inflation attack 主要是通过捐赠(donate)。
抵御攻击的措施有 3 种:
具体实现就是重写由 OpenZeppelin 提供的标准库代码 _decimalsOffset() 方法,这种方式即不用设置滑点,也不用注入足够初始资金,是非常好的抵御通胀攻击方式。
RC-4626 作为一个比较基础的金库提案,不可能满足所有需求,有一些提案也对止做出了扩展,比如 ERC-7535、EIP-7540。
前面提到 ERC-4626 只能使用 ERC-20 作为基础资产,这个提案主要是将原生资产(native asset)也可以作为基础资产(underlying asset),比如 ETH 在金库中使用。
这个对 ERC-4626 的扩展引入了对异步存款和赎回过程(称为”请求”)的支持。它包括了用于启动和检查这些请求状态的新方法。现有的从 ERC-4626 中使用的方法,如存款、铸币、提取和赎回,被用于执行可认领的请求。关于是否添加存款、赎回或两者的异步流程,由实现者自行决定。
潜在用例:
以上,就是关于 ERC-4626 相关的全部解析。
因为历史原因,当前市面上有很多金库并不遵循 ERC-4626的,依然在运作,比如 dForce,但没法应用更广。也有一些金库已经升级为遵循 ERC-4626,比如 Aladdin DAO 的一些合约(https://github.com/AladdinDAO/deployments/blob/main/deployments.mainnet.md)。
金库应用除了质押生息外,还可以将 shares 做为抵押物借出或者再质押,从而产生收益。另外通过金库来募资也是一个比较好的应用场景,它的一些基础功能就可以提供很好的支持。
该提案的推出,本质是为了提升金库与 DeFi 生态集成效率,减少开发成本。而金库本身的作用,随着 DeFi 市场的增长,还有更多挖掘的空间。