úvod
Důkazy nulových znalostí, zejména zk-SNARK (Zero-Knowledge Succinct Non-Interactive Knowledge Arguments), jsou možná jednou z nejdůležitějších špičkových technologií ve Webu 3. V současné době se většina mediální a investiční pozornosti v tomto podoboru zaměřuje na zk-rollups, škálovací řešení, které poskytuje masivní škálovatelnost pro L1 blockchainy, jako je Ethereum. Tento článek poskytne hloubkovou analýzu konceptu kódu sestavení s nulovými znalostmi (zkASM), zhodnotí jeho případy použití v zk-rollups a další aspekty a prozkoumá jeho potenciál při znovuobjevování internetu z teoretické úrovně.
Technické principy
Jak název napovídá, zk-ASM se skládá hlavně ze dvou technických součástí: ZK a ASM. ZK odkazuje na zk-SNARKs, což je stručný neinteraktivní znalostní argument, a ASM odkazuje na kód sestavení. Abychom pochopili potenciál zk-ASM, musíme nejprve pochopit teoretický základ těchto dvou zdánlivě nejasných konceptů.
zk-SNARKs
Zk-SNARK jsou korunovační klenot zk-Proofs: jsou stručným způsobem, jak dokázat, že tvrzení je pravdivé, aniž by prozrazovaly jakékoli informace o dokazovaných údajích. Předpokládejme například, že někdo prohlásí „Vím, že existuje m takové, že C(m) = 0,“ kde m je gigabajt informace a C je funkce. Zk-SNARK bude představovat krátký důkaz (<1 GB), který rychle ověří existenci m, aniž by odhalil žádné informace o m (jiné než veřejné informace).
Co přesně je to "C(m)"? Jaké je použití? Tato funkce je ve skutečnosti aritmetickým obvodem nebo řízeným acyklickým grafem (DAG) znázorněním konkrétní funkce, kterou chceme provést, jak je znázorněno na obrázku. V podstatě „m“ jsou vstupní data obvodu a konkrétní „uzly“ v obvodu jsou jednotlivá logická hradla nebo operace. Například "2" a "3" mohou být zadány do uzlu "+" a potom je "5" odesláno dalšímu operátoru. To umožňuje zakódování jakékoli aritmetické nebo logické operace do „aritmetického obvodu“.
Poté, co je kód zk-SNARK, který chceme spustit, reprezentován aritmetickým obvodem, můžeme začít tento zk-SNARK stavět. V zásadě je proveditelnost zk-SNARK stanovena "Základní větou algebry" Podle Základní věty algebry má polynom stupně "d" nanejvýš "d" kořeny. Tento matematický trik je dvoustupňový proces: (1) převést funkci „f(m)“, kterou je třeba dokázat, na polynom a pokračovat v používání polynomu a (2) použít „Základní větu algebry“ k zpracovat polynom a poskytnout výstižný důkaz. Z technického hlediska se první část nazývá „Polynomial Commitment Scheme“ (PCS) a druhá část se nazývá „Polynomial Interactive Proof of Oracle“ (PIOP).
Složení efektivního univerzálního obvodu SNARK. Zdroj: https://cs251.stanford.edu/lectures/lecture15.pdf
Konkrétní implementace PCS a PIOP je nad rámec tohoto článku, ale to nám poskytuje hrubý náčrt hlavních kroků zk-SNARK:
Vyberte funkci (funkci kódu, matematickou rovnici atd.), na které chcete spustit zk-SNARK
Zakódujte tuto funkci do aritmetického obvodu C(m)
Spusťte PCS pro získání polynomické reprezentace aritmetického obvodu
Spusťte PIOP a získejte stručný důkaz o velikosti log(m).
Nyní existuje přizpůsobený zk-SNARK, který dokáže prokázat, že někdo zná určitou informaci, aniž by prozradil konkrétní obsah informace.
montážní kód
Druhým kouskem skládačky zk-ASM je montážní kód. Jedná se o jazyk podobný jazyku obsahující velmi nízkoúrovňové jazykové instrukce, které jsou snadno čitelné pro stroje, ale pro lidi je obtížné je dešifrovat. Na rozdíl od jazyků na vysoké úrovni, jako je Python, Java nebo dokonce C, jazyk assembler obsahuje některé velmi primitivní funkce, stejně jako MOVE (přesun), CMP (porovnání), ADD (přidání) a JMP (skok) na procesoru. a registrovat úrovně. Například kód Pythonu pro psaní čísel 1 až 9 na obrazovce je `123456789`:
To je snadné pochopit, že? Podívejme se na jeho verzi sestavení x86:
Je to opravdu mnohem obtížnější a je to jen velmi jednoduchá operace. Proč v tomto případě používat jazyk symbolických instrukcí? Jak bylo zmíněno výše, ačkoli tyto instrukce nejsou snadno čitelné pro lidi, lze je snadno „sestavit“ do bajtového kódu `110011001`, aby je stroj mohl přečíst a spustit (tzv. assembler). Pro srovnání, ačkoli jsou jazyky na vysoké úrovni jako Python a Java čitelnější, procesor nemůže přímo spouštět programy napsané v těchto jazycích. Potřebujeme „kompilátor“, který převede kód Pythonu nebo Java, který zapíšeme, do kódu sestavení výše a předáme jej stroji k sestavení a provedení. Důvod, proč může stejný kus kódu Python nebo Java hladce běžet na různých procesorech a operačních systémech, je ten, že překladač dělá těžkou práci a zkompiluje zdrojový kód do jazyka symbolických instrukcí pro konkrétní procesor nebo operační systém.
Protože všechny jazyky se kompilují do kódu assembleru (který je sám dále kompilován do spustitelných binárních souborů), je assembler v podstatě jako „matka všech jazyků“. Nyní za předpokladu, že dokážeme převést všechny operandy v assembleru (jako je x86 nebo RISC-V) na reprezentace aritmetických obvodů, můžeme poskytnout důkazy zk-SNARK pro všechny operandy v tomto assembleru. Teoreticky to znamená, že můžeme poskytnout zk-SNARKy pro jakýkoli program napsaný v jakémkoli jazyce na vysoké úrovni, který se kompiluje do assembleru, jako je Python nebo Java. Z tohoto důvodu si zk-ASM zaslouží naše pečlivé studium.
Praktická aplikace
zk-EVM Rollups: Polygon zk-ASM
Jednou z nejdůležitějších aplikací zk-ASM je vytváření zk-rollups kompatibilních s virtuálním strojem Ethereum nebo zk-EVM. zk-EVM je velmi důležitý pro škálovatelnost blockchainu, protože umožňuje programátorům nasazení na L2 řetězcích založených na zk-Rollup bez provádění příliš mnoha (nebo jakýchkoli) úprav kódu. V tomto ohledu je zk-EVM společnosti Polygon typickým příkladem toho, jak lze k dosažení tohoto cíle použít zk-ASM.
Vývojáři na veřejném řetězci Ethereum L1 obvykle používají jazyk Solidity, což je programovací jazyk na vysoké úrovni podobný jazyku C. Před spuštěním kódu Solidity na blockchainu L1 bude nejprve zkompilován do řady operačních kódů EVM, jako je ADD, SLOAD, EQ atd. Ve výchozím nastavení tento proces zjevně nevytváří žádný zk-Proof. Vynalézavostí Polygonu bylo vytvořit způsob, jak přeložit každý operační kód EVM do vlastního zk-ASM, které je velmi přátelské k zk-SNARK. Jejich L2 zk-EVM pak provede zk-ASM při vytváření obvodu zk-SNARK ASM pro vytvoření důkazu zk-SNARK. Například operační kód ADD v EVM by byl přeložen do zk-ASM Polygonu takto:
Protože kouzlo Polygonu zk-EVM se odehrává na úrovni sestavy, je o dvě úrovně „nižší“ než vrstva kódu, které se dotýká běžné Ethereum, vrstva „Solidita“. Z tohoto důvodu může většina vývojářů přenést kód EVM, který vytvořili pro hlavní síť Ethereum, přímo do Polygon zk-EVM. Polygon zk-EVM zároveň „zachovává“ technologický stack Ethereum až na úroveň provozního kódu a veškerá ladicí infrastruktura, která se spoléhá na analýzu zkompilovaného provozního kódu, může být stále používána nedotčená. To se liší od jiných návrhů zk-EVM, které neposkytují zk-Proof na úrovni operačního kódu, jako je zk-Sync. Proto, i když Polygon vynalezl a ověřil svůj vlastní assembler, jak řekl Buterin, „stále může ověřit EVM kód, jen používá jinou vnitřní logiku“.
Beyond Rollups: zk-WASM
zk-EVM není v žádném případě jediným případem použití pro zk-ASM. Jak bylo zmíněno výše, jazyk symbolických instrukcí je v podstatě „matkou všech jazyků“ a vytvoření zk-ASM odemkne zk-Proofs pro univerzální programy napsané v jakémkoli jazyce, který se zkompiluje do jazyka symbolických instrukcí. Web Assembly (WASM) je jedním z nejdůležitějších vznikajících jazyků assembleru, který byl poprvé vydán v roce 2018 a jeho cílem je zlepšit rychlost spouštění webových aplikací a poskytovat spouštěcí doplňky pro Javascript (hlavní programovací jazyk za webem).
V podstatě, jak se web v průběhu let vyvíjel, webové aplikace rostly co do velikosti a složitosti, což znamená, že prohlížeče musí kompilovat vše napsané v Javascriptu, často extrémně nízkou rychlostí, a musí opakovat složité „kompilace-optimalizace-znovu načítání“. proces. WebAssembly eliminuje závislost na složitých prováděcích motorech prohlížeče tím, že poskytuje jazyk pro sestavení, který je přenosný, modulární a snadno proveditelný. WASM jako jazyk symbolických instrukcí navíc umožňuje programátorům psát úryvky kódu pomocí jazyků jako C, C++, Rust, Java nebo Ruby, které lze spustit přímo v prohlížeči. WASM se proto stal technologií volby pro „poskytování distribuovaných funkcí bez serveru“.
Jakou roli v tomto ohledu mohou hrát zk-SNARK? WASM je unikátní v tom, že jde o technologii na straně klienta, která přímo spolupracuje s daty zadanými uživatelem. To často zahrnuje citlivá data, jako jsou hesla a osobní údaje, takže potřebujeme technologii, která (1) zajistí přesné provedení programu a (2) zajistí, že nedojde k úniku citlivých informací. zk-SNARK je dokonalým řešením těchto dvou problémů, a proto je důležitým dílkem skládačky pro WASM.
Práce na vývoji zk-WASM jsou stále v rané fázi, ale několik projektů nedávno vydalo prototyp obvodů zk-SNARK pro WebAssembly. Například simulátor „ZAWA“ zk-SNARK společnosti Delphinus Lab přináší způsob, jak zakódovat operandy a sémantiku virtuálního stroje WASM do výpočetního obvodu, což umožňuje odvodit důkazy zk-SNARK. Obvod zk-WASM bude jistě i nadále optimalizován tak, aby programy napsané v univerzálních jazycích, jako jsou C, C++, Rust a Ruby, přijaly paradigma zk-Proofs.
na závěr
Tento článek zkoumá teoretický základ zk-ASM a zkoumá dva případy použití paradigmatu zk-ASM: Polygon používá zk-ASM k vytvoření zk-EVM na úrovni provozního kódu a aplikuje zk-SNARKs na WebAssembly k vytvoření zk-WASM; Nakonec zk-ASM slibuje spojit interoperabilitu a rozsah Web 2 s důvěryhodností a bezpečností Web 3.
Na jedné straně se blockchain stále více snaží prolomit současná úzká místa v objemu zpracování a na druhé straně jsou přístupy Web 2 stále častěji kritizovány za to, že nedostatečně chrání uživatelská data a soukromí. Vzhledem k tomu, že programátoři jsou schopni používat designová paradigmata Web 3 v kódu Web 2 a přinášet jazyky a kód Web 2 do blockchainu, očekává se, že se univerzální zk-ASM stane místem setkání mezi světy Web 2 a Web 3. S ohledem na to nám zk-ASM může umožnit přetvořit bezpečnější a důvěryhodnější internet.