Доказательства с нулевым разглашением данных обеспечивают конфиденциальность и безопасность транзакций. С помощью 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 🪄:
Откройте редактор кода и перейдите в место, где вы хотите создать свой проект, в терминале редактора.
Создайте новый экземпляр проекта, используя в терминале следующую команду: cargo risczero new multiply
.
Вы должны увидеть созданную папку под названием Multiple. компакт-диск в него. cd multiply
Структура папок очень проста.
У нас есть папка хоста и папка методов.
Папка хоста содержит хост-программу, которую мы называем гостевой программой. Он также имеет возможность проверить, если хотите.
Папка методов содержит гостевую программу, содержащую проверенную часть приложения zkvm. Он получает входные параметры от хоста, затем на основе логики генерирует результаты, фиксирует их в журнале и отправляет хосту в качестве квитанции.
Остальные файлы будут объяснены на ходу по мере необходимости.
Начнем с гостевой программы.
Давайте изменим названия файлов main.rs —> multiply.rs
.
Создайте папку с именем bin
в папке src
и переместите в нее mutiply.rs
. Структура ваших папок должна выглядеть примерно так:
Откройте Cargo.toml
и измените обновление на name = "method_name” —> name = "multiply”
.
Добавьте приведенный ниже код в Cargo.toml
.
[[bin]] name = "multiply" path = "src/bin/multiply.rs"
Итак, ваш окончательный Cargo.toml
будет выглядеть так:
Теперь откройте multiply.rs
. Здесь мы будем редактировать основную функцию. Это функция, которая будет выполняться в zkvm.
В приведенном ниже коде мы получаем входные данные от хост-программы. Затем мы проверяем, что входные данные не являются тривиальными коэффициентами, равными 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);
После вышеуказанных изменений ваш multiply.rs
должен выглядеть следующим образом.
В папке methods
Cargo.toml
есть еще одно последнее изменение.
Откройте и обновите значение name = "multiply-methods”
.
Ваш окончательный Cargo.toml
будет выглядеть, как показано ниже.
Наша работа здесь окончена.
Теперь перейдем к хост-программе.
Теперь ваша хост-папка должна выглядеть вот так.
Мы хотим разделить файл main.rs
на два файла: prover.rs
verify.rs
.
Создайте новую папку в src
и назовите ее bin
.
Удалить main.rs
Создайте файлы и назовите verify.rs
& prove.rs
.
Структура ваших папок теперь должна выглядеть примерно так.
prove.rs
и приступим к написанию кода:
Добавьте приведенный ниже код. Это импорт, который нам понадобится.
use multiply_methods::MULTIPLY_ELF; // It is a binary file of multiply_method use risc0_zkvm::{ default_prover, serde::{from_slice, to_vec}, ExecutorEnv, };
Давайте внесем изменения в основную функцию.
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
должно выглядеть так.
Давайте откроем и добавим код в verify.rs
.
Здесь мы импортируем идентификатор изображения гостевой программы и некоторые базовые импортированные данные.
use multiply_methods::MULTIPLY_ID; use risc0_zkvm::Receipt;
Давайте внесем изменения в основную функцию.
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
должен выглядеть примерно так.
Обещаю, это последние изменения. Теперь мы почти закончили.
Откройте папку Cargo.toml
в папке host
и внесите указанные ниже изменения в зависимости.
multiply-methods = { path = "../methods" }
Ваш Cargo.toml будет выглядеть так.
Наконец пришло время проверить, работает ли наш код.
Запустите консоль в корневом каталоге проекта и запустите приведенную ниже команду в console cargo run --release --bin prove
Эта команда сгенерирует подтверждение и квитанцию для проверяющего.
При первом запуске это займет много времени. Так что не волнуйтесь, выпейте кофе, пока он не закончится.
Как только это будет сделано, при желании вы сможете проверить созданную вами квитанцию. Для этого запустите команду cargo run --release --bin verify
При первом запуске это займет много времени. Так что не волнуйтесь, выпейте кофе, пока он не закончится.