Zero-knowledge’e Giriş ve Mina Protocol

0 Shares
0
0
0

TL;DR:

  • Sıfır bilgili kanıtlar, ifadenin kendisini ifşa etmeden bir ifadenin doğru olduğunu kriptografik olarak kanıtlamanın bir yoludur.
  • Mina, sıfır bilgiye odaklanan bir Katman 1 blok zinciridir. Özyinelemeli zk-SNARK’lar kullanılarak 22KB’lik sabit boyutta kalır.
  • SnarkyJS, Mina’nın sıfır bilgili smart contractları zkApps oluşturmak için kullanılan programlama dilidir.
  • Mina zkApp CLI’yi kullanarak bir zkApp’i boostrap edebilir ve Berkeley Testnet’e deploy edebilirsiniz.

Zero-knowledge(zk), blockchain ekosistemindeki en popüler ifadelerden biridir. Kulağa çok karmaşık bir teknik terim gibi geliyor ve açıkçası sıklıkla yanlış kullanılıyor. zkEVM, zk-proofs, zk-SNARKS ve zk-STARKS ortalıkta dolaşan duymuş olabileceğiniz kelimelerden sadece birkaçıdır. Son birkaç aydır zero-knowledge hakkında bilgi topladım ve bunun birçok yeni kullanım durumunun kilidini açma potansiyeline sahip en ilginç teknolojilerden biri olduğunu gördüm.

Mina Protocol, temelinde sıfır bilgili kanıtları kullanan bir blockchain projesidir. Geliştiriciler, Mina’yı kullanarak kullanıcıların verilerini gizli tutabilecekleri zkApp’ler (namı diğer sıfır bilgili smart contractlar) oluşturabilir.

  • Bu yazıda aşağıdakileri ele almak istiyorum:
  • Sıfır bilgi teknolojisi nedir?
  • Mina Protocol, SnarkyJs ve zkApps nedir?
  • Sıfır bilgili bir smart contract nasıl yazılır ve Mina Blockchain’e deploy edilir?
  • Deneyimlerim ve sonuç fikirlerim.

Sıfır Bilgiye İlk Adım

Kriptografide, sıfır bilgi protokolü veya sıfır bilgi kanıtı (ZKP) sistemi, herhangi bir ekstra bilgi ifşa etmeden bir şeyin doğru olduğunu kanıtlama yöntemidir. Sıfır bilgili kanıtlar ilk olarak 1985 tarihli “The Knowledge Complexity of Interactive Proof-Systems” adlı makalede ortaya atıldı ve şu şekilde tanımlandı:

Sıfır bilgi ispatları, söz konusu önermenin doğruluğundan başka hiçbir ek bilgi aktarmayan ispatlar olarak tanımlanır.

Daha teknik bir sözdiziminde, sıfır bilgi kanıtlama sisteminde kanıtlayıcı, doğrulayıcıya ifadenin geçerliliği dışında hiçbir şey ifşa etmeden bir bilgi parçasına sahip olduğunu gösterir.

Örnek: Bara girerken belirli bir yaşın üzerinde olduğunuzu kanıtlama örneği en yaygın analojidir. Barların yaş sınırlaması vardır ve girmek için genellikle kimliğinizi güvenlik görevlisine verirsiniz, o da yaş sınırının üzerinde olup olmadığınızı kontrol eder. Kimliğinizde yaşınız, adınız, kimlik numaranız ve daha fazla bilgi yer aldığı için güvenlik görevlisi artık yaşınızı, soyadınızı, doğum gününüzü, doğduğunuz ülkeyi vb. biliyor. Yani yalnızca 18 yaşından büyük olduğunuzu kanıtlamak için yaşınızdan çok daha fazlasını paylaşıyorsunuz. Şimdi bunun yerine, 18 yaşından büyük olduğunuzun kriptografik bir kanıtını paylaştığınızı düşünün. Bu şekilde, tüm ek bilgileri paylaşmadan onlara yaş sınırının üzerinde olduğunuzu kanıtlayabilirsiniz. Diğer tüm bilgiler (18 yaşından büyük olmanız dışında) özeldir; doğduğunuz günü veya kaç yaşında olduğunuzu paylaşmanıza bile gerek yok.

Blockchain’deki ZKP’ler

ZKP’lerin iki önemli özelliği gizlilik ve ölçeklenebilirliktir; bunlar özellikle blockchainler bağlamında önemlidir.

Gizlilik: Public blockchainler tam şeffaflıkla çalışır. Ancak bunu yaparken genellikle mahremiyetten yoksundurlar. Herkese açık bir blockchaindeki tüm işlem verilerini herkes okuyabilir. Blockchaindeki ZKP’ler, verileri gizli tutmamızı sağlar. Örneğin, kullanıcılar yalnızca bir zk kanıtı oluşturmak için kullanılan, gerçekleştirmek istedikleri eylem için gerekli bilgileri ifşa eder. Doğrulayıcı, kullanıcıya özel verileri değil, yalnızca işlem kanıtını isteyecektir.

Ölçeklenebilirlik: Ölçeklenebilirlik, blockchainin benimsenmesi için ana engellerden biridir. ZKP’ler, hesaplamayı oldukça sıkıştırılmış bir kriptografik kanıt olarak kapsülleyerek kullanıcı veri boyutunu önemli ölçüde azaltır. ZKP’leri zincir dışında kullanmak ve ardından sıkıştırılmış verileri doğrulanmak üzere blockchaine göndermek, işlem hacmini artırabilir. Zincir üzerindeki verilerin küçültülmüş boyutu aynı zamanda işlemek için daha küçük hesaplama kaynaklarının gerekli olduğu anlamına gelir, bu da bir nodeu çalıştırmak için sistem gereksinimlerini azaltır; bu esasen ağın daha merkeziyetsiz olmasını sağlayabilir. (ZKP’lerin farklı blockchainlerde ölçeklenebilirliği arttırmak üzere nasıl kullanıldığına dair farklı yaklaşımlar vardır. Ethereum bağlamında, ZKP’lerin esas olarak Katman 1’e yayınlanan verilerin boyutunu azaltan Katman 2 ölçeklendirme çözümlerinde kullanıldığını görüyoruz. Ana ağda yayınlanan veriler çok daha küçük olduğundan, işlem yapmak için daha az kaynağa, dolayısıyla daha hızlı işlemlere ve daha düşük maliyetlere ihtiyaç duyacaktır. Mina blokchaininde, ZKP’ler blockchainin tüm stateini sıkıştırır ve her zaman sabit bir boyutta tutar ve daha düşük hesaplama gereksinimi ile kullanıcıların ağa katılmasını kolaylaştırır.) Merkezilikten uzaklaşmayı da temel bir özellik olarak ekleyebiliriz; Ölçeklenebilirliğin bir yan ürünü olarak buraya ekledim.

Sıfır bilgili kanıtların yeni ya da blockchain alanına özgü olmadığını belirtmekte fayda var. Public blockchainlerin doğası göz önüne alındığında, büyük bir fırsat sunuyorlar ve bu nedenle ZKP’leri araştıran birçok araştırmacı ve girişimci görüyoruz.

ZKP’nin blockchain alanındaki popüler uygulamalarından bazıları:

  • ZCash ve Monero gizlilik odaklı blok zincirlerdir. (L1)
  • zkSyncStarkNet ve Scroll, ZKP’leri kullanan Ethereum’daki Validity Rollup örnekleridir.
  • Dark Forest, ZKP’leri kullanan bir oyundur.
  • Mina Protocol: Blockchaini sabit bir boyutta tutmak için öz yinelemeli ZKP’ler kullanır.

Gönderinin bir sonraki bölümünde, Mina Protocol’ün ZKP’leri nasıl kullandığını keşfedeceğiz ve Mina’da bir zkApp oluşturmaya geçeceğiz.

Buraya dalmadan önce, sıfır bilgiyle ilgili bazı kaynaklar:

a16z küratörlüğünde bir dizi kaynak

Anna Rose‘dan Sıfır Bilgi Podcast’i

ZKHack Beyaz Tahta Oturumu

Mina Protocol’e Giriş,SnarkyJs & zkApps

Mina, 22kB’lik sabit bir boyuta sahip olmayı amaçlayan, sıfır bilgiye odaklanan, hafif bir Katman 1 blockchaindir. Blockchaindeki işlemler için ödeme yapmak için MINA adlı kendi yerel kripto para birimine sahiptir.

İlk olarak, hafif bir blok zinciri olmak ne anlama geliyor?

Mina blockchaini, ~22kb’lik sabit bir boyutta kalır. Diğer blok zincirlerinden çok çok daha küçüktür ve ekibin en başta Mina Protocol’ü oluşturmaya karar verme sebebi bunu sağlamaktı.

Tez, blockchainlerin boyutu büyüdükçe, gelişmiş hesaplama kaynakları gerektireceği için yalnızca çok az katılımcının ağa katılabileceği idi. Bu, ağların kademeli olarak merkezileşmesine yol açacaktır. Bu nedenle ekip, bunu çözmek için Mina Protocol’ü (eski adıyla Coda) geliştirmeye karar verdi.

Daha küçük bir blockchain boyutu, katılımcıların daha az işlem ve depolama yapması gerektiğinden katılmak için daha az hesaplama kaynağına ihtiyaç duyulacağı anlamına gelir. Gereksinimler daha düşük olduğu için daha fazla kişi node çalıştırabilir. Bu, giriş engeli daha düşük olduğu için daha merkeziyetsiz bir yapıya imkan tanır.

Mina Protocol nasıl çalışır?

Mina Blockchain, sıfır bilgi teknolojisini kullanarak ağın küçük bir boyutta kalmasını sağlayabilir. Mina, bir tür sıfır bilgi kanıtı olan, Kimchi adlı özel bir kanıt sistemi kullanır. Kimchi, Mina Protocol’ün core contributoru olan O(1) Labs tarafından geliştirilmiştir. ZK-SNARK’ların farklı blockchain ekipleri tarafından kullanılan ve araştırılan önemli bir kriptografik araç olduğunu belirtmekte fayda var. Gizlilik için ZK-SNARK kullanımına ilişkin bazı fikirler için Vitalik’in gönderisine de göz atabilirsiniz.

İşte Mina Protocol’ün nasıl çalıştığına dair çok basit bir özet:

  • ZK-SNARK’lar, tüm blockchain stateini alır. Ağ nodeları, tüm data yerine bu kanıtı depolar.
  • Yeni bir blok üretildiğinde, önceki ağ statei ve yeni blok ile yeni bir anlık görüntü alınır. Bu yeni hafif anlık görüntü, tüm statei temsil eder.
  • Yeni bloklar eklendikçe işlem tekrarlanır.

Özetle Mina’da özyinelemeli zk-SNARK bileşimi kullanılarak blockchain sabit bir boyutta tutulur. Peki geçmiş verilere ne oluyor? Arşiv nodeları burada devreye giriyor. Bunlar, blockchain verilerini alan ve bir veritabanında saklayan Mina Blockchain üzerindeki özel nodelardır. Geçmişi kullanan uygulamalar için arşiv verileri gereklidir (örneğin, block explorer). Arşiv, olağanüstü bir kurtarma durumunda da çok önemlidir. Daha fazla bilgi için Mina Docs & Mina Book‘ta protokol mimarisi hakkında daha fazla bilgi edinebilirsiniz.

zkAppler nedir?

Mina Protocol, zkAppleri (“sıfır bilgili uygulamalar”) zk-SNARK’ları kullanan smart contractlar olarak tanımlar.

zkApplerin bazı özellikleri:

  • Offchain hesaplama ve zincir içi doğrulama kullanırlar. Offchain hesaplama, uygulamanın istemci tarafında (web uygulaması) çalıştırıldığı ve yalnızca ortaya çıkan ZKP’nin Mina blockchainine gönderildiği anlamına gelir.
  • Kullanıcılar yalnızca gerekli bilgileri açık ettiği ve smart contract, verilerin kendisini ifşa etmeden kanıtı oluşturabildiği için, kullanıcının gizliliğini korurlar.
  • Smart contract, SnarkyJS kullanılarak TypeScript’te yazılmıştır.

İşte Evan’ın Ethereum’un Mina uygulamalarını nasıl kullanabileceğini açıkladığı bir sunum. İlginç kullanım durumlarına kapı aralamak için teknolojilerin nasıl bir araya gelebileceğini görmek harika.

Kayda değer bir proje olan, =nil; Foundation’ın üzerinde çalıştığı Ethereum x Mina köprüsü hakkında daha fazla bilgiyi burada bulabilirsiniz.

Mina zkApp CLI, SnarkyJS kullanarak zkApp’ler yazmak, test etmek ve deploy etmek için kullanılan bir araç setidir. SnarkyJS, sıfır bilgi kanıtına dayalı smart contractlar yazmak için bir TypeScript çerçevesidir. SnarkyJS’nin yanı sıra Mina zkApp CLI, önerilen en iyi uygulamalarla hızlı bir başlangıç ​​için Jest, Prettier, ESLint, Git ve diğerleri gibi araçları içerir.

Mina Protocol üzerinde geliştirmeye başlama

Bu bölümde, Mina zkApp CLI ile bir zkApp’in nasıl oluşturulacağını ve Mina Testnet’e deploy edileceğini adım adım açıklamak istiyorum. Eğitim reposu burada.

Daha derin inceleme ve daha fazla örnek için Mina Docs‘a göz atmanızı şiddetle tavsiye ederim. Ayrıca, burada Jack’ten Mina zkApps oluşturmaya ilişkin harika bir sunum da mevcut.

Araçlar

  • NodeJS 16+
  • Mina zkApp CLI: Mina Protocol üzerinde zkApps yazmak için TypeScript frameworkü SnarkyJS’i kullanarak zkApps oluşturmak için paket. Test frameworkü, biçimlendirme, git ve diğer araçlar da NPM paketine dahildir
  • Berkeley Testnet: uygulamanın deploy edileceği yer (bu yazının yazıldığı sırada, zkApps henüz Mina Mainnet’te mevcut değildi)
  • Berkeley için Mina Block Explorer
  • Auro: Mina Protocol Cüzdanı

Kurulum

  1. Öncelikle, NodeJS sürüm 16 veya üzerine sahip olduğunuzdan emin olun. Node sürümünü şu şekilde kontrol edebilirsiniz: -v ya da node –version
  2. zkApp paket yöneticisini kurun npm install -g zkapp-cli

zk —version kodunu çalıştırarak yüklediğinizi kontrol edebilirsiniz.

(SnarkyJS, zkapp-cli ile birlikte gelir, böylece ayrı bir kurulum yapmanıza gerek kalmaz.)

  3. Mina cüzdanı kurun

Bu bölüm rehber için gerekli değildir ancak buraya ekliyorum çünkü blockchain ile etkileşime girecek araçlara sahip olmak önemlidir ve burada bir kripto cüzdanına ihtiyacımız var.

Bir tarayıcı uzantısı ve mobil uygulama olarak çalışan Mina Protocol cüzdanı olan Auro’yu kurdum. Web sitesindeki kurulum adımlarını takip edebilirsiniz. Uzantıyı tarayıcınıza ekledikten sonra hesap oluşturmak için adımları takip edin. Hesap oluşturma esnasında mnemonic kelimeler verilecektir, bu kelimeleri güvenli bir şekilde sakladığınızdan emin olun. Hesabınız oluşturulduktan sonra, kullanıcı arayüzünde hesap bilgilerini göreceksiniz.

Mina Protocol Üzerinde bir zkApp Oluşturma ve Deploy Etme

  1. Yeni bir proje klasörü oluşturun

zk project zk-app

Klasörün içi işte böyle görünüyor;

 ├── build
 ├── keys
 ├── node_modules
 ├── src
 ├── LICENSE
 ├── README.md
 ├── babel.config.cjs
 ├── config.json
 ├── jest-resolver.cjs
 ├── jest.config.js
 ├── package-lock.json
 ├── package.json
 └── tsconfig.json

zkApp için smart contractları içeren src klasörü. Add.ts ve Add.test.ts’yi göreceksiniz. Bunlar, zk-smart contractı ve test dosyasıdır.

Detayları açıklamak için kodu ve bazı yorumları ekledim:

import {
Field, // Field, işaretsiz tamsayıları tanımlamak için kullanılır
SmartContract, // zkapp smart contractları için sınıf
state,
State,
method,
DeployArgs,
Permissions,
} from ‘snarkyjs’;
/**
* Add contractı, ‘num’ durum değişkenini deploy edildiğinde  bir Field(1) olacak şekilde başlatır.
* Add contractı, update() işlevi çağrıldığında ‘num’a Field(2) ekler.
**/
export class Add extends SmartContract {
@state(Field) num = State<Field>(); // num adında onchain state oluşturur
deploy(args: DeployArgs) { // deploy yöntemi, ayarları ve izinleri açıklar     super.deploy(args);
this.setPermissions({
…Permissions.default(),
editState: Permissions.proofOrSignature(),
// Kanıt yetkilendirmesi: son kullanıcıların zkApp hesap stateini değiştirmesine izin verir
// İmza yetkilendirmesi: deploy eden hesaba izin verir     });

 },

// @method dekoratörü, func’un son kullanıcılar tarafından iptal edilebileceği anlamına gelir
@method init() { // deploy sırasında num değerini Field(1) olarak başlatır
this.num.set(Field(1));
}

@method update() { // num değişkeninin onchain stateini güncelleyen fonksiyon(state)
const currentState = this.num.get(); // onchain statei alır
this.num.assertEquals(currentState); // this.num.get() işlevinin onchain gerçek state ile eşit olup olmadığını kontrol eder
const newState = currentState.add(2); //2 ekler
newState.assertEquals(currentState.add(2)); // zk-proof oluşturmak için iddianın doğru olması gerekir
this.num.set(newState); // yeni onchain statei ayarlar  }
 }

Uygulamanın nasıl çalıştığına dair önemli bir özet, yürütmenin client tarafında (tarayıcı) yapılmasıdır. Contractta genel değişkenlere sahip olabilirsiniz, bu örnekte num zincir üstü bir değerdir. Başka bir durumda, tarayıcıda ZKP’ye dönüştürülen ve ağ tarafından görülmeyen özel verileri contracta iletebilirsiniz.

2- Proje konfigürasyonlarını eklememiz gerekiyor, konfigürasyon sihirbazını almak için aşağıdaki komutu çalıştırın.

zk config

Aşağıdaki ayrıntıları ekleyin:

İsim: berkeley-app

URL: proxy.berkeley.minaexplorer.com/graphql

Fee: 0.1

3- Önceki terminaldeki bağlantıyı takip ederek Testnet tokenlerini (tMINA) alın. Bu işlem birkaç dakika sürecektir.

Smart contractı blockchaine deploy etme işlemi için ödeme yapmak için Testnet tokenleri gerekir.

zk deploy berkeley-app

Yuppii! Smart contractlarınızı Mina Berkeley Testnet’e deploy ettiniz.

5- Contractla lokal olarak etkileşim kurmak için küçük bir komut dosyası oluşturun. Aşağıdaki kodu oluşturdum src/main.tsve ekledim. Neler anlama geldiklerini açıklamak için yorumlar ekledim.

import { Add } from ‘./Add.js’;
 import {
  isReady,
  shutdown,
  Mina,
  PrivateKey,
AccountUpdate,
 } from ‘snarkyjs’;

 (async function main() {
 await isReady;
 console.log(“Starting”);

 // bir lokal blockchain başlatın
  const Local = Mina.LocalBlockchain();
 Mina.setActiveInstance(Local);
const deployerAccount = Local.testAccounts[0].privateKey;

// smart contractı deploy etmek için bir hedef oluşturun
const zkAppPrivateKey = PrivateKey.random();
const zkAppAddress = zkAppPrivateKey.toPublicKey();

// Add’in bir örneğini oluşturun – ve zkAppAddress’e deploy edin
 const zkAppInstance = new Add(zkAppAddress);
const deploy_txn = await Mina.transaction(deployerAccount, () => {
AccountUpdate.fundNewAccount(deployerAccount);
zkAppInstance.deploy({ zkappKey: zkAppPrivateKey });
 zkAppInstance.init();
 zkAppInstance.sign(zkAppPrivateKey);
});
 await deploy_txn.send().wait();

// deploy ettikten sonra Add’in ilk stateini alın
 const num0 = zkAppInstance.num.get();
 console.log(‘Num after init:’, num0.toString());

 // —————————————————-

const txn1 = await Mina.transaction(deployerAccount, () => {
zkAppInstance.update();
 zkAppInstance.sign(zkAppPrivateKey);
});
 await txn1.send().wait();
 const num1 = zkAppInstance.num.get();
console.log(‘Add 2:’, num1.toString());

 // —————————————————-

try {
 const txn2 = await Mina.transaction(deployerAccount, () => {
zkAppInstance.update();
zkAppInstance.sign(zkAppPrivateKey);
});
await txn2.send().wait();
 } catch (ex: any) {
console.log(ex.message);
}
const num2 = zkAppInstance.num.get();
console.log(‘Add 2:’, num2.toString());

// —————————————————-

const txn3 = await Mina.transaction(deployerAccount, () => {
zkAppInstance.update();
zkAppInstance.sign(zkAppPrivateKey);
});
await txn3.send().wait();
const num3 = zkAppInstance.num.get();
console.log(‘Add 2:’, num3.toString());

// —————————————————-

console.log(‘Closing the local blockchain’);
await shutdown();
 })();

İlk adım, smart contractı, onu çağırmak istediğiniz scripte/frontende aktarmaktır. Temel olarak, müşteri tarafında çalışan ve daha sonra işlemi (zk korumalı) blockchaine göndermek için bir çağrı yapan bir JS paketidir.

zkApp’inizi üretimde kullanmak için dosyanızı npm’de yayınlamanız gerekir. Adımları burada bulabilirsiniz.

6- zkApp’ı derlemek ve çalıştırmak için aşağıdaki komutları çalıştırın:

npm run build
node build/src/main.js

Her şey yolunda giderse, terminalde şu sonuçları görürsünüz.

Test Etme

JavaScript Test Framework’ü, Jest, Mina zkApp CLI’ye dahildir.

  • Başlangıç ​​projesi için test dosyasını şu adreste bulabilirsiniz: Add.test.ts
  • Testleri şununla çalıştırabilirsiniz: npm run test ya da npm run testw (izleme modu için)
  • Kodunuzun yüzde kaçının testlerle kapsandığını gösteren bir kapsam raporu oluşturmak için npm run coverage kodunu çalıştırın . Örneğin, örnek projemiz için kapsam klasörü şu şekildedir.
  • Testlerinizi lokalde çalıştırabilirsiniz, lokal blockchain oluşturma hakkında daha fazla ayrıntıyı burada bulabilirsiniz.

Lütfen dikkat: Jest, projeyle birlikte gelir ve isterseniz başka bir test frameworkü kullanabilirsiniz.

Deneyimlerim ve Fikirlerim

zkApps oluşturmak, göründüğünden ÇOK DAHA kolay.

Gizliliği koruyan uygulamalar, birçok yeni ve heyecan verici kullanım durumuna kapı açabilir. ZKP’ler ve Mina Protocol’ün bun kapıları açabileceğini görmek beni heyecanlandırıyor.

Şu anda Mina Protocol web sitesindeki dokümanların çoğu üzerinde çalışılıyor. En son bilgileri ve eğitim materyallerini bulmak zaman ve çaba gerektirebilir. Ekosistemde yalnızca birkaç eğitimci veya başlangıç ​​seti var ve ben çoğunlukla destek için Discord’a gidiyordum. Bu da katılmak isteyenler için bir fırsat sunuyor.

Ölçeklenebilirlik, Mina Blockchain ile ilgili önemli bir konudur; işlemler çok yavaş. “Bekleyin; test jetonları gelecek…” Bu, şu anda ekibin üzerinde çalıştığı bir sorun. Daha fazla bilgi için buraya göz atabilirsiniz.

Sıfır bilgi, blockchain ekosisteminde farklı çözümler üzerinde çalışan birçok yenilikçi ekip ile genişleyen bir alan. Son birkaç ayda sıfır bilgi teknolojisi hakkında çok şey öğrendim ve öğrenecek daha çok şeyim var.

Kaynak

0 Shares
Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir