原文標題:《Solving the issue with slippage in EIP-4626 》
一級標題
原文編譯:ChinaDeFi
簡介
簡介
原文編譯:ChinaDeFi
一級標題
一級標題
function deposit(uint 256 assets, address receiver)
external
returns (uint 256 shares);
例如,存入3 Crv Convex mUSD 金庫將從調用方轉移3 Crv,並將vcx 3 CRV-mUSD 金庫份額轉移到接收方。
如何解決EIP-4626中的高滑點問題?
如何解決EIP-4626中的高滑點問題?
一級標題
如何解決EIP-4626中的高滑點問題?
function add_liquidity(uint 256 [ 2 ] memory amounts, uint 256 min_mint_amount)
external
returns (uint 256 );
如何解決EIP-4626中的高滑點問題?
如何解決EIP-4626中的高滑點問題?
一級標題
一級標題
開發金庫時的一個技術挑戰是我們如何設置預期流動性提供者代幣的最小數量。
例子
例子
例如,如果Curve 的mUSD Metapool 添加了200 萬個mUSD, 600 萬個3 Crv 和100 k 個3 Crv,則將收到100 , 068 個LP 代幣(musd 3 Crv)。如果Metapool 有600 萬個mUSD,添加了200 萬個3 Crv 和100 k 個3 Crv,將收到100 , 892 個LP 代幣(musd 3 Crv)。
一級標題
一級標題
攻擊者在將交易包含到區塊之前,就會監控Mempool 中可能被利用的交易。為了利用交易,他們賄賂區塊生產者,將他們的交易包含在可利用的交易之前和之後。也就是說,他們將易受攻擊的交易與自己的交易夾在一起。如果有一筆交易將3 Crv 添加到最低LP 金額為零的mUSD Metapool,則攻擊者的第一筆交易將是減少Metapool 中的mUSD 數量。這意味著在易受攻擊的添加流動性交易中收到的Metapool LP 代幣數量遠低於應有的數量。在第三個交易中,攻擊者返還在第一個交易中刪除的mUSD,並將收益裝入囊中。
使用Curve 的mUSD Metapool,池中有6 , 000 , 000 mUSD 和3 Crv, 11 , 917 , 295 個LP 代幣(musd 3 Crv) 和1.018095 美元的虛擬價格。
一級標題
攻擊者通過使用6 , 500 , 000 ( 54.5% ) 池流動性提供者(musd 3 Crv) 代幣從池中提取5 , 973 , 425 的mUSD,使用他們池中的大部分流動性提供者代幣(musd 3 Crv) 來平衡池。使用remove_liquidity_one_coin 函數進行單邊提款,池中剩下0.43% mUSD 和99.56% 3 Crv。虛擬價格上漲了近1% ,至1.019105 ,因為大量不平衡的提現為池收取了費用。
受害者使用add_liquidity 函數將100 , 000 個3 Crv 添加到不平衡的池中,且沒有最小流動性提供者數量。如果池是平衡的,受害者得到81978 個LP 代幣而不是100371 個。這意味著受害者得到的LP 代幣比他們應該得到的少18 , 393 個( 18% )。以美元計算,受害者得到的美元價值減少了18 , 643 ( 18% )。
function calc_token_amount(uint 256 [ 2 ] memory amounts, bool is_deposit) external view returns (uint 256 );
一級標題
一級標題
mStable 的方法
function get_virtual_price() external view returns (uint 256 );
Curve 的保護
fair Metapool LP tokens = 3 Crv assets *
3 Pool virtual price /
Metapool virtual price
mStable 的金庫獲得一個公平的Metapool LP 代幣價格的方法是使用Curve Metapool 和Curve 3 Pool 的虛擬價格。 get_virtual_price 函數以美元為單位返回池的流動性提供者代幣的價格。它通過計算池的不變式來實現這一點,該不變式是池中代幣的美元價值除以代幣的總供應量。由於池中代幣的餘額不影響池的不變值或總美元價值,虛擬價格不會受到三明治攻擊。
一級標題
結論
結論