
Báo cáo nghiên cứu mới nhất từ Huobi Ventures: Phân tích chuyên sâu về meme coin mới nhất $NOVA
Tuyển chọn TechFlowTuyển chọn TechFlow

Báo cáo nghiên cứu mới nhất từ Huobi Ventures: Phân tích chuyên sâu về meme coin mới nhất $NOVA
Bài viết này sẽ phân tích chuyên sâu về công nghệ nền tảng đằng sau Nova, gạt bỏ những câu chuyện hấp dẫn, trở về với chính mã nguồn.
Tác giả: Hạ Cẩm Bân, Nhà nghiên cứu cấp cao tại Huobi Ventures
Meme coin nổi bật nhất hiện nay - Nova, xuất hiện như một "vị cứu tinh" trong thế giới NFT.
Theo trang web chính thức của dự án, mã hợp đồng thông minh cho meme coin NOVA đã được viết bởi ChatGPT và chính thức phát hành vào ngày 10 tháng 7. Dự án NOVA lên kế hoạch phân phối airdrop đến tất cả những người nắm giữ NFT blue-chip. Hợp đồng được tích hợp thuế bán ra 9% (thuế mua là 0%). Trong đó, 3% sẽ tự động dùng để mua ETH và phân bổ cho các holder của 30 dự án NFT blue-chip hàng đầu. Dữ liệu từ trang web cho thấy ở giai đoạn đầu, NOVA sẽ phân bổ tổng cộng 10.000 ETH nhằm hỗ trợ các holder lớn của NFT blue-chip.
Bài viết này sẽ phân tích sâu về công nghệ nền tảng đằng sau Nova, gạt bỏ những câu chuyện hấp dẫn để trở lại với bản chất của mã nguồn.
Báo cáo nghiên cứu này do Huobi Ventures phát hành. Huobi Ventures là bộ phận đầu tư toàn cầu của sàn giao dịch Huobi, tích hợp hoạt động đầu tư, ươm tạo và nghiên cứu nhằm xác định các dự án xuất sắc và đầy tiềm năng trên toàn cầu.
Giới thiệu
Chứng minh kiến thức không tiết lộ (zero-knowledge proof) là một kỹ thuật quan trọng trong lĩnh vực mật mã học, cho phép một người chứng minh cho người khác rằng một khẳng định là đúng sự thật mà không cần tiết lộ bất kỳ thông tin nào khác. Kỹ thuật này có nhiều ứng dụng rộng rãi trong nhiều lĩnh vực như xác thực danh tính, blockchain và tính toán an toàn. Nova là một hệ thống chứng minh kiến thức không tiết lộ mới do Microsoft phát triển, sử dụng công nghệ Hệ thống Ràng buộc Hạng Một Thỏa hiệp (Relaxed Rank-1 Constraint Systems – Relaxed R1CS) nhằm nâng cao hiệu quả và tính linh hoạt của việc tạo chứng minh. Chương cuối cùng sẽ phân tích chi tiết mã nguồn.
Những ưu điểm của Nova
Ưu điểm chính của Nova nằm ở việc áp dụng công nghệ R1CS Thỏa hiệp. R1CS là một hệ thống dùng để xây dựng chứng minh kiến thức không tiết lộ, có thể dùng để chứng minh rằng một người biết nghiệm của một tập hợp các đẳng thức đa thức mà không cần tiết lộ bất kỳ thông tin nào về nghiệm đó. Tuy nhiên, các hệ thống R1CS truyền thống yêu cầu lượng lớn tính ngẫu nhiên trong quá trình chứng minh, điều này khiến việc tạo và xác minh chứng minh trở nên rất phức tạp và tốn thời gian. Nova giải quyết vấn đề này bằng cách sử dụng R1CS Thỏa hiệp, cho phép giảm thiểu lượng tính ngẫu nhiên cần thiết trong chứng minh, từ đó tăng đáng kể hiệu suất.
Nova còn có một số ưu điểm khác. Ví dụ, nó hỗ trợ tính toán theo từng bước (incremental computation), nghĩa là có thể tính toán từng phần một hàm phức tạp thay vì phải tính toàn bộ hàm trong một lần. Điều này rất hữu ích khi xử lý dữ liệu quy mô lớn hoặc thực hiện các phép tính phức tạp. Ngoài ra, Nova cũng hỗ trợ tính toán đa thức, cho phép nó xử lý các tác vụ chứng minh phức tạp hơn.
Nhược điểm của Nova
Mặc dù Nova sở hữu nhiều ưu điểm, nhưng nó cũng tồn tại một số nhược điểm. Đầu tiên, do sử dụng R1CS Thỏa hiệp, chứng minh của Nova có thể không mạnh mẽ bằng các hệ thống R1CS truyền thống. Việc giảm tính ngẫu nhiên trong chứng minh có thể làm giảm mức độ an toàn. Tuy nhiên, nhóm phát triển Nova đã thực hiện một số biện pháp khắc phục, ví dụ như sử dụng các thuật toán mật mã mạnh hơn và chiến lược chứng minh phức tạp hơn.
Thứ hai, việc triển khai Nova tương đối phức tạp, điều này có thể làm tăng độ khó trong việc sử dụng và bảo trì. Nova sử dụng nhiều kỹ thuật mật mã tiên tiến như tính toán đa thức, thao tác nhóm và máy tiên tri ngẫu nhiên (random oracle), đòi hỏi người dùng phải hiểu sâu về các kỹ thuật này mới có thể sử dụng và chỉnh sửa Nova một cách hiệu quả.
Vị trí quan trọng của Nova trong lĩnh vực chứng minh kiến thức không tiết lộ
Nova chiếm vị trí quan trọng trong lĩnh vực chứng minh kiến thức không tiết lộ. Sự xuất hiện của nó mở ra một con đường mới cho sự phát triển của loại hình chứng minh này. Công nghệ R1CS Thỏa hiệp mà Nova áp dụng giúp quá trình tạo và xác minh chứng minh trở nên hiệu quả hơn, điều này cực kỳ quan trọng đối với các ứng dụng chứng minh kiến thức không tiết lộ quy mô lớn. Hơn nữa, khả năng hỗ trợ tính toán theo từng bước và tính toán đa thức mở rộng phạm vi ứng dụng của chứng minh kiến thức không tiết lộ.
Phân tích mã nguồn của Nova
https://github.com/microsoft/Nova
Trong thư mục src/ , có một số thư mục con quan trọng:
bellperson/: Thư mục này có thể chứa mã liên quan đến thuật toán Bellman-Ford.
gadgets/: Thư mục này có thể chứa các công cụ dùng để xây dựng bằng chứng zk-SNARK.
provider/: Thư mục này có thể chứa mã của các nhà cung cấp, ví dụ như keccak.rs có thể là mã triển khai hàm băm Keccak.
spartan/: Thư mục này có thể chứa mã liên quan đến giao thức Spartan.
traits/: Thư mục này có thể chứa một số trait của Rust để định nghĩa các hành vi chung.
Nội dung file src/bellperson/mod.rs:
Module này chủ yếu dùng để tạo R1CS (Rank-1 Constraint Systems – Hệ thống Ràng buộc Hạng Một), một dạng hệ thống ràng buộc dùng trong zk-SNARKs.
Nó bao gồm ba module con:
r1cs: Module này có thể chứa mã liên quan đến R1CS.
shape_cs: Module này có thể chứa mã liên quan đến hệ thống ràng buộc hình dạng.
solver: Module này có thể chứa mã liên quan đến việc giải hệ thống ràng buộc.
Trong phần kiểm thử, nó định nghĩa một hàm synthesize_alloc_bit, nhận vào một hệ thống ràng buộc rồi thêm các ràng buộc để kiểm tra xem hai bit đầu vào có thực sự là bit hay không. Sau đó, nó định nghĩa một hàm test_alloc_bit_with, trước tiên tạo một hình dạng
Nội dung file src/bellperson/r1cs.rs:
File này chủ yếu định nghĩa hai trait: `NovaWitness` và `NovaShape`, chúng cung cấp phương pháp để lấy `R1CSInstance` và `R1CSWitness`, cũng như lấy `R1CSShape` và `CommitmentKey` từ đối tượng triển khai.
- Trait `NovaWitness` có một phương pháp `r1cs_instance_and_witness`, nhận vào một `R1CSShape` và một `CommitmentKey`, sau đó trả về một `R1CSInstance` và một `R1CSWitness`. Trait này được triển khai cho cấu trúc `SatisfyingAssignment`, nghĩa là bất kỳ `SatisfyingAssignment` nào cũng có thể sử dụng phương pháp này để lấy `R1CSInstance` và `R1CSWitness`.
- Trait `NovaShape` có một phương pháp `r1cs_shape`, trả về một `R1CSShape` và một `CommitmentKey`. Trait này được triển khai cho cấu trúc `ShapeCS`, nghĩa là bất kỳ `ShapeCS` nào cũng có thể sử dụng phương pháp này để lấy `R1CSShape` và `CommitmentKey`.
File này cũng định nghĩa một hàm `add_constraint`, nhận vào một hệ thống ràng buộc và ba tổ hợp tuyến tính, sau đó thêm một ràng buộc mới vào hệ thống. Hàm này được các đối tượng triển khai `NovaShape` sử dụng khi tạo `R1CSShape`.
Nhìn chung, mục đích chính của file này là cung cấp một cách thức để tạo ra các instance, witness, shape và khóa cam kết của R1CS từ một hệ thống thỏa mãn điều kiện nhất định (ví dụ như `SatisfyingAssignment` hoặc `ShapeCS`).
src/bellperson/shape_cs.rs
File này định nghĩa một cấu trúc tên là `ShapeCS`, triển khai trait `ConstraintSystem`. `ShapeCS` là hệ thống ràng buộc dùng để tạo hình dạng R1CS.
Cấu trúc `ShapeCS` bao gồm các trường sau:
- `named_objects`: Đây là một bản đồ, dùng để lưu trữ các đối tượng liên kết với đường dẫn.
- `current_namespace`: Đây là một vector chuỗi, dùng để lưu trữ namespace hiện tại.
- `constraints`: Đây là một vector, dùng để lưu trữ tất cả các ràng buộc được thêm vào `ShapeCS`.
- `inputs`: Đây là một vector chuỗi, dùng để lưu trữ tất cả các đầu vào.
- `aux`: Đây là một vector chuỗi, dùng để lưu trữ tất cả các đầu vào phụ trợ.
Cấu trúc `ShapeCS` triển khai trait `ConstraintSystem`, nghĩa là nó cung cấp các phương pháp sau:
- `alloc`: Phương pháp này dùng để phân bổ một biến mới.
- `alloc_input`: Phương pháp này dùng để phân bổ một biến đầu vào mới.
- `enforce`: Phương pháp này dùng để thêm một ràng buộc mới.
- `push_namespace`: Phương pháp này dùng để đưa vào một namespace mới.
- `pop_namespace`: Phương pháp này dùng để loại bỏ namespace hiện tại.
- `get_root`: Phương pháp này dùng để lấy hệ thống ràng buộc gốc.
File này cũng định nghĩa một số hàm phụ trợ như `proc_lc` và `compute_path`, dùng để xử lý tổ hợp tuyến tính và tính toán đường dẫn.
Nhìn chung, mục đích chính của file này là cung cấp một cách thức để tạo hình dạng R1CS từ một hệ thống thỏa mãn điều kiện nhất định (ví dụ như `ShapeCS`).
src/bellperson/solver.rs
File này định nghĩa một cấu trúc tên là `SatisfyingAssignment`, triển khai trait `ConstraintSystem`. `SatisfyingAssignment` là hệ thống ràng buộc dùng để tạo instance và witness của R1CS.
Cấu trúc `SatisfyingAssignment` bao gồm các trường sau:
- `a_aux_density`, `b_input_density`, `b_aux_density`: Các trường này thuộc kiểu `DensityTracker`, dùng để theo dõi mật độ truy vấn.
- `a`, `b`, `c`: Đây là các vector, dùng để lưu trữ kết quả đánh giá các đa thức A, B, C.
- `input_assignment`, `aux_assignment`: Đây là các vector, dùng để lưu trữ giá trị gán cho các biến.
Cấu trúc `SatisfyingAssignment` triển khai trait `ConstraintSystem`, nghĩa là nó cung cấp các phương pháp sau:
- `new`: Phương pháp này dùng để tạo một instance `SatisfyingAssignment` mới.
- `alloc`: Phương pháp này dùng để phân bổ một biến phụ trợ mới.
- `alloc_input`: Phương pháp này dùng để phân bổ một biến đầu vào mới.
- `enforce`: Phương pháp này dùng để thêm một ràng buộc mới.
- `push_namespace`, `pop_namespace`: Các phương pháp này dùng để thao tác namespace, tuy nhiên trong ngữ cảnh này không thực hiện hành động gì.
- `get_root`: Phương pháp này dùng để lấy hệ thống ràng buộc gốc.
- `is_extensible`, `extend`: Các phương pháp này dùng để mở rộng hệ thống ràng buộc.
Nhìn chung, mục đích chính của file này là cung cấp một cách thức để tạo instance và witness của R1CS từ một hệ thống thỏa mãn điều kiện nhất định (ví dụ như `SatisfyingAssignment`).
"src/circuit.rs", nó định nghĩa mạch tăng cường (Augmented Circuit) trong giao thức Nova.
Mạch này bao gồm một mạch bước (Step Circuit) và mạch xác minh trong sơ đồ gấp không tương tác của Nova.
File định nghĩa các cấu trúc và phương pháp chính sau:
- `NovaAugmentedCircuitParams`: Cấu trúc này chứa các tham số của mạch, bao gồm độ rộng limb, số lượng limb và một giá trị boolean chỉ định đây có phải là mạch chính hay không.
- `NovaAugmentedCircuitInputs`: Cấu trúc này chứa các đầu vào của mạch, bao gồm các tham số, i, z0, zi, U, u và T.
- `NovaAugmentedCircuit`: Cấu trúc này là định nghĩa chính của mạch tăng cường Nova, chứa các tham số mạch, hằng số chỉ đọc, đầu vào và mạch bước. Nó cũng định nghĩa một số phương pháp như `alloc_witness` (phân bổ witness), `synthesize_base_case` (tổng hợp trường hợp cơ sở) và `synthesize_non_base_case` (tổng hợp trường hợp không phải cơ sở).
- Phương pháp `synthesize`: Đây là phương pháp tổng hợp chính của mạch tăng cường Nova, trước tiên phân bổ tất cả các witness, sau đó tổng hợp mạch tùy theo có phải là trường hợp cơ sở hay không, và cuối cùng xuất giá trị băm được tính toán và u.X[1].
File này cũng chứa một số mã kiểm thử để kiểm tra chức năng của mạch đệ quy.
Nhìn chung, mục đích chính của file này là định nghĩa mạch tăng cường trong giao thức Nova, đây là phần lõi của giao thức, bao gồm một mạch bước và một mạch xác minh, đồng thời cung cấp cách thức để tổng hợp mạch này.
"src/constants.rs", nó định nghĩa một số hằng số được sử dụng rộng rãi trong toàn bộ dự án.
Dưới đây là ý nghĩa của các hằng số này:
- `NUM_CHALLENGE_BITS`: Hằng số này định nghĩa số bit của challenge, giá trị là 128. Challenge thường là một số ngẫu nhiên do bên chứng minh tạo ra, dùng trong các bước tương tác của quá trình chứng minh zk-SNARK.
- `NUM_HASH_BITS`: Hằng số này định nghĩa số bit của hàm băm, giá trị là 250. Hàm băm là hàm ánh xạ dữ liệu đầu vào độ dài bất kỳ thành đầu ra độ dài cố định, độ dài đầu ra ở đây là 250 bit.
- `BN_LIMB_WIDTH`: Hằng số này định nghĩa độ rộng limb của số lớn (Big Number), giá trị là 64. Trong khoa học máy tính, số lớn là những số vượt quá phạm vi biểu diễn của các kiểu dữ liệu tiêu chuẩn, chúng thường được chia thành nhiều "limb" để lưu trữ và xử lý.
- `BN_N_LIMBS`: Hằng số này định nghĩa số lượng limb của số lớn, giá trị là 4. Nghĩa là mỗi số lớn được chia thành 4 limb để lưu trữ và xử lý.
- `NUM_FE_WITHOUT_IO_FOR_CRHF`: Hằng số này định nghĩa số lượng phần tử trường (FE) dành cho hàm băm kháng va chạm (CRHF), không bao gồm I/O, giá trị là 17.
- `NUM_FE_FOR_RO`: Hằng số này định nghĩa số lượng phần tử trường (FE) dành cho máy tiên tri ngẫu nhiên (RO), giá trị là 24.
Các hằng số này đóng vai trò then chốt trong việc triển khai giao thức Nova, chúng định nghĩa một số tham số quan trọng như số bit của challenge, số bit của hash, độ rộng limb và số lượng limb của số lớn.
"src/errors.rs", nó định nghĩa các loại lỗi mà thư viện Nova có thể trả về.
Các loại lỗi này được gói gọn trong một enum tên là `NovaError`. Dưới đây là ý nghĩa của các loại lỗi:
- `InvalidIndex`: Lỗi này sẽ được trả về nếu hàng hoặc cột được cung cấp trong bộ (row, col, val) nằm ngoài phạm vi.
- `OddInputLength`: Lỗi này sẽ được trả về nếu độ dài đầu vào được cung cấp không phải là số chẵn.
- `InvalidInputLength`: Lỗi này sẽ được trả về nếu độ dài đầu vào được cung cấp không đúng.
- `InvalidWitnessLength`: Lỗi này sẽ được trả về nếu độ dài witness được cung cấp không đúng.
- `UnSat`: Lỗi này sẽ được trả về nếu witness được cung cấp không thỏa mãn hình dạng và instance đã cho.
- `DecompressionError`: Lỗi này sẽ được trả về nếu không thể giải nén commitment đã nén được cung cấp.
- `ProofVerifyError`: Lỗi này sẽ được trả về nếu việc xác minh bằng chứng thất bại.
- `InvalidNumSteps`: Lỗi này sẽ được trả về nếu số bước được cung cấp bằng không.
- `InvalidIPA`: Lỗi này sẽ được trả về nếu các tham số tích vô hướng được cung cấp không hợp lệ.
- `InvalidSumcheckProof`: Lỗi này sẽ được trả về nếu bằng chứng kiểm tra tổng được cung cấp không hợp lệ.
- `InvalidInitialInputLength`: Lỗi này sẽ được trả về nếu đầu vào ban đầu của tính toán tăng dần không khớp với số lượng đã khai báo trước đó.
- `InvalidStepOutputLength`: Lỗi này sẽ được trả về nếu độ dài đầu ra do bước thực thi tạo ra không khớp với số lượng đã khai báo trước đó.
- `InternalTranscriptError`: Lỗi này sẽ được trả về nếu engine chuyển tiếp gặp tràn số vòng.
- `InvalidMultisetProof`: Lỗi này sẽ được trả về nếu kiểm tra đa tập thất bại.
- `InvalidProductProof`: Lỗi này sẽ được trả về nếu kiểm tra bằng chứng sản phẩm thất bại.
- `IncorrectWitness`: Lỗi này sẽ được trả về nếu việc kiểm tra tính nhất quán giữa I/O công khai và giá trị gán sử dụng thất bại.
Các loại lỗi này bao phủ hầu hết các vấn đề có thể xảy ra trong thư viện Nova, bao gồm lỗi đầu vào, lỗi chứng minh, lỗi nội bộ... Khi các hàm trong thư viện Nova gặp vấn đề, chúng sẽ trả về các lỗi này để người gọi có thể biết đã xảy ra lỗi gì và có hành động phù hợp.
"ecc.rs", nó được viết bằng ngôn ngữ Rust.
File này chủ yếu chứa phần triển khai liên quan đến mật mã học đường cong elliptic (ECC) trong framework Nova.
Mật mã học đường cong elliptic (Elliptic Curve Cryptography - ECC) là một kỹ thuật mã hóa khóa công khai, ưu điểm chính của nó là có thể sử dụng khóa ngắn hơn để cung cấp mức độ bảo mật tương đương. Điều này có nghĩa là ECC có thể sử dụng ít tài nguyên tính toán và điện năng hơn, điều này rất quan trọng đối với nhiều thiết bị (đặc biệt là thiết bị di động và hệ thống nhúng).
Trong file này, bạn sẽ thấy một số định nghĩa struct và impl, tất cả đều nhằm mục đích triển khai chức năng ECC. Ví dụ, bạn sẽ thấy `struct EccGadget`, đây là phần triển khai chính của ECC, chứa một số trường như `value` và `pb_variable`, dùng để lưu trạng thái ECC và các biến liên quan.
Hơn nữa, bạn cũng sẽ thấy một số định nghĩa phương pháp (functions), dùng để triển khai các thao tác ECC như mã hóa, giải mã... Ví dụ, `fn encrypt` là một hàm mã hóa, nhận vào văn bản rõ và khóa công khai, sau đó trả về văn bản đã mã hóa.
Nhìn chung, file này là phần then chốt để triển khai chức năng ECC trong framework Nova.
"src/gadgets/mod.rs", là một module trong framework Nova, chủ yếu dùng để triển khai các "gadget" cần thiết cho Nova và các ứng dụng được xây dựng trên Nova.
Trong mật mã học, "gadget" là một thuật ngữ chung, dùng để mô tả một khối mã thực hiện chức năng cụ thể. Trong zk-SNARKs (chứng minh kiến thức không tiết lộ ngắn gọn, không tương tác), gadget thường chỉ hệ thống chứng minh thực hiện thuật toán hoặc giao thức cụ thể.
Trong file này, bạn sẽ thấy các module con sau:
- `ecc`: Module này có thể chứa các gadget liên quan đến mật mã học đường cong elliptic (Elliptic Curve Cryptography).
- `nonnative`: Module này có thể chứa các gadget cho các trường không phải native.
- `r1cs`: Module này có thể chứa các gadget cho R1CS (Rank-1 Constraint Systems).
- `utils`: Module này có thể chứa một số hàm hoặc lớp tiện ích.
Các module con này cùng nhau cung cấp các chức năng cần thiết cho framework Nova.
"bignat.rs", nó là một phần của dự án Nova, chủ yếu dùng để triển khai các thao tác trên số nguyên lớn (BigNat).
Trong khoa học máy tính, số nguyên lớn (hay còn gọi là số nguyên độ chính xác tùy ý) là các số có thể biểu diễn và thao tác vượt quá phạm vi biểu diễn của các kiểu nguyên tiêu chuẩn (như int hay long). Điều này rất hữu ích trong nhiều lĩnh vực, bao gồm mật mã học, đồ họa máy tính, tính toán số lớn...
Hãy cùng xem xét kỹ một số phần chính trong file này:
1. `use super::super::gadgets::GadgetCaller;`: Dòng mã này nhập GadgetCaller, đây là một trait dùng để gọi các gadget khác.
2. `pub struct BigNatGadget;`: Dòng mã này định nghĩa một cấu trúc tên là BigNatGadget. Trong Rust, cấu trúc được dùng để tạo các kiểu dữ liệu phức tạp.
3. `impl GadgetCaller for BigNatGadget`: Đây là phần triển khai cho cấu trúc BigNatGadget, nó triển khai trait GadgetCaller. Điều này có nghĩa là BigNatGadget phải cung cấp tất cả các phương pháp được yêu cầu bởi trait GadgetCaller.
4. Trong phần triển khai này, ta có thể thấy một số phương pháp như `add`, `sub`, `mul`, `div`, `rem`, v.v., đây đều là các thao tác cơ bản trên số nguyên lớn.
5. `pub fn from(&self, val: u64) -> Self`: Phương pháp này dùng để tạo một BigNatGadget từ một giá trị kiểu u64.
6. `pub fn to_u64(&self) -> u64`: Phương pháp này dùng để chuyển đổi BigNatGadget thành một giá trị kiểu u64.
7. `pub fn eq(&self, other: &Self) -> bool`: Phương pháp này dùng để kiểm tra xem hai BigNatGadget có bằng nhau hay không.
Nhìn chung, file này cung cấp một công cụ để xử lý số nguyên lớn, bao gồm tạo số nguyên lớn, chuyển đổi số nguyên lớn sang các kiểu giá trị khác, và thực hiện các phép toán cơ bản trên số nguyên lớn.
"mod.rs", nó nằm trong thư mục "src/gadgets/nonnative/".
File này chủ yếu dùng để triển khai các phép toán số học trên các trường không phải native.
Trong mật mã học, các trường không phải native thường chỉ những trường không được phần cứng hỗ trợ trực tiếp. Ví dụ, một số thuật toán mật mã có thể cần thực hiện phép toán trên các trường lớn hơn 64 bit, nhưng phần cứng máy tính hiện đại đa số chỉ hỗ trợ tối đa phép toán 64 bit. Trong trường hợp này, ta cần sử dụng các phép toán số học trên trường không phải native.
Trong file này, bạn sẽ thấy các phần chính sau:
1. Trait `OptionExt`: Trait này thêm hai phương pháp `grab` và `grab_mut` cho kiểu `Option`, dùng để cố gắng lấy giá trị bên trong `Option`, nếu `Option` là `None` thì trả về lỗi.
2. Trait `BitAccess`: Trait này cung cấp một phương pháp `get_bit`, nhận một chỉ số `i`, sau đó trả về xem bit ở vị trí đó có bằng `1` hay không.
3. `impl BitAccess for Scalar`: Đây là phần triển khai trait `BitAccess` cho kiểu `Scalar`, `Scalar` là một kiểu đại diện cho trường số nguyên tố.
4. `pub mod bignat;` và `pub mod util;`: Hai dòng mã này nhập hai module con `bignat` và `util`, chúng có thể chứa một số hàm hoặc lớp để triển khai các phép toán số học trên trường không phải native.
Nhìn chung, file này cung cấp một cách thức để thực hiện các phép toán số học trên các trường không phải native, điều này rất quan trọng để triển khai một số thuật toán mật mã nhất định.
"util.rs", nó nằm trong thư mục "src/gadgets/nonnative/".
File này chủ yếu dùng để triển khai một số hàm tiện ích thực hiện các phép toán trên các trường không phải native.
Dưới đây là một số phần chính trong file này:
1. Cấu trúc `Bit`: Cấu trúc này biểu thị một bit, chứa một tổ hợp tuyến tính và một giá trị, giá trị này được điền trong thời gian witness.
2. Cấu trúc `Bitvector`: Cấu trúc này biểu thị một vector bit, chứa một vector các tổ hợp tuyến tính, một vector giá trị và một vector bit được phân bổ.
3. Cấu trúc `Num`: Cấu trúc này biểu thị một số, chứa một tổ hợp tuyến tính và một giá trị.
4. Phương pháp `alloc` của cấu trúc `Bit`: Phương pháp này phân bổ một biến chỉ có thể mang giá trị boolean trong hệ thống ràng buộc.
5. Phương pháp `fits_in_bits` của cấu trúc `Num`: Phương pháp này kiểm tra xem một số có thể được biểu diễn bằng số lượng bit cho trước hay không.
6. Phương pháp `is_equal` của cấu trúc `Num`: Phương pháp này kiểm tra xem một số có bằng với một số tự nhiên được biểu diễn bởi vector bit hay không.
7. Phương pháp `decompose` của cấu trúc `Num`: Phương pháp này phân rã một số thành một vector bit.
8. Phương pháp `as_allocated_num` của cấu trúc `Num`: Phương pháp này chuyển đổi một số thành một số đã được phân bổ.
9. Hàm `f_to_nat`: Hàm này chuyển đổi một phần tử trường thành một số tự nhiên.
10. Hàm `nat_to_f`: Hàm này chuyển đổi một số tự nhiên thành một phần tử trường.
Nhìn chung, file này cung cấp một số hàm tiện ích, có thể thực hiện các phép toán khác nhau trên các trường không phải native, chẳng hạn như phân bổ biến, kiểm tra xem một số có thể được biểu diễn bằng số lượng bit cho trước hay không, phân rã một số thành vector bit, v.v.
"r1cs.rs", nó nằm trong thư mục "src/gadgets/".
File này chủ yếu dùng để triển khai các gadget cho Rank-1 Constraint Systems (R1CS).
R1CS là một hệ thống chứng minh dùng để mô tả thuật toán hoặc giao thức, là nền tảng của nhiều hệ thống chứng minh kiến thức không tiết lộ, bao gồm zk-SNARKs.
Dưới đây là một số phần chính trong file này:
1. Cấu trúc `AllocatedR1CSInstance`: Cấu trúc này biểu thị một instance R1CS đã được phân bổ, chứa một điểm `W` và hai số `X0` và `X1`.
2. Phương pháp `AllocatedR1CSInstance::alloc`: Phương pháp này dùng để phân bổ một instance R1CS trong hệ thống ràng buộc.
3. Phương pháp `AllocatedR1CSInstance::absorb_in_ro`: Phương pháp này dùng để đưa instance R1CS vào máy tiên tri ngẫu nhiên (RO).
4. Cấu trúc `AllocatedRelaxedR1CSInstance`: Cấu trúc này biểu thị một instance R1CS Thỏa hiệp đã được phân bổ, chứa hai điểm `W` và `E`, một số `u`, và hai số nguyên lớn `X0` và `X1`.
5. Phương pháp `AllocatedRelaxedR1CSInstance::alloc`: Phương pháp này dùng để phân bổ một instance R1CS Thỏa hiệp trong hệ thống ràng buộc.
6. Phương pháp `AllocatedRelaxedR1CSInstance::default`: Phương pháp này dùng để phân bổ một instance R1CS Thỏa hiệp mặc định trong hệ thống ràng buộc.
7. Phương pháp `AllocatedRelaxedR1CSInstance::from_r1cs_instance`: Phương pháp này dùng để chuyển đổi một instance R1CS thành một instance R1CS Thỏa hiệp.
8. Phương pháp `AllocatedRelaxedR1CSInstance::absorb_in_ro`: Phương pháp này dùng để đưa instance R1CS Thỏa hiệp vào máy tiên tri ngẫu nhiên (RO).
9. Phương pháp `AllocatedRelaxedR1CSInstance::fold_with_r1cs`: Phương pháp này dùng để gập instance R1CS Thỏa hiệp với một instance R1CS và trả về kết quả.
10. Phương pháp `AllocatedRelaxedR1CSInstance::conditionally_select`: Phương pháp này dùng để chọn một trong hai instance R1CS Thỏa hiệp dựa trên một điều kiện.
Nhìn chung, file này cung cấp một số công cụ để xử lý R1CS, bao gồm tạo instance R1CS, chuyển đổi instance R1CS thành instance R1CS Thỏa hiệp, đưa instance R1CS vào máy tiên tri ngẫu nhiên, gập instance R1CS Thỏa hiệp với một instance R1CS, v.v.
File tên là "utils.rs", nó nằm trong thư mục "src/gadgets/".
File này chủ yếu dùng để triển khai một số hàm tiện ích cấp thấp, rất hữu ích khi xây dựng các giao thức và thuật toán mật mã cấp cao hơn.
Dưới đây là một số phần chính trong file này:
1. Hàm `le_bits_to_num`: Hàm này nhận một mảng bit biểu diễn theo thứ tự little-endian, sau đó trả về giá trị số tương ứng.
2. Hàm `alloc_zero` và `alloc_one`: Hai hàm này lần lượt dùng để phân bổ một biến có giá trị bằng không và một biến có giá trị bằng một trong hệ thống ràng buộc.
3. Hàm `alloc_scalar_as_base`: Hàm này dùng để phân bổ một scalar như một base trong hệ thống ràng buộc.
4. Hàm `scalar_as_base`: Hàm này dùng để diễn giải một scalar như một base.
5. Hàm `alloc_bignat_constant`: Hàm này dùng để phân bổ một hằng số nguyên lớn trong hệ thống ràng buộc.
6. Hàm `alloc_num_equals`: Hàm này dùng để kiểm tra hai số có bằng nhau hay không và trả về một bit.
7. Hàm `conditionally_select`: Hàm này dùng để chọn một trong hai số dựa trên một điều kiện.
8. Hàm `conditionally_select_vec`: Hàm này dùng để chọn một trong hai mảng số dựa trên một điều kiện.
9. Hàm `conditionally_select_bignat`: Hàm này dùng để chọn một trong hai số nguyên lớn dựa trên một điều kiện.
10. Hàm `conditionally_select2`: Hàm này dùng để chọn một trong hai số dựa trên một điều kiện, điều kiện này là một số đã được phân bổ.
11. Hàm `select_zero_or_num2` và `select_num_or_zero2`: Hai hàm này lần lượt dùng để đặt một số về không hoặc giữ nguyên, dựa trên một điều kiện là một số đã được phân bổ.
12. Hàm `select_num_or_zero`: Hàm này dùng để đặt một số về không hoặc giữ nguyên, dựa trên một điều kiện là một giá trị boolean.
13. Hàm `select_one_or_num2` và `select_num_or_one`: Hai hàm này lần lượt dùng để đặt một số về một hoặc giữ nguyên, dựa trên một điều kiện là một số đã được phân bổ và một giá trị boolean.
Nhìn chung, file này cung cấp một số hàm tiện ích, có thể dùng để phân bổ biến trong hệ thống ràng buộc, kiểm tra hai số có bằng nhau hay không, chọn một trong hai số dựa trên một điều kiện, v.v.
Đây là một file mã nguồn Rust tên là "lib.rs", là thành phần chính của dự án Nova.
File này chủ yếu định nghĩa các giao diện công khai và một số chức năng cốt lõi của thư viện Nova. Dưới đây là phần phân tích chi tiết:
1. `pub mod ast`: Dòng mã này nhập một module tên là "ast". "ast" là viết tắt của "Abstract Syntax Tree" (Cây cú pháp trừu tượng), một cấu trúc dữ liệu dùng để biểu diễn cấu trúc mã nguồn. Trong dự án Nova, module "ast" có thể chứa các cấu trúc dữ liệu và hàm để phân tích và xử lý mã nguồn Nova.
2. `pub mod parser`: Dòng mã này nhập một module tên là "parser". "parser" có nghĩa là "bộ phân tích cú pháp", module này có thể chứa các hàm và lớp để phân tích cú pháp mã nguồn Nova.
3. `pub mod codegen`: Dòng mã này nhập một module tên là "codegen". "codegen" là viết tắt của "code generation" (sinh mã), module này có thể chứa các hàm và lớp để chuyển đổi cây cú pháp trừu tượng của ngôn ngữ Nova thành mã đích (ví dụ như LLVM IR hoặc mã máy).
4. `pub mod types`: Dòng mã này nhập một module tên là "types". Module này có thể chứa hệ thống kiểu dữ liệu của ngôn ngữ Nova, bao gồm biểu diễn và xử lý các kiểu dữ liệu dựng sẵn và do người dùng định nghĩa.
5. `pub mod util`: Dòng mã này nhập một module tên là "util". "util" là viết tắt của "utilities" (tiện ích), module này có thể chứa các hàm và lớp tiện ích khác nhau, ví dụ như xử lý lỗi, ghi log, đọc/ghi file, v.v.
6. `pub mod driver`: Dòng mã này nhập một module tên là "driver". Trong các dự án biên dịch, "driver" thường là module điều khiển toàn bộ quá trình biên dịch, bao gồm đọc mã nguồn, phân tích cú pháp, kiểm tra kiểu, sinh mã, tối ưu và xuất kết quả.
7. `pub mod error`: Dòng mã này nhập một module tên là "error". Module này có thể chứa hệ thống xử lý lỗi của ngôn ngữ Nova, bao gồm biểu diễn và xử lý các lỗi biên dịch và lỗi thời gian chạy.
8. `pub mod config`: Dòng mã này nhập một module tên là "config". Module này có thể chứa hệ thống cấu hình của ngôn ngữ Nova, bao gồm biểu diễn và xử lý các tùy chọn biên dịch, tùy chọn thời gian chạy, v.v.
Mục đích chính của file này là tổ chức các thành phần khác nhau của ngôn ngữ Nova (ví dụ như bộ phân tích, bộ sinh mã, hệ thống kiểu, hệ thống xử lý lỗi...) thành một thư viện biên dịch hoàn chỉnh.
File tên là "nifs.rs", nó nằm trong thư mục "src/".
File này triển khai một sơ đồ gập không tương tác (Non-Interactive Folding Scheme - NIFS). Đây là một giao thức mật mã dùng để chứng minh tính đúng đắn của từng bước trong tính toán tăng dần.
Dưới đây là một số phần chính trong file này:
1. Cấu trúc `NIFS`: Cấu trúc này biểu thị một SNARK, lưu trữ bằng chứng cho một bước trong tính toán tăng dần. Nó chứa một trường tên là `comm_T`, đây là một commitment đã nén (Compressed Commitment).
2. Phương pháp `prove`: Phương pháp này nhận một cặp instance-witness R1CS Thỏa hiệp `(U1, W1)` và một cặp instance-witness R1CS `(U2, W2)`, chúng có cùng hình dạng `shape` và được định nghĩa đối với cùng một `ck`. Sau đó, nó xuất ra một cặp instance-witness R1CS Thỏa hiệp đã được gập `(U, W)` với cùng hình dạng `shape`. Nếu `W1` thỏa mãn `U1` và `W2` thỏa mãn `U2`, thì witness đã gập `W` sẽ thỏa mãn instance đã gập `U`.
3. Phương pháp `verify`: Phương pháp này nhận một instance R1CS Thỏa hiệp `U1` và một instance R1CS `U2`, chúng có cùng hình dạng và được định nghĩa đối với cùng một tham số. Sau đó, nó xuất ra một instance đã gập `U` với cùng hình dạng. Nếu `U1` và `U2` là khả thi, thì instance đã gập `U` là khả thi.
4. Module kiểm thử: Module này chứa một số hàm kiểm thử để kiểm tra các phương pháp `prove` và `verify` của cấu trúc `NIFS`.
Nhìn chung, file này triển khai một sơ đồ gập không tương tác, một giao thức mật mã dùng để chứng minh tính đúng đắn của từng bước trong tính toán tăng dần. Ưu điểm chính của sơ đồ này là nó có thể gập nhiều bằng chứng thành một bằng chứng duy nhất, từ đó giảm chi phí lưu trữ và truyền tải bằng chứng.
File tên là "ipa_pc.rs", nó nằm trong thư mục "src/provider/".
File này triển khai một công cụ đánh giá sử dụng sơ đồ cam kết đa thức dựa trên IPA (Inner Product Argument).
Dưới đây là một số phần chính trong file này:
1. Cấu trúc `ProverKey`: Cấu trúc này biểu thị một khóa của bên chứng minh, chứa một khóa cam kết `ck_s`.
2. Cấu trúc `VerifierKey`: Cấu trúc này biểu thị một khóa của bên xác minh, chứa hai khóa cam kết `ck_v` và `ck_s`.
3. Cấu trúc `EvaluationArgument`: Cấu trúc này biểu thị một tham số đánh giá đa thức, chứa một tham số tích vô hướng `ipa`.
4. Cấu trúc `EvaluationEngine`: Cấu trúc này biểu
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News













