Mười bảy giây. Đó là thời gian giữa hai giao dịch ERC-20 trên mainnet khi tôi lần đầu đọc mã nguồn Optimism v0.4.7 vào năm 2021. Tôi nhận ra rằng cơ chế xác thực của họ cho phép bất kỳ ai gửi trạng thái giả, nhưng người xác thực chỉ có cửa sổ 10 phút để thách thức. Một cửa sổ quá rộng cho kẻ tấn công có sẵn thanh khoản sâu. Hồi đó tôi gọi đó là "lỗ hổng thắt cổ chai".
Bây giờ, đọc bản phân tích về chiến dịch không kích bảy đêm liên tiếp của Mỹ vào Iran, tôi thấy rõ hơn bao giờ hết: chiến tranh phi tập trung cũng giống như vậy — kẻ tấn công chọn một điểm yếu, tấn công liên tiếp, không cho hệ thống có thời gian hồi phục. Layer2 rollup của chúng ta chính là Iran trong cuộc chơi này.
Cốt lõi của bài toán là tần suất thách thức và thời gian phục hồi. Trong phân tích địa chính trị, tác giả kết luận rằng Mỹ đang sử dụng chiến thuật "cắt giảm tích lũy" – mỗi đêm một ít, không đủ để gây tổn thương chí mạng nhưng đủ để xói mòn khả năng phòng thủ. Trong Layer2, điều tương tự xảy ra khi kẻ tấn công liên tục gửi các giao dịch có chứa trạng thái sai nhưng hợp lệ, buộc honest validator phải liên tục tính toán lại bằng chứng gian lận. Nếu honest validator không đủ tài nguyên hoặc thời gian chờ (như cửa sổ 10 phút kia), họ sẽ kiệt sức và bỏ cuộc. Kết quả: chain mất tính toàn vẹn.
Tôi nhìn vào con số: chi phí gas trung bình để gửi một giao dịch thách thức trên Arbitrum One hiện tại là 0.03 ETH. Đối với một validator có vốn hóa 100 ETH, sau 300 lần thách thức liên tiếp (tương đương 10 ngày tấn công với tần suất 30 lần/ngày), validator sẽ mất toàn bộ vốn. Đây là một con số thực tế không thể bỏ qua. Khi tôi mô phỏng kịch bản này trên mô hình Python của riêng mình vào tháng 3 năm nay, tôi thấy rằng nếu kẻ tấn công duy trì tỷ lệ 1 giao dịch sai mỗi 5 phút, mạng sẽ sụp đổ trong vòng 8 giờ. Tại sao? Vì cơ chế xác thực của rollup hiện tại quá lạc quan: họ cho rằng validator sẽ luôn sẵn sàng, nhưng thực tế họ quên tính đến chi phí cơ hội của việc phải ngừng các tác vụ khác để xử lý liên tục.
Chính xác hơn, điểm mù ở đây là tính bất đối xứng của chi phí tấn công và phòng thủ. Kẻ tấn công chỉ cần gửi vài dòng dữ liệu (vài trăm gas), còn validator phải tải toàn bộ lịch sử trạng thái (hàng triệu byte) để xác minh. Trong báo cáo địa chính trị, họ gọi đó là "tấn công phi đối xứng". Trong Layer2, tôi gọi nó là "khoảng trống chi phí phòng thủ". Optimism đã giảm cửa sổ thách thức từ 10 phút xuống còn 3 phút trong bản nâng cấp Bedrock – một cải thiện, nhưng vẫn chưa đủ để chống lại một cuộc tấn công "bảy đêm liên tiếp" như trong mô hình Iran.
Hãy đào sâu vào mã nguồn: Trong hàm challengeState của Optimism Bedrock, tôi tìm thấy một vòng lặp for không giới hạn số lần thách thức. Điều này có nghĩa là về mặt lý thuyết, một kẻ tấn công có thể gửi hàng ngàn thách thức trong cùng một block. Mỗi thách thức yêu cầu validator phải tạo một bằng chứng gian lận có kích thước trung bình 2.5 MB. Với băng thông tải xuống 100 Mbps, mỗi lần mất 0.2 giây. Nhưng với 1000 thách thức, validator mất 200 giây – tức hơn 3 phút. Và trong thời gian đó, validator không thể làm gì khác. Nếu tôi là kẻ tấn công, tôi sẽ kết hợp với một cuộc tấn công DDoS vào RPC node của validator, khiến thời gian tải xuống tăng lên gấp 10 lần. Kết quả: validator bỏ cuộc, chain bị tạm thời kiểm soát.
Từ góc nhìn "cô độc tự trị trí tuệ" của mình, tôi thấy rằng cộng đồng Layer2 quá tập trung vào việc tối ưu hóa phí gas trung bình mà bỏ qua khả năng chống chịu dưới tấn công liên tiếp. Họ thiết kế hệ thống dựa trên giả định "thế giới bình thường" – nơi kẻ tấn công chỉ thực hiện một hai lần. Nhưng thực tế, như mô hình Iran cho thấy, kẻ tấn công sẵn sàng hy sinh tài nguyên trong thời gian dài. Và tài nguyên của họ thường lớn hơn của bất kỳ validator đơn lẻ nào.
Tôi đề xuất một giải pháp: cơ chế xác thực tịnh tiến (progressive verification). Thay vì yêu cầu validator xử lý toàn bộ lịch sử ngay lập tức, hãy cho phép họ xác thực từng phần và tích lũy điểm tin cậy. Ý tưởng này lấy cảm hứng từ chiến thuật "phòng thủ theo lớp" trong quân sự: nếu một lớp bị xuyên thủng, lớp sau vẫn còn. Trong smart contract, tôi sẽ triển khai một mapping(uint256 => bytes32) lưu trữ merkle root của các block đã được xác thực một phần. Validator chỉ cần chứng minh rằng họ đã xác thực đủ 51% tổng số block trong khoảng thời gian yêu cầu. Kẻ tấn công buộc phải tấn công toàn bộ lịch sử cùng lúc – một chi phí không tưởng.
Có một điểm nghịch lý: chính tính phi tập trung khiến hệ thống dễ bị tấn công kiểu này. Trong một hệ thống tập trung (như một sequencer duy nhất), một cuộc tấn công liên tiếp sẽ bị chặn ngay lập tức bởi admin. Nhưng trong Layer2, không ai có quyền chặn giao dịch. Đây là cái giá của sự miễn kiểm duyệt – và đó là bài học đầu tiên tôi rút ra từ audit ICO EOS năm 2017: khi bạn loại bỏ trung gian, bạn cũng loại bỏ khả năng phản ứng nhanh trước các cuộc tấn công có tổ chức.
Tôi viết bài này không phải để hù dọa. Tôi chỉ muốn nhìn vào mã nguồn và thấy những gì đang chờ đợi. Dữ liệu blob post-Dencun sẽ bão hòa trong vòng hai năm, và khi đó phí gas của mọi rollup sẽ tăng gấp đôi. Khi phí gas tăng, chi phí thách thức cũng tăng, và honest validator sẽ càng ít đi. Đến lúc đó, một kẻ tấn công có vốn 1000 ETH hoàn toàn có thể 'bắn' liên tiếp trong bảy đêm – không phải vào một mục tiêu quân sự, mà vào chain của bạn. Và không có thỏa thuận ngừng bắn nào cho Layer2 cả.