
Uniswap v4 Hooks là cơ chế cho phép gắn một hợp đồng thông minh bên ngoài vào từng bể thanh khoản, để tùy biến hành vi của bể tại các điểm móc xoay trong vòng đời giao dịch. Bài viết này giải thích cách hook hoạt động, các quyền hạn có thể khai báo, và vì sao kỹ thuật địa chỉ hook lại là chi tiết then chốt khi phát triển.
Uniswap v4 giữ nguyên cơ chế thanh khoản tập trung của v3 nhưng thay đổi kiến trúc hợp đồng theo hướng gọn hơn. PoolManager không còn cấp phát một hợp đồng riêng cho mỗi cặp token, mọi thao tác đi qua một hợp đồng trung tâm. Chính vì vậy mà cơ chế hook xuất hiện: thay vì fork sửa toàn bộ Uniswap, nhà phát triển chỉ cần viết một hợp đồng nhỏ gắn vào bể và khai báo các điểm móc nó muốn tham gia.

Hook là gì và bám vào đâu
Một hook là hợp đồng thông minh bên ngoài, gắn vào đúng một bể khi bể được tạo qua hàm PoolManager.initialize. Quan hệ này là một đối nhiều: mỗi bể có tối đa một hook, nhưng một hook có thể phục vụ vô số bể. Cùng một hook có thể áp dụng cho cặp token A với B, B với C, và các cặp khác mà không cần triển khai lại hợp đồng.
PoolManager tra cứu hook thông qua khóa của bể, rồi chỉ gọi những hàm mà hook khai báo quyền. Nhà phát triển không bắt buộc viết đủ tất cả hàm, chỉ cần chọn những cái mình thực sự dùng.
| Nhóm hook | Hàm | Thời điểm gọi |
|---|---|---|
| Khởi tạo | beforeInitialize, afterInitialize | Trước và sau khi tạo bể, chỉ chạy một lần |
| Thêm thanh khoản | beforeAddLiquidity, afterAddLiquidity | Trước và sau khi người dùng nạp thanh khoản |
| Rút thanh khoản | beforeRemoveLiquidity, afterRemoveLiquidity | Trước và sau khi người dùng rút thanh khoản |
| Hoán đổi | beforeSwap, afterSwap | Trước và sau mỗi lần đổi token |
| Quyên góp | beforeDonate, afterDonate | Trước và sau khi có người tặng thanh khoản |
Ngoài mười hàm gọi thuần, hook còn có bốn quyền trả về điều chỉnh số dư: beforeSwapReturnDelta, afterSwapReturnDelta, afterAddLiquidityReturnDelta và afterRemoveLiquidityReturnDelta. Đây là điểm mấu chốt cho phép hook thu phí, thưởng điểm, hoặc tính phí động thay vì chỉ quan sát.
Kỹ thuật địa chỉ: vì sao không deploy ở đâu cũng được
Điểm khác biệt lớn nhất của Uniswap v4 so với bất kỳ hệ thống hook nào khác là quyền của hook được mã hoá ngay trong địa chỉ hợp đồng. Mỗi hàm hook tương ứng với một bit cờ trong 20 byte địa chỉ, và PoolManager đọc trực tiếp các bit đó để biết cần gọi hàm nào.
Hệ quả là bạn không thể triển khai hook tới một địa chỉ tuỳ ý. Bạn phải đào một muối CREATE2 sao cho địa chỉ sinh ra có đúng các bit cờ mong muốn. Thư viện HookMiner trong gói v4-periphery làm đúng việc đó:
uint160 flags = uint160(Hooks.AFTER_ADD_LIQUIDITY_FLAG | Hooks.AFTER_SWAP_FLAG);
bytes memory constructorArgs = abi.encode(POOLMANAGER);
(address hookAddress, bytes32 salt) =
HookMiner.find(CREATE2_DEPLOYER, flags, type(PointsHook).creationCode, constructorArgs);
Sau đó kịch bản triển khai sẽ kiểm tra rằng địa chỉ thực tế trùng với địa chỉ đã đào. Cách làm này cho phép PoolManager xác định quyền của hook chỉ bằng cách đọc địa chỉ, không cần một lệnh tra cứu riêng, và tiết kiệm khí gas so với việc lưu cấu hình trên chuỗi.
Quyền được khai báo qua hàm getHookPermissions trả về một cấu trúc các cờ boolean. Nếu địa chỉ không có cờ tương ứng, PoolManager sẽ không bao giờ gọi hàm đó và logic của bạn sẽ âm thầm không chạy. Ngược lại, khai báo quyền không khớp với địa chỉ đã đào thì quá trình triển khai thất bại. Nói cách khác, địa chỉ và khai báo phải luôn khớp nhau.

Ứng dụng thực tế của hook
Hook mở ra một lớp tính năng mà AMM cố định không thể có:
- Đường cong định giá tùy chỉnh: khác với công thức cố định khi bán bằng sản phẩm, hook cho phép dùng đường cong khác hoặc kết hợp nhiều mô hình định giá.
- Phí động: thu phí biến động theo điều kiện thị trường, ví dụ phí cao hơn khi biến động tăng, thay vì cố định 0,3 phần trăm như trước.
- Chương trình thưởng điểm: ghi nhận điểm cho người cung cấp thanh khoản, mở đường cho yield farming dựa trên đúng bể thanh khoản đó.
- Kiểm soát quyền truy cập: chỉ cho phép danh sách địa chỉ được chỉ định thêm hoặc rút thanh khoản, hữu ích cho bể riêng tư.
- Sản phẩm phái sinh: xây dựng nền tảng phái sinh hoặc tài sản tổng hợp trên chính thanh khoản của Uniswap v4.
Lợi ích lớn cho đội ngũ phát triển là chi phí kiểm định thấp hơn hẳn. Thay vì fork toàn bộ giao thức và đưa qua nhiều vòng audit, nhóm có thể dựng một giao thức mới từ vài trăm dòng hook, rồi tái sử dụng lớp thanh khoản đã kiểm định của Uniswap.
Tuy nhiên có một hiểu lầm phổ biến cần lưu ý: viết hook không đồng nghĩa với việc giao dịch sẽ được chuyển tới hook đó từ giao diện chính thức của Uniswap. Dòng chảy thanh khoản phụ thuộc vào kết quả tìm đường tối ưu, đối tác tích hợp và đối lập cạnh tranh từ các sàn khác.
Một giới hạn thiết kế: không gắn hook sau
Hook là một phần của PoolKey và chỉ được đặt lúc tạo bể. Không thể thêm, gỡ hay đổi hook của một bể đang tồn tại. Muốn dùng hook khác, bạn phải tạo một bể mới với hook mong muốn trong khóa.
Đây là đánh đổi có chủ đích: bất biến của PoolKey giúp PoolManager xử lý logic đơn giản và rẻ hơn. Đổi lại, việc nâng cấp tính năng buộc phải tạo bể mới, và người dùng phải chủ động chuyển thanh khoản sang.
Kiểm thử với Foundry
Phần lớn dự án hook dùng Foundry làm bộ công cụ kiểm thử. Khuôn mẫu v4-template đã cấu hình sẵn v4-core và v4-periphery, nên bạn chỉ cần chạy:
git clone https://github.com/uniswapfoundation/v4-template.git
cd v4-template
forge install
forge test
Trong kiểm thử đơn vị, cheatcode deployCodeTo cho phép đặt hook ở bất kỳ địa chỉ nào mà không cần đào muối, tiết kiệm hàng giờ chờ. Khi cần kiểm thử tích hợp, bạn chạy một node Anvil cục bộ, triển khai v4 cùng hook bằng kịch bản Foundry, rồi trỏ bộ kiểm thử vào địa chỉ 127.0.0.1:8545.
Khi nào bạn không cần hook
Hook là tuỳ chọn. Một bể v4 không có hook vẫn hoạt động bình thường với hành vi thanh khoản tập trung giống v3. Bạn chỉ cần hook khi muốn can thiệp tại một điểm cụ thể: chạy logic trước hoặc sau lần đổi, kiểm soát ai được thêm hay rút thanh khoản, áp dụng phí động, hoặc xây hệ thống kế toán riêng. Với một bể trao đổi tiêu chuẩn, việc viết và gắn hook là công sức thừa.
Kết luận
Uniswap v4 biến việc tùy biến bể thanh khoản thành một bài toán đóng gói quyền trong địa chỉ hợp đồng, thay vì một lớp cấu hình phức tạp. Cách làm này giữ cho lõi giao thức gọn nhẹ, cho phép lập trình viên xây giao thức mới bằng vài trăm dòng, đồng thời vẫn kiểm soát được rủi ro bảo mật nhờ hệ sinh thái v4-core đã được audit kỹ. Nếu bạn đang tìm cách xây một sản phẩm DeFi khác biệt mà vẫn muốn hưởng thanh khoản sẵn có, hook là con đường ít ma sát nhất.
