Zephyrnet Logosu

Ethereum, SNARKs 101 ile nasıl ölçeklenebilir?

Tarih:


Bu konulara dalmadan önce birkaç ay önce beğendiğim başlangıç ​​kılavuzu

Marco De Rossi

İhtiyacınız olan:

  • bilgisayar bilimi geçmişi
  • Ethereum'un temelleri
  • Hesabın temelleri (kısıtlama optimizasyonu)

Ne alırsınız:

  • sıfır bilgili SNARK'ların temelleri
  • Merkle ağaçlarının temelleri
  • Ethereum, SNARK'lar sayesinde saniyede binlerce işleme nasıl ölçeklenebilir?

SNARK'lar, bir Prover'ın bir Doğrulayıcıya, W'yi açıklamadan, paylaşılan/bilinen X girdileriyle F sorununa bir W çözümüne sahip olduğunu kanıtlamasına olanak tanır.

Sorunun çözümünü bulmak büyük miktarda hesaplama gücü ve hafıza gerektirebilir.

Yani Doğrulayıcı temel olarak Kanıtlayıcının düzgün çalıştığından (ve bir çözüm bulduğundan) %100 emin olabilir. ne tek başına işi tekrar yaparak çözümü kontrol ediyor ne de çözümü hiç biliyor. Bu sihirdir!

Sürecin 3 adımı var:

  • KURMAK — SNARK'lar için F problemi (ikinci dereceden aritmetik programı olarak ifade edilmesi gereken, aşağıya bakınız) hazırlanmıştır. Bu süreç, problemin karmaşıklığına bağlı olarak çok yüksek bellek ve hesaplama yoğunluğu gerektirir (→ Girdi ve kısıtlamaların sayısı → Kısıtlamaların tatmin probleminin matrisinin boyutu). Kurulumun çıktısı sonraki aşamalarda kullanıldığından, Kurulumu yapan oyuncuya (Doğrulayıcının kendisi de olabilir) tüm tarafların güvenmesi gerekir. Kurulum genellikle kullanılarak yapılır. zkSNARK'lar için en popüler uygulama olan bir C++ kütüphanesi.
  • kanıtlama — F problemi için paylaşılan X girdileriyle bir W çözümüne sahip olan Prover (belki de onu bulmak için büyük miktarda CPU ve bellek harcamıştır!), şunu kullanır: libsnark ve çıktısı Kurmak kanıt oluşturma aşaması 𝚷. Bu işlem kesinlikle yüksek bellek ve yoğun bilgi işlem gerektirir (yukarıdaki gibi sorunun karmaşıklığına bağlı olarak). Çıktının boyutu (yani kanıt 𝚷) sorunun karmaşıklığından bağımsız olarak kısa ve özdür ve sabittir. Prover'ın, çıktısını kullandığı için Kurulum aşamasını yapan kişiye güvenmesi gerekir…
  • DOĞRULANIYOR — Bir Doğrulayıcı — Kurulum aşamasının çıktısını, paylaşılan girişler X'i ve kanıtı 𝚷 girdi olarak verir - kanıtı kontrol eder. Doğrulama başarılı olursa, Kanıtlayıcı, Doğrulayıcıya W sorununu açıklamadan W sorununun çözümünü bulduğunu kanıtlamayı başardı! İşin güzel yanı, yalnızca Kanıt'ın kısa ve öz olması ve her zaman aynı uzunluğa sahip olması değil, doğrulama sürecinin de hızlı olması ve bellek/bilgi işlem açısından hiç yoğun olmamasıdır. Önceki iki aşamadan farklı olarak, doğrulama bir akıllı telefonla milisaniyeler içinde kolayca yapılabilir!

Güzel bir özet ():

Bu nasıl olabilir? İşte bu Merlin büyüsü! Eğer bunun arkasındaki matematiği anlamak istiyorsanız, .

Yazılımımı ikinci dereceden aritmetik programına nasıl dönüştürebilirim?

Yukarıda da bahsettiğimiz gibi Kurulum aşamasındaki problem F'nin ikinci dereceden bir aritmetik program olması gerekmektedir. Oyunun kuralları zordur:

  • Yazılımınızın girişleri rakamlardan oluşmalıdır. Öğelerinizi (diziler, dizeler vb.) sayılara dönüştürün. Bu önemsiz.
  • “İkinci dereceden sınırlandırılmış denklem sistemi” şu anlama gelir:

burada x, girdilerinizin n boyutlu vektörüdür, m, kısıtlamaların sayısıdır (yani sisteminizin denklem sayısı), C, n'ye n katsayılar Matrisidir ve q, n boyutlu katsayılar vektörüdür. Matris ve vektörlerden hoşlanmıyorsanız, işte n = 3 ve m = 2 durumu (3 giriş, 2 kısıtlama):

  • Uygulama bir aritmetik devredir, yani sonuç Sorun çözüldü (sistem çözüldü, yani tüm polinomlar 0'a eşit) veya Sorun çözülmedi (diğer tüm durumlar). Başka bir deyişle: “bu girdiler bu Sorunun çözümlerinden biri/değildir”.
  • C₁, C₂, …, C𝚖, q₁, q₂, …, q𝚖 katsayıları sistemin kısıtlarıdır. Temel olarak yazılımınızı tanımlayan şey budur. Bunları değiştirin… ve başka bir yazılım alacaksınız! SNARK'ların nasıl çalıştığına dönersek: C₁, C₂, …, C𝚖, q₁, q₂, …, q𝚖 Kurulum aşamasının girdileridir. Kurulum aşamasının çıktısı (Kanıtlama ve Doğrulama için ihtiyacınız olan) bu nedenle kesinlikle C₁, C₂, …, C𝚖, q₁, q₂, …, q𝚖 ile ilgilidir ve yalnızca bu Problem için çalışır. Bunları değiştirirseniz, başka bir yazılım/sorun tanımlamış olursunuz ve Kurulum aşamasını yeniden çalıştırmanız gerekir! x₁, x₂, …, x𝗇 değişkenlerdir (yani bir sistemin çözümünü elde etmek için tahmin etmeniz gerekenler). Yani “Sevgili Kanıtlayıcı, X problemi için paylaşılan/genel girdilerle gizli bir W çözümü bulabilir misiniz?” dediğimizde örneğin “Sevgili Kanıtlayıcı, sistemi çözen x₁, x₂, …, x𝗇 değerlerini bulabilir misiniz? örneğin x₇ = 2393, x₅₂₆ = 5647 ile?" Paylaşılan/genel girişlerle sınırlı olan x₇ ve x₅₂₆ hariç tüm x𝗇 ile istediğinizi yapabilirsiniz.

Zor bir hayat ama hayatta kalabilirsiniz… Döngülere ihtiyacınız varsa, aynı işlemi defalarca tekrarlayarak onları açabilirsiniz. Veya örneğin x₁⁴ x₂⁵'ye ihtiyacınız varsa, yeni bir x₃ = x₁⁴ x₂⁵ girişi tanımlarsınız ve kısıtlamalarınızda x₃'yi kullanırsınız. Her şey değişkenler ve kısıtlamalar eklemekle ilgili… Oldukça basit yazılımlar için bile yüz milyonlarca veya milyarlarca girdi ve kısıtlamaya ulaşmak kolaydır!

Daha fazlasını mı öğrenmek istiyorsunuz? Okumak . Ayrıca şu temel bilgiye de göz atın Ethereum/araştırmadan.

Merkle ağacı nedir?

Karma işlevi, rastgele boyuttaki bir girişi sabit boyutlu bir çıktıyla eşleyen bir kuraldır. "Woody Allen"ı "Woen"a ve "Paul McCartney"i "Paey"e dönüştüren "İlk ikisini son iki harfle birleştir" gibi oldukça işe yaramaz bir karma işlevi icat edebiliriz.

Merkle ağacı, her ebeveynin iki oğlunun karması olduğu bir veri yapısıdır. En üstte, 1. seviyedeki iki oğlunun karması olan Kök'ü bulacaksınız. Altta, her yaprak, harici bir girişin karmasıdır.

Kurgusal “Woody Allen”→”Woen” hash fonksiyonumuzu kullanarak:

Bir yaprak değiştiğinde, değişiklik Kök'e kadar yayılır. ANTHONY değişirse ANNY (yaprak), CENY ve CECO (Kök) de değişir. Hangi yaprak değişirse kök de değişir.

Kökü yeniden hesaplamak için ağacın tamamına ihtiyacınız yoktur. Örneğimizde, ANTHONY değişirse ve hem JACO hem de CECILY'yi biliyorsanız, JAMES, MARCO, JAES ve MACO'yu tamamen görmezden gelseniz bile Kökü kolayca yeniden hesaplayabilirsiniz. Büyük ağaçlar için bu çok zaman kazandırır!

Öyleyse ne yapmalı?

Merkle ağaçları veri bütünlüğü kontrolleri için mükemmeldir. Genellikle: hangisinin geçerli Kök olduğunu bilirsiniz ve alınan verilerin bu Kök ile eşleşip eşleşmediğini kontrol edersiniz. Örneğin: size Dünya üzerindeki insanların adlarını içeren tüm veri setini veremeyen (zaman yok, bant genişliği yok veya belki de hiç veriye sahip değil) güvenilir bir taraf size yalnızca Kök'ü verir (örn. “CECO”). Son Söz: Binlerce güvenilmeyen taraftan yaprak numarasına göre milyonlarca ad alırsınız. Doğru Kök'e sahip olduğunuz için kime güvenebileceğinizi, kimin size sahte veriler verdiğini kontrol edebilirsiniz…

Merkle ağaçları sizin de hayatınızın bir parçası! 3GB'lık bir Torrent dosyası indirirken dosyanız milyonlarca küçük parçaya bölünür. Her parçanın karması bir yaprakta saklanır. Ağacın geçerli kökünün hangisi olduğunu bildiğiniz için, dosyanın bir kısmını birisinden aldığınızda, bunun doğru olup olmadığını kontrol edebilirsiniz. Değilse, aynı parçayı başka birine sorabilirsiniz.

Ağacın tamamını/tüm yaprakları henüz indirmemiş olsanız bile bunu yapabilirsiniz: Kökün CECO olduğunu biliyorsanız ve JACO'ya güveniyorsanız… ANTHONY parçasını aldığınızda, indirmemiş olsanız bile bunu doğrulayabilirsiniz. yine de MARCO ve JAMES parçaları.

Merkle ağaçlarının dağıtılmış defter teknolojisinde neden faydalı olduğu basittir: Konsensüs protokollerini (yavaş, pahalı) yalnızca Kök üzerinde fikir birliğine varmak için kullanırsınız. Daha sonra ağın güvenilmeyen düğümleri verileri verimli ve doğrudan paylaşabilir… ve Root ile yapılan bütünlük kontrolleri sayesinde güvenli ve sağlam bir şekilde uyuyabilirler.

Tanrı, Ethereum'dan Güvenlik, Ölçeklenebilirlik ve Merkezi Olmayanlaştırma arasından 2 süper güç seçmesini istediğinde… Ethereum Ölçeklenebilirliği feda etti. Aslında "saniye başına işlem sayısı" konusunda güçlü bir üst sınır yok: üst sınır, her bloğun gaz miktarıyla ilgilidir; bu, basitleştirmek gerekirse, her blokta yapabileceğim işlem miktarıdır. Bu limit 8 milyon gazdır. Bu, çok sayıda "küçük" işlem (işlemlere hiçbir veri eklenmemiş, bu veriler üzerinde yürütülecek hiçbir işlem yok) veya az sayıda büyük işlem anlamına gelebilir. İşlemleri gönderen Ethereum düğümlerine ve daha fazla ödeme yapan işlemleri bloğa dahil eden Ethereum madencilerine bağlıdır.

Bir blok çıkarıldı ~15 saniye. Bu, dakikada yaklaşık 32 milyon gaz anlamına geliyor ve eğer Ethereum'un dapp'lerinin ana akım haline gelmesini istiyorsak bu kesinlikle yeterli değil.

Bu arada: Ethereum ve Visa arasındaki sıkıcı karşılaştırmalara bir son verin. Merkezi sistem kurulacak her zaman Tasarım gereği Ethereum'dan daha hızlı olun! Farklı şeyler yaparlar ve onlara farklı durumlarda ihtiyaç duyarsınız. Eğer merkeziyetsizliğe ve güvenin olmadığı bir ortama ihtiyacınız yoksa… elbette Visa'yı seçmelisiniz. Kısacası: Blenderınızın çamaşır makinenizden daha hızlı dönmesi, pantolonunuzu blenderda temizleyeceğiniz anlamına gelmez!

Bulmacayı bir araya getirelim! SNARK'lar sayesinde birçok küçük işlemi tek bir büyük işlemde "sıkıştırabileceğinizi" hayal edin. Bu büyük işlemde harcanan gaz, küçük işlemlerde harcanan gazın toplamından azsa gaz tasarrufu sağlıyorsunuz demektir.

Ve gaz tasarrufu şu anlama gelir:

  • Kullanıcılar genel olarak işlemler için daha az harcama yapıyor → Bu, tüm ekosistem için bir itici güç olacaktır
  • Bir bloğa daha fazla şey koyabilmek → Ethereum, blenderinizden daha hızlı dönüyor!

Nasıl Çalışır?

İşlemleri ve akıllı bir sözleşmeyi bir araya getiren kullanıcılar, bir aktarıcı (veya daha fazla aktarıcı) vardır.

  1. Bu oyunu oynamak isteyen kullanıcılar Ether'lerini (veya tokenlerini) kamuya açık olarak denetlenen bir akıllı sözleşmeye gönderir. Her yeni oyuncu için Merkle ağacında yeni bir yaprak oluşturulur. Yaprak, Ether'in sahibi (aynı zamanda genel anahtar olan adresi), Ether miktarı ve nonce (yaprak eklendiğinde 0 olan o hesabın işlem sayacı) hakkında bilgiler içerir.
  2. A, B'ye Ether göndermek istediğinde (her ikisinin de akıllı sözleşmede bir yaprağı/hesabı olması gerekir), A, alıcının adresini içeren bir işlem paketler. itibarenhesabı, için hesabı, papalık elçisi gelen hesaptan, miktar aktarılacak Ether ve imza işlemin (tabii ki “kimden” hesabının özel anahtarıyla imzalanmış). Daha sonra paketlenmiş işlemi aktarıcıya gönderir.
  3. Aktarıcı, belirli bir zaman aralığında (örneğin bir saat) alınan tüm işlemleri toplar, Merkle ağacını yeni bakiye tutarlarıyla günceller ve tüm imzaların ve yeni Merkle ağacının kökünün geçerli olduğunu kanıtlayan bir SNARK kanıtı oluşturur. Aktarıcı sonunda yeni durumu ve kanıtı akıllı sözleşmeye gönderir.
  4. Akıllı sözleşme, zincirdeki Kanıtı doğrular. Geçerliyse, Yeni durumun Merkle ağaç kökünü sözleşmenin dahili belleğine kaydeder.

Temel olarak Merkle ağacı kökü, tüm hesapların tüm durumunu gösterir. Ve işlemleri, gönderdiğiniz yeni kök tarafından özetlenen Yeni duruma götüren imzaların geçerliliğini kanıtlamadığınız sürece bunu değiştiremezsiniz (= para çalamazsınız).

Özetle: kullanıcılar, Coinbase'de olduğu gibi, imzanız olmadan hiçbir şey yapamayan aktarıcıya güvenmeye gerek kalmadan süper hızlı ve neredeyse ücretsiz işlemler yapabilirler.

Durumu Merkle ağacı köküyle özetlenen, gözetimsiz bir yan zincirdir.

Yukarıda SNARK'lar hakkında öğrendiklerimizi ölçeklendirme hakkında konuştuklarımızla birleştirelim. Bunu yapmanın farklı yolları var. 2 tarifi karşılaştıracağım: Vitalik's ve barryWhiteHat'ın .

KURULUM şu şekilde yapılır:

Projeyi başlatan, aynı zamanda akıllı sözleşmeyi de yaratan kişi. Ne kadar denetlenebilir olursa o kadar iyidir. Ona güvenmelisin… güvenilir kurulum!

Akıllı sözleşme tasarruf sağlar…

2 Merkle kökleri (bytes32 değerleri): ilk ağaç hesapların adreslerini (genel imzalar), ikinci hesapların bakiyelerini ve nonce'lerini içerir

KANITLAMA şu şekilde yapılır:

Aktarıcı

Aktarıcı akıllı sözleşmeye gönderir…

  • Yeni durumun 2 Merkle kökü (ağaç ve dengeler+nonces ağacına hitap eder)
  • imzasız işlemlerin listesi. “Her işlemin bayt başına 68 gas maliyeti var. Dolayısıyla, normal bir transfer için marjinal maliyetin 68 * 3 (başlangıç) + 68 * 3 (--) + 68 * 1 (ücret) + 68 * 4 + 4 * 2 (tutar) + 68 * 2 olmasını bekleyebiliriz. (bir kez) veya 892 gazı”

KANITLANMA sürecinin bilinen girdileri…

  • 2 Eski durum Merkle kökleri
  • 2 Yeni durum Merkle kökleri
  • işlemler listesi

KANITLAMA süreci şunu kanıtlıyor…

Verilmiş

  • 2 Eski durum Merkle kökü (zaten sözleşmede saklanmaktadır)
  • 2 Yeni durum Merkle kökü (toplu işlemde gönderilir)
  • işlem listesi (toplu işlemde gönderilir)

… Aktarıcının, bu işlemlerle 2 Eski köklü durumdan 2 Yeni köklü duruma geçmek için geçerli imzaları vardır.

DOĞRULAMA şu kişi tarafından yapılır:

Akıllı sözleşme (istediğiniz gibi sağlamlıkla kodlanmış, vyper!)

DOĞRULAMA sürecinin bilinen girdileri…

Aynı KANITLAMA'nın bilinen girdileri, açıkça…!

Ölçeklenebilirliğin sınırları

Toplanan her işlem, SNARK doğrulaması için 650 bin gas kullanır (sabit ücret) artı ~900 gaz marjinal maliyet işlem başına (Veri göndermenin maliyeti vardır!). Böylece aktarıcı bloğun tamamını kullanarak en fazla şunları toplayabilir:

hangi vasıta ~544 tx/saniye

barryWhiteHat'ınki

KURULUM şu şekilde yapılır:

Projeyi başlatan adam.

Akıllı sözleşme tasarruf sağlar…

1 Mevcut Durum ile Merkle kökü. Her yaprak bir hesabın karma durumudur.

Ister Bir hesap?

durum = AccountState(pubkey, bakiye, tek seferlik)
state.index = self._tree.append(state.hash())

KANITLAMA şu şekilde yapılır:

Aktarıcı

Aktarıcı akıllı sözleşmeye gönderir…

  • kanıt 𝚷
  • Yeni durum Merkle kökü
  • kanıt 𝚷

KANITLANMA sürecinin bilinen girdileri…

  • Eski durum Merkle kökü
  • Yeni durum Merkle kökü

KANITLAMA süreci şunu kanıtlıyor…

Verilmiş

  • Eski Merkle kökü (zaten sözleşmede kayıtlıdır)
  • Yeni Merkle kökü (aggr. işleminde senti)

… Aktarıcı, Eski kök içeren durumdan Yeni kök içeren duruma geçmek için geçerli imzalara sahip işlemlerin bir listesine sahiptir

DOĞRULAMA şu kişi tarafından yapılır:

Akıllı sözleşme (istediğiniz gibi sağlamlıkla kodlanmış, vyper!)

DOĞRULAMA sürecinin bilinen girdileri…

Aynı KANITLAMA'nın bilinen girdileri, açıkça…!

Ölçeklenebilirliğin sınırları

Aktarıcı, işlemlerin verilerini akıllı sözleşmeye göndermiyor (ki bu maliyetlidir), dolayısıyla sınır aslında SNARK kanıtını doğrulamak için gereken gaz miktarıdır.

Howard Wu'dan bahsetmek SNARK'ın KANITLAMA aşamasını dağıtılmış sistemlerde çalıştırma hakkında, barryWhiteHat iyimser olarak devasa bir SNARK'ta (16666 milyar kısıtlama!) 1 işlemin onaylanmasının mümkün olduğunu belirtiyor.

barryWhiteHat ayrıca 500k gazla zincir üzerinde 𝚷 kanıtını doğrulamak mümkündür; bu, blok başına 16 SNARK (8 milyon/500k) koyabileceğiniz anlamına gelir; Saniye başına ~1.07 SNARK… bu da saniyede ~17,832 tx anlamına gelir (16,666*1.07).

Sonsuza kadar ve ötesine

  • Parıldayan her şey altın değil / 1. Kanıtlama aşamasında ihtiyacınız olan bilgi işlem gücü ve bellek miktarı tam anlamıyla şok edici olabilir. Özellikle karmaşıklığın bir kısmının zincir dışına taşındığı barryWhiteHat versiyonunda. barry yazıyor "7 GB RAM'e ve 20 GB takas alanına sahip bir dizüstü bilgisayarda saniyede 20 işlemi toplamakta zorlanıyor". Peki, eğer hedef saniyede 17,832 tx ise… LOL. Bu, önemsiz olmayan paralel hesaplama zorluklarını ortaya çıkarır. Ancak işlem başına ortalama $ maliyeti, sıradan SNARK içermeyen seçenekten çok daha ucuzsa… oyun muma değer.
  • Parıldayan her şey altın değil / 2. İlgili bir veri kullanılabilirliği sorunu var! Sözleşmede yalnızca ağacın kökü kaydedildiğinden, ağacın tam sürümünün (veya aynı şekilde tüm işlem geçmişinin) her zaman mevcut olduğundan emin olmalısınız. Veri mevcut değilse aktarıcı, geçerli imzalı işlemlerde bile hiçbir şey yapamaz çünkü Eski Durum → İşlemler → Yeni Durumu kanıtlayamaz.
  • Aktarıcının güvenilmez olması ve sözleşmedeki Ether'lerin dışarıdaki Ether'lerle aynı değere sahip olması (likidite sorunu) için… kullanıcıların (belirli) bir aktarıcıya güvenmeden istedikleri zaman akıllı sözleşmeden para çekebilmeleri gerekir. Nasıl? Bu, bu 101 yazının kapsamında değil, ancak bunu ekteki bağlantılardan okuyabilirsiniz.
  • Mevcut Durumun (adresler, bakiyeler ve nonce'ler) Merkle ağacıyla nasıl ele alınabileceği hakkında daha fazla bilgi edinmek ister misiniz? Bir yaprak eklemek, bir yaprağı güncellemek vb.? Çıkış yapmak (test dosyası ) bu temeli kullanan . Teşekkürler HarryR!
  • Kişisel Ethereum-SNARK ortamınızı kurmak ister misiniz? C++ ile zincir dışı başlayalım (Kurulum, Kanıtlama, Doğrulama) . Daha sonra Zokrates ( ile Ethereum'a geçebilirsiniz (unutmayın, yalnızca Doğrulama zincir üzerinde yapılır!), ).
  • Merkle ağaçları yerine RSA akümülatörlerini kullanmaya ne dersiniz? Google “rsa akümülatörleri ethereum” başlamak…

Keyfini çıkarın!

Twitter

Source: https://tokeneconomy.co/how-ethereum-can-scale-with-snarks-101-5b06ff048bb7?source=rss—-fbbd350c08fc—4

spot_img

En Son İstihbarat

spot_img