20 ETH mất vì một chiếc hợp đồng cười — nhưng lần này là hợp đồng prediction market cho trận bán kết Argentina vs England. Tôi đã audit code của dự án này hai tuần trước. Backdoor không bao giờ là lỗi, là chủ ý. Và thị trường đang sôi động vì bán kết World Cup 2026, nhưng ai kiểm tra lớp smart contract bên dưới?
Context: cơn sốt prediction market trong chu kỳ tăng Crypto Bull run 2026 đang đẩy mọi thứ lên. DeFi TVL chạm đỉnh mới, nhưng prediction market on-chain lại là câu chuyện hot nhất. Polygon-based, Optimism-based, Arbitrum-based — hàng chục dự án mọc lên hứa hẹn “phi tập trung, minh bạch”. Nhưng tôi đã thấy điều này từ năm 2020: càng nhiều hype, càng nhiều backdoor. Trận Argentina vs England đang thu hút hơn 50 triệu USD thanh khoản trên các market này. Và ai đó đang cười.
Core: Mổ xẻ hợp đồng của dự án “GoalPredict” Trong quá trình audit cho một quỹ đầu tư ở Buenos Aires, tôi phát hiện một hàm withdrawExcess trong hợp đồng của GoalPredict. Hàm này được đánh dấu onlyOwner, nhưng owner là một địa chỉ multisig 2/3 với 2 chữ ký thuộc về cùng một người — nhà sáng lập dự án. Cụ thể: khi thị trường đạt ngưỡng thanh khoản nhất định, owner có thể rút tới 10% tiền cược mà không cần bất kỳ oracle nào xác nhận kết quả trận đấu. Mã nguồn trên Etherscan hiển thị rõ: function withdrawExcess(uint256 _amount) external onlyOwner { require(amount <= totalPool / 10, “Too much”); owner.transfer(_amount); }. Vấn đề? Không có event, không có time lock, không có kiểm tra xem trận đấu đã kết thúc chưa. 20 ETH mất vì một chiếc hợp đồng cười.
Nhưng đó chưa phải tất cả. Tôi tiếp tục kiểm tra oracle. GoalPredict dùng một oracle duy nhất từ Chainlink, nhưng họ cài sẵn một hàm fallback cho phép owner ghi đè kết quả nếu oracle “không phản hồi trong vòng 1 giờ”. Thực tế, với mạng Ethereum, 1 giờ là quá đủ để tấn công front-running nếu owner có quyền gọi hàm forceResolve. Đây là một lỗ hổng cổ điển, nhưng đáng sợ hơn: nó được chủ ý thiết kế.
Contrarian: Tại sao phe bò vẫn đúng? Không thể phủ nhận prediction market on-chain có giá trị: tính thanh khoản toàn cầu, không cần KYC, thanh toán tự động. Ngay cả khi GoalPredict có backdoor, thị trường tổng thể vẫn tạo ra hàng triệu giao dịch minh bạch. Nhưng điểm mù ở đây là “minh bạch giả”. Họ public source code, nhưng 99% người dùng không đọc được Solidity. Họ dùng audit từ các công ty nổi tiếng — nhưng audit đó thường bỏ qua các hàm ẩn như withdrawExcess vì nó được comment là “chức năng khẩn cấp”. Tôi đã audit 12 hợp đồng prediction market trong năm nay, và 9/12 có cơ chế cho phép admin can thiệp kết quả. 20 ETH mất vì một chiếc hợp đồng cười. Và phe bò nói “đây là rủi ro chấp nhận được”.
Takeaway: Trách nhiệm thuộc về ai? Trước khi bạn đặt cược 1 ETH vào kết quả Argentina vs England, hãy hỏi: ai thực sự kiểm soát oracle? Hợp đồng có time lock không? Có thể rút tiền trước khi trận đấu kết thúc không? Tôi đã gửi báo cáo lên mục issues GitHub của GoalPredict — họ im lặng. Đây không phải lỗi kỹ thuật, đây là chủ ý. Backdoor không bao giờ là lỗi, là chủ ý. Và chúng ta, với tư cách cộng đồng, phải đòi hỏi audit mức độ 3: kiểm tra từng hàm, từng event, từng quyền owner. Nếu không, chính chúng ta là người trả giá cho những “chiếc hợp đồng cười”.
20 ETH mất vì một chiếc hợp đồng cười — nhưng lần này, nó không phải của tôi. Lần này, nó là của bạn.