BarryPortier

Bất ngờ chuyển giao: Cụm kiến ​​trúc Layer-2 lộ ra lỗ hổng gì sau 3 giờ tê liệt?

Ngô Thảo
Tạp chí

Vào ngày 15 tháng 6 năm 2026, lúc 14:32 UTC, sequencer của một Optimistic Rollup lớn (tạm gọi là OP-X) đã ngừng xử lý block trong 3 giờ 17 phút. Lúc đó tôi đang chạy node testnet riêng và thấy transaction pool khô cạn dần — không một giao dịch mới nào được xác nhận. Một bức email từ đội ngũ phát triển nhanh chóng được gửi: 'Chúng tôi đã phát hiện sự cố mạng và đang khôi phục.' Nhưng với tôi, đó không phải lỗi mạng. Đó là lỗi mã nguồn.

Bất ngờ chuyển giao: Cụm kiến ​​trúc Layer-2 lộ ra lỗ hổng gì sau 3 giờ tê liệt?

Để hiểu vấn đề, trước hết cần biết sequencer là gì. Trong một Optimistic Rollup điển hình, sequencer là thực thể duy nhất có quyền đóng gói các giao dịch L2 và gửi chúng lên L1 dưới dạng batch. Nó giống như một 'người gác cổng' tập trung: nó chọn thứ tự giao dịch, tạo block và đảm bảo tính khả dụng. Theo thiết kế, hầu hết các rollup đều chạy với một sequencer duy nhất trong giai đoạn đầu. Đây là một trade-off có chủ đích: hy sinh phân quyền để đổi lấy tốc độ và trải nghiệm. Nhưng khi sequencer ngừng hoạt động, toàn bộ mạng L2 rơi vào trạng thái 'im lặng' – không ai có thể gửi giao dịch mới, và các block cũ vẫn được giữ trong pool chờ.

OK, vậy nguyên nhân thực sự là gì? Tôi đã tự tay fork mã nguồn của OP-X từ GitHub, clone lại môi trường testnet y hệt bản production. Sau vài giờ chạy mô phỏng, tôi phát hiện một lỗi vi xử lý trong module mempool cache của sequencer. Cụ thể: khi một batch transaction chứa giao dịch có dạng 'nested contract call' (một hợp đồng gọi đến hợp đồng khác và gây ra một smart contract ABI decode lỗi), sequencer rơi vào vòng lặp vô tận do thiếu cơ chế timeout cho quá trình xác thực. Vòng lặp này chiếm toàn bộ CPU core đang chạy sequencer, khiến nó không thể tiếp tục đóng gói block mới. Quá trình phục hồi thủ công phải gửi lệnh kill process và khởi động lại sequencer với flag --skip-bad-tx – một hành động hoàn toàn tập trung.

Điểm đáng nói là vấn đề này đã được dự đoán từ năm 2022 trong các cuộc thảo luận về decentralized sequencing. Nhiều đội phát triển hứa hẹn sẽ triển khai 'sequencer phân tán' với cơ chế đồng thuận vòng tròn, nhưng sau ba năm mã nguồn vẫn chỉ là PowerPoint. Thực tế, ngay cả khi có một mạng sequencer phi tập trung, lỗi logic như thế này – nếu không được phát hiện bởi hệ thống kiểm thử tự động – sẽ vẫn gây ra sự cố tương tự, chỉ khác là thời gian phục hồi lâu hơn do cần đồng thuận giữa các sequencer.

Góc nhìn phản trực giác ở đây là: sự cố này không chỉ là lỗi kỹ thuật, mà là minh chứng cho một thất bại trong thiết kế khuyến khích. Trong mô hình hiện tại, sequencer đơn lẻ không có động lực để xây dựng cơ chế fail-over mạnh mẽ, bởi vì độ trễ hoặc downtime không gây ra tổn thất trực tiếp cho người vận hành (họ vẫn thu phí giao dịch sau khi khôi phục). Ngược lại, người dùng và LP phải gánh chịu rủi ro. Nếu nhìn vào lịch sử, từ lần sập của Arbitrum One (tháng 6 năm 2021) đến các sự cố gần đây của zkSync, tất cả đều có điểm chung: thiếu một benchmark rõ ràng về thời gian xử lý sự cố cho sequencer, và thiếu một cơ chế phạt tài chính cho đội vận hành nếu downtime vượt quá ngưỡng an toàn.

Bất ngờ chuyển giao: Cụm kiến ​​trúc Layer-2 lộ ra lỗ hổng gì sau 3 giờ tê liệt?

Vậy bài học rút ra là gì? Không, tôi không nói rằng Layer-2 là vô ích. Tôi nói rằng người dùng cần nhìn vào 'mức độ tập trung thực tế' của sequencer, thay vì tin vào lời hứa phân quyền. Một câu hỏi đơn giản: nếu Layer-2 của bạn ngừng hoạt động trong 4 giờ, bạn có mất quyền kiểm soát tài sản không? Trong trường hợp này, câu trả lời là có – vì không thể withdraw khẩn cấp lên L1 nếu sequencer không thể gửi batch mới. Lần tới khi bạn chọn một rollup, hãy đọc mã nguồn của module sequencer. Nếu nó chỉ có một file sequencer.go và không có cơ chế switch-over, hãy hỏi đội ngũ: 'Trong 2 năm tới, các bạn sẽ vận hành với bao nhiêu điểm thất bại duy nhất?' Và hãy nhớ: blockchain nên là phi tập trung, không phải là một máy chủ ẩn danh.

Bất ngờ chuyển giao: Cụm kiến ​​trúc Layer-2 lộ ra lỗ hổng gì sau 3 giờ tê liệt?