paint-brush
Risc0을 사용하여 첫 번째 ZK 프로젝트 만들기: 초보자를 위한 가이드~에 의해@luffysama
618 판독값
618 판독값

Risc0을 사용하여 첫 번째 ZK 프로젝트 만들기: 초보자를 위한 가이드

~에 의해 Luffy Sama13m2023/10/05
Read on Terminal Reader

너무 오래; 읽다

마지막에는 Risc0의 영지식 증명에 대한 실무 경험을 갖게 됩니다. 고급 수학이나 암호화 배경이 필요하지 않습니다. 실제 솔루션 구축을 시작하기 위한 코딩 필수 사항에 중점을 둘 것입니다. 이 실습 소개는 모든 개발자가 강력한 개인 정보 보호 기술을 이해할 수 있도록 하는 것을 목표로 합니다.
featured image - Risc0을 사용하여 첫 번째 ZK 프로젝트 만들기: 초보자를 위한 가이드
Luffy Sama HackerNoon profile picture

소개 :

영지식 증명은 개인적이고 안전한 거래를 가능하게 합니다. zkSNARK 및 zkSTARK를 사용하면 증명자는 실제 데이터를 공개하지 않고도 검증자에게 일부 정보의 소유를 증명할 수 있습니다.


이는 익명성과 기밀성에 대한 엄청난 잠재력을 가지고 있습니다. 그러나 zkSTARK와 zkSNARK는 복잡합니다. Risc0을 사용하면 더 쉽게 접근할 수 있습니다. 매우 기본적인 구현을 살펴보겠습니다.


이 튜토리얼에서는 다음을 다룹니다.

  • Risc0 설치

  • Rust를 사용하여 첫 번째 영지식 증명 프로그램 작성


전제 조건:

  • 복사 붙여넣기 단축키

  • 필요한 설치:

    • 러스트 언어
    • 화물 상자
  • Rust의 몇 가지 기본 코딩 지식

  • 코드 편집기(가능한 경우 VSCODE)


마지막에는 Risc0의 영지식 증명에 대한 실무 경험을 갖게 될 것입니다. 고급 수학이나 암호화 배경이 필요하지 않습니다.


실제 솔루션 구축을 시작하기 위한 코딩 필수 사항에 중점을 둘 것입니다. 이 실습 소개는 모든 개발자가 강력한 개인 정보 보호 기술을 이해할 수 있도록 하는 것을 목표로 합니다.

설치 :

  • (MacOS의 경우) Rust 및 Cargo를 설치하려면 터미널에서 아래 명령을 실행하면 됩니다.

    curl [https://sh.rustup.rs](https://sh.rustup.rs/) -sSf | sh


  • Risc0을 설치하려면 Rust 설치 후 아래 명령을 실행하고 터미널을 다시 시작합니다.

    cargo install cargo-risczero


  • 위 명령을 성공적으로 빌드하려면 필수 종속성을 설치해야 합니다. brew install openssl brew install pkgconf


  • 다음으로 다음을 사용하여 risc0 툴체인을 cargo risczero install 해야 합니다.


그게 우리에게 필요한 전부입니다. 이제 코드 편집기로 가보겠습니다.

마법 같은 대사 쓰기:

이제 설치가 완료되었으므로 다음 abra kadabra 🪄 단계를 읽고 따라갈 수 있습니다.


  1. 코드 편집기를 열고 편집기 터미널에서 프로젝트를 생성하려는 위치로 이동합니다.


  2. 터미널에서 아래 명령을 사용하여 프로젝트의 새 인스턴스를 생성합니다: cargo risczero new multiply .


    이 명령은 곱셈이라는 기본 템플릿을 생성합니다.

  3. Multiply라는 폴더가 생성된 것을 볼 수 있습니다. CD에 넣으세요. cd multiply


  4. 폴더 구조는 매우 간단합니다.


    1. 호스트 폴더와 메소드 폴더가 있습니다.


    2. 호스트 폴더에는 게스트 프로그램이라고 부르는 호스트 프로그램이 포함되어 있습니다. 원하는 경우 확인할 수 있는 기능도 있습니다.


    3. 방법 폴더에는 입증된 zkvm 응용 프로그램의 일부가 포함된 게스트 프로그램이 포함되어 있습니다. 호스트로부터 입력 매개변수를 수신한 다음 논리에 따라 결과를 생성하고 이를 저널에 커밋한 후 호스트에 영수증으로 보냅니다.


    4. 나머지 파일은 필요에 따라 이동 중에 설명됩니다.

  5. 게스트 프로그램부터 시작하겠습니다.


    1. main.rs —> multiply.rs 파일의 이름을 변경해 보겠습니다.

    2. src 폴더에 bin 이라는 폴더를 만들고 mutiply.rs 그 폴더로 옮깁니다. 폴더 구조는 다음과 같아야 합니다.

    3. Cargo.toml 열고 업데이트를 name = "method_name” —> name = "multiply” 로 변경합니다.

    4. Cargo.toml 에 아래 코드를 추가하세요.

       [[bin]] name = "multiply" path = "src/bin/multiply.rs"
    5. 따라서 최종 Cargo.toml 은 다음과 같습니다.

    6. 이제 multiply.rs 엽니다. 여기서는 주요 기능을 편집하겠습니다. 이것은 zkvm에서 실행될 함수입니다.


      1. 아래 코드에서는 호스트 프로그램에서 입력을 받습니다. 그런 다음 입력이 1이라는 사소한 요소가 아닌지 확인합니다. 그런 다음 제품을 계산하고 마지막으로 프로그램 호스트에 다시 커밋합니다.

         // 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. 위의 변경 후, 귀하의 multiply.rs 다음과 같아야 합니다.

    7. Cargo.toml methods 폴더에는 마지막 변경 사항이 하나 더 있습니다.

    8. name = "multiply-methods” 값을 열고 업데이트합니다.


    9. 최종 Cargo.toml 은 아래와 같습니다.

    10. 여기서 우리의 일은 끝났습니다.

    11. 이제 호스트 프로그램으로 가보겠습니다.

      1. 이제 호스트 폴더가 다음과 같아야 합니다.

      2. 우리는 main.rs prover.rsverify.rs 라는 두 개의 파일로 분할하려고 합니다.


      3. src 아래에 새 폴더를 만들고 이름을 bin 으로 지정합니다.


      4. main.rs 제거하세요. 파일을 생성하고 이름을 verify.rs & prove.rs 로 지정하세요.


      5. 이제 폴더 구조는 다음과 같아야 합니다.

      6. prove.rs 열고 코딩을 시작해 보겠습니다.


      7. 아래 코드를 추가하세요. 이것이 우리가 필요로 하는 수입품입니다.

         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. main 함수를 변경해 보겠습니다.

         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 는 다음과 같아야 합니다.

      10. verify.rs 를 열고 코드를 추가해 보겠습니다.


      11. 여기서는 게스트 프로그램 이미지 ID와 일부 기본 가져오기를 가져옵니다.

         use multiply_methods::MULTIPLY_ID; use risc0_zkvm::Receipt;


      12. main 함수를 변경해 보겠습니다.

         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 는 다음과 같아야 합니다.

      14. 이것이 최종 변경 사항이라고 약속합니다. 이제 거의 완료되었습니다.


      15. host 폴더에서 Cargo.toml 열고 종속성 아래에서 다음과 같이 변경합니다.

         multiply-methods = { path = "../methods" }
      16. Cargo.toml은 다음과 같습니다.

    12. 드디어 코드가 작동하는지 확인할 시간입니다.


    13. 프로젝트의 루트 디렉터리에서 콘솔을 실행하고 console cargo run --release --bin prove 에서 아래 명령을 실행하세요.


    14. 이 명령은 검증자에게 증명과 영수증을 생성합니다.


      처음 실행하면 시간이 많이 걸립니다. 그러니 완료될 때까지 걱정하지 말고 커피를 마시세요.


    15. 이 작업이 완료되면 원하는 경우 생성한 영수증을 확인할 수 있습니다. 이를 위해 다음 명령을 실행하십시오. cargo run --release --bin verify


      처음 실행하면 시간이 많이 걸립니다. 그러니 완료될 때까지 걱정하지 말고 커피를 마시세요.


    축하해요 !!! Risc0을 사용하여 첫 번째 ZK 앱을 작성하는 방법에 대해 알아보세요. 도움이 필요하시면 댓글을 남겨주시면 연락드리겠습니다.