跳至内容
0%

什么是 ERC-4626 代币标准?

Alchemy team headshot

作者 Alchemy

发布于 2022年6月21日2 分钟阅读

虽然目前存在几种主流的代币标准,去中心化金融(DeFi)领域在代币化金库方面仍然存在一个反复出现的重大问题。这促成了最新标准 ERC-4626 的诞生。

本文将解释什么是金库、开发者在代币化金库时面临的问题,以及 ERC-4626 如何解决 DeFi 开发中的这一问题。然后我们会深入探讨这一标准带来的新变化,并展示如何在智能合约中实现它们。

什么是金库?

金库是一种多签解决方案或智能合约,可以存储和管理加密资产等资产。每个金库都会产生对应的代币作为收益的一种形式。这些生成的代币之后可以兑换回最初锁定在金库中的代币。

例如,当你在自动做市商(AMM)Sushiswap 上质押 Sushi 时,你会获得 xSushi 作为奖励。类似地,当你在 DeFi 借贷协议 Compound 上通过收益耕作(yield farm)USDC 稳定币时,你也会获得 cUSDC。

cUSDC 和 xSushi 都是计息代币(yield-bearing token),可以兑换回原始代币(在此例中即 USDC 或 SUSHI)。只要金库或资金池中锁定的代币在增加,计息代币的价值就会随之上升。

金库被认为比钱包更好、更安全,这也是许多 DeFi 协议选择将资金存入金库的原因。使用金库的知名 DeFi 协议包括 Sushiswap、AaveBalancer 和 Compound 等。

代币化金库存在什么问题?

开发者在处理计息代币时面临的问题在于如何整合不同协议的代币。

例如,如果你想构建一个 DeFi 应用,需要整合各个协议的代币,你就得逐一研究每种代币,了解其收益累积模式,并将其调整适配到你的代码库中。

如果你想整合 Maker DAO 的 vDAI、Curve 上的 stETH 等等,你需要理解这些智能合约各自的特殊之处,并构建自定义方案才能成功将它们整合进你的 DeFi 应用。

除了整合不同计息代币这一过程本身既繁琐又耗时之外,由于潜在的错误,它还会增加智能合约风险。

开发者需要花费更多时间检查适配器中的潜在漏洞,在某些情况下,甚至可能需要将这项工作外包给智能合约审计人员,而这可能相当昂贵。鉴于目前有大量协议和 DeFi 应用的安全性遭到攻击者破坏,这一点变得更加重要。

ERC-4626 标准是谁提出的?

2021 年底,Fei Protocol 创始人 Joey Santoro 注意到开发者整合各自独立的计息代币十分困难,于是带领另外四名 Ethereum 开发者提交了Ethereum Comment Proposal 4626(ERC-4626)。

经过多轮审查和讨论后,Ethereum 最终在 2022 年 5 月批准了该标准。

ERC-4626 对金库有哪些好处?

ERC-4626 的主要好处在于它将代币化金库标准化,使协议整合变得更容易、更不易出错。

由于现在有了一个可以直接整合的通用标准,实际上不再需要为每个协议单独构建适配器。简而言之,它加快了开发速度,将可组合性发挥到极致。

同样,由于构建者不再需要审计人员来协助其适配器和接口,成本也随之降低。最重要的是,ERC-4626 增强了处理计息代币的应用和收益聚合器之间的安全性。

ERC-4626 标准引入了哪些变化?

有了新的 ERC-4626 代币标准后,开发者在构建涉及收益代币的 DeFi 应用时,终于有了统一的标准可循。

简而言之,ERC-4626 标准实现了以下特性:

  • 为想要接入该标准的开发者提供优化的金库接口
  • 存款时给予份额(shares)作为回报,份额代表对金库底层代币的部分所有权
  • 为开发者构建计息合约提供一致的标准
  • 经过实践检验的金库代币安全性

ERC-4626 的工作原理:函数与事件

ERC-4626 是 ERC-20 标准的扩展,并与之兼容。因此,ERC-20 代币合约中适用的大多数常规变量、事件和函数在 ERC-4626 金库标准中依然适用。

该金库标准引入了"份额"(shares)这一概念,作为从整个资金池中获得部分所有权的方式。这些 shares 指的就是计息代币。

现在让我们开始使用 ERC-4626 进行开发。

虽然你也可以使用 Cairo、Viper 等语言,但我们将使用 Solidity 来编写这份合约。

1. 将 OpenZepellin 扩展导入你的 IDE

打开你的 IDE(我们推荐使用 Remix)后,指定编译器所使用的 Solidity 版本。

在本例中,声明你使用的是 0.8 版本。之后,你需要导入两个 OpenZeppelin 扩展:ERC-20 和 ERC-4626。

接下来,创建并命名一个合约。

2. 创建你的合约

命名你的合约,并进一步确定它同时基于 ERC-20 代币和 ERC-4626。

Contract, testingVaults is ERC20, IERC4626 { your entire code here}

3. 实现该标准

创建合约后,你需要了解该标准中方法、函数和事件的一些重要变化。接下来,我们看看 ERC-4626 中的一些方法和事件:

存款(Deposit)

当用户向金库存入资金时,deposit 函数会触发智能合约向存款人铸造相应数量的份额。作为一个事件,每当发生存款时,智能合约必须触发该事件。

通过这个函数,我们指示合约将一定数量的代币存入金库,并将份额的所有权赋予调用者。提款函数的编写方式与此类似。

提款(Withdrawal)

提款函数帮助所有者销毁份额以换取资产。当从金库中提款时,必须触发提款事件。

该事件中的 address indexed _from 代表批准将代币存入金库的用户,而可以提取已存代币的人则是 address indexed _to

Asset 与 totalAsset

金库代币的地址应在 asset 函数中使用。智能合约中底层资产的总量应在 totalAssets 中声明。

convertToShares 与 convertToAssets

在 ERC-4626 标准下,有两个转换函数:convertToSharesconvertToAssets

当你需要将资产转换为份额时,convertToShares 是应该调用的正确函数,因为它会返回对应该资产数量应发放的份额数。

反之,convertToAssets 的作用方向相反,用于将份额转换为资产。

铸造(Mint)

当发生存款时,mint 函数会为接收者调用。maxMint 是金库中可以为某个用户或接收者创建的份额总量。作为开发者,你需要设置这个值。

赎回(Redeem)

redeem 函数会销毁所有者(msg.sender)的一定数量份额,并将资产发送给接收者。如果由于某种原因份额无法被赎回,redeem 必须被回滚(revert)。

maxRedeem 是所有者在金库中可以赎回的份额数量。

预览(Preview)

在使用 preview 系列方法时,开发者必须清楚,这些方法返回的值并不完全精确,但会足够接近。你不应将它们当作预言机(oracle)来依赖。

你可以将 preview 与其他方法结合使用,例如 mintwithdrawredeemdeposit

到这里就完成了。你已经成功开启了 ERC-4626 的开发之旅!

总结——ERC-4626 的未来

随着 ERC-4626 的出现,DeFi 领域正迎来一波新的浪潮。

由于此前没有统一标准,DeFi 聚合器一直很难聚合多种计息代币。但现在,借助 ERC-4626,只需一次 API 调用就能获取计息代币的详细信息。

借助这一经过实践检验的标准,为增强涉及计息代币的 DeFi 应用安全性而额外付出的努力问题,在很大程度上得到了解决。

未来几年,各 DeFi 协议之间可组合性和互操作性的应用将不断增加。这一标准甚至有可能成为构建和推出 DeFi 生态系统中全新产品的基石。

Background gradient

构建区块链应用

Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。