ชื่อเรื่องเดิม: "Solving the issue with slippage in EIP-4626 》
ชื่อระดับแรก
การรวบรวมต้นฉบับ: ChinaDeFi
การแนะนำ
การแนะนำ
ผลที่ตามมาอย่างหนึ่งของมาตรฐาน EIP-4626 คือฟังก์ชันการฝากและเหรียญกษาปณ์ไม่ได้จัดเตรียมวิธีการระบุส่วนแบ่งขั้นต่ำหรือจำนวนสินทรัพย์สำหรับการส่งคืน มักใช้เพื่อป้องกันการลื่นไถลสูงหรือการโจมตีแบบแซนวิช mStable แก้ไขปัญหานี้ด้วย Meta Vaults อย่างไร - บรรเทาการโจมตีที่มีการเลื่อนหลุดสูงในขณะที่ยังคงปฏิบัติตามข้อกำหนด เอกสารนี้อธิบายถึงความท้าทายเหล่านี้และอธิบายถึงวิธีการทำงานของพวกเขา
ชื่อระดับแรก
EIP-4626 และ mStable Gold Vault Deposits
function deposit(uint 256 assets, address receiver)
external
returns (uint 256 shares);
ตัวอย่างเช่น การฝาก vault 3 Crv Convex mUSD จะโอน 3 Crv จากผู้โทรและ vault vcx 3 CRV-mUSD แบ่งปันไปยังผู้รับ
จะแก้ปัญหาการลื่นไถลสูงใน EIP-4626 ได้อย่างไร?
จะแก้ปัญหาการลื่นไถลสูงใน EIP-4626 ได้อย่างไร?
ชื่อระดับแรก
การโจมตีด้วยแซนวิชคืออะไร? จะป้องกันได้อย่างไร?
function add_liquidity(uint 256 [ 2 ] memory amounts, uint 256 min_mint_amount)
external
returns (uint 256 );
เมื่อเราเพิ่มสภาพคล่องให้กับ Curve Metapool (หรือกลุ่มอื่นๆ) เราจะระบุจำนวนสินทรัพย์ที่เราต้องการฝากและจำนวนขั้นต่ำของโทเค็นผู้ให้บริการสภาพคล่อง (LP) สำหรับ mUSD Metapool จำนวนคืออาร์เรย์ที่มีสองรายการ อันแรกคือจำนวน mUSD และอันที่สองคือจำนวน 3 Crv ห้องนิรภัย 3 Crv Convex เก็บได้เพียง 3 Crv ดังนั้นรายการแรกของอาร์เรย์จำนวนเงินจะเป็นศูนย์
ความท้าทายทางเทคนิคในการพัฒนาห้องนิรภัยคือวิธีที่เรากำหนดจำนวนขั้นต่ำของโทเค็นผู้ให้บริการสภาพคล่องที่คาดไว้
ตัวอย่างเช่น ถ้า mUSD Metapool ของ Curve เพิ่ม 2 ล้าน mUSD, 6 ล้าน 3 Crv และ 100 k 3 Crv ก็จะได้รับโทเค็น LP 100,068 (musd 3 Crv) หาก Metapool มี 6 ล้าน mUSD เพิ่ม 2 ล้าน 3 Crv และ 100 k 3 Crv จะได้รับโทเค็น LP 100,892 (musd 3 Crv)
ชื่อระดับแรก
ผู้โจมตีตรวจสอบ Mempool เพื่อหาธุรกรรมที่อาจถูกโจมตีก่อนที่จะรวมไว้ในบล็อก ในการใช้ประโยชน์จากธุรกรรม พวกเขาติดสินบนผู้ผลิตบล็อกเพื่อรวมธุรกรรมของพวกเขาก่อนและหลังธุรกรรมที่แสวงหาผลประโยชน์ นั่นคือพวกเขาประกบการทำธุรกรรมที่มีช่องโหว่ด้วยตัวพวกเขาเอง หากมีธุรกรรมที่เพิ่ม 3 Crv ไปยัง mUSD Metapool โดยที่จำนวน LP ขั้นต่ำเป็นศูนย์ ธุรกรรมแรกของผู้โจมตีคือการลดจำนวน mUSD ใน Metapool ซึ่งหมายความว่าจำนวนโทเค็น Metapool LP ที่ได้รับในการทำธุรกรรมเพิ่มสภาพคล่องที่มีช่องโหว่นั้นต่ำกว่าที่ควรจะเป็นมาก ในการทำธุรกรรมครั้งที่สาม ผู้โจมตีจะคืนเงิน mUSD ที่ถูกถอนออกไปในการทำธุรกรรมครั้งแรกและนำเงินที่ได้ไปใส่กระเป๋า
ตัวอย่าง
ตัวอย่าง
เมื่อใช้ mUSD Metapool ของ Curve จะมี 6,000,000 mUSD และ 3 Crv ในพูล, 11,917,295 โทเค็น LP (musd 3 Crv) และราคาเสมือนจริงที่ $1.018095
ผู้โจมตีใช้โทเค็น LP ส่วนใหญ่ในพูลของพวกเขาโดยถอนเงิน 5,973,425 mUSD ออกจากพูลโดยใช้โทเค็นผู้ให้บริการสภาพคล่องของพูล 6,500,000 (54.5%) (musd 3 Crv) (musd 3 Crv) เพื่อปรับสมดุลของพูล ใช้ฟังก์ชัน remove_liquidity_one_coin เพื่อถอนออกด้านเดียว โดยเหลือ 0.43% mUSD และ 99.56% 3 Crv ในพูล ราคาจำลองเพิ่มขึ้นเกือบ 1% เป็น 1.019105 เนื่องจากการถอนเงินที่ไม่สมดุลจำนวนมากจะเรียกเก็บค่าธรรมเนียมจากพูล
เหยื่อใช้ฟังก์ชัน add_liquidity เพื่อเพิ่ม 100,000 3 Crvs ไปยังกลุ่มที่ไม่สมดุลโดยไม่มีผู้ให้บริการสภาพคล่องขั้นต่ำ หากพูลมีความสมดุล เหยื่อจะได้รับโทเค็น LP 81978 แทนที่จะเป็น 100371 ซึ่งหมายความว่าผู้ที่ตกเป็นเหยื่อได้รับโทเค็น LP น้อยกว่าที่ควรได้รับ 18,393 (18%) ในแง่เงินดอลลาร์ เหยื่อจะได้รับเงินดอลลาร์ลดลง 18,643 (18%)
สำหรับการทำธุรกรรมครั้งที่สามและครั้งสุดท้าย ผู้โจมตีใช้ add_liquidity เพื่อเพิ่มกลับเข้าไปในกลุ่มจำนวนเงิน 5,973,425 mUSD ที่พวกเขาถอนออกจากการทำธุรกรรมครั้งแรกเพื่อรับโทเค็น LP 6,503,610 (musd 3 Crv ) ถอน $3610 มากกว่าการทำธุรกรรมครั้งแรก ราคาเสมือนของพูลจะเพิ่มขึ้น 1% เป็น 1.019216 เนื่องจากเป็นธุรกรรมที่ไม่สมดุลอีกรายการหนึ่ง ในแง่ USD มูลค่า LP ของผู้โจมตีเพิ่มขึ้นจาก $6,500,000 * 1.018095 = $6,617,617 เป็น $6,503,610 * 1.019216 = $6,628,583 เพิ่มขึ้น $10,966 (1.65%)
ค่าธรรมเนียม 0.04% สำหรับการไม่สมดุลของพูลจะใช้ร่วมกันระหว่างผู้ให้บริการสภาพคล่องและผู้ถือ CRV (veCRV) ที่ลงคะแนนเสียงแบบ Curve มูลค่าของโทเค็น 5,417,295 LP ที่ไม่ได้ครอบครองโดยผู้โจมตีเพิ่มขึ้นจาก 5,515,323 ดอลลาร์เป็น 5,520,794 ดอลลาร์ นั่นคือเพิ่มขึ้น 5,471 ดอลลาร์มากกว่า 50% ของค่าธรรมเนียมพูล มูลค่า USD ที่เพิ่มขึ้นจะตกเป็นของผู้ถือ CRV (veCRV) ที่เอสโครว์
ชื่อระดับแรก
การป้องกันทางโค้ง
เพื่อป้องกันการโจมตีแบบแซนวิช เมื่อเพิ่มสภาพคล่องให้กับ Curve Metapool จำเป็นต้องระบุจำนวนโทเค็น LP ขั้นต่ำที่สมเหตุสมผล โดยปกติแล้วโปรโตคอล DeFi จะส่งผ่านเงินจำนวนมากในการทำธุรกรรม ฟังก์ชัน add_liquidity ในสระ Curve เป็นตัวอย่างที่ดีของ min_mint_amount แต่สำหรับฟังก์ชันการฝากเงินมาตรฐาน EIP-4626 ไม่มีการกำหนดพารามิเตอร์เพื่อระบุจำนวนเงินขั้นต่ำ ดังนั้นเราจึงไม่สามารถส่งโทเค็น Metapool LP ที่คำนวณนอกเครือข่ายในจำนวนที่มีนัยสำคัญได้
function calc_token_amount(uint 256 [ 2 ] memory amounts, bool is_deposit) external view returns (uint 256 );
ดังนั้นปัญหายังคงอยู่ ไม่มีทางที่ฟังก์ชัน EIP-4626 จะผ่านจำนวนขั้นต่ำได้ การทำลายมาตรฐานเพื่อเพิ่มสิ่งนี้เป็นสิ่งที่ไม่พึงปรารถนา และการใช้ oracle นั้นไม่เหมาะสม เราต้องการวิธีการแบบออนไลน์
ชื่อระดับแรก
วิธีการของ mStable
function get_virtual_price() external view returns (uint 256 );
วิธีที่คลังของ mStable จะได้รับราคาที่ยุติธรรมสำหรับโทเค็น Metapool LP คือการใช้ราคาเสมือนจริงจาก Curve Metapool และ Curve 3 Pool ฟังก์ชัน get_virtual_price ส่งคืนราคาของโทเค็นผู้ให้บริการสภาพคล่องของกลุ่มเป็น USD ทำสิ่งนี้โดยการคำนวณค่าคงที่สำหรับพูล ซึ่งเป็นค่าเงินดอลลาร์ของโทเค็นในพูลหารด้วยอุปทานทั้งหมดของโทเค็น เนื่องจากยอดคงเหลือของโทเค็นในพูลไม่ส่งผลกระทบต่อค่าคงที่หรือดอลลาร์รวมของพูล ราคาเสมือนจึงรอดพ้นจากการโจมตีแบบแซนด์วิช
fair Metapool LP tokens = 3 Crv assets *
3 Pool virtual price /
Metapool virtual price
สำหรับการฝากเงินเข้าไปในห้องนิรภัย mStable เราจำเป็นต้องกำหนดราคาโทเค็น Metapool LP ในโทเค็น 3 Pool LP ของ Curve (3 Crv) เนื่องจากเป็นสินทรัพย์ที่เราใช้ในห้องนิรภัย สำหรับสิ่งนี้ เราได้รับราคาเสมือน 3 Pool และหารด้วยราคาโทเค็น Metapool LP
ชื่อระดับแรก
สรุปแล้ว
สรุปแล้ว
