Sıfır bilgi kanıtları özel, güvenli işlemlere olanak tanır. zkSNARK'lar ve zkSTARK'lar sayesinde kanıtlayıcı, gerçek verileri açıklamadan bazı bilgilerin sahibi olduğunu doğrulayıcıya kanıtlayabilir.
Bu, anonimlik ve gizlilik açısından büyük bir potansiyele sahiptir. Ancak zkSTARK'lar ve zkSNARK'lar karmaşıktır. Risc0 bunları daha erişilebilir hale getirir. Bakalım bunun çok basit bir uygulaması var:
Bu eğitim şunları kapsayacaktır:
Risc0 Kurulumu
Pas kullanarak ilk sıfır bilgi kanıtlama programınızı yazma
Önkoşullar:
Kısayolları kopyalayıp yapıştırma
Gerekli kurulumlar:
Rustikte bazı temel kodlama bilgileri
Kod Düzenleyici (mümkünse VSCODE)
Sonunda, Risc0'da sıfır bilgi kanıtlarıyla ilgili pratik deneyime sahip olacaksınız. İleri düzey matematik veya kriptografi geçmişi gerekmez.
Gerçek dünya çözümleri oluşturmaya başlamak için kodlamanın temellerine odaklanacağız. Bu uygulamalı giriş, güçlü gizlilik teknolojisini tüm geliştiriciler için anlaşılır kılmayı amaçlamaktadır.
(MacOS için) Pas ve kargo kurulumu için terminalde aşağıdaki komutu çalıştırabilirsiniz:
curl [https://sh.rustup.rs](https://sh.rustup.rs/) -sSf | sh
Risc0'ı kurmak için Rust kurulumundan sonra aşağıdaki komutu çalıştırıp terminali yeniden başlatmalısınız:
cargo install cargo-risczero
brew install openssl
brew install pkgconf
risc0
araç zincirini şununla kurmamız gerekecek: cargo risczero install
İhtiyacımız olan tek şey bu. O halde kod düzenleyiciye geçelim.
Artık kurulumu tamamladığımıza göre şu abra kadabra 🪄 adımlarını okuyup takip edebilirsiniz:
Kod düzenleyiciyi açın ve düzenleyicinin terminalinde projenizi oluşturmak istediğiniz konuma gidin.
Terminalde aşağıdaki komutu kullanarak projenin yeni bir örneğini oluşturun: cargo risczero new multiply
.
Çarpma adı verilen oluşturulmuş bir klasör görüyor olmalısınız. içine cd. cd multiply
Klasör yapısı çok basittir.
Bir ana bilgisayar klasörümüz ve bir yöntem klasörümüz var.
Host klasörü, misafir program dediğimiz host programını içerir. Ayrıca isterseniz doğrulama özelliğine de sahiptir.
Yöntemler klasörü, zkvm uygulamasının kanıtlanmış bölümünü içeren konuk programını içerir. Ana bilgisayardan giriş parametrelerini alır, ardından mantığa dayalı olarak sonuçlar üretir, bunları günlüğe kaydeder ve bunları bir makbuz olarak ana bilgisayara gönderir.
Dosyaların geri kalanı gerektiği gibi hareket halindeyken açıklanacaktır.
Konuk programıyla başlayalım.
main.rs —> multiply.rs
dosyalarının adını değiştirelim.
src
klasöründe bin
adında bir klasör oluşturun ve mutiply.rs
dosyasını bu klasöre taşıyın. Klasör yapınız şöyle görünmelidir:
Cargo.toml
açın ve güncellemeyi name = "method_name” —> name = "multiply”
olarak değiştirin.
Cargo.toml
dosyasına aşağıdaki kodu ekleyin.
[[bin]] name = "multiply" path = "src/bin/multiply.rs"
Yani son Cargo.toml
dosyanız şöyle görünecek:
Şimdi, multiply.rs
dosyasını açın. Burada ana fonksiyonu düzenleyeceğiz. Bu, zkvm'de yürütülecek işlevdir.
Aşağıdaki kodda host programından girdi alıyoruz. Daha sonra girdinin 1 gibi önemsiz faktörler olmadığından emin oluyoruz. Daha sonra ürünü hesaplıyoruz ve son olarak programın ana bilgisayarına geri gönderiyoruz.
// 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);
Yukarıdaki değişikliklerden sonra multiply.rs
dosyanız şu şekilde görünmelidir.
Cargo.toml
methods
klasöründe son bir değişiklik daha var.
name = "multiply-methods”
değerini açın ve güncelleyin.
Son Cargo.toml
dosyanız aşağıdaki gibi görünecektir.
Buradaki çalışmalarımız tamamlandı.
Şimdi host programına geçelim.
Ana bilgisayar klasörünüz artık bu şekilde görünüyor olmalı.
main.rs
prover.rs
ve verify.rs
olmak üzere iki dosyaya bölmek istiyoruz.
src
altında yeni bir klasör oluşturun ve onu bin
olarak adlandırın.
main.rs
kaldırın. Dosyalar oluşturun ve bunları verify.rs
ve prove.rs
olarak adlandırın.
Klasör yapınız artık buna benzer bir şeye benzemelidir.
prove.rs
dosyasını açın ve kodlamaya başlayalım:
Aşağıdaki kodu ekleyin. Bunlar ihtiyacımız olan ithalatlar.
use multiply_methods::MULTIPLY_ELF; // It is a binary file of multiply_method use risc0_zkvm::{ default_prover, serde::{from_slice, to_vec}, ExecutorEnv, };
Ana fonksiyonda değişiklikler yapalım.
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 !!"), }; }
Son prove.rs
şu şekilde görünmelidir.
verify.rs
dosyamızı açıp kod ekleyelim.
Burada misafir programı resim kimliğini ve bazı temel içe aktarmaları içe aktaracağız.
use multiply_methods::MULTIPLY_ID; use risc0_zkvm::Receipt;
Ana fonksiyonda değişiklikler yapalım.
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 !!"), }; }
Son verify.rs
buna benzer bir şeye benzemelidir.
Söz veriyorum bunlar son değişiklikler. Artık neredeyse işimiz bitti.
host
klasörde Cargo.toml
dosyasını açın ve bağımlılıklar altında aşağıdaki değişiklikleri yapın.
multiply-methods = { path = "../methods" }
Cargo.toml dosyanız şu şekilde görünecek.
Sonunda kodumuzun çalışıp çalışmadığını görmenin zamanı geldi.
Konsolunuzu projenin kök dizininde çalıştırın ve console cargo run --release --bin prove
aşağıdaki komutu çalıştırın.
Bu komut, doğrulayıcı için kanıt ve makbuz oluşturacaktır.
İlk kez çalıştırdığınızda çok zaman alacaktır. O yüzden endişelenmeyin, tamamlanana kadar bir kahve alın.
Bu işlem tamamlandıktan sonra isterseniz oluşturduğunuz makbuzu doğrulayabilirsiniz. Bunun için bu cargo run --release --bin verify
çalıştırın.
İlk kez çalıştırdığınızda çok zaman alacaktır. O yüzden endişelenmeyin, tamamlanana kadar bir kahve alın.