Bằng chứng không có kiến thức cho phép giao dịch riêng tư, an toàn. Với zkSNARK và zkSTARK, người chứng minh có thể chứng minh việc sở hữu một số thông tin cho người xác minh mà không tiết lộ dữ liệu thực tế.
Điều này có tiềm năng rất lớn về tính ẩn danh và bảo mật. Nhưng zkSTARK và zkSNARK rất phức tạp. Risc0 làm cho chúng dễ tiếp cận hơn. Hãy xem cách thực hiện rất cơ bản:
Hướng dẫn này sẽ bao gồm:
Cài đặt Risc0
Viết chương trình chứng minh không có kiến thức đầu tiên của bạn bằng cách sử dụng Rust
Điều kiện tiên quyết:
Sao chép các phím tắt dán
Yêu cầu cài đặt:
Một số kiến thức code cơ bản trong Rust
Trình chỉnh sửa mã (VSCODE nếu có thể)
Cuối cùng, bạn sẽ có kinh nghiệm thực tế với các bằng chứng không có kiến thức trong Risc0. Không cần nền tảng toán học hoặc mật mã nâng cao.
Chúng ta sẽ tập trung vào những kiến thức cơ bản về mã hóa để bắt đầu xây dựng các giải pháp thực tế. Phần giới thiệu thực hành này nhằm mục đích làm cho bất kỳ nhà phát triển nào cũng có thể hiểu được công nghệ bảo mật mạnh mẽ.
(Đối với MacOS) Để cài đặt Rust và Cargo, bạn có thể chạy lệnh bên dưới trong terminal:
curl [https://sh.rustup.rs](https://sh.rustup.rs/) -sSf | sh
Để cài đặt Risc0, bạn chạy lệnh bên dưới sau khi cài đặt Rust và khởi động lại thiết bị đầu cuối:
cargo install cargo-risczero
brew install openssl
brew install pkgconf
risc0
với: cargo risczero install
Đó là tất cả những gì chúng ta cần. Vì vậy, hãy chuyển sang trình soạn thảo mã.
Bây giờ chúng tôi đã hoàn tất quá trình cài đặt, bạn có thể đọc và làm theo các bước abra kadabra 🪄 sau:
Mở trình soạn thảo mã và đi đến vị trí bạn muốn tạo dự án của mình trong thiết bị đầu cuối của trình soạn thảo.
Tạo một phiên bản mới của dự án bằng cách sử dụng lệnh bên dưới trong thiết bị đầu cuối: cargo risczero new multiply
.
Bạn sẽ thấy một thư mục được tạo có tên là Multiple. cd vào đó. cd multiply
Cấu trúc thư mục rất đơn giản.
Chúng tôi có một thư mục máy chủ và một thư mục phương thức.
Thư mục máy chủ chứa chương trình máy chủ mà chúng tôi gọi là chương trình khách. Nó cũng có khả năng xác minh nếu bạn muốn.
Thư mục phương thức chứa chương trình khách chứa phần ứng dụng zkvm đã được chứng minh. Nó nhận các thông số đầu vào từ máy chủ, sau đó dựa trên logic, nó tạo ra kết quả, đưa chúng vào nhật ký và gửi chúng đến máy chủ dưới dạng biên nhận.
Phần còn lại của các tập tin sẽ được giải thích khi đang di chuyển theo yêu cầu.
Hãy bắt đầu với chương trình dành cho khách mời.
Hãy thay đổi tên của các tập tin main.rs —> multiply.rs
.
Tạo một thư mục có tên bin
trong thư mục src
và di chuyển mutiply.rs
vào đó. Cấu trúc thư mục của bạn sẽ trông giống như thế này:
Mở Cargo.toml
và thay đổi bản cập nhật thành name = "method_name” —> name = "multiply”
.
Thêm mã bên dưới vào Cargo.toml
.
[[bin]] name = "multiply" path = "src/bin/multiply.rs"
Vì vậy, Cargo.toml
cuối cùng của bạn sẽ trông như thế này:
Bây giờ, hãy mở multiply.rs
. Ở đây chúng ta sẽ chỉnh sửa chức năng chính. Đây là chức năng sẽ được thực thi trong zkvm.
Trong đoạn mã dưới đây, chúng tôi lấy đầu vào từ chương trình máy chủ. Sau đó, chúng tôi đảm bảo rằng đầu vào không phải là các thừa số tầm thường bằng 1. Sau đó, chúng tôi tính toán tích và cuối cùng chuyển nó trở lại máy chủ của chương trình.
// We will get the values for these variables from host program let a:u64 = env::read(); let b:u64 = env::read(); // To avoid trivial factors like multiplication by 1 if a == 1 || b == 1 { panic!("Trivial factors !!") // The panic! macro in Rust is used to intentionally crash a program when an unrecoverable error occurs } // Caculate the product of the two numbers let product = a.checked_mul(b).expect("Integer Overflow"); // Commit back the output to the host to save it as receipt env::commit(&product);
Sau những thay đổi trên, multiply.rs
của bạn sẽ trông như thế này.
Có thêm một thay đổi cuối cùng trong thư mục Cargo.toml
của methods
.
Mở và cập nhật giá trị của name = "multiply-methods”
.
Cargo.toml
cuối cùng của bạn sẽ trông như bên dưới.
Công việc của chúng tôi ở đây đã xong.
Bây giờ chúng ta hãy đi đến chương trình chủ nhà.
Thư mục máy chủ của bạn bây giờ trông như thế này.
Chúng tôi muốn chia main.rs
thành hai tệp là prover.rs
và verify.rs
.
Tạo một thư mục mới dưới src
và đặt tên là bin
.
Xóa main.rs
. Tạo các tệp và đặt tên chúng là verify.rs
& prove.rs
.
Cấu trúc thư mục của bạn bây giờ trông giống như thế này.
Mở prove.rs
và bắt đầu viết mã:
Thêm mã dưới đây. Đây là những hàng nhập khẩu mà chúng tôi sẽ yêu cầu.
use multiply_methods::MULTIPLY_ELF; // It is a binary file of multiply_method use risc0_zkvm::{ default_prover, serde::{from_slice, to_vec}, ExecutorEnv, };
Hãy thực hiện các thay đổi đối với chức năng chính.
fn main() { // Declaring our secret input params let a: u64 = 17; let b: u64 = 23; // First, we construct an executor environment let env = ExecutorEnv::builder() .add_input(&to_vec(&a).unwrap()) // Passing the input params to environment so it can be used by gues proggram .add_input(&to_vec(&b).unwrap()) .build() .unwrap(); // Obtain the default prover. let prover = default_prover(); // Produce a receipt by proving the specified ELF binary. let receipt = prover.prove_elf(env, MULTIPLY_ELF).unwrap(); // Extract journal of receipt (ie output c, where c = a * b) let c: u64 = from_slice(&receipt.journal).unwrap(); // Print an assertion println!("Hello, world! I know the factors of {}, and I can prove it!", c); // Let's serialize the receipt so we can save it to an file for verifier program to verify. let serialized = bincode::serialize(&receipt).unwrap(); // Writing the serialized contect to receipt.bin file let _saved_file = match std::fs::write("./receipt.bin", serialized){ Ok(()) => println!("Receipt saved and serialized as receipt.bin"), Err(_) => println!("Something went wrong !!"), }; }
prove.rs
cuối cùng của bạn sẽ trông như thế này.
Hãy mở và thêm mã vào verify.rs
của chúng tôi.
Ở đây, chúng tôi sẽ nhập ID hình ảnh chương trình khách và một số mục nhập cơ bản.
use multiply_methods::MULTIPLY_ID; use risc0_zkvm::Receipt;
Hãy thực hiện các thay đổi đối với chức năng chính.
fn main(){ // Let's impor the receipt that was generated by prove let receipt_path ="./receipt.bin".to_string(); let receipt_file = std::fs::read(receipt_path).unwrap(); // As we has serialized the receipt we need to desrialize it let receipt = bincode::deserialize::<Receipt>(&receipt_file).unwrap(); // Let's verify if the receipt that was generated was not created tampered with let _verification = match receipt.verify(MULTIPLY_ID){ Ok(()) => println!("Proof is Valid"), Err(_) => println!("Something went wrong !!"), }; }
verify.rs
cuối cùng của bạn sẽ trông giống như thế này.
Tôi hứa đây là những thay đổi cuối cùng. Bây giờ, chúng ta gần như đã hoàn tất.
Mở Cargo.toml
trong thư mục host
và thực hiện các thay đổi bên dưới theo phần phụ thuộc.
multiply-methods = { path = "../methods" }
Cargo.toml của bạn sẽ trông như thế này.
Cuối cùng cũng đến lúc xem mã của chúng ta có hoạt động hay không.
Khởi động bảng điều khiển của bạn trong thư mục gốc của dự án và chạy lệnh bên dưới trong console cargo run --release --bin prove
Lệnh này sẽ tạo bằng chứng và biên nhận cho người xác minh.
Lần đầu chạy sẽ mất rất nhiều thời gian. Vì vậy, đừng lo lắng hãy uống cà phê cho đến khi nó hoàn thành.
Khi việc này hoàn tất, nếu muốn, bạn có thể xác minh biên nhận mà bạn đã tạo. Để làm điều đó, hãy chạy lệnh này cargo run --release --bin verify
Lần đầu chạy sẽ mất rất nhiều thời gian. Vì vậy, đừng lo lắng hãy uống cà phê cho đến khi nó hoàn thành.