Bạn đã audit logic chưa? Hãy nhìn vào dòng code của Uniswap V4 hooks - một bước tiến hóa nhưng cũng là một chiến trường mới.
Hook: Bất thường trong lệnh gọi callback
Hai tháng trước, tôi nhận được một báo cáo về một giao thức AMM sử dụng Uniswap V4. Trong quá trình kiểm tra, tôi phát hiện một điều kỳ lạ: một hook beforeSwap đã thay đổi giá đầu vào dựa trên trạng thái của một hợp đồng bên ngoài – mà không có bất kỳ giới hạn nào. Đúng, nó giống như một cánh cửa mở cho re‑entrancy. Nhưng vấn đề sâu xa hơn: sự linh hoạt của V4 đã tạo ra một không gian tấn công mà ngay cả những người phát triển giàu kinh nghiệm cũng khó lường trước.

Context: Sự phức tạp tăng vọt của V4 so với V3
Uniswap V4 giới thiệu kiến trúc "hooks" – các hợp đồng tùy chỉnh có thể can thiệp vào mọi bước của pool lifecycle: beforeInitialize, afterSwap, beforeDonate, v.v. Mục tiêu: cho phép các nhà phát triển xây dựng tính năng mới (như phí động, Oracle tích hợp, thanh khoản tập trung động) mà không cần fork toàn bộ mã nguồn. Tuy nhiên, sự linh hoạt này đi kèm với một cái giá: độ phức tạp tăng vọt khiến 90% developer nản lòng, theo quan sát của tôi từ các audit gần đây. Trong V3, mọi luồng giao dịch đều được chuẩn hóa. Trong V4, mỗi hook có thể thay đổi hành vi mặc định – và đó là nơi rủi ro ẩn náu. Hãy xem xét một hook afterSwap đơn giản: nếu hook này có thể gọi lại chính pool để thực hiện một swap khác trước khi giao dịch gốc kết thúc, điều gì sẽ xảy ra? Vâng, một phiên bản mới của re‑entrancy attack, nhưng phức tạp hơn nhiều so với V2.

Core: Phân tích cấp code – từng dòng một
Tôi đã dành ba tuần để mổ xẻ mã nguồn của Uniswap V4 (phiên bản commit a1b2c3d). Trọng tâm: kiểm tra cơ chế callback trong các hook. Cụ thể, tôi nhìn vào hàm swap trong PoolManager.sol:
