
Oracle Không Phải Là Vấn Đề Kỹ Thuật: Bài Học Từ Uniswap V2 Cho ZK-Rollup
Trương Thủy
Zero knowledge cũng có điểm mù.
Đó là câu nói tôi lặp đi lặp lại khi đào sâu vào mã nguồn Uniswap v2 vào năm 2020. DeFi Summer đang bùng nổ, TVL của các giao thức tăng vọt, và mọi người đều tin rằng cơ chế oracle của Uniswap là an toàn — một cải tiến so với v1, dựa trên giá trung bình theo thời gian (TWAP) thay vì giá tức thời. Nhưng tôi, một phụ nữ 38 tuổi làm auditor độc lập, đã dành hai tháng để đọc từng dòng code. Và tôi phát hiện ra 3 điểm yếu có thể thao túng giá oracle. 0x v2 lỗi – bài học nhớ mãi.
Bối cảnh lúc đó rất đặc biệt. Các giao thức DeFi như Compound, Aave, MakerDAO đều phụ thuộc vào oracle để xác định giá tài sản thế chấp. Uniswap v2, với cặp thanh khoản tự động, cung cấp một giải pháp phi tập trung: giá trung bình trong 9 block (khoảng 90 giây) được lưu trữ trong hợp đồng. Ý tưởng là kẻ tấn công không thể thao túng giá trong một block vì giá đã được tính trung bình qua nhiều block. Nhưng trên thực tế, thanh khoản thấp ở một số cặp như ETH/USDC trên các chuỗi phụ có thể cho phép kẻ tấn công tạo ra biến động giá trong nhiều block, làm lệch giá trung bình. Tôi đã kiểm tra mã nguồn và thấy rằng cơ chế TWAP chỉ an toàn khi thanh khoản đủ sâu. Vấn đề không nằm ở thuật toán, mà nằm ở giả định về thị trường.
Phân tích kỹ thuật của tôi tập trung vào ba điểm yếu cụ thể. Thứ nhất, oracle giá không được cập nhật nếu không có giao dịch. Nếu một cặp thanh khoản không có hoạt động trong một thời gian, giá trung bình cũ sẽ được sử dụng, tạo ra cơ hội cho kẻ tấn công khai thác chênh lệch. Thứ hai, TWAP dễ bị thao túng qua các giao dịch lớn trong nhiều block, đặc biệt khi thanh khoản thấp. Tôi đã mô phỏng một kịch bản: kẻ tấn công vay USDC, swap để đẩy giá lên cao trong 10 block, sau đó dùng giá đó để mở một vị thế trên Aave, rồi đảo ngược swap. Mặc dù chi phí hoa hồng và lãi vay là rào cản, nhưng với cặp thanh khoản nhỏ, chi phí này thấp hơn nhiều so với lợi nhuận từ việc thao túng. Thứ ba, oracle không chống lại được tấn công flash loan kết hợp với thanh khoản thấp. Flash loan cho phép vay không cần tài sản thế chấp; kẻ tấn công có thể dùng nó để tạo ra biến động giá tức thời, ảnh hưởng đến giá trung bình nếu block cuối cùng của khoảng thời gian TWAP bị thao túng. Cả ba điểm yếu này đều có thể dẫn đến mất mát hàng triệu đô la nếu không được vá.
Góc nhìn phản trực giác ở đây là: vấn đề không nằm ở kỹ thuật oracle, mà nằm ở incentive. Hầu hết các cuộc thảo luận về bảo mật oracle đều tập trung vào việc chọn nguồn dữ liệu, xác thực chữ ký, hoặc chống tấn công flash loan. Nhưng thực tế, lỗ hổng lớn nhất là sự phụ thuộc vào thanh khoản. Khi thanh khoản thấp, giá dễ bị thao túng, bất kể thuật toán có tinh vi đến đâu. Điều này có nghĩa là các giao thức DeFi đã đặt sai trọng tâm. Họ tập trung vào việc tối ưu hóa cơ chế giá mà quên mất rằng thanh khoản là nền tảng. Điểm mù thứ hai là sự tin tưởng mù quáng vào TWAP như một giải pháp hoàn hảo. Cộng đồng đã quá lạc quan sau v1, và tôi nhận thấy nhiều dự án sao chép code Uniswap v2 mà không kiểm tra kỹ các giả định về thanh khoản. Điều này đặc biệt nguy hiểm trên các chuỗi mới nổi, nơi thanh khoản còn mỏng.
Takeaway cho tương lai của zk-rollup là: zero knowledge không thể giải quyết vấn đề oracle. ZK-rollup có thể cung cấp bằng chứng về tính toán chính xác, nhưng không thể đảm bảo tính chính xác của dữ liệu đầu vào. Nếu oracle trong zk-rollup dựa trên cùng một cơ chế TWAP với thanh khoản thấp, lỗ hổng vẫn tồn tại. Mã nguồn mở không đồng nghĩa với bảo mật. Tôi đã thấy điều này trong quá trình nghiên cứu Aztec Protocol: các proof có thể được xác thực, nhưng dữ liệu giá từ bên ngoài vẫn có thể bị thao túng. Bài học từ Uniswap v2 là: hãy kiểm tra giả định về thanh khoản trước khi tin tưởng vào oracle. Và đừng quên rằng zero knowledge cũng có điểm mù.