Hook
Tháng 3 năm 2025, một người dùng Ethereum có biệt danh "crypto_0x5f" nhận được email từ giao thức Uniswap V4 với nội dung: "Hóa đơn phí giao dịch của bạn trong tháng qua là 16.247.890 USD. Vui lòng thanh toán trong vòng 7 ngày." Vấn đề? Người dùng này chưa bao giờ thực hiện một giao dịch nào trên Uniswap V4. Tài khoản của anh ta trống rỗng: zero nonce, zero lịch sử swap, zero allowance. Hệ thống đã tự động phát sinh một khoản phí dựa trên một "cơ chế ước tính phí động" mới được triển khai trong bản nâng cấp V4. Kết quả: thẻ tín dụng liên kết với tài khoản (qua on-ramp dịch vụ của MoonPay) bị đóng băng, và cộng đồng DeFi lại một lần nữa đặt câu hỏi về độ tin cậy của các giao thức tự động.
Context
Uniswap V4 ra mắt vào cuối năm 2024 với một thay đổi kiến trúc lớn: "Hooks" – những đoạn code cho phép các nhà phát triển tùy chỉnh hành vi của pool thanh khoản. Một trong những hook được quảng bá nhiều nhất là "Dynamic Fee Hook" – cho phép phí giao dịch thay đổi theo thời gian thực dựa trên độ biến động, khối lượng và các yếu tố vĩ mô on-chain. Ý tưởng là tốt: giảm phí khi thị trường yên tĩnh, tăng phí khi có biến động để bảo vệ nhà cung cấp thanh khoản. Nhưng việc triển khai lại gặp vấn đề. Một lỗi trong hợp đồng thông minh của hook đã khiến hệ thống tính phí không kiểm tra đúng trạng thái của người dùng trước khi phát sinh hóa đơn. Cụ thể, hook đã lấy nhầm dữ liệu từ một pool khác – một pool của một token lạ có tên "FakeUSDC" – và áp dụng mức phí trên một pool thanh khoản chính của USDC/ETH. Kết quả: bất kỳ ai có lịch sử tương tác với FakeUSDC (dù chỉ một lần approve từ năm 2021) đều bị tính phí tự động, bất kể họ có thực sự giao dịch trên pool chính hay không.
Core: Phân tích kỹ thuật và dữ liệu
Sự cố này không phải là một cuộc tấn công. Nó là một lỗi trong logic tính phí – một lỗi "off-by-one" trong việc ánh xạ địa chỉ pool. Hãy nhìn vào code của hook. Trong file DynamicFeeHook.sol, hàm calculateFee(address user, address pool) có một dòng: