Tối thứ Bảy, bot của tôi báo động. Một giao dịch bất thường trên Arbitrum: 4.2 triệu USDC rời khỏi cầu nối OptiBridge trong một block duy nhất. Không có phí gas cao, không có cháy hàng. Ai đó đã mint được token mà không cần deposit real asset.
Tôi ngồi lại, mở logs. Tôi chạy theo logic.
1. Hook
Cầu nối OptiBridge dùng cơ chế zk-rollup để verify giao dịch. Nhưng bot của tôi thấy một điểm bất thường: trong 24 giờ qua, tổng verified root votes từ sequencer chỉ có 3 lần, nhưng số gói tin gửi lên mainnet là 7. Tỷ lệ 7/3 vô lý – mỗi gói tin phải kèm một root được ký bởi ít nhất 2/3 validator threshold.
Tôi mở hợp đồng OptiBridge.sol. Dòng 112: require(voteCount[msg.sender] > threshold, 'Not enough votes');

Logic sai. threshold là hằng số 2, nhưng voteCount là tổng số phiếu từ trước đến nay, không reset theo epoch. Một validator có thể gom nhiều phiếu lẻ rải rác qua các kỳ, cộng dồn lại và dùng chúng để fake một verified batch.

2. Context
OptiBridge là một cầu nối giữa Ethereum và Arbitrum, sử dụng zk-proofs off-chain. Sequencer tập trung gửi batch lên mainnet, validators cần ký root. Cơ chế giống Polygon PoS bridge. Vấn đề: validators không cần phải đồng thời ký. Mỗi validator có thể bỏ phiếu bất kỳ lúc nào. Hợp đồng chỉ check voteCount[msg.sender] > threshold nhưng threshold là fixed value 2, và voteCount cộng dồn không reset.
Tôi từng audit một cầu nối tương tự năm 2021. Tôi biết pattern này: accumulation bug. Nhìn vào mã nguồn, tôi thấy rõ.
3. Core – Phân tích mã nguồn
Hợp đồng BatchVerifier.sol định nghĩa: