paint-brush
Tạo dự án ZK đầu tiên của bạn bằng Risc0: Hướng dẫn cho người mới bắt đầutừ tác giả@luffysama
513 lượt đọc
513 lượt đọc

Tạo dự án ZK đầu tiên của bạn bằng Risc0: Hướng dẫn cho người mới bắt đầu

từ tác giả Luffy Sama13m2023/10/05
Read on Terminal Reader

dài quá đọc không nổi

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ẽ.
featured image - Tạo dự án ZK đầu tiên của bạn bằng Risc0: Hướng dẫn cho người mới bắt đầu
Luffy Sama HackerNoon profile picture

Giới thiệu :

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:

    • ngôn ngữ rỉ sét
    • Thùng gỗ chứa hàng hóa
  • 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ẽ.

Cài đặt :

  • (Đố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


  • Để xây dựng thành công các lệnh trên, bạn cần phải cài đặt các phần phụ thuộc cần thiết. brew install openssl brew install pkgconf


  • Tiếp theo, chúng ta sẽ cần cài đặt chuỗi công cụ 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ã.

Viết một số dòng huyền diệu:

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:


  1. 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.


  2. 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 .


    Lệnh tạo một mẫu cơ bản cho chúng ta gọi là nhân

  3. Bạn sẽ thấy một thư mục được tạo có tên là Multiple. cd vào đó. cd multiply


  4. Cấu trúc thư mục rất đơn giản.


    1. Chúng tôi có một thư mục máy chủ và một thư mục phương thức.


    2. 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.


    3. 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.


    4. 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.

  5. Hãy bắt đầu với chương trình dành cho khách mời.


    1. Hãy thay đổi tên của các tập tin main.rs —> multiply.rs .

    2. 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:

    3. Mở Cargo.toml và thay đổi bản cập nhật thành name = "method_name” —> name = "multiply” .

    4. Thêm mã bên dưới vào Cargo.toml .

       [[bin]] name = "multiply" path = "src/bin/multiply.rs"
    5. Vì vậy, Cargo.toml cuối cùng của bạn sẽ trông như thế này:

    6. 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.


      1. 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);
      2. Sau những thay đổi trên, multiply.rs của bạn sẽ trông như thế này.

    7. Có thêm một thay đổi cuối cùng trong thư mục Cargo.toml của methods .

    8. Mở và cập nhật giá trị của name = "multiply-methods” .


    9. Cargo.toml cuối cùng của bạn sẽ trông như bên dưới.

    10. Công việc của chúng tôi ở đây đã xong.

    11. Bây giờ chúng ta hãy đi đến chương trình chủ nhà.

      1. Thư mục máy chủ của bạn bây giờ trông như thế này.

      2. Chúng tôi muốn chia main.rs thành hai tệp là prover.rsverify.rs .


      3. Tạo một thư mục mới dưới src và đặt tên là bin .


      4. Xóa main.rs . Tạo các tệp và đặt tên chúng là verify.rs & prove.rs .


      5. Cấu trúc thư mục của bạn bây giờ trông giống như thế này.

      6. Mở prove.rs và bắt đầu viết mã:


      7. 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, };


      8. 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 !!"), }; }


      9. prove.rs cuối cùng của bạn sẽ trông như thế này.

      10. Hãy mở và thêm mã vào verify.rs của chúng tôi.


      11. Ở đâ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;


      12. 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 !!"), }; }


      13. verify.rs cuối cùng của bạn sẽ trông giống như thế này.

      14. 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.


      15. 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" }
      16. Cargo.toml của bạn sẽ trông như thế này.

    12. Cuối cùng cũng đến lúc xem mã của chúng ta có hoạt động hay không.


    13. 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


    14. 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.


    15. 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.


    Chúc mừng !!! về việc viết ứng dụng ZK đầu tiên của bạn bằng Risc0. Nếu bạn cần trợ giúp gì, vui lòng để lại bình luận cho tôi, tôi sẽ liên hệ lại với bạn.