paint-brush
Создание вашего первого проекта ZK с использованием Risc0: руководство для начинающихк@luffysama
578 чтения
578 чтения

Создание вашего первого проекта ZK с использованием Risc0: руководство для начинающих

к Luffy Sama13m2023/10/05
Read on Terminal Reader

Слишком долго; Читать

К концу вы получите практический опыт работы с доказательствами с нулевым разглашением в Risc0. Никакого продвинутого математического или криптографического образования не требуется. Мы сосредоточимся на основах кодирования, чтобы начать создавать реальные решения. Это практическое введение призвано сделать мощную технологию обеспечения конфиденциальности понятной для любого разработчика.
featured image - Создание вашего первого проекта ZK с использованием Risc0: руководство для начинающих
Luffy Sama HackerNoon profile picture

Введение :

Доказательства с нулевым разглашением данных обеспечивают конфиденциальность и безопасность транзакций. С помощью zkSNARK и zkSTARK проверяющий может доказать наличие некоторой информации проверяющему, не раскрывая фактических данных.


Это имеет огромный потенциал для анонимности и конфиденциальности. Но zkSTARK и zkSNARK сложны. Risc0 делает их более доступными. Давайте посмотрим на очень простую реализацию:


В этом уроке будут рассмотрены:

  • Установка Риск0

  • Написание вашей первой программы доказательства с нулевым разглашением с использованием Rust


Предпосылки:

  • Копирование и вставка ярлыков

  • Требуются установки:

    • язык ржавчины
    • Грузовой ящик
  • Некоторые базовые знания программирования в Rust

  • Редактор кода (если возможно, VSCODE)


К концу вы получите практический опыт работы с доказательствами с нулевым разглашением в Risc0. Никакого продвинутого математического или криптологического образования не требуется.


Мы сосредоточимся на основах кодирования, чтобы начать создавать реальные решения. Это практическое введение призвано сделать мощную технологию обеспечения конфиденциальности понятной для любого разработчика.

Монтаж :

  • (Для MacOS) Чтобы установить Rust и Cargo, вы можете запустить в терминале следующую команду:

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


  • Чтобы установить Risc0, после установки ржавчины выполните следующую команду и перезапустите терминал:

    cargo install cargo-risczero


  • Для успешной сборки приведенных выше команд вам необходимо установить необходимые зависимости. brew install openssl brew install pkgconf


  • Далее нам нужно установить набор инструментов risc0 с помощью: cargo risczero install


Это все, что нам нужно. Итак, перейдем к редактору кода.

Написание некоторых волшебных строк:

Теперь, когда мы закончили установку, вы можете прочитать и выполнить следующие шаги abra kadabra 🪄:


  1. Откройте редактор кода и перейдите в место, где вы хотите создать свой проект, в терминале редактора.


  2. Создайте новый экземпляр проекта, используя в терминале следующую команду: cargo risczero new multiply .


    Команда создает для нас базовый шаблон под названием умножение.

  3. Вы должны увидеть созданную папку под названием Multiple. компакт-диск в него. cd multiply


  4. Структура папок очень проста.


    1. У нас есть папка хоста и папка методов.


    2. Папка хоста содержит хост-программу, которую мы называем гостевой программой. Он также имеет возможность проверить, если хотите.


    3. Папка методов содержит гостевую программу, содержащую проверенную часть приложения zkvm. Он получает входные параметры от хоста, затем на основе логики генерирует результаты, фиксирует их в журнале и отправляет хосту в качестве квитанции.


    4. Остальные файлы будут объяснены на ходу по мере необходимости.

  5. Начнем с гостевой программы.


    1. Давайте изменим названия файлов main.rs —> multiply.rs .

    2. Создайте папку с именем bin в папке src и переместите в нее 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. В папке methods Cargo.toml есть еще одно последнее изменение.

    8. Откройте и обновите значение name = "multiply-methods” .


    9. Ваш окончательный Cargo.toml будет выглядеть, как показано ниже.

    10. Наша работа здесь окончена.

    11. Теперь перейдем к хост-программе.

      1. Теперь ваша хост-папка должна выглядеть вот так.

      2. Мы хотим разделить файл main.rs на два файла: prover.rs verify.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. Давайте внесем изменения в основную функцию.

         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. Здесь мы импортируем идентификатор изображения гостевой программы и некоторые базовые импортированные данные.

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


      12. Давайте внесем изменения в основную функцию.

         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. Откройте папку Cargo.toml в папке host и внесите указанные ниже изменения в зависимости.

         multiply-methods = { path = "../methods" }
      16. Ваш Cargo.toml будет выглядеть так.

    12. Наконец пришло время проверить, работает ли наш код.


    13. Запустите консоль в корневом каталоге проекта и запустите приведенную ниже команду в console cargo run --release --bin prove


    14. Эта команда сгенерирует подтверждение и квитанцию для проверяющего.


      При первом запуске это займет много времени. Так что не волнуйтесь, выпейте кофе, пока он не закончится.


    15. Как только это будет сделано, при желании вы сможете проверить созданную вами квитанцию. Для этого запустите команду cargo run --release --bin verify


      При первом запуске это займет много времени. Так что не волнуйтесь, выпейте кофе, пока он не закончится.


    Поздравляю!!! при написании своего первого приложения ZK с использованием Risc0. Если вам нужна помощь, напишите мне комментарий, и я свяжусь с вами.