paint-brush
Risc0 Kullanarak İlk ZK Projenizi Oluşturma: Yeni Başlayanlar İçin Bir Kılavuzile@luffysama
533 okumalar
533 okumalar

Risc0 Kullanarak İlk ZK Projenizi Oluşturma: Yeni Başlayanlar İçin Bir Kılavuz

ile Luffy Sama13m2023/10/05
Read on Terminal Reader

Çok uzun; Okumak

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.
featured image - Risc0 Kullanarak İlk ZK Projenizi Oluşturma: Yeni Başlayanlar İçin Bir Kılavuz
Luffy Sama HackerNoon profile picture

giriiş :

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:

    • Pas dili
    • Kargo sandığı
  • 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.

Kurulum :

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


  • Yukarıdaki komutların başarılı bir şekilde oluşturulabilmesi için gerekli bağımlılıkları kurmuş olmanız gerekir. brew install openssl brew install pkgconf


  • Daha sonra, risc0 araç zincirini şununla kurmamız gerekecek: cargo risczero install


İhtiyacımız olan tek şey bu. O halde kod düzenleyiciye geçelim.

Bazı Sihirli Çizgiler Yazmak:

Artık kurulumu tamamladığımıza göre şu abra kadabra 🪄 adımlarını okuyup takip edebilirsiniz:


  1. Kod düzenleyiciyi açın ve düzenleyicinin terminalinde projenizi oluşturmak istediğiniz konuma gidin.


  2. Terminalde aşağıdaki komutu kullanarak projenin yeni bir örneğini oluşturun: cargo risczero new multiply .


    Komut bizim için çarpma adı verilen temel bir şablon oluşturur.

  3. Çarpma adı verilen oluşturulmuş bir klasör görüyor olmalısınız. içine cd. cd multiply


  4. Klasör yapısı çok basittir.


    1. Bir ana bilgisayar klasörümüz ve bir yöntem klasörümüz var.


    2. Host klasörü, misafir program dediğimiz host programını içerir. Ayrıca isterseniz doğrulama özelliğine de sahiptir.


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


    4. Dosyaların geri kalanı gerektiği gibi hareket halindeyken açıklanacaktır.

  5. Konuk programıyla başlayalım.


    1. main.rs —> multiply.rs dosyalarının adını değiştirelim.

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

    3. Cargo.toml açın ve güncellemeyi name = "method_name” —> name = "multiply” olarak değiştirin.

    4. Cargo.toml dosyasına aşağıdaki kodu ekleyin.

       [[bin]] name = "multiply" path = "src/bin/multiply.rs"
    5. Yani son Cargo.toml dosyanız şöyle görünecek:

    6. Şimdi, multiply.rs dosyasını açın. Burada ana fonksiyonu düzenleyeceğiz. Bu, zkvm'de yürütülecek işlevdir.


      1. 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);
      2. Yukarıdaki değişikliklerden sonra multiply.rs dosyanız şu şekilde görünmelidir.

    7. Cargo.toml methods klasöründe son bir değişiklik daha var.

    8. name = "multiply-methods” değerini açın ve güncelleyin.


    9. Son Cargo.toml dosyanız aşağıdaki gibi görünecektir.

    10. Buradaki çalışmalarımız tamamlandı.

    11. Şimdi host programına geçelim.

      1. Ana bilgisayar klasörünüz artık bu şekilde görünüyor olmalı.

      2. main.rs prover.rs ve verify.rs olmak üzere iki dosyaya bölmek istiyoruz.


      3. src altında yeni bir klasör oluşturun ve onu bin olarak adlandırın.


      4. main.rs kaldırın. Dosyalar oluşturun ve bunları verify.rs ve prove.rs olarak adlandırın.


      5. Klasör yapınız artık buna benzer bir şeye benzemelidir.

      6. prove.rs dosyasını açın ve kodlamaya başlayalım:


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


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


      9. Son prove.rs şu şekilde görünmelidir.

      10. verify.rs dosyamızı açıp kod ekleyelim.


      11. 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;


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


      13. Son verify.rs buna benzer bir şeye benzemelidir.

      14. Söz veriyorum bunlar son değişiklikler. Artık neredeyse işimiz bitti.


      15. 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" }
      16. Cargo.toml dosyanız şu şekilde görünecek.

    12. Sonunda kodumuzun çalışıp çalışmadığını görmenin zamanı geldi.


    13. Konsolunuzu projenin kök dizininde çalıştırın ve console cargo run --release --bin prove aşağıdaki komutu çalıştırın.


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


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


    Tebrikler !!! Risc0'ı kullanarak ilk ZK uygulamanızı yazma hakkında. Yardıma ihtiyacınız olursa lütfen bana yorum bırakın, size geri döneceğim.