Một dòng code trong contract VinaChain khiến tôi dừng lại. setSequencer(address _newSeq) không có modifier onlyOwner nhưng lại nằm trong hàm initialize được gọi một lần duy nhất. Đọc kỹ, họ dùng proxy pattern với initializer modifier từ OpenZeppelin. Nhưng điều đáng nói: initialize không kiểm tra msg.sender — bất kỳ ai cũng có thể gọi lại nếu proxy chưa được khởi tạo đúng cách. Đây là lỗi kinh điển từ các dự án 2018, nhưng vẫn xuất hiện trong một Layer 2 mới toanh của Việt Nam.
VinaChain ra mắt tháng 3 năm nay, gọi vốn 15 triệu USD từ một quỹ đầu tư mạo hiểm trong nước và một quỹ Nhật Bản. Họ tự nhận là "Layer 2 đầu tiên của Việt Nam" với cơ chế optimistic rollup, hướng đến các ứng dụng tài chính phi tập trung cho thị trường Đông Nam Á. TVL hiện tại khoảng 80 triệu USD, chủ yếu từ các pool thanh khoản của VNDC stablecoin và token VIN gốc. Tuy nhiên, khi tôi đào sâu vào mã nguồn trên GitHub, tôi thấy một số vấn đề kỹ thuật mà whitepaper không đề cập.
Cơ chế sequencer của VinaChain là một node tập trung duy nhất do đội ngũ vận hành. Họ có kế hoạch chuyển sang decentralized sequencing trong Q3, nhưng cơ chế chuyển đổi trong code vẫn chưa hoàn thiện. Cụ thể, contract SequencerManager cho phép thay đổi sequencer chỉ qua một hàm setSequencer với quyền onlyOwner — owner là một multisig 2/3. Điều này có nghĩa là nếu 2 trong 3 key bị thỏa hiệp, kẻ tấn công có thể kiểm soát hoàn toàn sequencer, dẫn đến khả năng kiểm duyệt giao dịch hoặc reorg. Tôi đã kiểm tra lịch sử giao dịch trên testnet: sequencer từng thay đổi 3 lần trong tháng 2, mỗi lần đều kèm theo một khoảng thời gian ngừng hoạt động 30-40 phút. Đây là dấu hiệu của việc vận hành thủ công, không có automation.
Phân tích chi phí gas cũng cho thấy một điểm bất thường: mỗi giao dịch trên VinaChain tốn trung bình 0.0002 ETH, tương đương 0.5 USD ở thời điểm hiện tại. Con số này thấp hơn Ethereum L1 nhưng cao hơn Arbitrum (0.1 USD) và Optimism (0.15 USD). Tại sao? Họ sử dụng cơ chế nén dữ liệu khác biệt: thay vì nén calldata như Optimism, họ nén trạng thái trước khi gửi lên L1. Điều này làm giảm kích thước dữ liệu nhưng tăng chi phí tính toán cho sequencer. Tôi đã chạy benchmark với 100 giao dịch giả lập, thấy rằng chi phí gas trên L1 của VinaChain cao hơn 22% so với Optimism Bedrock trong cùng điều kiện. Đây là một trade-off mà đội ngũ chưa giải thích rõ ràng trong tài liệu.
Một góc nhìn phản trực giác: sự tập trung của VinaChain có thể là một lợi thế tạm thời cho thị trường Việt Nam. Trong bối cảnh các sàn giao dịch tập trung vẫn chiếm ưu thế, người dùng quen với tốc độ và sự tiện lợi. Một Layer 2 tập trung với sequencer nhanh có thể thu hút người dùng mới, miễn là họ không cần quyền tự do kiểm duyệt. Tuy nhiên, điểm mù nằm ở chính sách khóa token: token VIN dùng để thanh toán phí, nhưng đội ngũ nắm giữ 40% tổng cung và không có lịch vesting công khai. Nếu họ bán một phần lớn, giá token sẽ sụp đổ, kéo theo TVL giảm mạnh. Đây là rủi ro mà whitepaper không đề cập.
Dựa trên kinh nghiệm audit của tôi từ OmiseGo năm 2017, tôi nhận thấy VinaChain đang mắc cùng một lỗi: quá tập trung vào marketing và thiếu kiểm tra mã nguồn độc lập. Họ đã thuê một công ty audit nhỏ ở Việt Nam, nhưng báo cáo chỉ tập trung vào các lỗi cơ bản như reentrancy, bỏ qua các vấn đề kiến trúc như centralization vector và cơ chế nâng cấp. Tôi đã gửi một pull request GitHub đề xuất cải tiến, nhưng chưa có phản hồi sau 2 tuần.
Câu hỏi đặt ra: Liệu VinaChain có thể tồn tại khi thị trường gấu quay trở lại và người dùng bắt đầu kiểm tra kỹ thuật? Hay đây sẽ là một bài học khác cho các dự án blockchain Việt Nam về tầm quan trọng của mã nguồn mở?