Hôm trước ngồi nói chuyện với mấy anh bạn ôn lại chuyện cũ ngày còn làm ở công ty Infinity Blockchain Labs, có cậu bạn bảo mình: "Anh viết blog nhiều như vậy mà sao anh lại không viết một bài viết về mấy cái paper của anh nhỉ?". Mình sực nhớ ra. Ờ nhỉ, mình quả thật thiếu sót! Bài báo của mình, chính xác hơn là team mình là một trong những bài báo đầu tiên viết về cách sinh số ngẫu nhiên trên blockchain, gồm có một series vài bài, nhưng về cốt lõi thì bài báo này là tâm điểm:
Scalable Distributed Random Number Generation Based on Homomorphic Encryption
Các bạn có hứng thú có thể vào link trên để tìm hiểu. Dưới đây là bản tóm tắt bài báo:
Bài viết này tóm tắt giải pháp dRNG (Distributed Random Number Generation) dựa trên sự kết hợp giữa Mã hóa đồng cấu (HE) và Hàm ngẫu nhiên có thể kiểm chứng (VRF), và một số các kỹ thuật khác liên quan đến đường cong Elliptic. Bạn có thể tham khảo thêm tại các bài viết của mình:
Đường cong elliptic: EC trên trường số thực, EC trên trường hữu hạn, Chữ ký số trên EC
Chứng minh không để lộ tri thức - Zero Knowlege Proof (ZKP): ZKP đơn giản
Mã hóa đồng cấu: Đồng cấu nhóm cộng vỡi hệ mã Paillier
Hàm ngẫu nhiên có thể kiểm chứng (VRF): VRF đơn giản
Blockchain về bản chất là một máy trạng thái xác định (deterministic), nơi mọi dữ liệu đều phải công khai và minh bạch để mọi node có thể thực hiện lại phép tính và cho ra cùng một kết quả. Do đó:
Không có hàm random() thực sự: Nếu một node dùng hàm ngẫu nhiên của hệ điều hành, các node khác sẽ không thể đồng thuận về kết quả đó.
Vấn đề tin tưởng: Làm sao để tin một số ngẫu nhiên được tạo ra mà không bị bên nào (kể cả thợ đào hay người yêu cầu) thao túng hoặc biết trước kết quả để trục lợi?
Mục tiêu của giao thức: Tạo ra một số ngẫu nhiên từ sự đóng góp của nhiều bên, đảm bảo: Unpredictability (Không thể dự đoán), Tamper-resistance (Kháng thao túng), Scalability (Khả năng mở rộng) và Verifiability (Có thể kiểm chứng công khai).

Hệ thống bao gồm 3 vai trò chính phối hợp trên nền tảng Public Distributed Ledger (PDL):
Requester (Người yêu cầu): Bên khởi tạo phiên tạo số ngẫu nhiên. Requester giữ khóa bí mật để giải mã kết quả cuối cùng.
Participants/Nodes (Người tham gia): Các node trong mạng lưới phân tán. Họ sử dụng khóa cá nhân để tự chạy VRF nhằm xác định quyền đóng góp và tạo ra các mảnh ghép Beacon bí mật.
PDL (Sổ cái phân tán/Smart Contract): Đóng vai trò là "điểm hẹn" công khai. PDL lưu trữ các bằng chứng, thực hiện phép toán cộng đồng cấu và đảm bảo quy trình diễn ra đúng trình tự thời gian. Ở đây, chúng ta có thể hình dung PDL là một hệ Blockchain bất kỳ có smart contract.
Quy trình hoạt động theo mô hình phễu lọc để tối ưu hiệu năng:
Giai đoạn Đăng ký: Requester gửi yêu cầu kèm một nonce công khai.
Giai đoạn Sàng lọc (VRF): Từ hàng ngàn node ban đầu, hệ thống dùng VRF để chọn ra một nhóm nhỏ node đủ điều kiện (Eligible Nodes).
Giai đoạn Đóng góp (HE): Những node trúng tuyển mã hóa mảnh ghép ngẫu nhiên của mình và gửi lên PDL.
Giai đoạn Tổng hợp & Giải mã: PDL cộng các bản mã lại mà không cần mở chúng ra. Cuối cùng, kết quả được giải mã để công bố Beacon.
Giao thức vận hành trên đường cong Elliptic xác định trên trường hữu hạn với phần tử sinh bậc . Hệ mã hóa chính được sử dụng là El-Gamal ECC nhờ tính chất đồng cấu cộng.
Giai đoạn 1: Khởi tạo (Initialization)
Requester khởi tạo một session tạo số ngẫu nhiên bằng cách gửi một yêu cầu lên PDL.
Requester tạo cặp khóa: Khóa bí mật và khóa công khai .
Gửi kèm một giá trị nonce (số dùng một lần) để đảm bảo tính duy nhất cho phiên.
Giai đoạn 2: Tính toán Ticket (Ticket Generation)
Hệ thống xác định một giá trị đầu vào chung cho hàm VRF của tất cả các node:
Mỗi node tính toán Ticket , trong đó là hàm băm mật mã, có thể là . Giá trị này đảm bảo rằng không ai có thể dự đoán được kết quả VRF trước khi phiên bắt đầu.
Giai đoạn 3: Kiểm tra quyền hợp lệ (Check Eligibility)
Mỗi node trong mạng lưới tự kiểm tra quyền tham gia đóng góp:
Sử dụng khóa bí mật để tính: .
Node được coi là hợp lệ (Eligible) nếu (với là ngưỡng xác định trước).
Nếu hợp lệ, node chuẩn bị bằng chứng PoE (Proof-of-Eligibility) bao gồm .
Giai đoạn 4: Xác minh PoE (Verify PoE)
Trước khi chấp nhận đóng góp, PDL (Sổ cái) thực hiện xác minh công khai:
PDL sử dụng khóa công khai của node để chạy hàm .
Nếu hợp lệ, node được ghi danh vào danh sách các bên đóng góp chính thức cho session này.
Giai đoạn 5: Đóng góp bản mã (Contribution)

Mỗi node hợp lệ chọn một số ngẫu nhiên bí mật (đóng góp của họ) và mã hóa nó bằng khóa công khai của Requester:
Chọn một số ngẫu nhiên .
Tính cặp bản mã El-Gamal:
Node gửi kèm theo chữ ký số xác thực (PoC - Proof-of-Contribution) lên PDL.
Giai đoạn 6: Xác minh PoC (Verify PoC)
PDL kiểm tra tính toàn vẹn của các bản mã nhận được:
Xác minh chữ ký số của từng node để đảm bảo dữ liệu không bị thay đổi trên đường truyền.
Kiểm tra xem các điểm có thực sự nằm trên đường cong hay không.
Giai đoạn 7: Tổng hợp đồng cấu (Tallying)
Sau khi kết thúc thời gian đóng góp, PDL tự động tổng hợp tất cả bản mã hợp lệ thành một bản mã tổng duy nhất mà không cần giải mã bất kỳ giá trị trung gian nào:
Phép toán này chỉ tốn phép cộng điểm trên đường cong Elliptic.
Giai đoạn 8: Giải mã và Công bố (Reveal)
Requester thu thập bản mã tổng từ PDL và thực hiện bước cuối cùng để lấy số ngẫu nhiên:
Sử dụng khóa bí mật để tính toán: .
Chứng minh toán học:
Vì , nên .
Do đó: .
Requester công bố kèm theo bằng chứng giải mã đúng (thường là một Zero-Knowledge Proof). chính là Beacon cuối cùng được mọi người công nhận.
Sau khi đã tính toán được điểm
Chúng ta sẽ tính random seed bằng cách sử dụng hàm Hash:
Từ random seed này chúng ta bắt đầu có thể khởi tạo chuỗi giá trị random theo một hàm random tùy ý.
Dưới đây là một demo đơn giản để minh họa, mình đã cố gắng thực hiện mọi thao tác sao cho sát với thuật toán nhất, và cố tình đơn giản hóa các chi tiết để cho các bạn dễ theo dõi như:
Chọn đường cong đơn giản
Thay hàm hash bằng một hàm đơn giản hơn bằng phép modulo
Xây dựng VRF đơn giản dạng Schnorr dựa vào hàm hash đơn giản ở trên (xem phụ lục phía dưới)
Thiết lập
Bước 1: Giá trị ngẫu nhiên được tính bằng
Đây là giá trị mà các bước sau sẽ bảo vệ và chứng minh tính hợp lệ.
Bước 2: Cam kết (Commitment)
Để bắt đầu bằng chứng, Prover chọn một số ngẫu nhiên tạm thời (blinding factor) và tạo ra hai "cam kết":
(trên đường cong Elliptic).
(trong trường số nguyên).
Việc chọn ngẫu nhiên đảm bảo rằng không ai có thể suy ngược ra từ bằng chứng sau này.
Bước 3: Thử thách (Challenge)
Hàm simpleHash đóng vai trò là một "Fiat-Shamir Heuristic". Thay vì cần một người xác minh gửi thử thách, chúng ta tự tạo ra thử thách bằng cách băm tất cả các thông tin công khai lại với nhau:
Bước 4: Phản hồi (Response)
Cuối cùng, Prover tính toán giá trị :
Bằng chứng cuối cùng gửi đi là bộ ba .
Quy trình xác thực vrfVerify:
Người xác minh (Verifier) nhận được bằng chứng và kết quả . Họ thực hiện kiểm tra hai điều kiện mà không bao giờ cần biết :
Kiểm tra tính đúng đắn của khóa (Public Key consistency)
Verifier tính lại điểm từ và nhận được:
Nếu đúng,
Verifier kiểm tra xem có thực sự bắt nguồn từ hay không:
Nếu ta thay và vào vế phải:
Nếu cả hai giá trị tính toán lại khớp với mã băm thử thách , ta có thể khẳng định 100% rằng là kết quả hợp lệ duy nhất.
Phần tiếp theo của bài báo tập trung phân tích về khía cạnh bảo mật (security) và độ phức tạp tính toán. Mọi người có thể tìm hiểu chi tiết hơn trực tiếp từ bài báo gốc.
Bài báo này là thành quả của cả đội ngũ nghiên cứu – những thành viên đầy nhiệt huyết và đam mê trong nhóm chúng mình, đồng thời cũng là niềm tự hào rất lớn của cá nhân mình. Mình viết bài viết này như một lời tri ân chân thành gửi đến tất cả mọi người đã đồng hành, và cũng xem đây là một kỷ niệm đẹp dành cho team GINAR.
No comments yet. Be the first to comment!