Đào mã thấy lỗi, im lặng là vàng.
Một tuần trước, tôi nhận được log từ một giao thức AMM trên Arbitrum. Họ mất 5.000 ETH chỉ sau 3 block. Nguyên nhân? Oracle feed bị thiếu 2 số thập phân. Đơn giản vậy thôi. Nhưng câu chuyện không dừng ở đó.

Hầu hết mọi người nghĩ oracle là vấn đề của Chainlink. Sai. Lỗi nằm ở cách giao thức xử lý dữ liệu đầu vào không đầy đủ. Tôi đã thấy điều này ít nhất 5 lần trong 29 năm quan sát ngành. Lần này, tôi muốn kể chi tiết.

Context: Cơ chế oracle và điểm mù
Giao thức này sử dụng một oracle tùy chỉnh, lấy giá từ UniswapV2 TWAP. Họ có một hàm updatePrice() chạy mỗi 15 phút. Vấn đề: khi mạng Ethereum tắc nghẽn, oracle không nhận được đủ số lượng block để tính TWAP chính xác. Kết quả là giá feed bị stale – nhưng vẫn được chấp nhận.

Trong audit của tôi, tôi đã chỉ ra rằng thiếu cơ chế kiểm tra tính toàn vẹn dữ liệu đầu vào. Cụ thể: không có minTimestamp check, không có maxDeviation so với các nguồn khác. Đây là lỗi kinh điển của các dự án vội vàng launch.
Core: Phân tích kỹ thuật – Tại sao 2 số thập phân lại gây ra thảm họa?
Hợp đồng thông minh của họ có đoạn code như sau (đã được biến đổi để bảo mật):