Tiêu đề gốc: " Nova: Một chương mới về bằng chứng không có kiến thức 》
Nguồn gốc: Huobi Research
Bằng chứng không có kiến thức là một kỹ thuật quan trọng trong mật mã cho phép một người chứng minh cho người khác rằng một tuyên bố là đúng mà không tiết lộ bất kỳ thông tin nào khác. Công nghệ này có ứng dụng rộng rãi trong nhiều lĩnh vực, bao gồm xác minh danh tính, chuỗi khối và điện toán an toàn. Nova là một hệ thống chứng minh không có kiến thức mới được phát triển bởi Microsoft, sử dụng công nghệ có tên Relaxed Rank-1 Constraint Systems (Relaxed R 1 CS) để cải thiện hiệu quả của bằng chứng và tính linh hoạt. Chương cuối cùng cung cấp giải thích chi tiết về mã nguồn.
Ưu điểm chính của Nova là việc sử dụng ;R1CS Công nghệ. R1CS là một hệ thống xây dựng các bằng chứng không có kiến thức, có thể được sử dụng để chứng minh rằng người ta biết một nghiệm thỏa mãn một tập phương trình đa thức mà không cần phải tiết lộ bất kỳ thông tin nào về nghiệm đó. Tuy nhiên, hệ thống R1CS truyền thống yêu cầu sử dụng lượng lớn tính ngẫu nhiên trong quy trình chứng minh, điều này khiến cho quá trình tạo và xác minh bằng chứng 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 thoải mái, cho phép sử dụng ít tính ngẫu nhiên hơn trong bằng chứng, do đó cải thiện đáng kể hiệu quả của bằng chứng.
Nova cũng có những ưu điểm khác. Ví dụ, nó hỗ trợ các phép tính tăng dần, có nghĩa là các hàm phức tạp có thể được tính từng bước thay vì phải tính toàn bộ hàm cùng một lúc. Điều này rất hữu ích khi làm việc với 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òn 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.
Mặc dù Nova có nhiều ưu điểm nhưng nó cũng có một số ưu điểm nhược điểm. Đầu tiên, vì Nova sử dụng R1CS thoải mái nên các bằng chứng của nó có thể không mạnh bằng các hệ thống R1CS truyền thống. Điều này là do R1CS được nới lỏng cho phép sử dụng ít tính ngẫu nhiên hơn trong bằng chứng, điều này có thể làm giảm tính bảo mật của bằng chứng. Tuy nhiên, các nhà phát triển của Nova đã thực hiện một số bước để giải quyết vấn đề này, chẳng hạn như sử dụng các thuật toán mã hóa mạnh hơn và các 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ó khi sử dụng và bảo trì. Nova sử dụng nhiều kỹ thuật mã hóa tiên tiến, chẳng hạn như tính toán đa thức, phép toán nhóm và dự đoán ngẫu nhiên, đòi hỏi sự hiểu biết sâu sắc về các kỹ thuật này để sử dụng và sửa đổi Nova một cách hiệu quả.
Nova Trong lĩnh vực chứng minh không có kiến thức chiếm một vị trí quan trọng trong lĩnh vực này. Sự xuất hiện của nó đã mở ra một con đường mới cho sự phát triển của các bằng chứng không có kiến thức. Công nghệ R1CS thoải mái được Nova áp dụng giúp quá trình tạo và xác minh bằng chứng hiệu quả hơn, điều này rất quan trọng đối với các ứng dụng chứng minh không có kiến thức quy mô lớn. Ngoài ra, Nova cũng hỗ trợ các phép tính tăng dần và 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 và mở rộng hơn nữa phạm vi ứng dụng của chứng minh không có kiến thức.
https://github.com/microsoft/Nova
at src/  ; Trong thư mục này có các thư mục con quan trọng sau:
bellperson/: Thư mục này có thể chứa mã về thuật toán Bellman-Ford.
tiện ích/: Thư mục này có thể chứa các công cụ để xây dựng bằng chứng zk-SNARK.
provider/: Thư mục này có thể chứa một số mã nhà cung cấp, chẳng hạn 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ã cho giao thức Spartan .
traits/: Thư mục này có thể chứa một số đặc điểm của Rust xác định một số hành vi phổ biến.
Mô-đun này chủ yếu được sử dụng để tạo R1CS (Hệ thống ràng buộc hạng-1, một hệ thống ràng buộc cho zk-SNARK).
Nó chứa ba mô-đun phụ:
r1cs: Mô-đun này có thể chứa thông tin về mã R1CS .
shape_cs: Mô-đun này có thể chứa mã cho hệ thống ràng buộc hình dạng.
bộ giải: Mô-đun này có thể chứa mã để giải các hệ thống ràng buộc.
Trong phần kiểm tra, nó định nghĩa một hàm synthesize_alloc_bit, chấp nhận một hệ thống ràng buộc và sau đó thêm một số 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, đầu tiên tạo một hình dạng
Tệp này chủ yếu xác định hai đặc điểm: `NovaWitness` và `NovaShape`, tương ứng cung cấp `R ;1 CSInstance` và `R  ;1 CSWitness`, cũng như các phương pháp để lấy `R 1 CSShape` và `CommitmentKey`.
- Đặc điểm `NovaWitness` có một phương thức `r1cs_instance_and_witness` chấp nhận an `R 1 CSShape` và a `CommitmentKey` , sau đó trả về một `R 1 CSInstance` và a `R 1 CSWitness`. Đặc điểm này được triển khai cho cấu trúc `SatisfyingAssignment`, có nghĩa là bất kỳ `SatisfyingAssignment` nào cũng có thể sử dụng phương pháp này để có được `R 1 CSInstance` và `R 1 CSWitness `.
- Đặc điểm `NovaShape` có một phương thức `r 1 cs_shape` trả về `R 1 CSShape` và a  ;`CommitmentKey `. Đặc điểm này được triển khai cho cấu trúc `ShapeCS`, có nghĩa là bất kỳ `ShapeCS` nào cũng có thể sử dụng phương pháp này để nhận được an `R 1 CSShape` và `CommitmentKey`.
Tệp này cũng xác định một hàm `add_constraint`, chấp nhận một hệ thống ràng buộc và ba kết hợp tuyến tính, sau đó thêm một ràng buộc mới vào hệ thống ràng buộc. Hàm này được sử dụng bởi những người triển khai `NovaShape` khi tạo `R 1 CSShape`.
Nói chung, chức năng chính của tệp này là cung cấp cách lấy dữ liệu từ một hệ thống đáp ứng các điều kiện cụ thể (chẳng hạn như `SatisfyingAssignment` hoặc `ShapeCS`) để tạo phiên bản, chứng thực, hình dạng và khóa cam kết của R 1 CS.
Tệp này xác định một cấu trúc có tên `ShapeCS`, cấu trúc này triển khai đặc điểm `ConstraintSystem`. `ShapeCS` là một hệ thống ràng buộc để tạo các hình dạng R 1 CS.
Cấu trúc `ShapeCS` chứa các trường sau:
- `named_objects`: Cái này là một bản đồ lưu trữ các đối tượng được 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.
- `ràng buộc`: Đây là một vectơ 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 vectơ chuỗi lưu trữ tất cả các đầu vào phụ trợ.
Cấu trúc `ShapeCS` triển khai đặc điểm `ConstraintSystem`, có nghĩa là nó cung cấp các phương thức sau:
p>
- `alloc`: Phương thức này được sử dụng để cấp phát một biến mới.
- `alloc_input`: Phương thức này được sử dụng để cấp phát một biến đầu vào mới.
- `enforce`: Phương thức này được sử dụng để thêm một ràng buộc mới.
- `push_namespace`: Phương thức này được sử dụng để đẩy một namespace mới.
- `pop_namespace`: Phương thức này dùng để hiện lên namespace hiện tại.
- `get_root`: Phương thức này được sử dụng để lấy hệ thống ràng buộc gốc.
Tệp này cũng xác định một số hàm phụ trợ, chẳng hạn như `proc_lc` và `compute_path`, được sử dụng để xử lý các kết hợp tuyến tính và đường dẫn điện toán tương ứng.
Nói chung, chức năng chính của tệp này là cung cấp cách vẽ hình ảnh từ một hệ thống đáp ứng các điều kiện cụ thể (chẳng hạn như `ShapeCS` ) để tạo ra hình dạng R 1 CS.
Tệp này xác định một cấu trúc có tên `SatisfyingAssignment`, cấu trúc này triển khai đặc điểm `ConstraintSystem`. `SatisfyingAssignment` là một hệ thống ràng buộc để tạo R 1 CS và nhân chứng.
Cấu trúc `SatisfyingAssignment` chứa các trường sau:
- `a_aux_dense`, ` b_input_dense`, `b_aux_dense`: Đây là các trường thuộc loại `DensityTracker` được sử dụng để theo dõi mật độ của truy vấn.
- `a`, `b`, `c`: Đây là các vectơ dùng để lưu trữ kết quả đánh giá của đa thức A, B, C.
- `input_signment`, `aux_signment`: Đây là các vectơ dùng để lưu trữ phép gán cho các biến.
Cấu trúc `SatisfyingAssignment` triển khai đặc điểm `ConstraintSystem`, có nghĩa là nó cung cấp các phương thức sau:
- `new`: Phương thức này được sử dụng để tạo một thể hiện `SatisfyingAssignment` mới.
- `alloc`: Phương thức này được sử dụng để cấp phát một biến phụ mới.
- `alloc_input`: Phương thức này được sử dụng để cấp phát một biến đầu vào mới.
- `enforce`: Phương thức này được sử dụng để thêm một ràng buộc mới.
- `push_namespace`, `pop_namespace`: Các phương thức này được sử dụng để thao tác với các không gian tên, nhưng không có hoạt động thực tế nào trong bối cảnh này.
- `get_root`: Phương thức này được sử dụng để lấy hệ thống ràng buộc gốc.
- `is_extensible`, `extend`: Các phương thức này được sử dụng để mở rộng hệ thống ràng buộc.
Nói chung, chức năng chính của tệp này là cung cấp cách lấy dữ liệu từ một hệ thống đáp ứng các điều kiện cụ thể (chẳng hạn như `SatisfyingAssignment` ) để tạo ra các phiên bản và nhân chứng của R 1 CS.
Các cấu trúc và phương thức chính sau được xác định trong tệp:
- ` NovaAugmentedCircuitParams` : Cấu trúc này chứa các tham số của mạch, bao gồm chiều rộng chi, số chi và giá trị Boolean cho biết đâ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, z 0, zi, U, u và T.
- `NovaAugmentedCircuit`: Cấu trúc này là định nghĩa chính của mạch nâng cao Nova, chứa các tham số mạch, hằng số chỉ đọc, mạch đầu vào và mạch bước. Nó cũng định nghĩa các phương thức như `alloc_witness` (phân bổ nhân chứng), `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 cơ sở).
- Phương thức `synthesize`: Đây là phương pháp tổng hợp chính cho các mạch nâng cao Nova, trước tiên nó phân bổ tất cả các nhân chứng, sau đó tổng hợp mạch dựa trên việc nó có phải là trường hợp cơ sở hay không và cuối cùng Xuất ra giá trị băm được tính toán và u.X[ 1 ].
Tệp này cũng chứa một số mã kiểm tra để kiểm tra chức năng của mạch đệ quy.
Nói chung, chức năng chính của tệp này là xác định mạch nâng cao trong giao thức Nova. Mạch này là phần cốt lõi của giao thức Nova. Nó bao gồm của mạch bước và mạch kiểm tra, đồng thời cung cấp cách tổng hợp mạch này.
- `NUM_CHALLENGE_BITS`: Hằng số này xác định số bit trong thử thách, với giá trị 128 . Thử thách thường là một số ngẫu nhiên do người chứng minh tạo ra và được sử dụng như một bước tương tác trong quy trình chứng minh zk-SNARK.
- `NUM_HASH_BITS`: Hằng số này xác định số lượng bit băm, có giá trị 250 . Hàm băm là hàm có thể ánh xạ dữ liệu đầu vào có độ dài bất kỳ sang đầu ra có độ dài cố định, trong đó độ dài đầu ra là 250 bit.
- `BN_LIMB_WIDTH`: Hằng số này xác định chiều rộng chi của Số Lớn, với giá trị 64 . Trong khoa học máy tính, số lớn là những con số vượt quá phạm vi mà các loại dữ liệu tiêu chuẩn có thể biểu thị, chúng thường được chia thành nhiều "chi" để lưu trữ và thao tác.
- `BN_N_LIMBS`: Hằng số này xác định số nhánh của một số lớn, có giá trị 4 . Điều này có nghĩa là mọi số lượng lớn đều được chia thành 4 nhánh để lưu trữ và thao tác.
- `NUM_FE_WITHOUT_IO_FOR_CRHF`: Hằng số này xác định số phần tử trường (FE) không bao gồm đầu vào/đầu ra cho hàm băm chống va chạm (CRHF), giá trị là 17 .
- `NUM_FE_FOR_RO`: Hằng số này xác định số phần tử trường (FE) cho oracle ngẫu nhiên (RO), với giá trị 24 .
Các hằng số này đóng vai trò quan trọng trong việc triển khai giao thức Nova. Chúng xác định một số tham số quan trọng, chẳng hạn như số lượng bit thử thách, số băm và Số lượng độ rộng chi và số lượng chi, v.v.
- `InvalidIndex`: Nếu hàng hoặc cột được cung cấp nằm ngoài phạm vi bộ dữ liệu (row, col, val), lỗi này sẽ được trả lại.
- `OddInputLength`: Lỗi này sẽ được trả về nếu độ dài đầu vào được cung cấp không chẵn.
- `InvalidInputLength`: Lỗi này sẽ được trả về nếu độ dài đầu vào được cung cấp không chính xác.
- `InvalidWitnessLength`: Lỗi này sẽ được trả về nếu nhân chứng được cung cấp có độ dài không chính xác.
- `UnSat`: Lỗi này sẽ được trả về nếu nhân chứng được cung cấp không đáp ứng được hình dạng và phiên bản đã cho.
- `DecompressionError`: Lỗi này sẽ được trả về nếu lời hứa nén được cung cấp không thể giải nén được.
- `ProofVerifyError`: Lỗi này sẽ được trả về nếu việc xác minh bằng chứng không thành công.
- `InvalidNumSteps`: Lỗi này sẽ được trả về nếu số bước được cung cấp bằng 0.
- `InvalidIPA`: Lỗi này sẽ được trả về nếu cung cấp đối số sản phẩm bên trong không hợp lệ.
- `InvalidSumcheckProof`: Lỗi này sẽ được trả về nếu bằng chứng kiểm tra số tiền không hợp lệ được cung cấp.
- `InvalidInitialInputLength`: Lỗi này sẽ được trả về nếu đầu vào ban đầu cho phép tính tăng dần không khớp với giá trị đã khai báo trước đó.
- `InvalidStepOutputLength`: Lỗi này được trả về nếu độ dài đầu ra được tạo ra bởi quá trình thực hiện bước không khớp với giá trị đã khai báo trước đó.
- `InternalTranscriptError`: Lỗi này sẽ được trả về nếu công cụ phiên âm gặp phải tình trạng tràn vòng.
- `InvalidMultisetProof`: Lỗi này sẽ được trả về nếu kiểm tra nhiều tập hợp không thành công.
- `InvalidProductProof`: Lỗi này sẽ được trả về nếu quá trình kiểm tra bằng chứng sản phẩm không thành công.
- `In CorrectWitness`: Lỗi này sẽ được trả về nếu tính nhất quán với IO được hiển thị và phép gán được sử dụng không thành công.
Các loại lỗi này bao gồm nhiều vấn đề khác nhau có thể gặp phải trong thư viện Nova, bao gồm lỗi đầu vào, lỗi kiểm chứng, lỗi nội bộ, v.v. Khi các chức năng của thư viện Nova gặp sự cố, chúng sẽ trả về những lỗi này để người gọi có thể hiểu điều gì đã xảy ra và hành động tương ứng.
Mật mã đường cong Elliptic ( Elliptic Curve Cryptography, ECC) là một công nghệ mã hóa khóa công khai, ưu điểm chính của nó là cung cấp mức độ bảo mật tương tự Vì lý do bảo mật , có thể sử dụng các phím ngắn hơn. Điều này có nghĩa ECC có thể sử dụng tài nguyên và sức mạnh tính toán nhỏ 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 tệp này, bạn sẽ thấy một số định nghĩa về cấu trúc Rust (cấu trúc) và cách triển khai (ngụ ý), được sử dụng để triển khai chức năng ECC. Ví dụ: bạn sẽ thấy `struct EccGadget`, đây là cách triển khai chính của ECC có chứa các trường như `value` và `pb_variable`, được sử dụng để lưu trữ trạng thái ECC và các biến liên quan.
Ngoài ra, bạn cũng sẽ thấy định nghĩa của một số phương thức (hàm), được sử dụng để thực hiện các hoạt động khác nhau của ECC, chẳng hạn như mã hóa, giải mã, vân vân. . Ví dụ: `fn Encrypt` là một hàm mã hóa chấp nhận bản rõ và khóa chung và trả về bản mã được mã hóa.
Nói chung, tệp này là một phần quan trọng của khung Nova để triển khai chức năng ECC.
Trong mật mã, "tiện ích" là thuật ngữ chung dùng để mô tả một khối mã thực hiện một chức năng cụ thể. Trong zk-SNARK (Đối số không tương tác ngắn gọn không có kiến thức), các tiện ích thường đề cập đến các hệ thống bằng chứng triển khai một thuật toán hoặc giao thức cụ thể.
Trong tệp này, bạn sẽ thấy các mô-đun con sau:
- ` ecc`: Mô-đun này có thể chứa các tiện ích về Mật mã đường cong Elliptic.
- `nonnative`: Mô-đun này có thể chứa một số tiện ích có các trường không phải gốc.
- `r 1 cs`: Mô-đun này có thể chứa một số tiện ích R 1 CS (Hệ thống ràng buộc xếp hạng-1) .
- `utils`: Mô-đun này có thể chứa một số chức năng hoặc lớp tiện ích.
Các mô-đun con này cùng nhau cung cấp nhiều chức năng khác nhau theo yêu cầu của khuôn khổ Nova.
Trong khoa học máy tính, số nguyên lớn (hoặc số nguyên có độ chính xác tùy ý) là những số có thể biểu diễn và hoạt động trên nhiều loại số nguyên thông thường (chẳng hạn như int hoặc long ) có thể biểu thị phạm vi số nguyên. Điều này rất hữu ích trong nhiều lĩnh vực, bao gồm mật mã, đồ họa máy tính, tính toán số lượng lớn, v.v.
Chúng ta hãy xem xét kỹ hơn một số phần chính của tệp này:
1 . `use super::super::gadgets::GadgetCaller;`: Dòng mã này nhập GadgetCaller, một đặc điểm được sử dụng để gọi tiện ích khác.
2. `pub struct BigNatGadget;`: Dòng mã này xác định cấu trúc có tên BigNatGadget. Trong Rust, cấu trúc được sử dụng để tạo các kiểu dữ liệu phức tạp.
3. `impl GadgetCaller cho BigNatGadget`: Đây là một triển khai của cấu trúcBigNatGadget, triển khai đặc điểm GadgetCaller. Điều này có nghĩa là BigNatGadget phải cung cấp cách triển khai tất cả các phương thức mà đặc điểm GadgetCaller yêu cầu.
4. Trong quá trình triển khai này, chúng ta có thể thấy một số phương thức, chẳng hạn như `add`, `sub`, `mul`, `div`, `rem`, v.v. , đây là các phép toán cơ bản của các phép toán số nguyên lớn.
5. `pub fn from(&self, val: u 64) ->Self`: Phương thức này được sử dụng để lấy từ a u  ; Tạo BigNatGadget với giá trị loại 64.
6. `pub fn to_u 64(&self) -> u 64 `: Phương pháp này được sử dụng để chuyển BigNatGadget thành A giá trị của loại u 64.
7. `pub fn eq(&self, other: &Self) -> bool`: Phương pháp này được sử dụng để đánh giá hai BigNatGadget là bình đẳng.
Nói chung, tệp này cung cấp một công cụ để xử lý các số nguyên lớn, bao gồm tạo các số nguyên lớn, chuyển đổi các số nguyên lớn sang các loại giá trị khác và thực hiện các thao tác cơ bản trên các số nguyên lớn. số nguyên.
Trong mật mã, các trường không phải gốc thường đề cập đến 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ã hóa có thể yêu cầu các thao tác trên các trường lớn hơn 64 bit, nhưng hầu hết phần cứng máy tính hiện đại chỉ hỗ trợ trực tiếp các hoạt động lên tới 64 bit. Trong trường hợp này, chúng ta cần sử dụng các phép toán số học trên các trường không cục bộ.
Trong file này, bạn sẽ thấy các phần chính sau:
1 . `OptionExt ` đặc điểm: đặc điểm này thêm hai phương thức vào loại `Option`, `grab` và `grab_mut`, cố gắng lấy giá trị trong `Option` if `Option ` is `None`, một lỗi Được trả lại.
2. Đặc điểm `BitAccess`: đặc điểm này cung cấp một phương thức `get_bit`, chấp nhận một chỉ mục `i` và trả về Liệu bit ở vị trí chỉ mục là ` 1 `.
3. `impl BitAccess for Scalar`: Đây là cách triển khai đặc điểm `BitAccess` của loại `Scalar`, đại diện cho trường số nguyên tố.
4. `pub mod bignat;` và `pub mod util;`: Hai dòng mã này import `bignat` và ` util` hai mô-đun con, có thể chứa một số hàm hoặc lớp thực hiện các phép toán số học trên các trường không cục bộ.
Nói chung, tệp này cung cấp một cách để thực hiện các phép tính số học trên các trường không cục bộ, điều này rất quan trọng để triển khai một số thuật toán mã hóa nhất định.
Sau đây là một số phần chính của tệp này:
1. `  ;Bit  ;` Cấu trúc: Cấu trúc này biểu thị một bit chứa tổ hợp tuyến tính và một giá trị được điền vào tại thời điểm chứng kiến.
2. Cấu trúc `Bitvector`: Cấu trúc này biểu thị một vectơ bit, bao gồm vectơ tổ hợp tuyến tính, vectơ giá trị và vectơ bit được phân bổ .
3. Cấu trúc `Num`: Cấu trúc này biểu thị một số và chứa tổ hợp tuyến tính và một giá trị.
4. Phương thức `alloc` của cấu trúc Bit`: Phương thức này phân bổ một biến trong hệ thống ràng buộc chỉ có thể là giá trị Boolean.
5. Phương thức `fits_in_bits` của cấu trúc `Num`: Phương thức này kiểm tra xem một số có thể được biểu diễn bằng một số bit nhất định hay không.
6. Phương thức `is_equal` của cấu trúc `Num`: Phương thức này kiểm tra xem một số có bằng số tự nhiên được biểu thị bằng một vectơ bit hay không.
7. Phương thức `decompose` của cấu trúc `Num`: Phương thức này phân tách một số thành một vectơ bit.
8. Phương thức `as_allocated_num` của cấu trúc `Num`: Phương thức 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 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.
Nói chung, tệp này cung cấp một số hàm tiện ích có thể thực hiện nhiều thao tác khác nhau trên các trường không cục bộ, chẳng hạn như gán biến và kiểm tra một số. được biểu diễn bằng một số bit nhất định, chia một số thành một vectơ bit, v.v.
R 1 CS là một hệ thống chứng minh được sử dụng để mô tả các thuật toán hoặc giao thức. Nó là cơ sở cho nhiều hệ thống chứng minh không có kiến thức, bao gồm zk- SNARK .
Sau đây là một số phần chính của tệp này:
1. `AllocatedR  ;1  ;Cấu trúc CSInstance`: Cấu trúc này đại diện cho một phiên bản R 1 CS được phân bổ, chứa một điểm `W` và hai số `X 0 ` và `X 1  ;`.
2. Phương thức `AllocatedR1CSInstance::alloc`: Phương thức này được sử dụng để phân bổ một phiên bản R 1 CS trong hệ thống ràng buộc.
3. Phương thức `AllocatedR1CSInstance::absorb_in_ro`: Phương thức này được sử dụng để hấp thụ R 1 CS vào phần giữa oracle (RO) ngẫu nhiên.
4. Cấu trúc `AllocatedRelaxedR1CSInstance`: Cấu trúc này đại diện cho một cá thể R 1 CS được phân bổ thoải mái, chứa hai điểm ` W` và `E` , một số `u` và hai số nguyên lớn `X 0 ` và `X 1 `.
5. Phương thức `AllocatedRelaxedR1CSInstance::alloc`: Phương thức này được sử dụng để phân bổ một cá thể R 1 CS thoải mái trong hệ thống ràng buộc.
6. Phương thức `AllocatedRelaxedR1CSInstance::default`: Phương thức này được sử dụng để phân bổ một phiên bản Relax R 1 CS mặc định trong hệ thống ràng buộc.
7. Phương thức `AllocatedRelaxedR1CSInstance::from_r 1 cs_instance`: Phương thức này được sử dụng để chuyển đổi một phiên bản R 1 CS thành một phiên bản  ;R  thoải mái ;1 phiên bản CS.
8. Phương thức `AllocatedRelaxedR1CSInstance::absorb_in_ro`: Phương thức này được sử dụng để hấp thụ thể hiện R 1 CS thoải mái vào oracle ngẫu nhiên (RO ) ở giữa.
9. Phương thức `AllocatedRelaxedR 1 CSInstance::fold_with_r 1 cs`: Phương thức này được sử dụng để kết hợp phiên bản R 1 CS thoải mái với Một phiên bản của R 1 CS bị thu gọn và kết quả được trả về.
10. Phương thức `AllocatedRelaxedR1CSInstance::conditionally_select`: Phương thức này được sử dụng để chọn một trong hai phiên bản R 1 CS thoải mái dựa trên một điều kiện.
Tóm lại, tệp này cung cấp các công cụ để làm việc với R 1 CS, bao gồm việc tạo R 1 CS phiên bản , chuyển đổi R 1  ;phiên bản CS thành phiên bản R 1 CS thoải mái, kết hợp R 1 CS thành một oracle ngẫu nhiên, chuyển đổi phiên bản R 1 CS thoải mái bằng cách gấp R 1 CS, vân vân.
Sau đây là một số phần chính của tệp này:
1. Hàm `le_bits_to_num` : Hàm này chấp nhận một mảng bit được biểu thị bằng little endian và trả về giá trị tương ứng.
2. Hàm `alloc_zero` và `alloc_one`: Hai hàm này được sử dụng để gán giá trị 0 và giá trị 0 tương ứng trong hệ thống ràng buộc .Một biến của một.
3. Hàm `alloc_scalar_as_base`: Hàm này được sử dụng để cấp phát một đại lượng vô hướng làm cơ số trong hệ thống ràng buộc.
4. Hàm `scalar_as_base`: Hàm này được sử dụng để diễn giải một đại lượng vô hướng làm cơ số.
5. Hàm `alloc_bignat_constant`: Hàm này dùng để cấp phát 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 xem hai số có bằng nhau hay không và trả về một bit.
7. Hàm `conditionally_select`: Hàm này được sử 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 được sử dụng để chọn một trong hai số dựa trên một điều kiện, đó là số được phân bổ.
11. Hàm `select_zero_or_num 2 ` và `select_num_or_zero 2 `: Hai hàm này được sử dụng để đặt một số dựa trên một điều kiện. bằng 0 hoặc không thay đổi, điều kiện là một số được gán.
12. Hàm `select_num_or_zero`: Hàm này được sử dụng để đặt một số về 0 hoặc giữ nguyên số đó dựa trên một điều kiện, đó là giá trị Boolean.
13. Hàm `select_one_or_num 2 ` và `select_num_or_one`: Hai hàm này được sử dụng để đặt một số thành một hoặc một theo một điều kiện. Không thay đổi, điều kiện là một số được gán và một giá trị boolean.
Nói chung, tệp này cung cấp một số hàm tiện ích có thể gán các biến trong hệ thống ràng buộc, kiểm tra xem hai số có bằng nhau không và chọn một trong hai số, vân vân.
1. `pub mod ast`: Dòng mã này nhập một mô-đun có tên "ast". "ast" là tên viết tắt của "Cây cú pháp trừu tượng", một cấu trúc dữ liệu được sử dụng để thể hiện cấu trúc của mã nguồn. Trong dự án Nova, mô-đun "ast" có thể chứa nhiều cấu trúc dữ liệu và chức năng khác nhau để phân tích cú pháp và xử lý mã nguồn ngôn ngữ Nova.
2. `pub mod parser`: Dòng mã này nhập vào một mô-đun có tên "parser". "Trình phân tích cú pháp" có nghĩa là "trình phân tích cú pháp" và mô-đun này có thể chứa các hàm và lớp để phân tích mã nguồn ngôn ngữ Nova.
3. `pub mod codegen`: Dòng mã này nhập vào một mô-đun có tên "codegen". "codegen" là tên viết tắt của "tạo mã" và mô-đun này có thể chứa các chức năng và loại.
4. `pub mod type`: Dòng mã này nhập vào một mô-đun có tên "types". Mô-đun này có thể chứa hệ thống loại ngôn ngữ Nova, bao gồm việc biểu diễn và xử lý các loại tích hợp và do người dùng xác định khác nhau.
5. `pub mod util`: Dòng mã này nhập vào một mô-đun có tên "util". "util" là tên viết tắt của "utilities" (tiện ích). Mô-đun này có thể chứa nhiều chức năng và lớp thực tế khác nhau, chẳng hạn như xử lý lỗi, ghi nhật ký, đọc và ghi tệp, v.v.
6. `pub mod driver`: Dòng mã này nhập vào một mô-đun có tên "driver". Trong dự án trình biên dịch, "trình điều khiển" thường đề cập đến mô-đun kiểm soát 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, tạo mã, tối ưu hóa và đầu ra.
7. `lỗi pub mod`: Dòng mã này nhập vào một mô-đun có tên "error". Mô-đun này có thể chứa hệ thống xử lý lỗi của ngôn ngữ Nova, bao gồm việc trình bày và xử lý các lỗi biên dịch và lỗi thời gian chạy khác nhau.
8. `pub mod config`: Dòng mã này nhập một mô-đun có tên "config". Mô-đun này có thể chứa hệ thống cấu hình ngôn ngữ Nova, bao gồm việc 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.
Chức năng chính của tệp này là tổ chức các thành phần khác nhau của ngôn ngữ Nova (chẳng hạn như trình phân tích cú pháp, trình tạo mã, hệ thống kiểu, hệ thống xử lý lỗi, v.v.). ) Cùng nhau, chúng tạo thành một thư viện trình biên dịch hoàn chỉnh.
Tệp này có tên "nifs.rs". Nằm ở thư mục "src/". Tệp này triển khai Sơ đồ gấp không tương tác (NIFS). Đây là giao thức mật mã được sử dụng để chứng minh tính đúng đắn của từng bước trong phép tính tăng dần.
Sau đây là một số phần chính của tập tin này:
1. Cấu trúc `NIFS`: Cấu trúc này biểu thị một SNARK chứa bằng chứng về một bước tính toán gia tăng. Nó chứa một trường có tên `comm_T`, là một Cam kết được nén.
2. Phương thức `chứng minh`: Phương thức này chấp nhận cặp nhân chứng R 1 CS lỏng lẻo `(U 1, W  ;1) ` và một R 1 Cặp nhân chứng phiên bản CS `(U 2, W 2)`, có cùng cấu trúc `hình dạng` và có liên quan đến cùng một `ck ` định nghĩa. Sau đó, nó xuất ra một cặp nhân chứng phiên bản R 1 CS `(U, W)` lỏng lẻo, có cùng cấu trúc `hình dạng`. Nhân chứng bị thu gọn `W` thỏa mãn trường hợp thu gọn nếu `W 1 ` thỏa mãn `U 1 ` và `W 2 ` thỏa mãn `U 2 ` `U`.
3. Phương thức `xác minh`: Phương thức này chấp nhận một phiên bản R 1 CS lỏng lẻo `U 1 ` và một R 1 phiên bản CS ` U 2 `, có cùng cấu trúc và được xác định theo cùng một tham số. Sau đó nó xuất ra một thể hiện thu gọn của `U`, với cùng cấu trúc. Nếu `U 1 ` và `U 2 ` thỏa mãn, thì phiên bản thu gọn `U` thỏa mãn.
4. Mô-đun kiểm tra: Mô-đun này chứa một số chức năng kiểm tra để kiểm tra `chứng minh` và ` của phương pháp `Xác minh cấu trúc NIFS`.
Tóm lại, tệp này triển khai một sơ đồ gấp không tương tác, một giao thức mã hóa để chứng minh từng bước một đều đúng. Ưu điểm chính của sơ đồ này là nó thu gọn nhiều bằng chứng thành một bằng chứng duy nhất, do đó giảm chi phí lưu trữ và truyền tải bằng chứng.
Tệp này có tên "ipa_pc.rs" và nó nằm trong thư mục "src/provider/". Tệp này triển khai một công cụ đánh giá bằng cách sử dụng sơ đồ cam kết đa thức dựa trên IPA (Đối số sản phẩm bên trong).
Dưới đây là một số phần chính của tệp này:
1. Cấu trúc `ProverKey`: Cấu trúc này đại diện cho khóa chứng minh, chứa khóa cam kết `ck_s`.
2. Cấu trúc `VerifierKey`: Cấu trúc này đại diện cho một khóa 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 tham số tích bên trong `ipa`.
4. Cấu trúc `EvaluationEngine`: Cấu trúc này thể hiện một công cụ đánh giá đa thức sử dụng IPA.
5. Triển khai đặc điểm `EvaluationEngineTrait`: Việc triển khai đặc điểm này cung cấp chức năng chính của công cụ đánh giá đa thức, bao gồm thiết lập, chứng minh và xác minh.
6. Hàm `inner_product`: Hàm này tính tích bên trong của hai vectơ.
7. Cấu trúc `InnerProductInstance`: Cấu trúc này đại diện cho một phiên bản sản phẩm bên trong, chứa cam kết của một vector `a` `comm_a_vec` , một cấu trúc khác vector `b_vec` và một giá trị `c` xác nhận `c = <a, b>`.
8. Cấu trúc `InnerProductWitness`: Cấu trúc này biểu thị một nhân chứng sản phẩm bên trong, chứa một vectơ `a_vec`.
9. Cấu trúc `InnerProductArgument`: Cấu trúc này biểu thị một tham số sản phẩm bên trong, chứa hai vectơ cam kết nén `L_vec` và ` R_vec`, và một vô hướng `a_hat`.
Tóm lại, tệp này triển khai một công cụ đánh giá bằng cách sử dụng sơ đồ cam kết đa thức dựa trên IPA, một giao thức mật mã để Chứng minh đánh giá đa thức tại một điểm nhất định trong một bằng chứng không có kiến thức. Ưu điểm chính của sơ đồ này là nó có thể chứng minh giá trị đánh giá của đa thức mà không tiết lộ chính đa thức đó, do đó bảo vệ tính riêng tư của đa thức.
Tệp này có tên là "keccak.rs" và nó nằm trong thư mục "src/provider/". Tệp này triển khai TranscriptEngineTrait sử dụng hàm băm Keccak 256. TranscriptEngineTrait là đặc điểm được sử dụng để xử lý bản ghi trong quy trình chứng minh không có kiến thức. Bản ghi là cấu trúc dữ liệu ghi lại tất cả các bước tương tác trong quy trình chứng minh.
Dưới đây là một số phần chính của tệp này:
1. Cấu trúc `Keccak 256 Transcript`: Cấu trúc này triển khai TranscriptEngineTrait, sử dụng Keccak 256 hàm băm để xử lý transcript. Nó chứa trường vòng để ghi lại số vòng hiện tại, trường trạng thái để lưu trạng thái băm hiện tại, trường bản ghi để lưu bản ghi và trường _p để lưu thông tin loại.
2. Hàm `compute_updated_state`: Hàm này chấp nhận một đầu vào và sau đó tính toán trạng thái băm được cập nhật.
3. Triển khai `TranscriptEngineTrait`: Việc triển khai trait này cung cấp các chức năng chính của việc xử lý bản ghi, bao gồm tạo bản ghi mới, bắt đầu Trích xuất một thử thách từ ;bản ghi, thêm một phần tử vào bản ghi và thêm dấu tách tên miền.
4. Mô-đun kiểm tra: Mô-đun này chứa một số chức năng kiểm tra để kiểm tra chức năng của cấu trúc `Keccak 256 Transcript`.
Tóm lại, tệp này triển khai TranscriptEngineTrait bằng cách sử dụng hàm băm Keccak 256, đây là một phương pháp xử lý các Công cụ không có kiến thức cho bản ghi trong quy trình chứng minh. Ưu điểm chính của công cụ này là nó có thể xử lý bản ghi mà không tiết lộ các bước tương tác trong quy trình chứng minh, do đó bảo vệ quyền riêng tư của quy trình chứng minh.
Tệp này có tên là "mod.rs" và nó nằm trong thư mục "src/provider/". Tệp này chủ yếu được sử dụng để nhập các mô-đun triển khai khác nhau trong dự án Nova, cung cấp các chức năng khác nhau mà dự án Nova yêu cầu.
Dưới đây là một số phần chính của tệp này:
1. `pub mod ipa_pc;`: Dòng mã này nhập một mô-đun có tên "ipa_pc". Mô-đun này triển khai một công cụ đánh giá bằng cách sử dụng sơ đồ cam kết đa thức dựa trên IPA (Đối số sản phẩm bên trong).
2. `pub mod keccak;`: Dòng mã này nhập vào một mô-đun có tên "keccak". Mô-đun này triển khai TranscriptEngineTrait bằng hàm băm Keccak 256.
3. `pub mod mì ống;`: Dòng mã này nhập vào một mô-đun có tên "pasta". Mô-đun này có thể chứa các hàm và lớp sử dụng đường cong Pasta.
4. `pub mod pedersen;`: Dòng mã này nhập một mô-đun có tên "pedersen". Mô-đun này có thể chứa các hàm và lớp sử dụng lời hứa Pedersen.
5. `pub mod poseidon;`: Dòng mã này nhập vào một mô-đun có tên "poseidon". Mô-đun này có thể chứa các hàm và lớp sử dụng hàm băm Poseidon.
Nói chung, mục đích chính của tệp này là tích hợp các thành phần khác nhau của dự án Nova (chẳng hạn như công cụ đánh giá, TranscriptEngineTrait, Pasta Curve, Pedersen Commitment , hàm băm Poseidon, v.v.) được tổ chức cùng nhau để tạo thành một thư viện mật mã hoàn chỉnh.
Tên tệp: `src/r 1 cs.rs`
Tệp này xác định các loại và phương thức liên quan đến Hệ thống ràng buộc Rank-1 (R 1 CS). R 1 CS là một hệ thống ràng buộc được sử dụng rộng rãi trong các hệ thống chứng minh không có kiến thức.
Chủ yếu xác định các cấu trúc sau và phương thức của chúng:
1. `R  ;1 CS<G: Group>`: Cấu trúc này thể hiện các tham số công khai của a R 1 CS . Nó chứa một phương thức `commitment_key` được sử dụng để tạo các tham số công khai của R 1CS .
2. `R 1 CSShape<G: Group>`: Cấu trúc này thể hiện hình dạng của ma trận R 1 CS , bao gồm The số ràng buộc, số lượng biến, số lượng đầu vào/đầu ra và ba ma trận A, B và C. Nó chứa các phương thức như `new` để tạo một đối tượng `R 1 CSShape` từ một ma trận `R 1 CS được chỉ định rõ ràng, `multiply_vec` để tính tích của một ma trận và một vectơ, ` is_sat_relaxed` và `is_sat` được sử dụng để kiểm tra xem nhân chứng đã cho và hình dạng của nó có đáp ứng Thư giãn phiên bản R 1 CS và R 1 CS phiên bản hay không, `commit_T` được sử dụng để tính toán Thư giãn R 1 CS  đã cho ;Cặp nhân chứng và R 1 CS Thuật ngữ chéo của cặp nhân chứng `Lời hứa của T`, `pad` được sử dụng để điền R 1 CSShape sao cho số lượng của biến là lũy thừa của 2, và các biến được đánh số lại để phù hợp với các biến đã điền.
3. `R 1 CSWitness<G: Group>`: Cấu trúc này thể hiện sự chứng kiến của cá thể R 1 CS đã cho và chứa một số phương thức , chẳng hạn như vì `new` được sử dụng để tạo đối tượng nhân chứng bằng cách sử dụng vectơ vô hướng và `commit` được sử dụng để cam kết với nhân chứng bằng cách sử dụng trình tạo được cung cấp.
4. `R 1 CSInstance<G: Group>`: Cấu trúc này đại diện cho một thể hiện R 1 CS , bao gồm một số Phương thức như `new` được sử dụng để tạo các đối tượng cá thể bằng cách sử dụng các phần tử cấu thành.
5. `RelaxedR 1 CSWitness<G: Group>`: Cấu trúc này thể hiện sự chứng kiến của phiên bản R RelaxedR 1 CS đã cho , bao gồm một số phương thức, chẳng hạn như `default` được sử dụng để tạo RelaxedR 1 CSWitness mặc định, `from_r 1 cs_witness` được sử dụng để khởi tạo một RelaxedR 1  ;CSWitness mới, `commit` được sử dụng để cam kết nhân chứng sử dụng trình tạo được cung cấp, `fold` được sử dụng để gấp R 1 CSWitness đến với nhân chứng hiện tại, `pad` được sử dụng để cam kết phần đệm của nhân chứng được cung cấp có độ dài chính xác.
6. `RelaxedR 1 CSInstance<G: Group>`: Cấu trúc này đại diện cho một thể hiện RelaxedR 1 CS , bao gồm một số phương thức, chẳng hạn như `default` được sử dụng để tạo RelaxedR 1 CSInstance mặc định, `from_r 1 cs_instance` được sử dụng để khởi tạo RelaxedR 1 CSInstance mới từ R 1 CSInstance `from_r1cs_instance _unchecked` được sử dụng để khởi tạo một RelaxedR 1 CSInstance mới từ R 1 CSInstance (không cần kiểm tra), `fold` được sử dụng để gấp RelaxedR 1 CSInstance
Tên tệp: `src/spartan/math.rs`
Tệp này xác định một đặc điểm có tên `Math` và cách triển khai loại `usize`. Đặc điểm này xác định một số phép toán, bao gồm tăng lũy thừa 2, lấy bit nhị phân và tính logarit.
1. Đặc điểm `Toán học` xác định các phương pháp sau:
  ; - `pow 2(self) -> usize`: Tính 2 theo sức mạnh của self .
- `get_bits(self, num_bits: usize) -> Vec<bool>`: Lấy biểu diễn nhị phân của self num_bits bit đầu tiên.
- `log_ 2(self) -> usize`: Tính self với 2 làm cơ số Logarit của.
2. Đối với loại `usize`, tất cả các phương thức của đặc điểm `Math` đều được triển khai:
- `pow 2(self) -> usize`: Sử dụng hàm `pow` tích hợp để tính self sức mạnh của 2 .
- `get_bits(self, num_bits: usize) -> Vec<bool>`: Có được thông qua dịch chuyển bitwise và các phép toán AND bitwise num_bits bit đầu tiên của biểu diễn nhị phân của self .
- `log_ 2(self) -> usize`: Nếu self là sức mạnh của 2 , Thì sử dụng phương pháp `số_0 dẫn đầu` để tính logarit của self với cơ số 2 ; mặt khác, sử dụng phương thức `số_0 dẫn đầu` và phương thức `số_0 dẫn đầu` của giá trị lớn nhất của `usize` để tính cơ số 2 Lôgarit của  ;bản thân .
Tệp này cung cấp một số phép toán cơ bản có thể được các phần khác của mã sử dụng để triển khai các hàm phức tạp hơn.
Tên tệp: src/spartan/mod.rs
Mô-đun này triển khai RelaxedR1CSSNARKTrait bằng cách sử dụng Spartan, đây là một tham số đánh giá và cam kết đa thức chung (tức là PCS).
Sau đây là một số cấu trúc và chức năng chính:
1. `PolyEvalWitness`: Đây là là cấu trúc chứa chứng minh của đa thức.
2. `PolyEvalInstance`: Đây là một cấu trúc chứa một thể hiện của đánh giá đa thức.
3. `ProverKey` và `VerifierKey`: Hai cấu trúc này lần lượt đại diện cho khóa của người chứng minh và khóa của người xác minh.
4. `RelaxedR 1 CSSNARK`: Cấu trúc này thể hiện bằng chứng ngắn gọn về kiến thức về một phiên bản R 1 CS thoải mái R 1 CS . Bằng chứng được tạo ra bằng cách sử dụng kết hợp phép kiểm tra tổng của Spartan và các vectơ được coi là các cam kết đa thức.
5. `setup`: Chức năng này được sử dụng để thiết lập các khóa chứng nhận và xác minh.
6. `chứng minh`: Hàm này được sử dụng để tạo ra bằng chứng ngắn gọn về sự hài lòng của một phiên bản R 1 CS thoải mái.
7. `verify`: Hàm này được sử dụng để xác minh bằng chứng hài lòng của một phiên bản R 1 CS thoải mái.
Mã trong mô-đun này chủ yếu liên quan đến bằng chứng không có kiến thức trong mật mã, đặc biệt là về bằng chứng R 1 CS (Hệ thống ràng buộc hạng 1). R 1 CS là một hệ thống xây dựng các bằng chứng không có kiến thức, có thể được sử dụng để chứng minh rằng người ta biết một nghiệm thỏa mãn một tập hợp các phương trình đa thức mà không cần phải tiết lộ bất kỳ thông tin nào về nghiệm đó. Spartan là một hệ thống chứng minh không có kiến thức cụ thể sử dụng thứ gọi là R1CS "thoải mái", cho phép sử dụng tính ngẫu nhiên trong bằng chứng, từ đó nâng cao hiệu quả.
Tên tệp: src/spartan/polynomial.rs
Tệp này xác định một số loại và phép toán cơ bản liên quan đến đa thức. Các loại và phép toán này được sử dụng để thực hiện các phép tính đa thức trong giao thức Spartan.
Sau đây là một số phần chính của tập tin này:
1. `EqPolynomial`: Cấu trúc này đại diện cho một đa thức phương trình. Nó chứa một phương thức `new` để tạo một đa thức mới, một phương thức `evaluate` để đánh giá đa thức tại một điểm được chỉ định và một phương thức `evals` để đánh giá đa thức trên tất cả các đầu vào Boolean.
2. `Đa thức tuyến tính`: Cấu trúc này biểu diễn một đa thức đa tuyến tính. Nó chứa một phương thức `new` để tạo một đa thức mới, một phương thức `get_num_vars` để lấy số biến của đa thức, một phương thức `bound_poly_var_top` để liên kết các biến của đa thức với đầu và một phương thức `evaluate` Được sử dụng để đánh giá một đa thức tại một điểm xác định.
3. `SparsePolynomial`: Cấu trúc này biểu thị một đa thức thưa thớt. Nó chứa phương thức `new` để tạo đa thức mới và phương thức `evaluate` để đánh giá đa thức tại một điểm được chỉ định.
Mã trong tệp này chủ yếu liên quan đến các phép tính đa thức trong mật mã, đặc biệt là tính toán đa thức đa tuyến tính và đa thức thưa thớt. Những tính toán này đóng một vai trò quan trọng trong các hệ thống chứng minh không có kiến thức vì chúng có thể được sử dụng để xây dựng các bằng chứng phức tạp mà không cần phải tiết lộ bất kỳ thông tin nào về bằng chứng.
`src/spartan/pp.rs` là một tệp ngôn ngữ Rust trong dự án Nova. Tệp này chủ yếu thực hiện chức năng của bộ tiền xử lý trong Nova. Bộ tiền xử lý là một giai đoạn trong quá trình biên dịch, thực hiện một số xử lý trên mã trước khi biên dịch thực tế.
Cấu trúc và chức năng chính trong file này bao gồm:
1.`struct Preprocessor` : Đây là cấu trúc tiền xử lý, chứa một số trạng thái và dữ liệu được yêu cầu bởi bộ tiền xử lý.
2. `Impl Preprocessor`: Đây là cách triển khai cấu trúc `Preprocessor` và chứa một số phương thức.
3. `fn new(source: String) ->Self`: Đây là hàm tạo của `Preprocessor`, được sử dụng để tạo một `Preprocessor `Example.
4. `fn preprocess(&mut self) ->Result<(), Error>`: Đây là chức năng chính của bộ tiền xử lý. Nó Tiền xử lý mã nguồn đầu vào và trả về kết quả xử lý. Nếu xảy ra lỗi trong quá trình xử lý, nó sẽ trả về lỗi.
5. `fn next_token(&mut self) ->Result<Token, Error>`: Hàm này được sử dụng để lấy token tiếp theo từ mã nguồn mã thông báo. Nếu xảy ra lỗi trong quá trình xử lý, nó sẽ trả về lỗi.
6. `fn Skip_whitespace(&mut self)`: Hàm này được sử dụng để bỏ qua các ký tự khoảng trắng trong mã nguồn.
7. `fn Skip_comment(&mut self) ->Result<(), Error>`: Hàm này dùng để bỏ qua mã nguồn Lưu ý . Nếu xảy ra lỗi trong quá trình xử lý, nó sẽ trả về lỗi.
8. `fn read_number(&mut self) ->Result<Token, Error>`: Hàm này được sử dụng để đọc một số. Nếu xảy ra lỗi trong quá trình xử lý, nó sẽ trả về lỗi.
9. `fn read_identifier(&mut self) ->Result<Token, Error>`: Hàm này được sử dụng để đọc mã định danh. Nếu xảy ra lỗi trong quá trình xử lý, nó sẽ trả về lỗi.
10. `fn read_string(&mut self) ->Result<Token, Error>`: Hàm này dùng để đọc token từ nguồn chuỗi mã. Nếu xảy ra lỗi trong quá trình xử lý, nó sẽ trả về lỗi.
Nói chung, tệp `src/spartan/pp.rs` triển khai bộ tiền xử lý trong Nova, bộ tiền xử lý này xử lý trước mã nguồn, bao gồm bỏ qua các ký tự khoảng trắng và nhận xét, đọc số, số nhận dạng và chuỗi, v.v.
Tên tệp: src/spartan/sumcheck.rs
Tệp này triển khai thuật toán Sumcheck trong giao thức Spartan. Thuật toán Sumcheck là thuật toán để xác minh tổng các đa thức, được sử dụng rộng rãi trong các hệ thống chứng minh không có kiến thức.
Sau đây là một số phần chính của tệp này:
1. `SumcheckProof`: Cấu trúc này thể hiện bằng chứng Sumcheck . Nó chứa một phương thức `mới` để tạo bằng chứng mới, một phương thức `xác minh` để xác minh bằng chứng và một số phương thức `chứng minh` để tạo bằng chứng.
2. `UniPoly` và `CompressionUniPoly`: Hai cấu trúc này biểu diễn đa thức một biến và đa thức nén một biến. Chúng chứa các phương pháp tạo đa thức, đánh giá đa thức, đánh giá đa thức tại các điểm xác định cũng như nén và giải nén đa thức.
3. `TranscriptReprTrait`: trait này xác định một phương thức `to_transcript_bytes` để chuyển đổi các đối tượng thành chuỗi byte. Đây là một hoạt động phổ biến trong các hệ thống chứng minh không có kiến thức, vì nó có thể được sử dụng để thêm phần trình bày của một đối tượng vào bản ghi của bằng chứng.
Mã trong tệp này chủ yếu liên quan đến thuật toán Sumcheck trong mật mã, đặc biệt là tính toán và chứng minh đa thức. Những tính toán này đóng một vai trò quan trọng trong các hệ thống chứng minh không có kiến thức vì chúng có thể được sử dụng để xây dựng các bằng chứng phức tạp mà không tiết lộ bất kỳ thông tin nào về bằng chứng.
Tên tệp: src/traits/ Circuit.rs
Tệp này xác định một đặc điểm có tên `StepCircuit` và cấu trúc `TrivialTestCircuit` triển khai đặc điểm này. Đặc điểm và cấu trúc này có liên quan đến hàm bước tính toán tăng dần.
Sau đây là một số phần chính của tập tin này:
1. `StepCircuit ` đặc điểm : Đặc điểm này xác định cách phải triển khai hàm bước được tính toán tăng dần. Những phương pháp này bao gồm:
- `arity`: Trả về số lượng đầu vào hoặc đầu ra cho mỗi bước.
- `synthesize`: Tổng hợp một bước tính toán và trả về biến tương ứng với đầu ra của bước đó.
- `output`: Trả về đầu ra của bước khi đầu vào của nó được cung cấp.
2. Cấu trúc `TrivialTestCircuit`: Cấu trúc này triển khai đặc điểm `StepCircuit`, nó chỉ đơn giản trả về đầu vào. Cấu trúc này có thể được sử dụng để thử nghiệm hoặc như một hàm bước cơ bản.
Mã trong tệp này chủ yếu liên quan đến hàm bước tính toán tăng dần. Trong mật mã, tính toán gia tăng là một kỹ thuật phổ biến có thể được sử dụng để tính toán các hàm phức tạp theo từng bước thay vì phải tính toán toàn bộ hàm cùng một lúc. Kỹ thuật này đặc biệt hữu ích trong các hệ thống chứng minh không có kiến thức, vì nó có thể được sử dụng để xây dựng các bằng chứng phức tạp mà không cần phải tạo ra toàn bộ bằng chứng trong một lần.
Tên tệp: src/traits/commitment.rs
Tệp này xác định một số đặc điểm liên quan đến cam kết. Trong mật mã, cam kết là một cơ chế cho phép một người cam kết một giá trị mà không tiết lộ ngay lập tức. Điều này là cần thiết trong nhiều giao thức mật mã, chẳng hạn như bằng chứng không có kiến thức.
Sau đây là một số phần chính của tệp này:
1. `CommitmentOps ` đặc điểm : Đặc điểm này xác định các hoạt động cơ bản của lời hứa, bao gồm cả phép cộng và phép gán bổ sung.
2. Đặc điểm `CommitmentOpsOwned`: Đặc điểm này xác định các hoạt động cơ bản cho các tham chiếu sở hữu các cam kết.
3. Đặc điểm `ScalarMul`: Đặc điểm này xác định phép toán nhân của các lời hứa và các đại lượng vô hướng.
4. Đặc điểm `CommitmentTrait`: Đặc điểm này xác định hành vi của cam kết, bao gồm nhân bản, sao chép, mặc định, so sánh, gửi, đồng bộ hóa, tuần tự hóa và giải tuần tự hóa Transform , hấp thụ, vận hành, nén, giải nén, v.v.
5. Đặc điểm `CommitmentEngineTrait`: Đặc điểm này liên kết các phần khác nhau của quá trình tạo cam kết với nhau, bao gồm các khóa cam kết, cam kết, cài đặt, cam kết, v.v.
Mã trong tệp này chủ yếu liên quan đến các lời hứa trong mật mã. Những cam kết này đóng một vai trò quan trọng trong các hệ thống chứng minh không có kiến thức vì chúng có thể được sử dụng để xây dựng các bằng chứng phức tạp mà không tiết lộ bất kỳ thông tin nào về bằng chứng.
Tên tệp: src/traits/evaluation.rs
Tệp này xác định một đặc điểm được gọi là `EvaluationEngineTrait`. Đặc điểm này xác định hành vi của công cụ đánh giá đa thức, bao gồm thiết lập, chứng minh và xác minh.
Sau đây là một số phần chính của tệp này:
1. Đặc điểm `EvaluationEngineTrait` : Đặc điểm này xác định các phương thức mà công cụ đánh giá đa thức phải triển khai. Các phương pháp này bao gồm:
- `setup`: Phương pháp này được sử dụng để thực hiện mọi thiết lập bổ sung cần thiết nhằm tạo ra bằng chứng đánh giá.
- `chứng minh`: Phương pháp này dùng để chứng minh đánh giá một đa thức đa tuyến tính.
- `verify`: Phương pháp này dùng để kiểm chứng việc chứng minh đánh giá một đa thức đa tuyến tính.
Đặc điểm này cũng xác định một số loại liên kết, bao gồm:
  ; - `CE`: Đây là loại được liên kết với công cụ hứa hẹn.
- `ProverKey`: Đây là loại khóa chứng minh.
- `VerifierKey`: Đây là loại khóa xác minh.
- `EvaluationArgument`: Đây là loại đối số đánh giá.
Mã trong tệp này chủ yếu liên quan đến việc đánh giá đa thức trong mật mã. Đây là một bước quan trọng trong hệ thống chứng minh không có kiến thức vì nó có thể được sử dụng để chứng minh rằng người ta biết nghiệm thỏa mãn một tập phương trình đa thức mà không cần phải tiết lộ bất kỳ thông tin nào về nghiệm đó.
Tên tệp: src/traits/mod.rs
Tệp này là điểm vào chính cho mô-đun trong Nova dự án. Nó chủ yếu xác định một số đặc điểm được sử dụng cho các hoạt động mã hóa. Đặc điểm là một tính năng chính trong Rust xác định một loại trừu tượng có thể được triển khai bằng nhiều loại cụ thể khác nhau. Điều này cho phép chúng ta viết mã chung có thể xử lý bất kỳ loại giá trị nào thực hiện một đặc điểm cụ thể.
Sau đây là một số phần chính của tập tin này:
1. `Nhóm ` trait : Đặc điểm này xác định các hoạt động cơ bản của một nhóm, bao gồm sao chép, sao chép, mặc định, so sánh, gửi, đồng bộ hóa, tuần tự hóa, giải tuần tự hóa, hấp thụ, vận hành, nén, giải nén, v.v.
2. Đặc điểm `CompressionGroup`: Đặc điểm này xác định các hoạt động cơ bản của một nhóm nén, bao gồm nhân bản, sao chép, so sánh, gửi, đồng bộ hóa, tuần tự hóa và đảo ngược . Tuần tự hóa, v.v.
3. Đặc điểm `AbsorbInROTrait`: Đặc điểm này xác định phương thức `absorb_in_ro` để hấp thụ các đối tượng vào các oracle ngẫu nhiên ( Random Oracle) ở giữa.
4. Đặc điểm `ROTrait`: Đặc điểm này xác định hành vi của oracle ngẫu nhiên, bao gồm khởi tạo, hấp thụ và nén.
5. Đặc điểm `ROConstantsTrait`: Đặc điểm này xác định các hằng số của oracle ngẫu nhiên.
6. Đặc điểm `GroupOps`: Đặc điểm này xác định các hoạt động nhóm, bao gồm phép cộng, phép trừ, phép gán cộng và phép trừ.
7. Đặc điểm `ScalarMul`: Đặc điểm này xác định phép toán nhân vô hướng.
8. Đặc điểm `TranscriptReprTrait`: Đặc điểm này xác định phương thức `to_transcript_bytes` để chuyển đổi các đối tượng thành chuỗi byte.
9. Đặc điểm `TranscriptEngineTrait`: Đặc điểm này xác định hành vi của công cụ phiên mã, bao gồm khởi tạo, đùn, hấp thụ và thêm dấu phân cách trường.
Mã trong tệp này chủ yếu liên quan đến các hoạt động nhóm, các lời tiên tri ngẫu nhiên và công cụ phiên mã trong mật mã. Chúng đóng một vai trò quan trọng trong các hệ thống chứng minh không có kiến thức vì chúng có thể được sử dụng để xây dựng các bằng chứng phức tạp mà không cần phải tiết lộ bất kỳ thông tin nào về bằng chứng.
Tên tệp: src/traits/snark.rs
Tệp này xác định một đặc điểm được gọi là `RelaxedR1CSSNARKTrait`. Đặc điểm này xác định hành vi của một đối số không tương tác ngắn gọn, không có kiến thức (zkSNARK), đặc biệt dành cho Hệ thống ràng buộc Thư giãn Hạng 1 (R 1 CS Thư giãn).
Sau đây là một số phần chính của tệp này:
1. `RelaxedR1CSSNARKTrait ` đặc điểm : Đặc điểm này xác định một phương thức mà zkSNARK phải triển khai. Các phương thức này bao gồm:
- `setup`: Phương thức này được sử dụng để tạo khóa chứng minh và khóa xác minh.
- `prove`: Phương pháp này được sử dụng để tạo ra sự đơn giản thỏa mãn của một ví dụ R 1 CS thoải mái chứng minh.
- `verify`: Phương pháp này được sử dụng để xác minh bằng chứng về sự hài lòng của một thể hiện R 1 CS thoải mái .
Đặc điểm này cũng xác định một số loại liên kết, bao gồm:
  ; - `ProverKey`: Đây là loại prover key.
- `VerifierKey`: Đây là loại khóa xác minh.
Mã trong tệp này chủ yếu liên quan đến bằng chứng không có kiến thức trong mật mã, đặc biệt là bằng chứng về R 1 CS . R 1 CS là một hệ thống xây dựng các bằng chứng không có kiến thức, có thể được sử dụng để chứng minh rằng người ta biết một nghiệm thỏa mãn một tập hợp các phương trình đa thức mà không cần phải tiết lộ bất kỳ thông tin nào về nghiệm đó. zkSNARK là một hệ thống chứng minh không có kiến thức cụ thể cung cấp một cách hiệu quả để tạo và xác minh bằng chứng.
Bài viết này là từ một bài gửi và không thể hiện quan điểm của BlockBeats
Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:
Nhóm Telegram đăng ký: https://t.me/theblockbeats
Nhóm Telegram thảo luận: https://t.me/BlockBeats_App
Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia