Tuần trước, một hợp đồng thông minh trên Polymarket thu hút sự chú ý của tôi. Nó cho phép người dùng đặt cược vào việc tàu chở dầu có thể hoạt động trở lại qua eo biển Hormuz sau vụ tấn công hay không. Tỉ lệ hiện tại: 14%. Nhưng tôi không quan tâm đến con số đó. Tôi quan tâm đến mã nguồn. Tôi đã audit hơn 30 hợp đồng cho các thị trường dự đoán trong 5 năm qua. Và tôi biết: whitelist oracle, cơ chế giải quyết, và lỗ hổng reentrancy thường ẩn nấp ở những nơi ít ai ngờ tới.

Hãy bắt đầu từ bối cảnh. Ngày 12/2/2025, một tàu chở dầu bị tấn công gần eo biển Hormuz. Ngay lập tức, thị trường dự đoán phi tập trung xuất hiện: 'Liệu hoạt động vận tải dầu mỏ qua Hormuz có được khôi phục hoàn toàn trong vòng 30 ngày tới?' Hợp đồng này được tạo trên Polymarket, sử dụng framework ERC-1155 của họ. Về cơ bản, người dùng mua 'Có' hoặc 'Không' dưới dạng token. Giá token 'Có' hiện là 0.14 USDC, tương ứng với xác suất 14% do thị trường ấn định. Nhưng điều thú vị không nằm ở dự đoán – nó nằm ở cách thức hợp đồng xử lý kết quả.
Tôi mở trình duyệt block explorer và đọc mã nguồn của hợp đồng Polymarket đã triển khai. Đây là hợp đồng Conditional Token Framework (CTF) kết hợp với Oracle – cụ thể là một bộ oracle tùy chỉnh cho phép chủ sở hữu (UMA) báo cáo kết quả. Điểm mấu chốt: hàm reportPayouts chỉ được gọi bởi một địa chỉ duy nhất, không phải bởi một DAO hay bất kỳ cơ chế đồng thuận nào. Một điểm yếu kinh điển. Tôi đã thấy lỗi này trong dự án Augur vào năm 2020 – khi một admin key có thể thay đổi kết quả sau khi thị trường kết thúc. Ở đây, nó được gọi là 'Proposer' – nhưng thực chất là một EOA (Externally Owned Account). Dưới đây là đoạn code tôi lấy từ Etherscan: