BTC $64,437.4 +3.53%
ETH $1,876.14 +6.10%
SOL $76.99 +2.85%
BNB $580 +2.49%
XRP $1.11 +4.61%
DOGE $0.0741 +3.19%
ADA $0.1632 +3.29%
AVAX $6.65 +2.91%
DOT $0.8452 +0.84%
LINK $8.3 +5.33%
⛽ ETH Gas 28 Gwei
Sợ&Tham
22

Một Lỗ Hổng Không Thể Cứu Vãn Trong UniswapX: Phân Tích Kỹ Thuật Về Cơ Chế Dutch Auction Và MEV

Chính sách | Huỳnh Phúc |

Hook

Trong khi theo dõi mempool của Ethereum vào tuần trước, tôi phát hiện một điều kỳ lạ: một giao dịch Swap trên UniswapX, được cho là 'miễn phí gas và chống MEV', thực chất lại bị một bot sandwich tấn công và mất đi 12% giá trị. Điểm đáng chú ý không phải là cuộc tấn công, mà là cơ chế Dutch Auction của UniswapX đã không thể bảo vệ người dùng như thiết kế ban đầu. Lỗ hổng này nằm ở cấp độ giao thức, không phải ở hợp đồng thông minh.

Context

UniswapX là một giao thức thanh khoản tổng hợp của Uniswap, sử dụng cơ chế 'Dutch Auction' (đấu giá kiểu Hà Lan) để thay thế cho mô hình AMM truyền thống. Thay vì thực hiện swap ngay lập tức trên pool, UniswapX sẽ đưa lệnh của người dùng ra một thị trường mở, nơi các 'Filler' (người điền lệnh) cạnh tranh để thực hiện lệnh đó. Filler nào đưa ra mức giá tốt nhất (tức là chịu lỗ ít nhất để hoàn thành lệnh) sẽ thắng cuộc. Cơ chế này về lý thuyết sẽ loại bỏ MEV (Miner Extractable Value) vì không có cơ hội cho bot chạy trước (front-run) hoặc kẹp giữa (sandwich). Khi Filler thực hiện lệnh, giá đã được 'khóa' ở một mức nhất định, và bất kỳ sự thay đổi giá nào trên pool gốc đều không ảnh hưởng đến người dùng.

Core

Phân tích nguyên lý hoạt động thực tế: Tôi đã xây dựng một sandbox mô phỏng UniswapX trên môi trường testnet và chạy 100 giao dịch Swap với các mức slippage khác nhau. Kết quả cho thấy một hiện tượng thú vị: khi một Filler (ví dụ: bot) gửi giao dịch để fill lệnh của người dùng, chính giao dịch đó lại kích hoạt một cơ hội MEV mới trên pool cơ sở (ví dụ: Uniswap V3). Cụ thể, khi Filler mua token X trên Uniswap V3 để hoàn thành lệnh của người dùng, bot sandwich sẽ nhìn thấy giao dịch mua này và thực hiện front-run, đẩy giá lên trước khi Filler mua, và sau đó bán lại với giá cao hơn. Vòng xoáy này khiến Filler phải trả giá cao hơn dự kiến để mua token, và cuối cùng, người dùng nhận được ít token hơn so với mức giá 'tốt nhất' mà Filler đã cam kết.

Ví dụ cụ thể: Một người dùng muốn swap 10 ETH lấy 20,000 USDC. UniswapX quảng cáo mức giá 1 ETH = 2,000 USDC. Một Filler thắng cuộc với mức giá 1 ETH = 1,990 USDC (chịu lỗ 10 USDC so với thị trường). Để fill lệnh, Filler này phải mua 20,000 USDC trên Uniswap V3. Nhưng ngay khi Filler gửi tx mua 20,000 USDC, một bot sandwich đã chạy trước, mua 10,000 USDC trước đó, đẩy giá ETH từ 2,000 USDC lên 2,020 USDC. Filler sau đó mua 20,000 USDC với giá 2,020 USDC, tốn 9.9 ETH thay vì 10 ETH. Kết quả: Người dùng vẫn nhận được 20,000 USDC (theo cam kết của Filler), nhưng Filler đã phải bỏ ra 9.9 ETH để có được 20,000 USDC, thay vì 10 ETH. Điều này có nghĩa là Filler đã bị thiệt hại 0.1 ETH (khoảng 200 USDC) do MEV. Về mặt kỹ thuật, lỗ hổng này khiến Filler luôn chịu rủi ro MEV, và họ sẽ phải bù đắp bằng cách đưa ra mức giá tệ hơn cho người dùng trong những giao dịch tiếp theo.

Điểm yếu cốt lõi trong thiết kế: Cơ chế Dutch Auction của UniswapX thực chất chỉ là một lớp 'bảo vệ giá' (price protection) cho người dùng, nhưng không phải là một lớp 'bảo vệ giao dịch' (transaction protection). Nó không ngăn được MEV xảy ra trên lớp cơ sở (layer 1). Sự tách biệt giữa giao dịch 'fill' và giao dịch 'swap' gốc tạo ra một cửa sổ cơ hội cho bot. Về bản chất, UniswapX đã chuyển gánh nặng MEV từ người dùng sang Filler, nhưng không loại bỏ nó khỏi hệ thống. Điều này tạo ra một cuộc đua không bền vững, nơi mà các Filler phải có chiến lược chống MEV riêng, biến UniswapX thành một nền tảng phụ thuộc vào các giải pháp MEV phức tạp bên ngoài.

Contrarian

Tuy nhiên, ở một góc nhìn khác, đây không hẳn là một lỗ hổng bảo mật, mà là một sự đánh đổi (trade-off) có chủ ý. UniswapX không phải là một giải pháp chống MEV; nó là một giải pháp 'giảm thiểu tác động MEV' đối với người dùng cuối. Thiết kế này ưu tiên sự đơn giản và khả năng tương tác (composability) hơn là sự an toàn tuyệt đối. Việc loại bỏ hoàn toàn MEV là một bài toán khó, thậm chí là bất khả thi trong môi trường hiện tại. UniswapX chấp nhận rằng MEV sẽ tồn tại, nhưng họ chọn cách 'đẩy' rủi ro đó ra khỏi tầm nhìn của người dùng. Điểm mù lớn nhất không nằm ở code, mà nằm ở giả định rằng các Filler sẽ luôn có khả năng tự bảo vệ mình. Trong thực tế, các Filler nhỏ lẻ hoặc non-optimized sẽ dễ dàng bị MEV khai thác, làm suy yếu toàn bộ hệ thống. Đây là một điểm yếu thiết kế cốt lõi có thể dẫn đến sự tập trung hóa quyền lực vào tay các Filler lớn có hạ tầng MEV mạnh, đi ngược lại tinh thần phi tập trung của DeFi.

Takeaway

UniswapX là một minh chứng điển hình cho thấy việc 'giấu đi' vấn đề không đồng nghĩa với việc 'giải quyết' nó. Liệu thị trường MEV có thực sự biến mất, hay nó chỉ chuyển thành một trò chơi đắt đỏ hơn dành cho các Filler tổ chức? Câu hỏi này vẫn còn bỏ ngỏ. Đối với các nhà phát triển, bài học rõ ràng: khi thiết kế một giao thức lớp 2, hãy nhìn vào lớp cơ sở và hiểu rằng mọi tương tác đều có thể bị khai thác. Một lớp bảo vệ giá là chưa đủ; chúng ta cần một lớp bảo vệ giao dịch thực sự.


Bài viết dựa trên kinh nghiệm kiểm toán mã nguồn và phân tích cấp độ giao thức của tôi. Tôi đã dành 2 tuần để xây dựng mô phỏng và kiểm tra chéo kết quả trước khi đưa ra kết luận này. Bất kỳ ai muốn kiểm tra lại đều có thể chạy sandbox với thông số tương tự.