
Wprowadzenie
Społeczność zajmująca się rozwojem technologii blockchain od dawna potrzebowała skutecznych rozwiązań w zakresie bezpieczeństwa i integralności inteligentnych kontraktów.
## Wprowadzenie i streszczenie
Ten nowy system formalnej weryfikacji zmieni sposób, w jaki programiści mogą ustalać poprawność swoich inteligentnych kontraktów Solidity. Jest on bardziej elastyczny niż inne konwencjonalne metody automatycznego dowodzenia twierdzeń, ponieważ jest bardziej programowalny przez człowieka, ale także zapewnia większą elastyczność w wyrażaniu i wykazywaniu właściwości poprawności niż dotychczas.
Dzięki temu programiści mają łatwiejszy punkt wyjścia do tworzenia dowodów, że specyfikacje wynikają z abstrakcyjnej reprezentacji.
Wprowadzenie do struktury
Framework kompiluje sprawdzalne komputerowo dowody poprawności inteligentnych kontraktów Yul do podjęzyka Lean proving assistant i może kompilować specyfikacje w celu ich wykonania na EVM zgodnym z testami weryfikującymi poprawność modelu.
Wykorzystuje bogate biblioteki matematyczne i automatyzację dowodów ekosystemu Lean, dlatego ta metoda wymaga większej interwencji ręcznej niż inne znane metody automatyzacji, ale każda poprawność, którą można zapisać na papierze, może zostać potwierdzona komputerowo.
Framework korzysta z efektywnych bibliotek formalizacji matematycznej i opcji automatyzacji specyficznych dla danej dziedziny. Niemniej jednak, jak pokazuje wiele podstawowych twierdzeń matematycznych, zawsze będą istnieć twierdzenia, których nie da się udowodnić w żadnym systemie wystarczająco potężnym, aby je udowodnić.
Możliwość ta powinna otworzyć drzwi do sprawdzania złożonych właściwości poprawności inteligentnych kontraktów. Framework ten szczególnie dobrze nadaje się do zilustrowania swoich mocnych stron poprzez weryfikację złożonych właściwości algorytmów aproksymacji numerycznej stosowanych w zdecentralizowanych aplikacjach finansowych oraz weryfikatorach zero-knowledge w łańcuchu bloków.
Architektura techniczna i funkcje
Aby w pełni ułatwić budowanie zaufania, framework został wsparty dotacją finansową na testowanie semantyki w oparciu o zestawy testów zgodności Ethereum oraz rozszerzenie modelu o najnowsze plany aktualizacji Ethereum. Ulepszony model zostanie opublikowany jako dobro publiczne.
Struktura zawiera generator warunków weryfikacyjnych, który jest w stanie wyodrębnić programy Yul do asystenta dowodowego Lean. Nie tylko dzieli programy na łatwe do zrozumienia bloki, ale także generuje uproszczone opisy semantyki tych bloków.
Framework obsługuje również pisanie dowodów poprzez udostępnienie biblioteki twierdzeń i narzędzi automatyzacji. Dowody można następnie sprawdzić za pomocą LeanCompiler, którego jądro sprawdzające dowody jest nieco mniejsze, ale obecnie uważa się je za wolne od błędów w sensie akceptowania dowodów fałszywych twierdzeń.
Zaletą tego podejścia jest to, że pozwala ono na zapisanie dowolnej właściwości, którą można zapisać i formalnie udowodnić na papierze, oraz sprawdzenie jej za pomocą LeanCompiler, który ma stosunkowo niewielkie jądro sprawdzające poprawność dowodów i obecnie uważa się, że jest wolny od błędów w sensie akceptowania dowodów fałszywych twierdzeń. Ta elastyczność jest większa niż w przypadku większości metod automatycznych, które są ograniczone przez wbudowane rozumowanie metod.
Kompozycyjność i abstrakcja
Właściwości kompozycyjności i abstrakcji oznaczają, że sprawdzone elementy kodu są zachowywane poprzez ich wykorzystanie w nowych sytuacjach. Umożliwia to zastąpienie dużych fragmentów skomplikowanego kodu prostymi instrukcjami opisującymi ich działanie.
Obsługuje nawet bezpieczne zastępowanie implementacji kodu alternatywnymi, ale semantycznie równoważnymi, np. optymalizując algorytmy i zachowując gwarancje poprawności.
Struktura zapewnia rozszerzalną, kontrolowaną automatyzację za pomocą niestandardowych procedur, które generują dowody weryfikowane przez system bazowy. Pozwala to znacznie ograniczyć pracę ręczną, zachowując jednocześnie gwarancje weryfikacji.
Komponenty systemu i przepływ pracy
Struktura składa się z trzech kluczowych elementów, które współpracują ze sobą, zapewniając szerokie możliwości weryfikacyjne:
- Model dialektu Yul EVM, który wyjaśnia semantykę kodu Yul w środowisku asystenta dowodowego. To właśnie on nadaje rozumowaniu dotyczącemu zachowania programów ich podstawową semantykę
- Zbiór niestandardowych taktyk i twierdzeń specjalnie opracowanych, aby ułatwić pisanie dowodów dotyczących programów Yul. Narzędzia te przetwarzają typowe wzorce i operacje, które często występują w weryfikacji inteligentnych kontraktów.
- Generator warunków weryfikacyjnych tworzy szablony dowodów o wysokim poziomie struktury i automatycznie generuje dowody, które upraszczają programy Yul do form kanonicznych. Warunki weryfikacyjne nie są już określane w języku Yul, ale w bardziej przystępny sposób
Weryfikacja jest procesem ustrukturyzowanym. Użytkownicy zaczynają od programu Yul i kompilują go przy użyciu specjalnych opcji kompilatora, aby uzyskać kod spełniający założenia strukturalne frameworka. Kod ten jest następnie przetwarzany przez generator warunków weryfikacyjnych w celu wygenerowania wymaganej infrastruktury dowodowej.
Zacznij weryfikować swoje inteligentne kontrakty już dziś
Zmień swoje podejście do programowania w języku Solidity dzięki formalnej weryfikacji. Zacznij już teraz.
Wymagania dotyczące kompilacji umów
Struktura zakłada pewną strukturę kodów Yul.
Praktyczne wdrożenie: funkcja mnożenia
Aby zaimplementować funkcję mnożenia, należy spełnić następujące wymagania strukturalne, kompilując poniższy kod z określonymi flagami kompilatora. Ten przykład pokazuje, w jaki sposób framework może zarządzać funkcjami napisanymi przez użytkownika i dowolnymi strukturami przepływu sterowania.
Proces mnożenia ma dwa wejścia i polega na mnożeniu poprzez dodanie jednej wartości do akumulatora wymaganą liczbę razy.
W pętlach stosuje się przerwy warunkowe zamiast standardowych warunków pętli, aby zademonstrować możliwość pracy frameworka w złożonym scenariuszu przepływu sterowania.
Proces generowania warunków weryfikacyjnych
Uruchomienie generatora warunków weryfikacyjnych w programie powoduje utworzenie uporządkowanej hierarchii plików wraz z wygenerowanymi plikami. Ogólna struktura składa się z:
- Pliki wygenerowane w odniesieniu do każdego pliku Yul i umowy
- Inne popularne podfoldery zawierające wyodrębnione bloki kodu
Framework automatycznie rozkłada programy na jednostki i tworzy logikę integracji, aby zapewnić, że złożone jednostki są oryginalnym programem. Każdy podstawowy blok kodu generuje trzy typy plików, które można łatwo analizować, ponownie wykorzystać oraz które zapewniają lepszą wydajność i skalowalność.
Kod programu Yul i rozumowanie specyficzne dla frameworka obejmują warunki weryfikacji i dowody, że uruchomienie bloku kodu powoduje spełnienie warunku weryfikacji, które są reprezentowane w wygenerowanych plikach rodziny. Pliki te łączą specyfikację/spełnienie wymagań i wykonanie kodu. Należy zachować szczególną ostrożność w przypadku plików rodziny użytkownika, ponieważ są to pliki wygenerowane przez framework, które zawierają logikę weryfikacji, którą użytkownik musi wykonać.
Aby wypełnić luki logiczne, system musi podawać specyfikacje zachowań warunkowych. W celu wyrażenia semantyki kontroli pętli system oferuje narzędzia do wykonywania rutynowych operacji, takich jak wyjście z pętli i dostęp do zmiennych w stanach programu.
Specyfikacje nie muszą być nieprawidłowe, ale mogą nie odzwierciedlać zamierzonego zachowania, jeśli nie uwzględniają ważnych kwestii. Problemy związane ze specyfikacjami są zazwyczaj najtrudniejszą częścią formalnej weryfikacji, czasem nawet trudniejszą niż samo pisanie dowodów.
Wyzwania związane z weryfikacją pętli
Pętle są bardzo trudne do zweryfikowania za pomocą systemu weryfikacyjnego, co wynika częściowo z indukcyjnego rozumowania, które często jest wymagane w przypadku takiego systemu. Framework radzi sobie z tym problemem, podając systematyczne specyfikacje komponentów pętli.
Użytkownik musi określić:
- Warunki zakończenia
- Zachowanie po iteracji
- Zachowanie pętli
- Ogólne niezmienne pętle
Struktura obsługuje opis semantyki pętli prostych aktualizacji zmiennych w celu opracowania logiki warunkowej. Chociaż tego rodzaju kwestie techniczne mogą na początku wydawać się mało przejrzyste, zapewniają one uwzględnienie wszystkich możliwości wykonania.
Konstrukcja i automatyzacja korekty
Po ustaleniu specyfikacji użytkownik musi wykazać, że warunki weryfikacji pozwalają potwierdzić określone specyfikacje. Framework oferuje szerokie możliwości automatyzacji przetwarzania typowych wzorców dowodów.
Do przetwarzania wykorzystywane są niestandardowe taktyki:
- Manipulacje w pamięci przechowuj w zmiennych
- Rozumowanie dotyczące przepływu sterowania
- Inne typowe problemy związane z weryfikacją
Te zautomatyzowane metody przyczyniają się do znacznego zmniejszenia nakładu pracy ręcznej wymaganej do wykonania korekty, przy jednoczesnym zachowaniu najwyższego poziomu weryfikacji.
Proces weryfikacji zazwyczaj rozpoczyna się od rozwinięcia odpowiednich abstrakcji, ponieważ weryfikacje te są bezpośrednio powiązane z właściwościami zdefiniowanymi przez użytkownika. Stosuje on strukturę w celu zautomatyzowania wielu warunków weryfikacyjnych za pomocą uniwersalnych taktyk porządkowych służących do zarządzania szczegółami technicznymi, takimi jak operacje przechowywania zmiennych i przejścia stanów.
Funkcje zaawansowane i przyszły rozwój
Framework jest złożonym narzędziem służącym do przekształcania dowolnego programu Yul w zestaw instrukcji określających, co program ma robić, oraz do sprawdzania, czy kod spełnia oczekiwania. Programy są początkowo tłumaczone na programy z dowodami spójności w postaci abstrakcyjnej reprezentacji, co daje uproszczone punkty wyjścia do dalszych dowodów specyfikacji.
Wzorce w rozumowaniu programu Yul, takie jak operacje na magazynie zmiennych, są obsługiwane przez niestandardowe procedury automatyzacji.
Dalszy rozwój
Dalszy rozwój zawiera szereg istotnych ulepszeń:
- Niezawodny model skrótu będzie miał poprawną semantykę operacji kryptograficznych
- Modelowanie połączeń międzykontraktowych pozwoli na analizę skomplikowanych wzorców interakcji
- Dokładność semantyczna zostanie sprawdzona poprzez modelowanie gazowe z uwzględnieniem kosztów wykonania
- Przestrzeganie najnowszych zmian w planach aktualizacji Ethereum zapewni zgodność z istniejącym działaniem sieci
- Poprawa użyteczności pozwoli wam na bardziej wydajne i przyjazne dla użytkownika korzystanie z programu na co dzień
Możesz podjąć dalsze działania, aby wyodrębnić klientów Ethereum execution ze specyfikacji i stworzyć formalnie zweryfikowane kompilatory Yul do EVM bytecode.
Integracja z bibliotekami matematycznymi
Struktura opiera się na szerokiej gamie bibliotek matematycznych i informatycznych w swoim podstawowym systemie dowodowym. Biblioteki te oferują sformalizowane pojęcia, które często pojawiają się podczas rozumowania o programach, znacznie upraszczając wysiłek potrzebny do wykonywania złożonych dowodów.
Niestandardowe taktyki opierają się na silnym środowisku metaprogramowania bez uszczerbku dla weryfikacji. Modułowy charakter automatyzacji, oparty na obserwowanych wzorcach użytkowania, gwarantuje ciągłą poprawę użyteczności w miarę upływu czasu.
Architektura umożliwiająca bezpośrednie kodowanie języka Yul w środowisku weryfikacyjnym sprawia, że interfejs jest przejrzysty i naturalny dla programistów zaznajomionych z tym językiem, a także oferuje niespotykane dotąd możliwości automatycznej weryfikacji poprawności kodu.


