wstęp
Dowody wiedzy zerowej, zwłaszcza zk-SNARK (Zero-Knowledge Succinct Non-Interactive Knowledge Arguments), są prawdopodobnie jedną z najważniejszych, najnowocześniejszych technologii w Web 3. Obecnie większość uwagi mediów i inwestorów w tej subdziedzinie skupia się na zk-Rollups, skalowalnym rozwiązaniu zapewniającym ogromną skalowalność do łańcuchów bloków L1, takich jak Ethereum.Mimo to zk-Rollups nie są jedynym celem zk-SNARK. W tym artykule dokonamy dogłębnej analizy koncepcji kodu asemblera o zerowej wiedzy (zkASM), ocenimy jego przypadki użycia w zk-Rollups i innych aspektach oraz zbadamy jego potencjał w ponownym wynalezieniu Internetu z poziomu teoretycznego.
Zasady techniczne
Jak sama nazwa wskazuje, zk-ASM składa się głównie z dwóch komponentów technicznych: ZK i ASM. ZK odnosi się do zk-SNARK, który jest zwięzłym, nieinteraktywnym argumentem wiedzy, a ASM odnosi się do kodu asemblera. Aby zrozumieć potencjał zk-ASM, musimy najpierw zrozumieć podstawy teoretyczne tych dwóch pozornie niejasnych koncepcji.
zk-SNARK
zk-SNARK to klejnot w koronie zk-Proofs: to zwięzły sposób udowodnienia, że stwierdzenie jest prawdziwe, bez ujawniania jakichkolwiek informacji na temat potwierdzanych danych. Załóżmy na przykład, że ktoś deklaruje: „Wiem, że istnieje m takie, że C(m) = 0”, gdzie m to gigabajt informacji, a C to funkcja. Zk-SNARK będzie krótkim dowodem (<1GB), który szybko zweryfikuje istnienie m, nie ujawniając przy tym żadnych informacji o m (innych niż informacje publiczne).
Czym dokładnie jest to „C(m)”? Jakie jest zastosowanie? Ta funkcja jest w rzeczywistości obwodem arytmetycznym lub skierowanym wykresem acyklicznym (DAG) reprezentującym konkretną funkcję, którą chcemy wykonać, jak pokazano na rysunku. Zasadniczo „m” to dane wejściowe obwodu, a określone „węzły” w obwodzie to indywidualne bramki logiczne lub operacje. Na przykład „2” i „3” można wprowadzić do węzła „+”, a następnie „5” wysłać do następnego operatora. Umożliwia to zakodowanie dowolnej operacji arytmetycznej lub logicznej w „obwodzie arytmetycznym”.

Gdy kod zk-SNARK, który chcemy uruchomić, zostanie przedstawiony w postaci obwodu arytmetycznego, możemy zacząć budować ten zk-SNARK. Zasadniczo wykonalność zk-SNARK jest ustalona przez „Podstawowe twierdzenie algebry”. Zgodnie z podstawowym twierdzeniem algebry wielomian stopnia „d” ma co najwyżej „d” pierwiastków. Ta matematyczna sztuczka składa się z dwuetapowego procesu: (1) zamień funkcję „f(m)”, którą należy udowodnić, na wielomian i kontynuuj korzystanie z wielomianu oraz (2) użyj „Podstawowego twierdzenia algebry”, aby przetworzyć wielomian i przedstawić zwięzły dowód. Z technicznego punktu widzenia pierwsza część nazywa się „Polynomial Commitment Scheme” (PCS), a druga część nazywa się „Polynomial Interactive Proof of Oracle” (PIOP).

Skład wydajnego, uniwersalnego obwodu SNARK. Źródło: https://cs251.stanford.edu/lectures/lecture15.pdf
Konkretna implementacja PCS i PIOP wykracza poza zakres tego artykułu, ale daje nam to przybliżony szkic podstawowych kroków zk-SNARK:
Wybierz funkcję (funkcję kodu, równanie matematyczne itp.), dla której chcesz uruchomić zk-SNARK
Zakoduj tę funkcję w obwodzie arytmetycznym C(m)
Uruchom PCS, aby uzyskać wielomianową reprezentację obwodu arytmetycznego
Uruchom PIOP i uzyskaj zwięzły dowód rozmiaru log(m).
Teraz istnieje spersonalizowany zk-SNARK, który może udowodnić, że ktoś zna określone informacje, nie ujawniając przy tym konkretnej treści informacji.
kod zespołu
Drugim elementem układanki zk-ASM jest kod asemblera. Jest to język podobny do języka, zawierający instrukcje języka bardzo niskiego poziomu, które są łatwe do odczytania przez maszyny, ale trudne do rozszyfrowania przez ludzi. W przeciwieństwie do języków wysokiego poziomu, takich jak Python, Java czy nawet C, język asemblera zawiera kilka bardzo prymitywnych funkcji, a także MOVE (przesuń), CMP (porównaj), ADD (dodawanie) i JMP (skok) na procesorze i poziomy rejestracji. Na przykład kod Pythona służący do wpisywania cyfr od 1 do 9 na ekranie to `123456789`:

Łatwo to zrozumieć, prawda? Rzućmy okiem na jego wersję montażową x86:

Jest to naprawdę o wiele bardziej kłopotliwe, a to po prostu bardzo prosta operacja. W takim przypadku po co używać języka asemblera? Jak wspomniano powyżej, chociaż instrukcje te nie są łatwo czytelne dla ludzi, można je łatwo „złożyć” w kod bajtowy „110011001”, aby maszyna mogła je odczytać i wykonać (tzw. asembler). Dla porównania, chociaż języki wysokiego poziomu, takie jak Python i Java są bardziej czytelne, procesor nie może bezpośrednio wykonywać programów napisanych w tych językach. Potrzebujemy „kompilatora”, aby przekonwertować kod Pythona lub Java, który piszemy na powyższy kod asemblera i przekazać go maszynie w celu montażu i wykonania. Powodem, dla którego ten sam fragment kodu w języku Python lub Java może działać płynnie na różnych procesorach i systemach operacyjnych, jest to, że kompilator wykonuje całą ciężką pracę i kompiluje kod źródłowy do języka asemblera dla konkretnego procesora lub systemu operacyjnego.
Ponieważ wszystkie języki kompilują się do kodu asemblera (który sam jest dalej kompilowany do wykonywalnych plików binarnych), asembler jest zasadniczo jak „matka wszystkich języków”. Zakładając teraz, że możemy przekonwertować wszystkie operandy w języku asemblera (takim jak x86 lub RISC-V) na reprezentacje obwodów arytmetycznych, możemy dostarczyć dowody zk-SNARK dla wszystkich operandów w tym języku asemblera. Teoretycznie oznacza to, że możemy zapewnić zk-SNARK dla dowolnego programu napisanego w dowolnym języku wysokiego poziomu, który kompiluje się do asemblera, takim jak Python lub Java. Z tego powodu zk-ASM zasługuje na dokładne zbadanie.
Praktyczne zastosowanie
Zk-EVM Rollupy: Wielokąt zk-ASM
Jednym z najważniejszych zastosowań zk-ASM jest tworzenie zk-Rollupów kompatybilnych z maszyną wirtualną Ethereum, czyli zk-EVM. zk-EVM jest bardzo ważny dla skalowalności blockchainu, ponieważ umożliwia programistom wdrażanie w łańcuchach L2 opartych na zk-Rollup bez dokonywania zbyt wielu (lub jakichkolwiek) modyfikacji kodu. Pod tym względem zk-EVM firmy Polygon jest typowym przykładem tego, jak zk-ASM można wykorzystać do osiągnięcia tego celu.

Programiści w publicznym łańcuchu Ethereum L1 zwykle używają języka Solidity, który jest językiem programowania wysokiego poziomu podobnym do języka C. Zanim kod Solidity zostanie uruchomiony na blockchainie L1, zostanie on najpierw skompilowany w serię kodów operacyjnych EVM, takich jak ADD, SLOAD, EQ itp. Domyślnie ten proces oczywiście nie tworzy żadnego ZK-Proof. Pomysłowość firmy Polygon polegała na stworzeniu sposobu na przetłumaczenie każdego kodu operacji EVM na ich niestandardowy kod ZK-ASM, który jest bardzo przyjazny dla ZK-SNARK. Ich L2 zk-EVM następnie wykonuje zk-ASM podczas tworzenia obwodu zk-SNARK ASM w celu utworzenia dowodu zk-SNARK. Na przykład kod operacji ADD w EVM zostanie przetłumaczony na zk-ASM firmy Polygon w następujący sposób:

Ponieważ magia Polygon zk-EVM dzieje się na poziomie montażu, jest on dwa poziomy „niższy” niż warstwa kodu, z którą styka się zwykłe Ethereum, czyli warstwa „Solidność”. Z tego powodu większość programistów może przenieść kod EVM, który zbudowali dla sieci głównej Ethereum, bezpośrednio do Polygon zk-EVM. Jednocześnie Polygon zk-EVM „zachowuje” stos technologii Ethereum aż do poziomu kodu operacyjnego, a cała infrastruktura debugowania opierająca się na analizie skompilowanego kodu operacyjnego może być nadal używana w nienaruszonym stanie. Różni się to od innych projektów ZK-EVM, które nie zapewniają ZK-Proof na poziomie kodu operacji, takich jak ZK-Sync. Dlatego chociaż Polygon wynalazł i zweryfikował swój własny język asemblera, jak powiedział Buterin, „nadal może weryfikować kod EVM, po prostu używa innej logiki wewnętrznej”.
Poza rollupami: zk-WASM
zk-EVM nie jest bynajmniej jedynym przypadkiem użycia zk-ASM. Jak wspomniano powyżej, język asemblera jest zasadniczo „matką wszystkich języków” i utworzenie zk-ASM odblokuje dowody zk dla programów ogólnego przeznaczenia napisanych w dowolnym języku, który kompiluje się do języka asemblera. Web Assembly (WASM) to jeden z najważniejszych pojawiających się języków asemblera. Został wydany po raz pierwszy w 2018 roku i ma na celu poprawę szybkości wykonywania aplikacji internetowych i zapewnienie dodatków wykonawczych dla Javascript (głównego języka programowania w Internecie).
Zasadniczo wraz z ewolucją sieci WWW na przestrzeni lat aplikacje internetowe zwiększyły swój rozmiar i złożoność, co oznacza, że przeglądarki muszą kompilować wszystko, co napisano w języku Javascript, często z bardzo małą szybkością, i muszą powtarzać złożone operacje „kompiluj-optymalizuj-załaduj ponownie”. proces. WebAssembly eliminuje zależność od złożonych silników wykonawczych przeglądarki, zapewniając język asemblera, który jest przenośny, modułowy i łatwy do wykonania. Dodatkowo WASM, jako język asemblera, umożliwia programistom pisanie fragmentów kodu przy użyciu języków takich jak C, C++, Rust, Java czy Ruby, które można uruchomić bezpośrednio w przeglądarce. Dlatego WASM stała się technologią z wyboru do „zapewniania rozproszonych funkcji bezserwerowych”.
Jaką rolę mogą w tym odegrać zk-SNARK? WASM jest wyjątkowy, ponieważ jest technologią po stronie klienta, która wchodzi w bezpośrednią interakcję z danymi wprowadzanymi przez użytkownika. Często obejmują one wrażliwe dane, takie jak hasła i dane osobowe, dlatego potrzebujemy technologii, która (1) zagwarantuje dokładne wykonanie programu oraz (2) zagwarantuje, że poufne informacje nie wyciekną. zk-SNARK jest idealnym rozwiązaniem tych dwóch problemów i dlatego jest ważnym elementem układanki dla WASM.
Prace nad opracowaniem zk-WASM są wciąż na wczesnym etapie, ale w ramach kilku projektów opublikowano niedawno prototypowe obwody zk-SNARK dla WebAssembly. Na przykład symulator zk-SNARK „ZAWA” firmy Delphinus Lab umożliwia kodowanie operandów i semantyki maszyny wirtualnej WASM w obwodzie obliczeniowym, umożliwiając jej tworzenie dowodów zk-SNARK. Obwód zk-WASM z pewnością będzie w dalszym ciągu optymalizowany, aby programy napisane w językach ogólnego przeznaczenia, takich jak C, C++, Rust i Ruby, przyjęły paradygmat zk-Proofs.
podsumowując
W tym artykule zbadano teoretyczne podstawy zk-ASM i zbadano dwa paradygmatowe przypadki użycia zk-ASM: Polygon używa zk-ASM do tworzenia zk-EVM na poziomie kodu operacyjnego i stosuje zk-SNARK do WebAssembly, aby utworzyć zk-WASM. Ostatecznie zk-ASM obiecuje połączyć interoperacyjność i skalę Web 2 z niezawodnością i bezpieczeństwem Web 3.
Z jednej strony blockchain w coraz większym stopniu stara się przełamać obecne wąskie gardła w zakresie wielkości przetwarzania, a z drugiej strony podejścia Web 2 są coraz częściej krytykowane za to, że nie zapewniają odpowiedniej ochrony danych i prywatności użytkowników. Ponieważ programiści będą mogli wykorzystywać paradygmaty projektowania Web 3 w kodzie Web 2 i przenosić języki i kod Web 2 do blockchain, oczekuje się, że uniwersalny zk-ASM stanie się punktem spotkania pomiędzy światami Web 2 i Web 3. W związku z tym zk-ASM może pozwolić nam na ponowne zaprojektowanie bezpieczniejszego i pozbawionego zaufania Internetu.