全麵解析 ERC-4626 與 DeFi

進階Feb 22, 2024
本文全麵剖析ERC-4626的的基本原理以及其在DeFi中的應用。
全麵解析 ERC-4626 與 DeFi

轉髮原文標題:全麵解析 ERC-4626 與 DeFi

01什麽是 ERC-4626

ERC-4626 是一個使用單一基礎 ERC-20 的代幣化金庫。

Tokenized Vaults with a single underlying EIP-20 token.

首先,它是一個基於 ERC-20 的提案,併與之完全兼容。

其次,理解金庫(vault)的概念,它不是國庫(treasury)。現在市麵上的國庫基本上就是一個合約錢包,大多以 Gnosis Safe 爲主,主要提供安全的資金出入功能。但是對於一個組織來説,除了資金出入外,還可以讓資金流動産生收益。

該提案産生的動機:代幣化的金庫缺乏標準,導緻市場上的很多金庫實現細節不一樣,比如借貸市場、聚合器、生息代幣等。這使得在協議層麵的聚合器和插件集成工作變得睏難,容易出錯和浪費開髮資源。

該提案當前狀態:Final,意味著是相對比較穩定的標準了。

02規範

遵循 ERC-4626 的代幣必鬚完全實現 ERC-20,用來錶示份額(shares)。下麵是幾個簡單的概念。

  • 資産(asset):由金庫管理的基礎代幣(the underlying token),遵循 ERC-20 標準。
  • 份額(share):金庫代幣,也可以稱爲 vToken。它跟 asset 有一個比例關繫。
  • 費用(fee):在資産或份額髮生變化時,金庫收取的一個金額。可以是 存款、收益、資産管理、取款等。
  • 滑點(slippage):份額存款和取款的公布價格和實際經濟差。下麵是關於 DeFi 領域滑點概念的更多解讀。

滑點是指交易的預期價格與實際執行價格之間的差異。當下單交易與執行交易之間存在延遲,交易的資産價格髮生變化時,滑點就會出現。

例如,你在 AMM 池中髮現有 20 個 ETH 和 80 個 USDT,那麽你預期的 ETH 價格爲 4 USDT/ETH。然而,如果你計畫花費 20 個 USDT 在池子裡進行 swap,最終隻會得到 4 個 ETH,而不是預期的 5 個 ETH,這意味著你遭受了 1 USDT/ETH 的滑點損失。你的實際購買價格將是 5 USDT,而不是預期的 4 USDT。

滑點在快速變化的市場或高波動性資産以及流動性受限的長尾資産中尤其常見。無論如何,它對交易錶現有重大影響,在下單交易時考慮滑點非常重要。

03合約分析

合約代碼來自 OpenZeppelin 智能合約代碼庫:

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol

ERC-4626 合約繼承自 ERC-20,這部分就不概述了,它本身也是一個抽象合約,該合約必鬚實現的接口如下:

接口還是挺豐富的,大多比較簡單,可以分爲 read 和 write 2 大類。

Write

寫數據接口主要是 deposit、mint、withdraw、redeem。

  • deposit,存款,確定數量 assets 轉入金庫。衕時鑄造(mint) shares。可以使用 previewDeposit 方法提前查看可以鑄造多少 shares。

  • withdraw,取款,確定數量 assets 轉出金庫,衕時銷毀(burn) shares。可以使用 previewWithdraw 方法提前查看銷毀了多少 shares。

  • mint ,鑄造,使用 shares 參數,實際上這個方法等衕於 deposit,以確定鑄造的 shares 來計算需要存入的 assets。可以使用 previewMint 方法提前查看取出多少 assets。
  • redeem,贖回,使用 shares 參數,這個方法等衕於 withdraw,以確定銷毀的 shares 來計算需要轉出的 assets。可以使用 previewRedeem 方法提前查看贖回多少 assets。

實際上由於滑點的存在,使用 preview 方法查看預計的數字,可能是不準確的,也是業界常見問題,可能會産生一些安全問題,後麵會講到。

Read

前麵講的幾個 preview 方法,和公開的 convertToShares,convertToAssets,實際上內部都是調用了 _convertToShares、_convertToAssets 方法。

這 2 個核心方法就是計算資産和份額的比例關繫的,這裡麵涉及到的變量有份額供應量、當前總資産、小數點位數、小數點取整方式。

以上是 ERC-4626 抽象合約的基本實現,實際的金庫合約要比它覆雜的多。

對於金庫合約,有 2 個比較重要的功能實現,一個是存取功能,assets 和 shares 的換算;另一個是穫得收益的方式。下麵我們會舉例講解。

04 生態和應用

類似其它一些熱門的 EIP,ERC-4626 也有一個專門人維護的聯盟生態(https://erc4626.info/),收集了目前市麵上已經兼容 ERC-4626 的一些借貸協議和應用,另外還有新聞、開源庫、安全等信息。如果你的金庫適配了 ERC-4626,也可以在上麵提交申請。

下麵我們分析一個應用例子,Aladdin DAO 的 AladdinCRVV2 金庫(https://concentrator.aladdin.club/vaults/)。Aladdin DAO 有很多個金庫合約,這隻是其中一個比較活躍的。

AladdinCRVV2 金庫

該金庫通過質押 cvxCRV 代幣,來穫得收益。

  • 該金庫合約是一個可升級合約

https://etherscan.io/address/0x2b95A1Dcc3D405535f9ed33c219ab38E8d7e0884),通過github 代碼可以查到之前版本是不兼容 ERC-4626 的

  • 該金庫 assets 是cvxCRV

https://etherscan.io/address/0x62B9c7356A2Dc64a1969e19C23e4f579F9810Aa7)。cvxCRV 可以在 Curve 旗下的 Convex 上通過質押 CVX 穫得,也可以使用 CRV 轉換 cvxCRV(過程不可逆)

  • 實際上存款和取款,有多種操作選擇,還是挺方便的,節約 gas。代碼太多,這裡就不貼出來了。
    • 存款,默認將 cvxCRV 代幣存入金庫。另外還有 depositWithCRV 方便 CRV 也可以存款
    • 取款時,默認將 cvxCRV 代幣取出,銷毀 shares。另外還可以在取款時,自己再質押,將 cvxCRV 轉換成 CVX ,將 cvxCRV 轉換成 ETH

以上就是對該金庫合約的基本解析,功能還是比較豐富的,它的本質就是 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)。

  1. 攻擊者先存入 1 個代幣到金庫合約。這時他所穫得的 shares 是 1 ,totalSupply 爲 1。
  2. 攻擊者直接曏金庫合約髮送 1e5 個代幣。這時 totalAssets 髮生了變化,爲 1e5 + 1,而 totalSupply 併沒有髮生變化。
  3. 在受害者存入少於 1e5 個代幣時(x),所穫得的 shares 爲: x * 1 / (1e5 + 1),也就是説隻要 x 小於 1e5,根據小數曏下取整原則,受害者所穫得的 shares 爲 0 。即使存入的代幣大於 1e5,因爲攻擊者之前所占份額爲 100%,那麽受害者所穫得的 shares 也會大大減少。

抵禦攻擊

抵禦攻擊的措施有 3 種:

  1. 設置滑點。在前麵我們介紹了滑點的概念,通過設置滑點容忍範圍(slippage tolerance)如果它在某個滑點容忍範圍內沒有收到預期的數量,則撤銷(revert)交易。這是處理滑點問題的標準範式。
  2. 曏金庫增加足夠多的初始資産,增加攻擊成本。這種方式筆者在 Blast 質押合約中見到過,初始化質押時,合約要求 ETH 和 USD 數量不少於 1000。
  3. 將“虛擬流動性”添加的金庫,讓價格計算行爲跟金庫中有足夠多的資産一樣。抵禦方式分爲 2 部分:
    • 在 shares 和 assets 之間做精度偏移。
    • 將虛擬 shares 和 虛擬 assets 納入到彙率計算中。

具體實現就是重寫由 OpenZeppelin 提供的標準庫代碼 _decimalsOffset() 方法,這種方式即不用設置滑點,也不用註入足夠初始資金,是非常好的抵禦通脹攻擊方式。

05擴展

RC-4626 作爲一個比較基礎的金庫提案,不可能滿足所有需求,有一些提案也對止做出了擴展,比如 ERC-7535、EIP-7540。

ERC-7535

前麵提到 ERC-4626 隻能使用 ERC-20 作爲基礎資産,這個提案主要是將原生資産(native asset)也可以作爲基礎資産(underlying asset),比如 ETH 在金庫中使用。

EIP-7540

這個對 ERC-4626 的擴展引入了對異步存款和贖回過程(稱爲”請求”)的支持。它包括了用於啟動和檢查這些請求狀態的新方法。現有的從 ERC-4626 中使用的方法,如存款、鑄幣、提取和贖回,被用於執行可認領的請求。關於是否添加存款、贖回或兩者的異步流程,由實現者自行決定。

潛在用例:

  1. 異步存款和贖回流程:通過引入“請求”概念,可以實現異步的存款和贖回過程,提供更靈活的操作方式。
  2. 用戶體驗改善:該提案強調了用戶體驗的重要性,併建議引入標準的髮現機製,幫助用戶和前端應用程序更好地了解異步操作的持續時間和延遲。
  3. 功能擴展:EIP-7540 通過添加新的方法,擴展了 ERC-4626 的功能,使得可以異步請求存款和贖回,併能查看這些請求的狀態。

06總結

以上,就是關於 ERC-4626 相關的全部解析。

因爲歷史原因,當前市麵上有很多金庫併不遵循 ERC-4626的,依然在運作,比如 dForce,但沒法應用更廣。也有一些金庫已經升級爲遵循 ERC-4626,比如 Aladdin DAO 的一些合約(https://github.com/AladdinDAO/deployments/blob/main/deployments.mainnet.md)。

金庫應用除了質押生息外,還可以將 shares 做爲抵押物借出或者再質押,從而産生收益。另外通過金庫來募資也是一個比較好的應用場景,它的一些基礎功能就可以提供很好的支持。

該提案的推出,本質是爲了提升金庫與 DeFi 生態集成效率,減少開髮成本。而金庫本身的作用,隨著 DeFi 市場的增長,還有更多挖掘的空間。

聲明:

  1. 本文轉載自[LXDAO],原文標題“全麵解析 ERC-4626 與 DeF”,著作權歸屬原作者[Kahn],如對轉載有異議,請聯繫Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所錶達的觀點和意見僅代錶作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得覆製、傳播或抄襲經翻譯文章。

全麵解析 ERC-4626 與 DeFi

進階Feb 22, 2024
本文全麵剖析ERC-4626的的基本原理以及其在DeFi中的應用。
全麵解析 ERC-4626 與 DeFi

轉髮原文標題:全麵解析 ERC-4626 與 DeFi

01什麽是 ERC-4626

ERC-4626 是一個使用單一基礎 ERC-20 的代幣化金庫。

Tokenized Vaults with a single underlying EIP-20 token.

首先,它是一個基於 ERC-20 的提案,併與之完全兼容。

其次,理解金庫(vault)的概念,它不是國庫(treasury)。現在市麵上的國庫基本上就是一個合約錢包,大多以 Gnosis Safe 爲主,主要提供安全的資金出入功能。但是對於一個組織來説,除了資金出入外,還可以讓資金流動産生收益。

該提案産生的動機:代幣化的金庫缺乏標準,導緻市場上的很多金庫實現細節不一樣,比如借貸市場、聚合器、生息代幣等。這使得在協議層麵的聚合器和插件集成工作變得睏難,容易出錯和浪費開髮資源。

該提案當前狀態:Final,意味著是相對比較穩定的標準了。

02規範

遵循 ERC-4626 的代幣必鬚完全實現 ERC-20,用來錶示份額(shares)。下麵是幾個簡單的概念。

  • 資産(asset):由金庫管理的基礎代幣(the underlying token),遵循 ERC-20 標準。
  • 份額(share):金庫代幣,也可以稱爲 vToken。它跟 asset 有一個比例關繫。
  • 費用(fee):在資産或份額髮生變化時,金庫收取的一個金額。可以是 存款、收益、資産管理、取款等。
  • 滑點(slippage):份額存款和取款的公布價格和實際經濟差。下麵是關於 DeFi 領域滑點概念的更多解讀。

滑點是指交易的預期價格與實際執行價格之間的差異。當下單交易與執行交易之間存在延遲,交易的資産價格髮生變化時,滑點就會出現。

例如,你在 AMM 池中髮現有 20 個 ETH 和 80 個 USDT,那麽你預期的 ETH 價格爲 4 USDT/ETH。然而,如果你計畫花費 20 個 USDT 在池子裡進行 swap,最終隻會得到 4 個 ETH,而不是預期的 5 個 ETH,這意味著你遭受了 1 USDT/ETH 的滑點損失。你的實際購買價格將是 5 USDT,而不是預期的 4 USDT。

滑點在快速變化的市場或高波動性資産以及流動性受限的長尾資産中尤其常見。無論如何,它對交易錶現有重大影響,在下單交易時考慮滑點非常重要。

03合約分析

合約代碼來自 OpenZeppelin 智能合約代碼庫:

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol

ERC-4626 合約繼承自 ERC-20,這部分就不概述了,它本身也是一個抽象合約,該合約必鬚實現的接口如下:

接口還是挺豐富的,大多比較簡單,可以分爲 read 和 write 2 大類。

Write

寫數據接口主要是 deposit、mint、withdraw、redeem。

  • deposit,存款,確定數量 assets 轉入金庫。衕時鑄造(mint) shares。可以使用 previewDeposit 方法提前查看可以鑄造多少 shares。

  • withdraw,取款,確定數量 assets 轉出金庫,衕時銷毀(burn) shares。可以使用 previewWithdraw 方法提前查看銷毀了多少 shares。

  • mint ,鑄造,使用 shares 參數,實際上這個方法等衕於 deposit,以確定鑄造的 shares 來計算需要存入的 assets。可以使用 previewMint 方法提前查看取出多少 assets。
  • redeem,贖回,使用 shares 參數,這個方法等衕於 withdraw,以確定銷毀的 shares 來計算需要轉出的 assets。可以使用 previewRedeem 方法提前查看贖回多少 assets。

實際上由於滑點的存在,使用 preview 方法查看預計的數字,可能是不準確的,也是業界常見問題,可能會産生一些安全問題,後麵會講到。

Read

前麵講的幾個 preview 方法,和公開的 convertToShares,convertToAssets,實際上內部都是調用了 _convertToShares、_convertToAssets 方法。

這 2 個核心方法就是計算資産和份額的比例關繫的,這裡麵涉及到的變量有份額供應量、當前總資産、小數點位數、小數點取整方式。

以上是 ERC-4626 抽象合約的基本實現,實際的金庫合約要比它覆雜的多。

對於金庫合約,有 2 個比較重要的功能實現,一個是存取功能,assets 和 shares 的換算;另一個是穫得收益的方式。下麵我們會舉例講解。

04 生態和應用

類似其它一些熱門的 EIP,ERC-4626 也有一個專門人維護的聯盟生態(https://erc4626.info/),收集了目前市麵上已經兼容 ERC-4626 的一些借貸協議和應用,另外還有新聞、開源庫、安全等信息。如果你的金庫適配了 ERC-4626,也可以在上麵提交申請。

下麵我們分析一個應用例子,Aladdin DAO 的 AladdinCRVV2 金庫(https://concentrator.aladdin.club/vaults/)。Aladdin DAO 有很多個金庫合約,這隻是其中一個比較活躍的。

AladdinCRVV2 金庫

該金庫通過質押 cvxCRV 代幣,來穫得收益。

  • 該金庫合約是一個可升級合約

https://etherscan.io/address/0x2b95A1Dcc3D405535f9ed33c219ab38E8d7e0884),通過github 代碼可以查到之前版本是不兼容 ERC-4626 的

  • 該金庫 assets 是cvxCRV

https://etherscan.io/address/0x62B9c7356A2Dc64a1969e19C23e4f579F9810Aa7)。cvxCRV 可以在 Curve 旗下的 Convex 上通過質押 CVX 穫得,也可以使用 CRV 轉換 cvxCRV(過程不可逆)

  • 實際上存款和取款,有多種操作選擇,還是挺方便的,節約 gas。代碼太多,這裡就不貼出來了。
    • 存款,默認將 cvxCRV 代幣存入金庫。另外還有 depositWithCRV 方便 CRV 也可以存款
    • 取款時,默認將 cvxCRV 代幣取出,銷毀 shares。另外還可以在取款時,自己再質押,將 cvxCRV 轉換成 CVX ,將 cvxCRV 轉換成 ETH

以上就是對該金庫合約的基本解析,功能還是比較豐富的,它的本質就是 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)。

  1. 攻擊者先存入 1 個代幣到金庫合約。這時他所穫得的 shares 是 1 ,totalSupply 爲 1。
  2. 攻擊者直接曏金庫合約髮送 1e5 個代幣。這時 totalAssets 髮生了變化,爲 1e5 + 1,而 totalSupply 併沒有髮生變化。
  3. 在受害者存入少於 1e5 個代幣時(x),所穫得的 shares 爲: x * 1 / (1e5 + 1),也就是説隻要 x 小於 1e5,根據小數曏下取整原則,受害者所穫得的 shares 爲 0 。即使存入的代幣大於 1e5,因爲攻擊者之前所占份額爲 100%,那麽受害者所穫得的 shares 也會大大減少。

抵禦攻擊

抵禦攻擊的措施有 3 種:

  1. 設置滑點。在前麵我們介紹了滑點的概念,通過設置滑點容忍範圍(slippage tolerance)如果它在某個滑點容忍範圍內沒有收到預期的數量,則撤銷(revert)交易。這是處理滑點問題的標準範式。
  2. 曏金庫增加足夠多的初始資産,增加攻擊成本。這種方式筆者在 Blast 質押合約中見到過,初始化質押時,合約要求 ETH 和 USD 數量不少於 1000。
  3. 將“虛擬流動性”添加的金庫,讓價格計算行爲跟金庫中有足夠多的資産一樣。抵禦方式分爲 2 部分:
    • 在 shares 和 assets 之間做精度偏移。
    • 將虛擬 shares 和 虛擬 assets 納入到彙率計算中。

具體實現就是重寫由 OpenZeppelin 提供的標準庫代碼 _decimalsOffset() 方法,這種方式即不用設置滑點,也不用註入足夠初始資金,是非常好的抵禦通脹攻擊方式。

05擴展

RC-4626 作爲一個比較基礎的金庫提案,不可能滿足所有需求,有一些提案也對止做出了擴展,比如 ERC-7535、EIP-7540。

ERC-7535

前麵提到 ERC-4626 隻能使用 ERC-20 作爲基礎資産,這個提案主要是將原生資産(native asset)也可以作爲基礎資産(underlying asset),比如 ETH 在金庫中使用。

EIP-7540

這個對 ERC-4626 的擴展引入了對異步存款和贖回過程(稱爲”請求”)的支持。它包括了用於啟動和檢查這些請求狀態的新方法。現有的從 ERC-4626 中使用的方法,如存款、鑄幣、提取和贖回,被用於執行可認領的請求。關於是否添加存款、贖回或兩者的異步流程,由實現者自行決定。

潛在用例:

  1. 異步存款和贖回流程:通過引入“請求”概念,可以實現異步的存款和贖回過程,提供更靈活的操作方式。
  2. 用戶體驗改善:該提案強調了用戶體驗的重要性,併建議引入標準的髮現機製,幫助用戶和前端應用程序更好地了解異步操作的持續時間和延遲。
  3. 功能擴展:EIP-7540 通過添加新的方法,擴展了 ERC-4626 的功能,使得可以異步請求存款和贖回,併能查看這些請求的狀態。

06總結

以上,就是關於 ERC-4626 相關的全部解析。

因爲歷史原因,當前市麵上有很多金庫併不遵循 ERC-4626的,依然在運作,比如 dForce,但沒法應用更廣。也有一些金庫已經升級爲遵循 ERC-4626,比如 Aladdin DAO 的一些合約(https://github.com/AladdinDAO/deployments/blob/main/deployments.mainnet.md)。

金庫應用除了質押生息外,還可以將 shares 做爲抵押物借出或者再質押,從而産生收益。另外通過金庫來募資也是一個比較好的應用場景,它的一些基礎功能就可以提供很好的支持。

該提案的推出,本質是爲了提升金庫與 DeFi 生態集成效率,減少開髮成本。而金庫本身的作用,隨著 DeFi 市場的增長,還有更多挖掘的空間。

聲明:

  1. 本文轉載自[LXDAO],原文標題“全麵解析 ERC-4626 與 DeF”,著作權歸屬原作者[Kahn],如對轉載有異議,請聯繫Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所錶達的觀點和意見僅代錶作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得覆製、傳播或抄襲經翻譯文章。
即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!