Testowanie i formalna weryfikacja bezpieczeństwa kontraktów Web3 Smart

Testowanie i formalna weryfikacja bezpieczeństwa kontraktów Web3 Smart

Testowanie i formalna weryfikacja bezpieczeństwa inteligentnych kontraktów Web3 PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Czas czytania: 9 minuty

Wyobraź sobie skok ze spadochronem. Zanim wyskoczysz z samolotu, sto razy sprawdzisz, czy masz spadochron, prawda? Sprawdzanie i testowanie są integralną częścią bezpieczeństwa; pomyśl o jakiejkolwiek rzeczy związanej z bezpieczeństwem. Prawdopodobnie istniałby późniejszy mechanizm testowania, niezależnie od tego, czy jest to instalacja telewizji przemysłowej, czy sprawdzanie atramentu w długopisie przed egzaminem pisemnym w szkole, wszyscy przestrzegamy środków bezpieczeństwa. Im większe ryzyko, tym więcej rzeczy testujemy. A kiedy mówimy o inteligentnych kontraktach, ryzyko jest OGROMNE. Nie można być nieostrożnym, jeśli chodzi o bezpieczeństwo inteligentnych umów.

1. Bezpieczeństwo jest zawsze potrzebne.

Na pewno możesz zamknąć drzwi dwa razy lub trzy razy, nie ma to znaczenia. Czy możesz być pewien, że Twój dom nie zostanie okradziony podczas Twojej nieobecności? Nie możesz, ponieważ nie wiesz, co złodziej może zrobić, aby włamać się do domu — to samo dotyczy każdego środka bezpieczeństwa, jaki podejmujemy. Nie ma całkowicie bezpiecznej metody, która zagwarantuje bezpieczeństwo. Jednak działanie, które podejmujemy szybko, zwiększa nasze szanse na bezpieczeństwo, a taka jest gra. Chcemy zwiększyć szanse na bezpieczeństwo, stosując różne środki.

Świat Web3 nie jest inny. Nie ma bezpiecznej metody, aby się uratować, ale posiadanie doświadczonych audytorów z QuillAudits może znacznie zwiększyć szanse na zabezpieczenie Twojego protokołu i zapewni Ci aktualne bezpieczeństwo. W web3 istnieją dwa ważne mechanizmy, które pomagają zrozumieć, jak bardzo jesteś bezpieczny, wykonując kilka testów na swoim protokole: -

  1. Testowanie inteligentnych kontraktów
  2. Formalna weryfikacja inteligentnych kontraktów

Poznajmy je szczegółowo i dowiedzmy się, w jaki sposób pomagają nam poznać słabe punkty lub słabe punkty naszych kontraktów.

2. Testowanie inteligentnych kontraktów

Doświadczony programista może wytłumaczyć pracę maszynie za pomocą kodu. Mimo to czasami maszyna nie przedstawia dokładnego mechanizmu, który programista miał na myśli z powodu usterki lub błędu logicznego w kodzie. Testowanie to proces, który pomaga zidentyfikować, gdzie nasz kod zawodzi i co można zrobić, aby odpowiadał akcji, do której wykonania jest nam potrzebny.

Testowanie inteligentnych kontraktów to faza cyklu rozwojowego, w której przeprowadzamy szczegółową analizę naszych umów i próbujemy dowiedzieć się, gdzie i dlaczego nasz kod zawodzi. Prawie wszystkie inteligentne kontrakty przechodzą tę fazę. Testowanie inteligentnych kontraktów odbywa się na dwa sposoby. Zbadajmy je.

2.1 Zautomatyzowane

Jak sama nazwa wskazuje, ta metoda testowania inteligentnych kontraktów służy do przeprowadzania testów skryptowych. Obejmuje zautomatyzowane oprogramowanie, które przeprowadza powtarzające się testy w celu znalezienia wszelkich luk i defektów w inteligentnych kontraktach. Te zautomatyzowane narzędzia do testowania można skonfigurować za pomocą danych testowych i oczekiwanych wyników. Następnie rzeczywisty wynik jest porównywany z oczekiwanym, aby sprawdzić, czy umowa działa prawidłowo. Testy automatyczne można dalej podzielić na trzy kategorie.

2.1.1. Testy funkcjonalne

Załóżmy, że piszesz program, który bierze dwie liczby, aib, a następnie zwraca sumę obu liczb. Więc aby sprawdzić ten program, podajesz 2 i 8 i podajesz oczekiwany wynik 10. Teraz, gdy program działa, powinien również zwrócić 10. Jeśli tak, to działa dobrze, a nasz kod jest poprawny, ale jeśli nie, oznacza to, że w naszym kodzie jest jakiś błąd. 

Testy funkcjonalne wymagają zrozumienia, jak Twoja umowa powinna zachowywać się w określonych warunkach. Możemy to przetestować, uruchamiając obliczenia z wybranymi wartościami i porównując zwrócone dane wyjściowe. Testy funkcjonalne mają trzy klasy: -

  1. Testy jednostkowe:- Dotyczy to testowania poszczególnych elementów inteligentnej umowy pod kątem poprawności. Jest asertywny lub wymaga stwierdzeń dotyczących zmiennych.
  1. Integracja tekstyng: – Dotyczy to testowania kilku pojedynczych komponentów razem. Testy integracyjne to wyższy poziom w hierarchii niż testy jednostkowe. Pomaga nam określić błędy wynikające z interakcji różnych funkcji, które mogą być częścią innych inteligentnych kontraktów.
  1. Konfiguracja testng: – To jest najwyższe w hierarchii. W tym przypadku testujemy całą umowę jako jeden w pełni zintegrowany system, aby sprawdzić, czy działa zgodnie z naszymi potrzebami. Odbywa się to z punktu widzenia użytkownika, a najlepszym sposobem na to jest wdrożenie go w sieciach testowych.

2.1.2. Analiza statyczna

Analizę statyczną można przeprowadzić nawet bez uruchamiania programu. Polega na analizie kodu źródłowego lub kodu bajtowego inteligentnej umowy przed jej wykonaniem. W ten sposób, biorąc pod uwagę swoją nazwę, analiza statyczna może skutkować wykryciem niektórych typowych luk w zabezpieczeniach.

2.1.3. Analiza dynamiczna

W przeciwieństwie do analizy statycznej, analiza dynamiczna jest przeprowadzana w czasie wykonywania inteligentnych kontraktów w celu zidentyfikowania problemów w kodzie. Dynamiczne analizatory kodu obserwują stan realizacji kontraktu i generują szczegółowy raport o lukach w zabezpieczeniach i naruszeniach własności. Fuzzing podlega analizie dynamicznej. Fuzzing polega na wprowadzaniu nieprawidłowych lub złośliwych danych wejściowych w celu spowodowania niezamierzonego wykonania kodu.

2.2 instrukcja

Jak sama nazwa wskazuje, ta metoda testowania inteligentnych kontraktów obejmuje regularną interakcję z programistą-człowiekiem. Audyty kodu, w których programiści przechodzą przez linie kodów, wchodzą w tryb ręczny testowania inteligentnych kontraktów.

Tryb ręczny wymaga sporo czasu, umiejętności, pieniędzy i wysiłku. Mimo to wynik często jest tego wart, ponieważ dzięki temu identyfikujemy luki w zabezpieczeniach, które mogą pozostać niezauważone podczas testów automatycznych. Istnieją dwa podstawowe rodzaje testów ręcznych:

2.2.1 Audyty kodu: - 

Najlepszym sposobem sprawdzenia, czy środek bezpieczeństwa działa prawidłowo, jest próba jego złamania. Na przykład, jeśli chcesz sprawdzić, czy zamek w Twoim samochodzie działa prawidłowo, spróbuj go wyłamać. Teraz możesz poprosić, aby wykwalifikowany złodziej samochodów mógł łatwo włamać się do mojego samochodu. Ja nie mogę, więc rozwiązaniem jest zatrudnienie kogoś, kto jest biegły w włamywaniu się, aby mógł cię poprowadzić!

 Tak, mówię o QuillAudits. Jesteśmy zespołem wykwalifikowanych audytorów, którzy mogą Cię poprowadzić. Audyty kodu wymagają sposobu myślenia atakującego, aby znaleźć wszystkie możliwe luki w kodzie źródłowym. Audyt kodu to szczegółowa ocena kodu inteligentnej umowy w celu wykrycia potencjalnych luk i wad.

2.2.2 Nagroda za błędy: -

Jeśli uważasz, że w twoim kodzie źródłowym mogą występować luki w zabezpieczeniach (które w większości są) i nie możesz ich znaleźć, możesz zlecić tę pracę freelancerom, tworząc system nagród. To bardziej przypomina ogłoszenie nagrody dla każdego, kto zhakuje twój inteligentny kontrakt. W ten sposób dowiesz się o luce w zabezpieczeniach Twojej inteligentnej umowy, dzięki czemu możesz ją lepiej chronić i uchronić użytkowników przed utratą.

3. Formalna weryfikacja inteligentnych kontraktów

Weryfikacja formalna to proces oceny prawidłowości umowy na podstawie specyfikacji formalnej. Oznacza to, że weryfikacja formalna ocenia, czy kod robi to, co zamierzono. Weryfikacja formalna wykorzystuje formalne metody określania, projektowania i weryfikacji programów.

3.1 Co to jest formalna specyfikacja?

W kontekście inteligentnych kontraktów specyfikacje formalne odnoszą się do właściwości, które muszą pozostać takie same w każdych możliwych okolicznościach. Są to właściwości „niezmienników”, ponieważ nie mogą się zmieniać i reprezentują logiczne twierdzenia dotyczące wykonania kontraktu.

Specyfikacja formalna to zbiór instrukcji zapisanych w języku formalnym. Specyfikacje obejmują różne właściwości i opisują, jak właściwości kontraktu powinny zachowywać się w innych okolicznościach. Specyfikacje formalne są krytyczne, ponieważ jeśli kontrakty nie mają niezmiennych zmiennych lub właściwości zmieniają się podczas realizacji, może to prowadzić do możliwego wykorzystania własności, co może prowadzić do ogromnych strat.

Może nam pomóc określić, czy inteligentna umowa spełnia specyfikacje lub ma nieoczekiwane zachowania. Weryfikacja formalna składa się z trzech elementów: specyfikacji, modelu i mechanizmu weryfikacji.

Specyfikacja 3.1.1

Specyfikacja to jasny, jednoznaczny i kompletny opis wymagań dla inteligentnej umowy. Powinien opisywać, co umowa ma robić, a czego nie. Oto przykładowa specyfikacja prostej, inteligentnej umowy, która dodaje dwie liczby:

// Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
// Implementation details are not relevant to the specification
// …
}

Model 3.1.2

Model formalnie reprezentuje inteligentną umowę, której można użyć do wnioskowania o jej zachowaniu. Jednym z popularnych modeli inteligentnych kontraktów jest język programowania Solidity. Oto przykładowy model opisanej powyżej funkcji dodawania:

// Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
return a + b;
}

3.1.3 Mechanizm weryfikacji

Silnik weryfikacyjny to narzędzie, które może przeanalizować model i zweryfikować jego poprawność w odniesieniu do danej specyfikacji. Dostępnych jest kilka mechanizmów weryfikacji inteligentnych kontraktów, w tym:

mithril: narzędzie do symbolicznego wykonywania o otwartym kodzie źródłowym, które może wykrywać szeroki zakres luk w zabezpieczeniach inteligentnych kontraktów Solidity.

Remiks IDE: zintegrowane środowisko programistyczne, które zawiera formalne narzędzie do weryfikacji, które może zweryfikować poprawność inteligentnych kontraktów.

Certora Dowódca: komercyjne narzędzie, które może weryfikować poprawność inteligentnych kontraktów za pomocą zautomatyzowanego wnioskowania matematycznego. Oto przykład, jak można wykorzystać weryfikację formalną do weryfikacji poprawności inteligentnej umowy za pomocą Certora Prover:

pragma solidity 0.7.6; // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint)
function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function test_add(uint a, uint b) public pure returns (bool) {
uint expected = a + b;
uint actual = add(a, b);
return expected == actual;
} // Verification: Verify the correctness of the add function contract TestAdd {
function test_add(uint a, uint b) public view returns (bool) {
return CertoraProver.verify(test_add, a, b);
}
}

W powyższym przykładzie definiujemy smart kontrakt Solidity, który zawiera model funkcji add, specyfikację funkcji oraz silnik weryfikacyjny (Certora Prover), który może zweryfikować poprawność funkcji. Definiujemy również funkcję testową (test_add), za pomocą której można zweryfikować poprawność funkcji.

3.2 Testowanie VS Weryfikacja formalna

Jak już wspomnieliśmy, testowanie zwraca oczekiwany wynik dla niektórych danych wejściowych bota, których mu brakuje, ponieważ nie możemy powiedzieć o danych, na których nie został przetestowany. Praktycznie niemożliwe jest sprawdzenie tego na każdym możliwym wejściu. Nie mamy więc pewności co do jego „poprawności funkcjonalnej”. I tu pojawia się formalna weryfikacja. Formalne metody weryfikacji wykorzystują rygorystyczne techniki matematyczne do określania i weryfikowania oprogramowania lub inteligentnych kontraktów.

3.3 Techniki weryfikacji formalnej

Weryfikacja formalna obejmuje szeroki zakres technik wzmacniania inteligentne bezpieczeństwo kontraktów. W tej części bloga przyjrzymy się kilku indywidualnie.

3.3.1 Sprawdzanie modelu

Kiedy dyskutowaliśmy, czym jest formalna specyfikacja, sprawdzamy inteligentną umowę pod kątem jej specyfikacji w tej formalnej technice weryfikacji. Te inteligentne kontrakty są reprezentowane jako systemy przejść między stanami, a właściwości są definiowane za pomocą logiki czasowej. 

Ta technika jest używana przede wszystkim do oceny właściwości czasowych, które przedstawiają zachowanie inteligentnych kontraktów w czasie. Właściwość kontroli dostępu (wywołanie administratora samounicestwienia) można zapisać jako logikę formalną. Następnie algorytm sprawdzający model może zweryfikować, czy umowa spełnia tę weryfikację formalną.

Sprawdzanie modelu wykorzystuje technikę zwaną eksploracją przestrzeni stanów, która zasadniczo polega na wypróbowaniu wszystkich możliwych stanów, w których może znajdować się nasz inteligentny kontrakt, a następnie sprawdzeniu, czy któryś z nich nie prowadzi do naruszenia własności. Może to jednak prowadzić do nieskończenie wielu stanów; dlatego kontrolery modeli polegają na technikach abstrakcji, aby umożliwić wydajną analizę inteligentnych kontraktów.

3.3.2 Dowód twierdzeń

Dowód twierdzeń polega na rozumowaniu matematycznym na temat poprawności programów. Polega na stworzeniu logicznego obrazu systemu i specyfikacji umowy oraz weryfikacji „logicznej równoważności” między stwierdzeniami. Równoważność logiczna to matematyczna zależność, która mówi, że zdanie A jest prawdziwe wtedy i tylko wtedy, gdy zdanie B jest prawdziwe.

Jak nauczyliśmy się w technice sprawdzania modeli, modelujemy kontrakty jako systemy przejściowe o skończonych stanach. Dowód twierdzeń może obsłużyć analizę systemów o nieskończonych stanach. Jednak zautomatyzowany dowód twierdzeń nie zawsze może wiedzieć, czy problem logiczny jest rozstrzygalny; w związku z tym często wymagana jest pomoc człowieka, aby poprowadzić dowódcę twierdzeń w wyprowadzaniu dowodów poprawności.

4. Wniosek

Testowanie i weryfikacja formalna są integralnymi częściami rozwoju inteligentnych kontraktów. Są to metody stosowane do zabezpieczania inteligentnych kontraktów i pomagają przygotować kontrakty do wdrożenia. Ale jak wiadomo, bezpieczeństwa nigdy dość. Wiele inteligentnych kontraktów zostało zhakowanych tylko dlatego, że nie było odpowiednich testów. Teraz bardziej niż kiedykolwiek społeczność web3 potrzebuje bezpieczniejszych protokołów. 

Misją QuillAudits jest pomoc w ochronie Twoich protokołów. Dzięki naszemu zręcznemu i doświadczonemu zespołowi dbamy o to, aby żadna luka w zabezpieczeniach nie pozostała niezauważona. Odwiedź naszą stronę internetową i zabezpiecz swój projekt Web3!

28 odwiedzajacy

Znak czasu:

Więcej z Quillhash