Trong 72 giờ đầu tiên, ZetaLayer hút 200 triệu USD TVL. Tôi mở block explorer, thấy một transaction kỳ lạ: 500 ETH từ liquidity pool chuyển sang contract không có source code. Không verify, không audit log. Tôi compile lại contract từ bytecode — một lỗi rounding xuất hiện ngay dòng 42.
ZetaLayer là zk-rollup tập trung gaming, dùng Cairo và StarkEx. Team tuyên bố giải quyết phân mảnh thanh khoản (fragmented liquidity narrative) bằng cross-chain liquidity pool. Họ fork từ StarkNet, thêm module thanh khoản đa chuỗi. Theo whitepaper, phí giao dịch thấp hơn Arbitrum 40%. Nhưng whitepaper không nói về lỗi làm tròn.

Tôi mở contract chính, tìm thấy hàm tính phí:
function computeFee(uint256 amount, uint256 feeRate) public pure returns (uint256) {
return amount * feeRate / 10000;
}
Vấn đề: feeRate được truyền từ oracle ngoài chuỗi, nhưng không có kiểm tra tràn số. Nếu feeRate = 0, phí = 0. Nếu feeRate > 10000, phí vượt amount. Tôi viết PoC: gửi 1 ETH với feeRate 99999, contract trả về 9.9999 ETH — lỗi dẫn đến mint token giả.
Trong thực tế, team dùng oraclize để lấy feeRate. Một lần oracle trả về giá trị sai (do reentrancy ở contract nguồn), pool mất 20 ETH. Tôi gửi report, họ fix sau 3 ngày. Nhưng câu chuyện không dừng ở đây.
Điểm mù bảo mật: Layer 2 thường tập trung vào zk-proof, quên mất smart contract cơ bản. Lỗi rounding là lỗi lớp 101, nhưng vì rush ship, 2 auditor bỏ qua. Bài học: dù zk-SNARK có mạnh đến đâu, nếu contract nguồn sai, toàn bộ hệ thống sập.

Sau 2 tháng, ZetaLayer TVL giảm 60%. Team blame thị trường giảm. Thực tế: vấn đề không phải narrative thanh khoản — mà là kiến trúc zk-proof generation chậm, cross-chain settlement mất 30 phút, tạo arbitrage và MEV. Đây là lý do thực sự LP rút.
Khi mọi Layer 2 đều chạy đua về TVL, ai sẽ kiểm tra dòng code cuối cùng?