![](/img/bg-single.png)
Samodzielna kontrola inteligentnych kontraktów za pomocą ChatGPT
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Podczas audytu inteligentnych kontraktów należy uwzględnić szeroki zakres zagadnień, aby zapewnić bezpieczeństwo kodu. Pytania te obejmują różne aspekty, w tym kontrolę dostępu, zarządzanie zasobami, zarządzanie danymi, założenia, zależności i listy kontrolne bezpieczeństwa. Poniżej przedstawiamy szczegółową listę kontrolną i instrukcje dotyczące zapytań ChatGPT, które poprowadzą Cię przez proces audytu inteligentnego kontraktu.
Jeśli chcesz samodzielnie zbadać inteligentny kontrakt pod kątem luk w zabezpieczeniach i ukrytych technik oszustwa, pierwszym krokiem jest poprawnie spreparowany monit ChatGPT.
Przydatnym zapytaniem dla ChatGPT byłoby następujące polecenie:
Podaj wyczerpującą listę wszystkich problemów i luk w poniższym inteligentnym kontrakcie. Szczegółowo opisz problemy i możliwe podatności. Podaj jeden scenariusz wykorzystania dla każdej luki. Dane wyjściowe jako prawidłowa tabela w formacie markdown z listą obiektów, każdy z kolumnami "opis", "akcja", "dotkliwość", "aktorzy", "scenariusz", "typ" i "wiersz". "typ", gdzie może być "użyteczność", "podatność", "optymalizacja" lub "sugestia". "actors" to lista zaangażowanych podmiotów. "dotkliwość" może być "niska", "średnia" lub "wysoka". "row" to numer wiersza problemu. Upewnij się, że wszystkie pola w tabeli są wypełnione.
Następnie użyj poniższych pytań, aby dokładniej zbadać inteligentny kontrakt.
Scenariusze użycia:
- Kim są aktorzy w systemie?
- Jakie działania ma system?
- Jakie są ograniczenia systemu?
- Jakie są potencjalne sposoby złamania systemu?
- Jakie mechanizmy obronne są używane do odpierania ataków?
- Opisz, w oparciu o ograniczenia, zmiany stanu każdej funkcji.
- Podaj informacje o używanych szablonach Solidity i DeFi.
- Opisz pozytywne i negatywne aksjomaty na podstawie informacji o systemie.
- Wymień sposoby optymalizacji i modyfikacji kodu, aby uczynić go bardziej niezawodnym (z fragmentami kodu).
- Wymień ukryte metody oszustwa używane w kodzie (z fragmentami kodu).
Wskazówka: Wizualna reprezentacja danych często zapewnia lepsze zrozumienie działania systemu. Podczas pracy z ChatGPT zalecane jest żądanie wizualizacji danych wyjściowych, takich jak modyfikacje stanu w postaci diagramów znaków ASCII. Chociaż nie wszystkie wizualizacje mogą mieć sens, niektóre mogą zapewnić bardzo cenny wgląd w działanie inteligentnego kontraktu.
W rzeczywistości, chociaż ChatGPT nie może zastąpić ludzkiego audytora, znacznie uzupełnia proces audytu, zapewniając lepsze zrozumienie przejść stanu protokołu, ograniczeń, niezmienników i zgodności. Narzędzie to jest szczególnie skuteczne w zrozumieniu przejść stanu protokołu i ograniczeń.
Wskazówka: Przed rozpoczęciem audytu, dostarczenie chatbotowi dokumentacji dotyczącej audytowanego protokołu może znacznie poprawić dokładność i trafność odpowiedzi. Wystarczy wspomnieć: "To jest dokumentacja, która zapewnia najlepszy kontekst dla 'nazwa_protokołu', który poddaję audytowi" i wstawić dokument.
Można powiedzieć, że ChatGPT jest potężnym asystentem dla audytorów, zapewniającym ustrukturyzowane i dogłębne podejście do audytu inteligentnych kontraktów. Należy jednak pamiętać, że ChatGTP (i podobne usługi) to tylko złożone interpretacje analizy maszynowej pracującej z prawdopodobieństwami, więc często powoduje błędy i nieścisłości. W związku z tym nie można w pełni polegać na wynikach ChatGPT - jest to tylko dobre narzędzie we właściwych rękach i "punkt wyjścia" w badaniach nad inteligentnymi kontraktami.
Dlatego, aby uchronić się przed możliwymi zagrożeniami, inteligentne kontrakty powinny być dokładniej badane pod kątem możliwych luk w zabezpieczeniach i nieuczciwych schematów.
Jak przeprowadzić dogłębny audyt inteligentnych kontraktów? Top 100 zapytań do ChatGPT
Powyżej rozważyliśmy ogólne zapytanie (monit) do ChatGPT, od którego można rozpocząć analizę inteligentnego kontraktu. Ale oczywiście szczegółowa analiza nie ogranicza się do wstępnego monitu.
Oszuści stale ulepszają swoje taktyki, więc musisz być poinformowany i ostrożny w wielu aspektach - są to podstawowe strategie ochrony inwestycji w tokeny.
Przyjrzyjrzyjmy się liście 100 najlepszych zapytań, które zapewnią profesjonalne podejście do audytu inteligentnego kontraktu:
- Czy kod kompiluje się pomyślnie?
- Jaka wersja Solidity jest używana w kodzie? Czy jest to aktualna stabilna wersja?
- Czy obecne są jasne komentarze wyjaśniające przeznaczenie funkcji i zmiennych?
- Czy kontrakt wykorzystuje schemat "Ownable"? Jeśli tak, to dla których funkcji?
- Czy zmienne stanu są prawidłowo przydzielane przy użyciu modyfikatorów widoczności?
- Czy zdarzenia są używane do prawidłowego rejestrowania?
- Czy dostarczane są przyjazne dla użytkownika komunikaty o błędach?
- Czy sprawdzana jest wartość zwracana wywołań niskiego poziomu?
- Czy istnieją scenariusze, w których właściciel może autoryzować się, co może prowadzić do ciągnięcia dywanu?
- Kto ma kontrolę nad kontami uprzywilejowanymi i jakie są mechanizmy kontroli?
- Jakie mechanizmy zarządzania istnieją w umowie i czy zarządzanie jest w pełni otwarte czy ograniczone?
- Czy inne umowy są używane w systemie i jakie role pełnią (np. umowa proxy)?
- Czy istnieje mechanizm blokady czasowej i czy można go obejść?
- Czy dostępna jest odpowiednia dokumentacja?
- Czy w kodzie występują potencjalne luki w zabezpieczeniach przed atakami DoS lub reentrancy?
- Czy wszystkie funkcje są wewnętrzne, z wyjątkiem tych, które są wyraźnie wymagane jako publiczne/zewnętrzne?
- Brak przepełnień/niedopełnień arytmetycznych w operacjach matematycznych?
- Czy używana jest bezpieczna biblioteka OpenZeppelin?
- Czy eter lub tokeny nie mogą zostać przypadkowo wysłane na adres zerowy (0x0)?
- Czy warunki są sprawdzane za pomocą require przed operacjami i zmianami stanu?
- Czy stan jest ustawiany przed i w trakcie wykonywania akcji?
- Czy stosowana jest ochrona przed atakami typu reentry (ponowne wejście) (A wywołuje B wywołuje A)?
- Czy interfejs ERC20 jest prawidłowo zaimplementowany?
- Czy modyfikator jest używany w wielu miejscach tylko wtedy, gdy jest to naprawdę konieczne?
- Czy wszystkie typy są ustawione jawnie (np. uint256 jest używany zamiast uint)?
- Czy wszystkie metody i cykle mieszczą się w maksymalnym dopuszczalnym limicie gazu?
- Brak niepotrzebnych inicjalizacji w konstruktorze (pamiętaj, że ustawione są wartości domyślne)?
- Całkowite pokrycie testami: przetestowano każdą metodę inteligentnego kontraktu i wszystkie możliwe typy danych wejściowych?
- Czy przeprowadzono testy rozmyte przy użyciu losowych danych wejściowych?
- Czy przetestowano wszystkie możliwe stany, w których może znajdować się kontrakt?
- Czy domyślne ilości eteru i tokenów są określone w jednostkach wei?
- Czy blok/czas zakończenia crowdsale następuje po bloku/czasie rozpoczęcia (rozpoczęcia/włączenia handlu)?
- Czy kurs wymiany/konwersji tokenów crowdsale jest ustawiony prawidłowo?
- Czy ustawiony jest miękki/twardy limit crowdsale?
- Czy minimalny/maksymalny dopuszczalny wkład w crowdsale jest ustawiony i przetestowany?
- Czy funkcjonalność białej listy crowdsale została przetestowana?
- Czy logika zwrotu crowdsale została zweryfikowana?
- Czy uczestnicy crowdsale otrzymują proporcjonalną liczbę tokenów lub mogą ubiegać się o swój wkład?
- Czy czas trwania każdego etapu crowdsale (np, przedsprzedaż, sprzedaż publiczna) jest odpowiednio skonfigurowany?
- Czy określa, które funkcje powinny być kontrolowane tylko przez właściciela (np, wstrzymanie crowdsale, przejście do innego etapu crowdsale, włączenie dystrybucji tokenów itp.)?
- Czy logika nabywania uprawnień (vesting) crowdsale została sprawdzona?
- Czy crowdsale ma tryb awaryjny, który po włączeniu przez właściciela ogranicza wywołania funkcji i zawiera funkcję zwrotu pieniędzy?
- Crowdsale ma funkcję awaryjną, jeśli ma to sens.
- Czy zaimportowane biblioteki zostały wstępnie sprawdzone i nie zawierają niepożądanych części, które mogą zostać zastąpione w przyszłych wersjach i mogą zostać wykorzystane do złośliwych celów?
- Metody transferu tokenów (transfer) opakowane w require?
- Czy require i assert są używane poprawnie? Metoda assert jest używana tylko do rzeczy, które nigdy nie powinny się zdarzyć, zwykle jest używana do sprawdzania stanu po wprowadzeniu zmian.
- Czy istnieje obrona przed atakami rekurencyjnymi?
- Czy długość dowolnych ciągów znaków na wejściu jest ograniczona?
- Gdzie to możliwe, unikaj używania tablic i zamiast tego używaj mapowań?
- Czy hashe blokowe nie są używane do obsługi losowych wartości (górnicy mogą mieć na to wpływ)?
- Czy tx.origin nie jest nigdzie używany?
- Czy elementy tablicy są przesuwane w dół, gdy element jest usuwany, aby nie pozostawiać luk?
- Czy revert jest używany zamiast throw?
- Czy funkcje kończą się natychmiast, jeśli warunki nie są spełnione?
- Czy ostrzeżenia kompilatora zostały rozwiązane?
- Czy biblioteka SafeMath jest używana w obliczeniach?
- Czy jakiekolwiek gniazda pamięci (gniazda przechowywania) są odczytywane więcej niż jeden raz?
- Czy używane są jakieś nieograniczone pętle / tablice, które mogą powodować DoS?
- Czy block.timestamp jest używany tylko dla długich interwałów?
- Nie używając block. number do obliczania czasu, który upłynął?
- Czy unika się wywoływania delegatecall, zwłaszcza w przypadku zewnętrznych (nawet jeśli zaufanych) kontraktów?
- Czy długość tablicy nie jest aktualizowana podczas iteracji po niej?
- Czy podpisy są chronione przed odtworzeniem za pomocą nonce i block.chainid?
- Upewnij się, że wszystkie podpisy używają EIP-712?
- Wynik abi.encodePacked() nie powinien być hashowany, jeśli używane są więcej niż 2 typy dynamiczne. Ogólnie rzecz biorąc, lepiej jest używać abi.encode().
- Dokładnie sprawdzaj wstawki kodu asemblera.
- Unikaj niewystarczającego zużycia gazu (gas griefing).
- Czy wszystkie prywatne dane są naprawdę prywatne?
- Czy aktualizacja struktury / tablicy w pamięci (memory) nie zmieni jej w magazynie (stage)?
- Czy zmienne stage są przesłonięte?
- Czy obliczanie wartości zmiennej w locie jest tańsze niż jej przechowywanie?
- Czy wszystkie zmienne stanu są odczytywane z właściwego kontraktu (master vs. clone)?
- Czy operatory porównania (>, <, >=, <=) są używane poprawnie, zwłaszcza w celu zapobiegania błędom off-by-one?
- Czy operatory logiczne (==, ! =, &&, ||, !) są używane poprawnie, zwłaszcza w celu zapobiegania błędom typu "off-by-one"?
- Czy mnożenie jest zawsze wykonywane przed dzieleniem (chyba że mnożenie może spowodować przepełnienie)?
- Czy liczby magiczne są zastępowane stałą o intuicyjnej nazwie?
- Jeśli odbiorca ETH ma funkcję awaryjną (fallback ), którą można cofnąć, czy może to prowadzić do DoS?
- Czy używany jest standard SafeERC20 i czy wartości zwracane są sprawdzane w bezpieczny sposób?
- Czy zakłada się, że nadawca msg. nadawca jest zawsze odpowiednim użytkownikiem?
- Czy tx.origin nie jest używany do autoryzacji?
- Czy address.transfer() lub address.send() nie są używane zamiast .call.value()?
- Przy korzystaniu z wywołań niskiego poziomu upewnij się, że przed wywołaniem istnieje umowa.
- Czy kod asemblera jest używany do uzyskania dostępu do chainid lub kodu kontraktu / rozmiaru / skrótu zamiast składni Solidity?
- Czy słowo kluczowe delete jest używane podczas ustawiania zmiennej na wartość null (0, false, "" itp.)?
- Wyrażenia przekazywane do operatorów logicznych/porównań (&&/||/>=/==/itp) nie mogą mieć efektów ubocznych.
- Kiedy masz do czynienia z wieloma adresami, zadaj sobie pytanie, co się stanie, jeśli są one takie same?
- Jak dobrze udokumentowany jest kod? Czy komentarze i przykłady są dostarczane wszędzie tam, gdzie używany jest niestandardowy kod?
- Jeśli używane jest wywołanie zewnętrzne, upewnij się, że zewnętrzne wywołanie umowy jest naprawdę konieczne?
- Czy wynik wywołania zewnętrznego jest sprawdzany i czy obsługiwane są błędy?
- Co się stanie, jeśli wywołanie zewnętrzne wykorzysta cały dostarczony gaz?
- Jeśli wywołanie zewnętrzne wywołuje określoną funkcję, upewnij się, że funkcja faktycznie istnieje (funkcje fantomowe).
- Upewnij się, że żadne zewnętrzne wywołania nie są używane w modyfikatorach
- Czy zdarzenia są generowane dla każdej funkcji, która modyfikuje pamięć?
- Sprawdź swoje założenia dotyczące tego, co zewnętrzne kontrakty używane w main robią i zwracają.
- Uważaj na tokeny, które używają zbyt wielu lub zbyt mało miejsc po przecinku. Upewnij się, że maksymalne i minimalne obsługiwane wartości są udokumentowane.
- Czy uprawnienia związane z rolami są udokumentowane?
- Jakie są zagrożenia w przypadku naruszenia praw dostępu i jak może to wpłynąć na różne komponenty systemu?
- Czy właściciel może manipulować tokenami i ETH w ramach umowy?
- Jak jest ustawiony adres wyroczni (Oracle) i jaki proces za tym stoi? Czy istnieją zapasowe wyrocznie do tworzenia kopii zapasowych?
- Jak podobne funkcje są wdrażane w innych projektach, czy uwzględniono najlepsze praktyki?
Ta lista kontrolna pomoże ci zapewnić przeprowadzenie dokładnego audytu bezpieczeństwa inteligentnych kontraktów Solidity. Obejmuje ona szeroki zakres krytycznych aspektów w celu zidentyfikowania i złagodzenia potencjalnych luk w zabezpieczeniach i zagrożeń w kodzie i powiązanych systemach.
Mamy nadzieję, że te przykłady pomogły Ci lepiej zrozumieć metodologię audytu inteligentnych kontraktów.
Ponieważ wszystkie informacje w łańcuchu bloków są otwarte (oczywiście pod warunkiem, że kod źródłowy kontraktu jest zweryfikowany), uzbrojony w tę wiedzę możesz niezależnie badać inteligentne kontrakty i identyfikować różne schematy oszustw.
Jednak już zrobiliśmy to wszystko za Ciebie! Zarejestruj się w subskrypcji premium i uzyskaj dostęp do ekskluzywnych filtrów funkcji inteligentnych kontraktów i świeżych analiz. Zwiększ swoje szanse na udane inwestycje w dochodowe tokeny.
Regards, Lotus Market team.