Tiêu đề ban đầu: "Solving the issue with slippage in EIP-4626 》
tiêu đề cấp đầu tiên
Tổng hợp gốc: ChinaDeFi
Giới thiệu
Giới thiệu
Một hệ quả của tiêu chuẩn EIP-4626 là các chức năng gửi tiền và đúc tiền không cung cấp cách chỉ định số tiền cổ phần hoặc tài sản tối thiểu để hoàn trả. Điều này thường được sử dụng để ngăn chặn các cuộc tấn công trượt hoặc bánh sandwich cao. mStable giải quyết vấn đề này bằng Meta Vault như thế nào - giảm thiểu các cuộc tấn công trượt giá cao trong khi vẫn tuân thủ? Bài viết này mô tả những thách thức này và giải thích cách tiếp cận của họ hoạt động.
tiêu đề cấp đầu tiên
Tiền gửi EIP-4626 và mStable Gold Vault
function deposit(uint 256 assets, address receiver)
external
returns (uint 256 shares);
Ví dụ: gửi kho tiền 3 Crv Convex mUSD sẽ chuyển 3 Crv từ người gọi và chia sẻ kho tiền vcx 3 CRV-mUSD cho người nhận.
Làm cách nào để giải quyết vấn đề trượt cao trong EIP-4626?
Làm cách nào để giải quyết vấn đề trượt cao trong EIP-4626?
tiêu đề cấp đầu tiên
Một cuộc tấn công bánh sandwich là gì? Làm thế nào để ngăn chặn chúng?
function add_liquidity(uint 256 [ 2 ] memory amounts, uint 256 min_mint_amount)
external
returns (uint 256 );
Khi chúng tôi thêm tính thanh khoản vào Curve Metapool (hoặc bất kỳ nhóm nào khác), chúng tôi chỉ định số lượng tài sản mà chúng tôi muốn gửi và số lượng mã thông báo Nhà cung cấp thanh khoản (LP) tối thiểu. Đối với Metapool mUSD, số tiền là một mảng chứa hai mục. Đầu tiên là số lượng mUSD và thứ hai là số lượng 3 Crv. Kho tiền 3 Crv Convex chỉ chứa 3 Crv, vì vậy mục đầu tiên của mảng số lượng sẽ bằng không.
Một thách thức kỹ thuật khi phát triển kho tiền là cách chúng tôi đặt số lượng mã thông báo nhà cung cấp thanh khoản dự kiến tối thiểu.
Ví dụ: nếu Metapool mUSD của Curve thêm 2 triệu mUSD, 6 triệu 3 Crv và 100 k 3 Crv, nó sẽ nhận được 100.068 mã thông báo LP (musd 3 Crv). Nếu Metapool có 6 triệu mUSD, thêm 2 triệu 3 Crv và 100k 3 Crv, sẽ nhận được 100.892 LP token (musd 3 Crv).
tiêu đề cấp đầu tiên
Kẻ tấn công giám sát Mempool để tìm các giao dịch có khả năng bị khai thác trước khi đưa chúng vào một khối. Để khai thác các giao dịch, họ hối lộ các nhà sản xuất khối để bao gồm các giao dịch của họ trước và sau các giao dịch có thể khai thác. Đó là, họ kẹp giao dịch dễ bị tổn thương với giao dịch của chính họ. Nếu có một giao dịch thêm 3 Crv vào mUSD Metapool trong đó số LP tối thiểu bằng 0, thì giao dịch đầu tiên của kẻ tấn công sẽ là giảm số lượng mUSD trong Metapool. Điều này có nghĩa là số lượng mã thông báo Metapool LP nhận được trong các giao dịch thanh khoản bổ sung dễ bị tổn thương thấp hơn nhiều so với mức cần thiết. Trong giao dịch thứ ba, kẻ tấn công trả lại mUSD đã bị lấy đi trong giao dịch đầu tiên và bỏ túi số tiền thu được.
ví dụ
ví dụ
Sử dụng Metapool mUSD của Curve, có 6.000.000 mUSD và 3 Crv trong nhóm, 11.917.295 mã thông báo LP (musd 3 Crv) và giá ảo là $1,018095.
Kẻ tấn công đã sử dụng hầu hết các mã thông báo LP trong nhóm của chúng bằng cách rút 5.973.425 triệu USD khỏi nhóm bằng cách sử dụng 6.500.000 (54,5%) mã thông báo của nhà cung cấp thanh khoản (musd 3 Crv) của nhóm (musd 3 Crv) để cân bằng nhóm. Sử dụng chức năng remove_liquidity_one_coin để thực hiện rút tiền một phía, để lại 0,43% mUSD và 99,56% 3 Crv trong nhóm. Giá giả đã tăng gần 1% lên 1,019105, do các khoản rút tiền không cân bằng lớn sẽ tính phí cho nhóm.
Nạn nhân sử dụng chức năng add_liquidity để thêm 100.000 3 Crv vào nhóm không cân bằng không có số lượng nhà cung cấp thanh khoản tối thiểu. Nếu nhóm được cân bằng, nạn nhân sẽ nhận được 81978 mã thông báo LP thay vì 100371. Điều này có nghĩa là các nạn nhân đã nhận được ít hơn 18.393 (18%) mã thông báo LP so với mức mà họ đáng lẽ phải nhận được. Tính theo đồng đô la, các nạn nhân bị giảm 18.643 (18%) giá trị đồng đô la.
Đối với giao dịch thứ ba và cũng là giao dịch cuối cùng, kẻ tấn công sử dụng add_liquidity để thêm lại vào nhóm 5.973.425 triệu USD mà chúng đã rút từ giao dịch đầu tiên để nhận 6.503.610 mã thông báo LP (musd 3 Crv ). Rút nhiều hơn $3610 so với giao dịch đầu tiên. Giá ảo của nhóm sẽ tăng 1% lên 1,019216 vì đây là một giao dịch không cân bằng khác. Tính theo USD, giá trị LP của kẻ tấn công đã tăng từ 6.500.000 USD * 1,018095 = 6.617.617 USD lên 6.503.610 * 1,019216 = 6.628.583 USD, tăng 10.966 USD (1,65% ).
Phí 0,04% để làm mất cân bằng nhóm được chia đều giữa các nhà cung cấp thanh khoản và những người nắm giữ CRV (veCRV) ký quỹ bỏ phiếu của Curve. Giá trị của 5.417.295 mã thông báo LP không do kẻ tấn công nắm giữ đã tăng từ 5.515.323 USD lên 5.520.794 USD. Đó là mức tăng $5,471 so với 50% phí nhóm. Giá trị USD tăng lên sẽ được chuyển đến những người nắm giữ CRV (veCRV) được ký quỹ.
tiêu đề cấp đầu tiên
Bảo vệ đường cong
Để ngăn chặn các cuộc tấn công bánh sandwich, khi thêm tính thanh khoản vào Curve Metapool, cần chỉ định số lượng mã thông báo LP tối thiểu hợp lý. Thông thường, các giao thức DeFi sẽ chuyển một số tiền đáng kể trong giao dịch. Hàm add_liquidity trong nhóm Curve là một ví dụ điển hình về min_mint_amount. Nhưng đối với chức năng ký gửi EIP-4626 tiêu chuẩn, không có tham số nào được xác định để chỉ định số tiền tối thiểu, vì vậy chúng tôi không thể chuyển một lượng đáng kể mã thông báo Metapool LP được tính toán ngoài chuỗi.
function calc_token_amount(uint 256 [ 2 ] memory amounts, bool is_deposit) external view returns (uint 256 );
Vì vậy, vấn đề vẫn còn, không có cách nào để các hàm EIP-4626 vượt qua một lượng tối thiểu. Việc phá vỡ tiêu chuẩn để thêm điều này là điều không mong muốn và việc sử dụng một lời tiên tri là không tối ưu. Chúng ta cần các phương thức on-chain.
tiêu đề cấp đầu tiên
Các phương thức của mStable
function get_virtual_price() external view returns (uint 256 );
Cách để kho bạc của mStable có được mức giá hợp lý cho mã thông báo Metapool LP là sử dụng giá ảo từ Curve Metapool và Curve 3 Pool. Hàm get_virtual_price trả về giá của mã thông báo nhà cung cấp thanh khoản của nhóm bằng USD. Nó thực hiện điều này bằng cách tính toán một bất biến cho nhóm, đó là giá trị đồng đô la của các mã thông báo trong nhóm chia cho tổng nguồn cung cấp mã thông báo. Vì số dư của các mã thông báo trong nhóm không ảnh hưởng đến giá trị bất biến hoặc tổng giá trị đô la của nhóm, nên giá ảo miễn nhiễm với các cuộc tấn công kiểu bánh sandwich.
fair Metapool LP tokens = 3 Crv assets *
3 Pool virtual price /
Metapool virtual price
Đối với tiền gửi vào vault mStable, chúng tôi cần định giá mã thông báo Metapool LP bằng mã thông báo 3 Pool LP của Curve (3 Crv), vì đây là tài sản chúng tôi sử dụng trong vault. Đối với điều này, chúng tôi lấy giá ảo 3 Pool và chia cho giá mã thông báo Metapool LP.
tiêu đề cấp đầu tiên
Tóm lại là
Tóm lại là
