Người ký liên bang của Blockstream lần này không hề mất một mẩu khóa riêng nào. Quy trình ký của họ chạy trọn vẹn từ đầu đến cuối đúng như thiết kế: các node chức năng cần kiểm thì đã kiểm, rồi theo đúng quy định đã phát hành Bitcoin ra ngoài. Vấn đề nằm ở chỗ, số L-BTC yêu cầu rút tiền kia được tạo ra một cách “từ hư không”, và không ai nhận ra.

Sự việc xảy ra vào ngày 6 tháng 9. Có người lợi dụng một lỗ hổng trong Elements để tạo ra trên Liquid khoảng 4000 đồng L-BTC không có bằng chứng/đối chiếu Bitcoin (không được chứng thực). Lô chứng từ này sau đó được chuyển cho thành viên liên bang SideSwap, và họ đi qua một quy trình peg-out hoàn toàn bình thường. Chỉ sau hơn nửa giờ, gần 4000 đồng $BTC đã rời địa chỉ dự trữ của liên bang, tương đương theo giá thời điểm đó hơn 300 triệu USD. Trước khi xảy ra sự cố, địa chỉ này có 4205 đồng; khoản rút ra đó cộng với vài lần xử lý tiếp theo sau đó xong, hiện chỉ còn 197 đồng. Chuỗi sau đó bị dừng lại, và đến nay vẫn chưa mở lại.

Lỗ hổng nằm ở lớp giao dịch bảo mật (confidential transactions). Liquid che giấu số tiền chuyển trong giao dịch; các node xác nhận rằng “số dư” của một giao dịch là cân bằng nhờ range proof. Việc kiểm một lần range proof như vậy tốn không ít năng lực tính toán, nên Elements đã lưu kết quả đã kiểm vào cache để dùng lại. Khóa của cache lại bị thiếu ngữ cảnh ở lớp tài sản và script; do đó một proof đã từng được kiểm ở nơi khác có thể được mang đi dùng cho một lần “phát hành/được cấp chứng thực” hoàn toàn mới. Bản Elements 23.3.4 do phía chính thức phát hành sau đó đã sửa theo đúng hướng: gia cố khóa cache của range proof, đồng thời bổ sung một công tắc để node khỏi cần cache luôn.

Bản thân cơ chế hạn mức (threshold) không có vấn đề. Mười lăm khóa, đủ mười một khóa để ký thì quy tắc chính là vậy, và người ký đều là thật. Các node chức năng chỉ kiểm xem peg-out này có được một thành viên giữ quyền PAK khởi xướng hay không; còn việc đợt L-BTC này ban đầu có thực sự đi kèm Bitcoin thật đi vào hay không thì nằm ngoài phạm vi kiểm của họ. Các node của SideSwap và các node chức năng phân bố toàn cầu chạy cùng một phiên bản Elements, đụng đúng cùng một lỗ hổng cache; đáp án vì thế xuất phát từ cùng một chỗ, không thể nói họ “đối chiếu độc lập” với nhau. Nếu nâng mức threshold lên nữa thì kết quả cũng sẽ không khác.

Việc định danh nhóm này đến nay bên ngoài vẫn chưa thống nhất. Bên kia trên main chain để lại một câu tự xưng là “white hat” và đề nghị liên hệ qua chain; Blockstream đã trả lời bằng một email bảo mật. Tối 7 tháng 9, 3400 đồng Bitcoin quay về địa chỉ dự trữ, còn 598.5 đồng cho đến nay vẫn chưa động. Khi đó CTO của Ledger, Charles Guillemet, nói rằng “white hat sẽ không rút cạn một cây cầu rồi mới chạy tới xin thông tin liên hệ của bạn”. Sau đó ông ấy nói mềm hơn một chút, thừa nhận cách làm này đúng là không giống thông lệ của white hat; nhưng các tổ chức tội phạm thông thường cũng sẽ không chủ động liên hệ với nạn nhân. Giữ lại khoản tiền đó, ông ấy còn sẵn sàng gọi đó là “tiền chuộc/ransom” hơn. Samson Mow của JAN3 thì nhắc rằng yêu cầu chuyển sang Signal là từ một địa chỉ khác.

Tôi không chấp nhận từ “white hat”. Người ôm tiền đàm phán điều kiện thì không thể gọi là white hat. Nhưng chuyện tiền có quay lại được hay không là một việc khác; hiện Blockstream cũng không có đòn bẩy tốt hơn.

Bước gây sự cố lần này nằm ở khâu kiểm账/đối chiếu giao dịch (verification). Lớp ủy thác (custody) trên thực tế không hỏng; điểm này càng đáng ghi nhớ. Trong lộ trình tháng Năm của Blockstream có một cây cầu kiểu BitVM 1-of-n: mục đích ban đầu là giảm rủi ro “một nhóm người thông đồng” bằng cách chỉ cần có một người trung thực là đủ. Thiết kế đó quản lý chuyện thông đồng và bỏ trốn, nhưng không quản được mọi người chạy cùng một phiên bản code rồi nhìn sai ở cùng một chỗ. Dù trong liên bang ngồi một trăm thành viên trung thực, họ vẫn đọc cùng một “cuốn sổ cái” đã bị nhiễm.

Vì vậy, với những người cầm nhiều loại BTC đã được đóng gói, hay BTC xuyên chuỗi, chỉ tiêu “số lượng người ký” không còn ý nghĩa nhiều. Tôi sẽ hỏi ba điều: ai có quyền đúc (mint) ra chứng từ mới, sau khi đúc ra thì đem thứ gì đi để đối chiếu, và các bên thực hiện đối chiếu có thực sự tính toán độc lập với nhau hay không. Cái thứ ba lần này chính là “điểm tử huyệt”. Bản thân main chain (#Bitcoin ) hoàn toàn không sao; điều có vấn đề vẫn là lớp được gắn bên cạnh nó.

Mô hình liên bang lần này cũng có mặt tốt của nó, phải thừa nhận. Nếu chuỗi bị gọi dừng, thì khoản nợ xấu sẽ dừng ở đó; còn nếu gặp một chuỗi khác mà không ai dừng được, thì khi gặp lỗ hổng gây lạm phát (inflation), các chứng từ không có đối chiếu sẽ lan ra toàn bộ các lớp/nhánh dưới (downstream) và không thể thu hồi hết.

Bản vá đã được phát hành từ rạng sáng 9 tháng 9, nhưng chuỗi vẫn bị dừng ở khung hình từ rạng sáng 7 tháng 9. Bên code đã sẵn sàng; thứ còn bị kẹt là việc làm sao xóa cho “peg-out” không hợp lệ đó khỏi sổ sách, và lỗ hổng do ai bù. Hiện địa chỉ dự trữ đang nằm đó với 3601 đồng Bitcoin; bên ngoài còn hơn 4100 đồng L-BTC đang chờ được đổi trả. Phía chính thức nói rằng khi khởi động lại sẽ từ chối khoản rút phát hành không hợp lệ đó và khôi phục lại đủ lượng chứng thực/bằng chứng đối chiếu, nhưng không nói rõ cái “lỗ hổng” này ai sẽ bù. Nếu cuối cùng là Blockstream hoặc các thành viên liên bang tự bỏ tiền bù, thì đây là một sự cố do code—những lời chỉ trích nhắm vào việc ủy thác sẽ không “chạm” được vào điểm thực. Còn nếu lỗ hổng trải ra lên đầu những người nắm giữ L-BTC, thì các lời chỉ trích sẽ có bằng chứng.

Có thể chú ý vào số dư của địa chỉ dự trữ đó. Khi chuỗi khởi động lại và tạo ra khối (re-start produce blocks), việc số dư có được bù đủ hay không sẽ trực tiếp hơn bất kỳ một bản thông cáo nào.