
Dowód wiedzy zerowej (ZKP) to potężne narzędzie kryptograficzne, które może zweryfikować poprawność obliczeń, chroniąc jednocześnie prywatność wprowadzanych danych. Jako integralna część tej infrastruktury krytycznej, języki dziedzinowe (DSL) odgrywają istotną rolę, usprawniając proces rozwoju i weryfikacji obwodów ZKP. Odgrywają ważną rolę w łączeniu abstrakcyjnych koncepcji z precyzyjnymi reprezentacjami obwodów wymaganymi do sprawdzenia działania systemu, pełniąc rolę ważnego pomostu między nimi.
Jednym z kluczowych wyzwań w testowaniu systemów jest tłumaczenie abstrakcyjnych koncepcji wysokiego poziomu na rzeczywiste obwody. Jednakże pojawienie się DSL stanowi odpowiedź na to wyzwanie, ułatwiając ustrukturyzowane wyrażanie tych abstrakcyjnych koncepcji w bardziej konkretny i osiągalny sposób.
W ciągu ostatniej dekady byliśmy świadkami znacznego wzrostu liczby i różnorodności łączy DSL. Aktywność w tym obszarze znajduje odzwierciedlenie w rozwoju kilku języków obwodów, w tym Noir, Leo, Zinc i innych. Niezależnie od tego, czy potrzebujesz opcji ogólnego przeznaczenia, jak Circom, czy rozwiązania dostosowanego do konkretnej platformy, jak Cairo, możesz wybierać spośród szerokiej gamy języków i frameworków do pisania obwodów ZKP.
W tym artykule przyjrzymy się głównym językom programowania ZK, z których programiści aktywnie korzystają, i przeanalizujemy najlepsze funkcje każdego języka.
TLDR;

Kair autorstwa StarkWare
Cairo, podstawowy język programów obliczeniowych ogólnego przeznaczenia obsługujących dowody STARK, odegrał kluczową rolę w sukcesie StarkNet i StarkEx, napędzając skalowalność aplikacji w głównej sieci Ethereum. Warto zauważyć, że Cairo odegrał kluczową rolę we wspieraniu różnych aplikacji, w tym dYdX, Sorare, Immutable X i innych. Nazwa „Kair” pochodzi od skrótu „CPU Algebraic Intermediate Representation”. W świecie dowodów o wiedzy zerowej pełni rolę podobną do języka asemblera, ułatwiając start programistom znającym niskopoziomowe języki programowania takie jak C, C++ czy Solidity.
Zainspirowany Rust, Cairo umożliwia programistom tworzenie inteligentnych kontraktów Starknet, koncentrując się na bezpieczeństwie i rozwoju przyjaznym dla użytkownika. Cairo ma potężną składnię, która upraszcza tworzenie obwodów ZK, umożliwiając użytkownikom wykonywanie różnorodnych zadań w programach Cairo. Dodatkowo istotną zaletą Cairo jest jego rozszerzalność, pozwalająca na elastyczne wprowadzanie nowych funkcji i możliwości.
W systemach ZK najważniejsza jest wydajność i skalowalność, a Cairo wychodzi naprzeciw temu wymaganiu, kładąc nacisk na te dwa aspekty. Język integruje strategie optymalizacji, w tym redukcję ograniczeń i eliminację pętli, aby złagodzić obciążenie obliczeniowe zwykle związane z obwodami ZK. Optymalizacja projektu obwodów firmy Cairo zapewnia szybsze generowanie i weryfikację dowodów, dzięki czemu idealnie nadaje się do zastosowań wymagających dużej przepustowości i minimalnych opóźnień.
Ekspansja Kairu była imponująca, a w ciągu ostatnich dwóch lat nastąpił niezwykły wzrost liczby pełnoetatowych programistów. Ten wzrost podkreśla zdolności adaptacyjne Kairu, ponieważ zastosowania Kairu nie ograniczają się do blockchain, ale są istotne w każdym kontekście, w którym wymagana jest weryfikacja obliczeniowa. W rezultacie możemy spodziewać się znacznego dalszego wzrostu liczby zastosowań Kairu przez deweloperów.
28 września 2023 r. firma Starknet uruchomiła ważną aktualizację swojego języka programowania Cairo v2.3.0. To wydanie stanowi duży krok naprzód w zwiększaniu modułowości umów, zwiększając potencjał inteligentnych kontraktów poprzez wprowadzenie nowych funkcji, opcji przechowywania i zarządzania zdarzeniami. Integracja tych komponentów zapewnia elastyczny sposób rozszerzania funkcjonalności umowy, umożliwiając modułom innych firm zwiększanie funkcjonalności umowy.
Cynk od ZkSync
Zinc to język programowania przeznaczony do tworzenia inteligentnych kontraktów i obwodów SNARK na platformie zkSync. Używa składni Rusta, zawiera elementy Solidity i zapewnia unikalne funkcje.
Tym, co czyni Zinc wyjątkowym, jest jego łatwość obsługi. Nie musisz rozumieć wszystkich zawiłych szczegółów systemów ograniczeń pierwszego rzędu (R1CS), aby pisać bezpieczny kod. Cynk podkreśla niezmienność, czyniąc go z natury funkcjonalnym. Oznacza to, że priorytetowo traktuje niezmienne dane i ocenę funkcji, redukując w ten sposób skutki uboczne i promując pisanie czystszego, mniej podatnego na błędy inteligentnego kodu kontraktu.
Dodatkowo Cynk zawiera bezpieczne operacje matematyczne zapobiegające potencjalnym przepełnieniom, zapewniając bezpieczeństwo wszystkich operacji. Chociaż ma pewne ograniczenia, takie jak brak nieskończonych pętli i rekurencji, Zinc upraszcza proces debugowania poprzez śledzenie dzienników konsoli. Te ślady usprawniają debugowanie, upraszczając proces śledzenia i rozwiązywania problemów w sieci testowej lub sieci głównej.
Noir autorstwa Azteków
Noir to open source DSL opracowany przez firmę Aztec, oparty na Rust, zaprojektowany w celu uproszczenia tworzenia obwodów ZK i programów ZK bez konieczności dogłębnej znajomości kryptografii. Uważany jest za jeden z najbardziej dostępnych języków do pisania aplikacji ZK, które są kompatybilne z dowolnym systemem sprawdzającym. Noir skupia się na bezpieczeństwie, prostocie i wydajności. Zapewnia wysokopoziomową składnię podobną do Rusta, która abstrahuje bezpieczeństwo kryptograficzne i upraszcza użycie podstawowych prymitywów kryptograficznych przy jednoczesnym zachowaniu wysokiej wydajności.
Noir ma istotne zalety w poszerzaniu zakresu aplikacji, które mogą skorzystać z możliwości ochrony prywatności udostępnianych przez ZKP, zwiększając tym samym skuteczność prywatności i weryfikacji. Noir jest kompilowany do postaci pośredniej zwanej abstrakcyjną reprezentacją pośrednią obwodu (Acer), którą można następnie skompilować do R1CS. Oddzielenie systemu sprawdzającego backend od samego języka umożliwia Noir obsługę różnych systemów sprawdzających, w tym Aztec Brettenberg, Turbo Plonk i potencjalnych przyszłych integracji, takich jak Groth16 i Halo2.
Język zapewnia standardową bibliotekę zawierającą wydajne funkcje, takie jak SHA-256 (kryptograficzna funkcja skrótu, która generuje dane wyjściowe o stałym rozmiarze) i kontrole Pedersen-Merkle (metoda wykorzystująca zobowiązania Pedersen i drzewa Merkle w celu zapewnienia integralności danych i spójności szyfrowania technologia weryfikacji). Noir jest zaprojektowany podobnie jak Rust i zawiera funkcje znane twórcom aplikacji, takie jak funkcje, podmoduły, typy zdefiniowane przez użytkownika (struktury), warunki, pętle i stałe globalne. Ponadto czynione są ciągłe wysiłki w celu opracowania produktów generycznych i pierwszorzędnych funkcji w celu dalszego zwiększania możliwości ekspresyjnych Noir.
Należy zauważyć, że Noir jest wciąż w toku i mogą występować pewne ograniczenia i potencjalne błędy. Zespół programistów jest jednak zaangażowany w ciągłe doskonalenie i optymalizację języka.
o1js autorstwa 0(1) laboratoriów
o1js, dawniej SnarkyJS, to biblioteka TypeScript opracowana przez 0(1)Labs do tworzenia inteligentnych kontraktów przy użyciu języka programowania SNARK. Wykorzystuje już ustalone technologie, takie jak Node.js i kompatybilność z przeglądarkami, aby zapewnić programistom łatwy dostęp i łatwość obsługi.
o1js bezproblemowo integruje się z bibliotekami i narzędziami JavaScript i TypeScript, zapewniając programistom silny ekosystem i szerokie wsparcie społeczności. Integracja ta upraszcza proces programowania i skraca czas uczenia się związany z przyjęciem nowego środowiska programistycznego. Ponadto w pełni obsługuje Visual Studio Code (VS Code), powszechnie używany edytor kodu, który umożliwia programistom korzystanie z takich funkcji, jak uzupełnianie kodu, podświetlanie składni i debugowanie w celu zwiększenia komfortu programowania.
o1js to zasadniczo wszechstronny framework ZK, który zapewnia kluczowe narzędzia potrzebne do tworzenia dowodów ZK. Obsługuje tworzenie różnorodnych programów ZK, obejmujących różnorodne wbudowane operacje możliwe do udowodnienia, w tym podstawową arytmetykę, mieszanie, podpisy, operacje logiczne, porównania i inne. Dzięki frameworkowi o1js możesz budować zkApps na protokole Mina, inteligentnych kontraktach, które są wykonywane po stronie klienta i mają prywatne dane wejściowe.
Warto wspomnieć, że na początku września 2023 roku zespół 0(1)Labs ogłosił, że przejdzie ze SnarkyJS na o1js i podkreślił swoje zaangażowanie w poprawę wydajności. Na szczególną uwagę zasługuje to, że osiągnięto 3-4-krotne skrócenie czasu ładowania biblioteki, który odnosi się do czasu potrzebnego na zaimportowanie o1js, procesu, który może zablokować główny wątek. W przypadku aplikacji internetowych czas ładowania ma ogromne znaczenie zarówno dla czasu wykonania JavaScript, jak i renderowania całej strony. Ponadto zespół zaktualizował również interfejs CLI Mina zkApp, aby poprawić komfort tworzenia interfejsu użytkownika, i ogłosił dalsze ulepszenia interfejsu API Archive Node w celu zwiększenia jego niezawodności i przejrzystości.
Leo przez Aleo
Blockchain Aleo jest wyjątkowy w dziedzinie inteligentnych kontraktów i kładzie nacisk na ochronę prywatności. Jego rdzeniem jest język programowania Leo, język ze statycznym typowaniem inspirowany Rustem. Zaprojektowany specjalnie do tworzenia prywatnych aplikacji, Leo wspiera twórców, którzy chcą zbudować bezpieczny i prywatny zdecentralizowany ekosystem. Tym, co jest naprawdę wyjątkowe w firmie Leo, jest jej pionierska rola we wprowadzaniu kompleksowego zestawu narzędzi do zastosowań ogólnego przeznaczenia wykorzystujących wiedzę zerową. Ten zestaw narzędzi zawiera platformę testową, rejestr pakietów, analizator importu, zdalny kompilator i generator twierdzeń.
Leo został stworzony przez zespół programistów pod przewodnictwem Howarda Wu, który przewidział technologię, która umożliwi programistom tworzenie zdecentralizowanych aplikacji, w których priorytetem będzie prywatność i bezpieczeństwo. Projekt Leo opiera się na zasadach Rusta, jednocześnie zawiera elementy podobne do JavaScript, aby promować znajomość i wygodę podczas procesu programowania. Ponadto Leo ma na celu przyspieszenie rozwoju i uproszczenie procesu rozwoju poprzez zapewnienie zintegrowanej platformy testowej, rejestru pakietów i konwertera importu. Integracja ta pozwala programistom skoncentrować się na podstawowej logice swoich aplikacji bez obciążania problemami związanymi z infrastrukturą.
Uderzającą cechą Leo jest jego kompilator, który konwertuje programy do niskopoziomowego formatu próbnego R1CS. Kompilator Leo wyróżnia się rygorystycznym procesem weryfikacji formalnej. Weryfikacja ta ma kluczowe znaczenie, ponieważ luki mogą pojawić się na wielu etapach, od wstępnego programowania po audyt i kompilację. Przeprowadzając rygorystyczne kontrole matematyczne, aby upewnić się, że kompilator jest zgodny z zamierzeniami programisty, Leo ma na celu zmniejszenie ryzyka niewykrytych błędów lub potencjalnych podatności, szczególnie w kontekstach L2, pakietach ZK lub prywatnych programach na platformie Leo.
Circom autorstwa iden3
Circom, DSL stworzony specjalnie dla rozwoju obwodów ZK, jest wynikiem wspólnego wysiłku Jordiego Bayliny i zespołu iden3. Kompilator Circom napisany jest w języku Rust i jego głównym zadaniem jest kompilowanie obwodów napisanych w języku Circom. Warto zauważyć, że Circom stał się preferowanym wyborem w przypadku wyjątkowych aplikacji ZK w świecie rzeczywistym, takich jak Dark Forest i Tornado Cash. Jego popularność wynika z doskonałej wydajności, w tym krótkiego czasu sprawdzania przeglądarki dzięki zoptymalizowanym weryfikacjom WASM, wydajnym weryfikacjom po stronie serwera za pomocą Rapidsnark i wydajnej weryfikacji w łańcuchu.
Należy jednak zdać sobie sprawę, że funkcjonalność Circom koncentruje się przede wszystkim na rozwoju obwodów ZK, co może sprawić, że będzie on mniej przydatny do obsługi szerszego zakresu zadań obliczeniowych. Programiści poszukujący większej funkcjonalności, która zaspokoi szerszy zakres potrzeb programistycznych, mogą uznać, że możliwości Circom są nieco ograniczone. W takim przypadku programiści mogą potrzebować połączenia innych języków programowania lub frameworków, aby sprostać szerszym potrzebom programistycznym.
Zdjęcie za pośrednictwem Circom
Kompatybilność Circom koncentruje się na powszechnie używanych systemach ZKP, takich jak snarkjs i libsnark. Chociaż ta kompatybilność zapewnia bezproblemową integrację z powszechnie używanymi systemami, oznacza to również, że obwody Circom dziedziczą specyficzne możliwości i ograniczenia związane z tymi zależnościami. Programiści, którzy wolą lub potrzebują alternatywnego systemu ZKP, mogą stanąć przed wyzwaniami związanymi z kompatybilnością lub muszą zainwestować dodatkową pracę w celu dostosowania i zintegrowania obwodów generowanych przez Circom z preferowanym systemem.
Lurk przez Lurk Lab
Lurk jest dialektem Lispa o statycznym zasięgu, na który wpływają Scheme i Common Lisp, z unikalną cechą: umożliwia bezpośredni dowód poprawności wykonania programu przy użyciu zk-SNARK, umożliwiając zwartą i wydajną weryfikację.
Główne zastosowania Lurka obejmują:
Sprawdzalne obliczenia: Lurk pozwala udowodnić poprawność swoich wyrażeń w warunkach wiedzy zerowej, zwiększając zaufanie do wyników obliczeń.
Wiedza zerowa: użytkownicy mogą udowodnić wiedzę bez ujawniania konkretnych informacji poza zasięgiem opinii publicznej, chroniąc w ten sposób prywatność.
Dane adresowalne pod względem treści: każdy program Lurk jest wyposażony w unikalny identyfikator treści (CID), dzięki czemu jest kompatybilny z IPFS i IPLD.
Kompletność Turinga: Lurk wspiera tworzenie i udowadnianie dowolnych twierdzeń obliczeniowych.
Funkcje wyższego rzędu: funkcje Lurk mogą akceptować i zwracać funkcje, umożliwiając ekspresyjne programowanie funkcjonalne.
Obliczenia obsługujące prywatne dane: Lurk umożliwia obsługę prywatnych danych, zapewniając jednocześnie możliwe do udowodnienia poprawne dane wyjściowe bez narażania prywatności.
Lurk w pełni wykorzystuje „wady” alokatora pamięci Lispa podczas budowania obwodów ogólnego przeznaczenia. Ten alokator łączy wyrażenia i generuje odniesienia za pomocą skrótów. Kluczem jest udowodnienie, że oba wyrażenia rzeczywiście mają skrót do tego samego odniesienia. Weryfikacja ta umożliwia Lurkowi wykonywanie obliczeń w obwodzie Snarka.
Lurk jest bardzo bogaty w funkcje, w tym obsługę nieskończonej rekurencji, pętli, warunkowego przepływu sterowania i wielu systemów sprawdzających backend, takich jak Groth16, SnarkPack+ i Nova. Ta wszechstronność otwiera drzwi do różnych zastosowań, w tym do obliczeń weryfikacyjnych, przetwarzania prywatnych danych i wykonywania kompletnych programów Turinga w obwodach Snarka.
Podsumować
Wraz ze wzrostem różnorodności zastosowań ZK, DSL ma szerokie perspektywy rozwoju w obszarze ZK. Kluczem do udanego DSL jest budowanie prężnej społeczności i bogatych bibliotek, które wzbogacają doświadczenia programistów. Linie DSL, dla których priorytetem jest zgodność z istniejącymi bibliotekami, mogą wykorzystać wiedzę i zasoby szerszej społeczności programistów. Takie podejście ułatwia płynniejszą integrację, przyspiesza rozwój i zapewnia większą elastyczność przy wdrażaniu aplikacji ZK. Ten wspólny wysiłek ma kluczowe znaczenie dla wspierania solidniejszego ekosystemu wokół DSL, zapewniając programistom wymierne korzyści i w dalszym ciągu będzie napędzał przyjęcie i skuteczność technologii ZK.




