LapTrinhBlockchain

Chia sẻ kiến thức về Lập Trình Blockchain

Kiến thức Blockchain, Nâng cao Kiến thức

JIT Liquidity: Tấn công thanh khoản tức thời trên Uniswap V3, chiến lược làm nản lòng các nhà cung cấp thanh khoản dài hạn

JIT Liquidity: Chiến lược thanh khoản tức thời trên Uniswap V3, chiến lược làm nản lòng các nhà cung cấp thanh khoản dài hạn

JIT Liquidity: Chiến lược thanh khoản tức thời trên Uniswap V3, chiến lược làm nản lòng các nhà cung cấp thanh khoản dài hạn

Chia sẻ bài viết
5
(68)

Một giao dịch swap trị giá hàng triệu USD sắp được thực hiện. Ngay trước đó, một ví bất ngờ cung cấp lượng thanh khoản khổng lồ vào đúng vùng giá hiện tại. Giao dịch hoàn tất, thanh khoản lập tức biến mất. Đây không phải sự trùng hợp—đó có thể là JIT Liquidity, một chiến thuật MEV đặc biệt trên Uniswap V3.

Chi tiết kỹ thuật chiến lược JIT Liquidity

JIT Liquidity là gì và tại sao nó xuất hiện trên Uniswap V3?

JIT Liquidity là một chiến lược thanh khoản tức thời (JIT: Just-In-Time), một hình thức thao túng thị trường phổ biến trên các sàn giao dịch phi tập trung (DEX) sử dụng mô hình thanh khoản tập trung (như Uniswap v3). Đây là một trong các chiến lược được nhiều MEV bot sử dụng.

Tại sao Uniswap V3 lại tạo điều kiện cho chiến lược này? Một số lý do như sau:

  • Cơ chế thanh khoản tập trung: LP không cần cung cấp thanh khoản trên toàn bộ range giá
  • Thanh khoản có thể Nạp (Mint) và Rút (Burn) tùy ý
  • Phí (Fee) được phân bổ theo “active liquidity”

Như vậy, khi phát hiện một giao dịch swap lớn, thì MEV Bot chỉ cần cung cấp lượng thanh khoản lớn trong vùng giá hiện tại, thì sau khi swap xảy ra, thực hiện rút toàn bộ thanh khoản, khi đó gần như toàn bộ phí swap của giao dịch trên là của MEV Bot.

Một chiến lược JIT diễn ra như thế nào?

Chiến lược diễn ra hoàn toàn tự động thông qua các hợp đồng thông minh của bot và được gom gọn trong duy nhất 1 block của mạng lưới (ví dụ: Ethereum):

[ Giao dịch 1: Thêm thanh khoản lớn ] -> [ Giao dịch 2: Lệnh mua của người dùng ] -> [ Giao dịch 3: Rút thanh khoản + Phí ]
  1. Săn mồi (Mempool): Bot liên tục quét mempool (vùng chờ của các giao dịch) và phát hiện một lệnh hoán đổi (swap) token có khối lượng cực lớn, hứa hẹn tạo ra số tiền phí giao dịch khổng lồ.
  2. Kẹp chả (Sandwiching – Giao dịch 1 & 2): Bot phát một giao dịch thêm một lượng vốn cực lớn vào đúng dải giá hẹp mà lệnh của nạn nhân sắp đi qua. Bot trả phí gas thật cao để thợ đào (miner/validator) xếp giao dịch của nó đứng ngay trước lệnh của nạn nhân. Vì thanh khoản của bot quá lớn, lệnh của nạn nhân hầu như chỉ khớp với nguồn vốn của bot.
  3. Húp trọn và Rút lui (Giao dịch 3): Ngay sau khi lệnh của nạn nhân vừa khớp xong, bot thực hiện tiếp một lệnh rút toàn bộ số thanh khoản đó ra, ôm theo phần lớn số tiền phí thu được từ nạn nhân.

Điều kiện để có thể thực hiện 1 chiến lược JIT:

  • Lệnh swap người dùng phải đủ lớn => Để phí lớn đủ bù các chi phí khác và có lợi nhuận
  • Lựa chọn pool theo thanh khoản hiện tại và phí để sao cho có lợi nhuận
    • Pool có phí cao thì phí swap sẽ cao
    • Pool có thanh khoản nhỏ trong vùng hiện tại => Tỉ lệ % thanh khoản của bot cao => Phần lớn phí sẽ về bot
    • Phải tính toán xác định phí thực sự nhận được từ giao dịch

Ai là người bị thiệt hại với JIT Liquidity

Rõ ràng, JIT Liquidity giúp cho người dùng swap có lợi thế giá tốt và trượt giá thấp, do đó các trader không phản đối hình thức này. Vậy nếu Mev Bot có lợi nhuận thì ai mới là người bị thiệt hại thực sự? Người thiệt hại thực sự lại chính là các “Nhà cung cấp thanh khoản thụ động” hay là các “Nhà cung cấp thanh khoản dài hạn“.

  • Các LP bình thường phải chịu rủi ro giữ token dài hạn và chịu tổn thất tạm thời (Impermanent Loss).
  • Khi có một lệnh giao dịch lớn mang lại nguồn phí béo bở để bù đắp rủi ro đó, MEV Bot lại nhảy vào cướp mất 90-95% số phí này.
  • Do đó, nó làm suy yếu cấu trúc khuyến khích của các sàn DEX, khiến các LP truyền thống bị thiệt hại nặng nề.

Cách thị trường DeFi đối phó với JIT

Để bảo vệ các nhà cung cấp thanh khoản nhỏ lẻ, các dự án DeFi hiện tại đang áp dụng một số giải pháp:

  • Áp dụng thời gian khóa (Lockup period): Yêu cầu thanh khoản sau khi nạp vào phải giữ tối thiểu qua một số lượng block nhất định mới được rút.
  • Sử dụng sàn DEX chạy trên các mạng MEV-resistant: Các nền tảng có cơ chế sắp xếp giao dịch mù (blinded mempool) hoặc đấu giá công bằng khiến bot không thể “nhìn trước” để chèn lệnh Just-in-Time.

Case Study: Phân tích một JIT thực tế

Bây giờ chúng ta sẽ đi sâu phân tích một giao dịch JIT thực tế trên Ethereum:
Giao dịch JIT 1 -> Giao dịch hoán đổi -> Giao dịch JIT 2

Ba giao dịch này là một ví dụ sách giáo khoa về Tấn công thanh khoản JIT (Just-in-Time) diễn ra trên mạng lưới Ethereum tại block 18282570 vào ngày 05/10/2023, giá ETH tại thời điểm này khoảng 1624 USDC. Đối tượng thực hiện cuộc tấn công này là một MEV Bot có địa chỉ ví kết thúc bằng 0xA69...78C.

Hãy cùng phân tích chi tiết dòng tiền diễn ra trong vỏn vẹn vài giây của block này:

Bước 1: Giao dịch JIT 1 – Nạp thanh khoản khổng lồ (Vị trí thứ 2 trong Block)

MEV Bot phát hiện lệnh swap lớn của người dùng đang nằm trong Mempool. Ngay lập tức, nó thực hiện giao dịch đầu tiên để bơm một lượng vốn cực lớn vào bể Uniswap V3: USDC 2 (Bể USDC/WETH phí 0.3%):

  • Số vốn bơm vào: 12.11 triệu USDC và 5,270.61 WETH, với tổng giá trị khoảng 26.6 triệu USD.
  • Hành động kỹ thuật: Bot thực hiện lệnh Mint vị thế thanh khoản tập trung (Concentrated Liquidity) ở một dải giá cực hẹp (từ tickLower 202260 đến tickUpper 202320) => Làm tăng thanh khoản hoạt động lên gấp 40 lần và Bot chiếm 97,5% thanh khoản
  • Mục đích: Chiếm giữ gần như toàn bộ tỷ trọng thanh khoản tại dải giá mà lệnh swap của người dùng sắp đi qua, nhằm ép lệnh của người dùng phải khớp với vốn của nó.
Tấn công JIT: Giao dịch thêm thanh khoản lớn
Tấn công JIT: Sự kiện thêm thanh khoản

Bước 2: Giao dịch của User – Thực hiện Swap (Vị trí thứ 3 trong Block)

Ngay sau khi thanh khoản của bot được thiết lập thành công, giao dịch của người dùng được xử lý:

  • Hành động của user: Người dùng thực hiện Swap 122.32 ETH lấy 200,000 USDC thông qua Uniswap Universal Router
  • Thực tế khớp lệnh: Lệnh này tự động chia nhỏ và quét qua hai bể:
    • Swap 109.98 ETH để đổi lấy 180,000 USDC trên một pool Uniswap V3 (Pool này có phí 0.05%)
    • Swap 12.22 ETH để đổi lấy 20,000 USDC trên Uniswap V3: USDC 2 (Đây là pool và Bot mới thêm thanh khoản)
  • Tại bể USDC 2, người dùng đổi 12,21 ETH lấy 20.000 USDC. Vì thanh khoản của bot lúc này chiếm tỷ trọng áp đảo, bot đã nuốt trọn phần phí phát sinh từ 20,000 USDC giao dịch này.
Tấn công JIT: Người dùng thực hiện một lệnh swap rất lớn

Bước 3: Giao dịch JIT 2 – Rút vốn và Thu hoạch (Vị trí thứ 4 trong Block)

Ngay ở giao dịch tiếp theo của block, MEV Bot thực hiện lệnh rút lui lập tức để bảo toàn vốn và thu lợi nhuận:

  • Hành động kỹ thuật: Bot gọi lệnh Burn và Collect để rút toàn bộ thanh khoản vừa tạo ở Bước 1 đồng thời claim phí.
  • Số tiền rút ra: 12.09 triệu USDC và 5,282.51 WETH cộng với khoản phí thu về là 0.00231 ETH (~6.37$)

Tổng kết lợi nhuận của Bot khi thực hiện giao dịch

Hãy so sánh lượng tài sản Bot nạp vào ở Bước 1 và rút ra ở Bước 3 để thấy khoản lãi:

Tấn công JIT: Lợi nhuận ròng mà Mev Bot thu được

Tính giá ETH thời điểm đó là 1 ETH = 1641.76 USDC, Bot đã nhận được khoảng 60$ tiền phí và lợi nhuận ròng là 50.5$ sau khi trừ đi phí gas (4.15$) và tiền thưởng cho người xây dựng (3.8$). Trong khi đó, phần còn lại của pool tức là các nhà cung cấp thanh khoản khác, tổng cộng $65M thanh khoản, phải chia nhau 1.56$

Bot chấp nhận bỏ ra khoản vốn khổng lồ $26.6M, chấp nhận chịu rủi ro trượt giá trong đúng 1 giao dịch của user, thu lời chỉ trong 1 block rồi rút toàn bộ vốn về an toàn. Toàn bộ dòng tiền được tính toán chuẩn xác nhờ sức mạnh của các thuật toán định tuyến MEV.

Chính vấn đề lớn này mà Solidly V3 đã ra đời với mục đích khắc phục vấn đề trên.

Bài viết này có hữu ích với bạn?

Kích vào một biểu tượng ngôi sao để đánh giá bài viết!

Xếp hạng trung bình 5 / 5. Số phiếu: 68

Bài viết chưa có đánh giá! Hãy là người đầu tiên đánh giá bài viết này.

Trả lời

Giao diện bởi Anders Norén