![](/img/bg-single.png)
Samoauditující se chytré smlouvy s ChatGPT
![](https://lotusmarket.io/storage/files/self-auditing-smart-contracts-with-chat-gpt/cover.png)
Při auditu chytrých smluv je třeba pokrýt celou řadu otázek, aby bylo zajištěno, že kód je bezpečný. Tyto otázky zahrnují různé aspekty včetně řízení přístupu, správy aktiv, správy dat, předpokladů, závislostí a kontrolních seznamů zabezpečení. Níže uvádíme podrobný kontrolní seznam a pokyny pro dotazy ChatGPT, které vás provedou procesem auditu chytrých smluv.
Pokud chcete sami prozkoumat chytrou smlouvu z hlediska zranitelností a skrytých podvodných technik, prvním krokem je správně vytvořený dotaz ChatGPT.
Užitečný dotaz pro ChatGPT by byl následující příkaz:
Poskytněte komplexní seznam všech problémů a zranitelností v následující chytré smlouvě. Podrobně popište problémy a možné zranitelnosti. Uveďte pro každou zranitelnost jeden scénář zneužití. Výstup jako platná tabulka ve formátu markdown se seznamem objektů, každý se sloupci 'popis', 'akce', 'závažnost', 'aktéři', 'scénář', 'typ' a 'řádek'. 'type', kde může být 'usability', 'vulnerability', 'optimization' nebo 'suggestion'. "actors" je seznam zúčastněných subjektů. "závažnost" může být "nízká", "střední" nebo "vysoká". "row" je číslo řádku problému. Ujistěte se, že jsou vyplněna všechna pole v tabulce.
Poté použijte následující otázky k hlubšímu prozkoumání inteligentní smlouvy.
Scénáře využití:
- Kdo jsou aktéři v systému?
- Jaké akce má systém?
- Jaká jsou omezení systému?
- Jaké jsou potenciální způsoby prolomení systému?
- Jaká obrana se používá proti útokům?
- Popište na základě omezení změny stavu jednotlivých funkcí.
- Uveďte informace o použitých šablonách Solidity a DeFi.
- Napište pozitivní a negativní axiomy na základě informací o systému.
- Uveďte způsoby optimalizace a úpravy kódu, aby byl spolehlivější (s ukázkami kódu).
- Vyjmenujte skryté podvodné metody použité v kódu (pomocí úryvků kódu).
Tip: Vizuální znázornění dat často umožňuje jasnější pochopení fungování systému. Při práci s ChatGPT doporučujeme vyžádat si vizualizaci výstupních dat, například modifikace stavu ve formě diagramů znaků ASCII. I když ne všechny vizualizace mohou dávat smysl, některé mohou poskytnout velmi cenný vhled do fungování chytrého kontraktu.
Ve skutečnosti ChatGPT sice nemůže nahradit lidského auditora, ale významně doplňuje proces auditu tím, že poskytuje jasnější pochopení přechodů stavů protokolu, omezení, invariantů a kompatibility. Tento nástroj je obzvláště efektivní pro pochopení stavových přechodů protokolu a omezení.
Tip: Před zahájením auditu může poskytnutí dokumentace k auditovanému protokolu chatbotu výrazně zlepšit přesnost a relevanci odpovědí. Stačí zmínit: "Toto je dokumentace, která poskytuje nejlepší kontext pro 'název_protokolu', který audituju," a vložit dokument.
Dá se říci, že ChatGPT je výkonný pomocník pro auditory, který poskytuje strukturovaný a hloubkový přístup k auditu chytrých kontraktů. Je však třeba mít na paměti, že ChatGTP (a podobné služby) jsou pouze komplexní interpretací strojové analýzy pracující s pravděpodobnostmi, takže často produkuje chyby a nepřesnosti. Na výsledek ChatGPT se proto nelze plně spoléhat - je to pouze dobrý nástroj ve správných rukou a "výchozí bod" při výzkumu chytrých smluv.
Pro ochranu před možnými riziky je proto třeba chytré kontrakty pečlivěji prozkoumat z hlediska možných zranitelností a podvodných schémat.
Jak provést hloubkový audit chytrých kontraktů? 100 nejčastějších dotazů na ChatGPT
Výše jsme zvážili obecný dotaz (výzvu) na ChatGPT, od kterého můžete začít analyzovat inteligentní kontrakt. Podrobná analýza se však samozřejmě neomezuje pouze na úvodní výzvu.
Podvodníci neustále zdokonalují své taktiky, takže je třeba být informovaný a obezřetný v mnoha ohledech - jedná se o základní strategie, jak ochránit své investice do tokenů.
Podívejme se na seznam 100 nejčastějších dotazů, které vám umožní profesionální přístup k auditu chytrých smluv:
- Uspěšně se kód zkompiloval?
- Jaká verze Solidity je v kódu použita? Je to aktuální stabilní verze?"
- Jsou přítomny jasné komentáře vysvětlující účel funkcí a proměnných?"
- Používá kontrakt schéma "Ownable"? Pokud ano, pro které funkce?
- Jsou stavové proměnné správně alokovány pomocí modifikátorů viditelnosti?
- Jsou použity události pro správné logování?
- Jsou k dispozici uživatelsky přívětivá chybová hlášení?
- Je kontrolována návratová hodnota nízkoúrovňových volání?
- Existují scénáře, kdy se vlastník může autorizovat, což by mohlo vést k tahání za koberec?
- Kdo má kontrolu nad privilegovanými účty a jaké jsou kontrolní mechanismy?
- Jaké mechanismy správy existují ve smlouvě a je správa plně otevřená nebo omezená?
- Jsou v systému používány další smlouvy a jaké role plní (např. smlouva o zastupování)?
- Je k dispozici mechanismus časového uzamčení a lze jej obejít?
- Je k dispozici dostatečná dokumentace?
- Jsou v kódu potenciální zranitelnosti vůči útokům typu DoS nebo reentrancy?
- Jsou všechny funkce interní kromě těch, které mají být explicitně veřejné/externí?
- Není v matematických operacích aritmetické přetečení/podtečení?
- Je použita bezpečná knihovna OpenZeppelin?
- Nemůže dojít k náhodnému odeslání etheru nebo tokenů na nulovou adresu (0x0)?
- Před operacemi a změnami stavu se kontrolují podmínky pomocí require?
- Je stav nastaven před a během provádění akcí?
- Je použita ochrana proti útokům typu reentry (opětovný vstup) (A volá B volá A)?
- Je správně implementováno rozhraní ERC20?
- Používá se modifikátor na více místech, jen pokud je to opravdu nutné?
- Jsou všechny typy nastaveny explicitně (např. místo uint se používá uint256)?
- Jsou všechny metody a cykly v rámci maximálního povoleného limitu plynu?
- Žádné zbytečné inicializace v konstruktoru (nezapomeňte, že jsou nastaveny výchozí hodnoty)?
- Je zajištěno kompletní pokrytí testů: jsou otestovány všechny metody inteligentního kontraktu a všechny možné typy vstupních dat?
- Bylo provedeno fuzz testování pomocí náhodných vstupů?
- Jsou otestovány všechny možné stavy, ve kterých se kontrakt může nacházet?
- Jsou výchozí množství etherů a tokenů specifikována v jednotkách wei?
- Přichází blok/čas ukončení crowdsale po bloku/času zahájení (zahájení/povolení obchodování)?
- Je správně nastaven směnný/konverzní kurz tokenů crowdsale?
- Je nastaven měkký/tvrdý limit crowdsale?
- Je nastaven a otestován minimální/maximální povolený příspěvek do crowdsale?
- Je otestována funkce whitelistingu crowdsale?
- Je ověřena logika vrácení příspěvku do crowdsale?
- Obdrží účastníci crowdsale poměrný počet tokenů, nebo si mohou svůj příspěvek nárokovat?
- Je doba trvání jednotlivých fází crowdsale (např, předprodej, veřejný prodej) správně nakonfigurováno?
- Je uvedeno, které funkce má ovládat pouze vlastník (např, pozastavení crowdsale, přechod na jinou fázi crowdsale, povolení distribuce tokenů atd...)?
- Je logika crowdsale vesting (vestování) zkontrolována?
- Má crowdsale režim fail-safe, který po povolení vlastníkem omezuje volání funkcí a obsahuje funkci vrácení peněz?
- Má crowdsale funkci nouzového přístupu, pokud to dává rozumný smysl.
- Byly importované knihovny předem zkontrolovány a neobsahují nežádoucí části, které mohou být v budoucích verzích nahrazeny a mohly by být použity ke škodlivým účelům?
- Metody přenosu tokenů (transfer) zabalené do require?
- Jsou require a assert použity správně? Metoda assert se používá pouze pro věci, které by se nikdy neměly stát, obvykle se používá pro kontrolu stavu po provedených změnách.
- Existuje obrana proti útokům rekurzivním voláním?
- Jsou omezeny délky libovolných řetězců na vstupu?
- Pokud je to možné, vyhněte se používání polí a použijte místo nich mapování?
- Nepoužívají se blokové hashe pro zpracování náhodných hodnot (těžaři to mohou ovlivnit)?
- Nikde se nepoužívá tx.origin?
- Prvky pole se při mazání prvku posouvají dolů, aby nezůstávaly mezery?
- Používá se revert místo throw?
- Funkce se ukončí okamžitě, pokud nejsou splněny podmínky?
- Jsou vyřešena varování kompilátoru?
- Používá se při výpočtech knihovna SafeMath?
- Jsou některé paměťové sloty (storage sloty) čteny více než jednou?
- Používají se neohraničené smyčky/ pole, které by mohly způsobit DoS?
- Používá se block.timestamp pouze pro dlouhé intervaly?
- Nepoužívá se block. number pro výpočet uplynulého času?
- Vyhýbá se volání delegatecall, zejména u externích (i když důvěryhodných) kontraktů?
- Neaktualizuje se délka pole při iteraci nad ním?
- Jsou podpisy chráněny před přehráním pomocí nonce a block.chainid?
- Ujistěte se, že všechny podpisy používají EIP-712?
- Výstup abi.encodePacked() by neměl být hashován, pokud jsou použity více než 2 dynamické typy. Obecně je vhodnější použít abi.encode().
- Důkladně zkontrolujte vkládání kódu assembleru.
- Vyhněte se nedostatečné spotřebě plynu (gas griefing).
- Jsou všechna soukromá data skutečně soukromá?
- Aktualizace struktury/ pole v paměti (memory) ji nezmění v úložišti (stage)?
- Jsou proměnné stage zastíněné?
- Je výpočet hodnoty proměnné za běhu levnější než její uložení?
- Jsou všechny stavové proměnné načítány ze správného kontraktu (master vs. clone)?
- Jsou správně používány operátory porovnávání (>, <, >=, <=), zejména aby se zabránilo chybám off-by-one?
- Jsou logické operátory (==, ! =, &&, ||, !) používány správně, zejména aby se zabránilo chybám mimo jednotku?
- Provádí se násobení vždy před dělením (pokud násobení nemůže přetéct)?
- Jsou magická čísla nahrazena konstantou s intuitivním názvem?
- Pokud má příjemce ETH zpětnou (fallback ) funkci, kterou lze vrátit, může to vést k DoS?
- Používá se standard SafeERC20 a kontrolují se návratové hodnoty bezpečným způsobem?
- Předpokládá se, že msg. odesílatelem je vždy relevantní uživatel?
- Nepoužívá se pro autorizaci funkce .origin?
- Nepoužívá se místo funkce .call.value() funkce address.transfer() nebo address.send()?
- Při použití nízkoúrovňových volání se ujistěte, že před voláním existuje smlouva.
- Používá se kód assembleru pro přístup k chainid nebo kód/velikost/hash kontraktu místo syntaxe Solidity?
- Používá se klíčové slovo delete při nastavování proměnné na nulovou hodnotu (0, false, "" atd..)?
- Výrazy předávané logickým operátorům/porovnáním (&&/|||/>=/==/atd..) nesmí mít vedlejší účinky.
- Při práci s více adresami si položte otázku, co se stane, pokud jsou stejné?
- Jak dobře je kód zdokumentován? Jsou uvedeny komentáře a příklady všude tam, kde je použit nestandardní kód?
- Pokud je použito externí volání, ujistěte se, že je volání externí smlouvy opravdu nutné?
- Je výsledek externího volání kontrolován a jsou ošetřeny chyby?
- Co se stane, pokud externí volání použije všechny poskytnuté plyny?
- Pokud externí volání volá konkrétní funkci, ujistěte se, že tato funkce skutečně existuje (fantomové funkce).
- Ujistěte se, že v modifikátorech nejsou použita žádná externí volání (modifikátory)
- Jsou pro každou funkci, která modifikuje úložiště, vydávány události?
- Zkontrolujte své předpoklady o tom, co dělají a vracejí externí smlouvy použité v mainu.
- Dejte si pozor na tokeny, které používají příliš mnoho nebo příliš málo desetinných míst. Ujistěte se, že jsou zdokumentovány maximální a minimální podporované hodnoty.
- Jsou zdokumentovány pravomoci spojené s rolemi?
- Jaká jsou rizika při porušení přístupových práv a jak to může ovlivnit různé součásti systému?
- Může vlastník manipulovat s tokeny a ETH v rámci kontraktu?
- Jak je nastavena adresa oracle (Oracle) a jaký proces za tím stojí? Existují náhradní oracly pro zálohování?
- Jak jsou podobné funkce implementovány v jiných projektech, byly zohledněny osvědčené postupy?
Tento kontrolní seznam vám pomůže zajistit provedení důkladného bezpečnostního auditu chytrých kontraktů Solidity. Zahrnuje širokou škálu kritických aspektů pro identifikaci a zmírnění potenciálních zranitelností a rizik v kódu a souvisejících systémech.
Doufáme, že vám tyto příklady pomohly lépe pochopit metodiku auditu chytrých smluv.
Jelikož jsou všechny informace v blockchainu otevřené (samozřejmě za předpokladu, že je ověřen zdrojový kód smlouvy), můžete vyzbrojeni těmito znalostmi nezávisle studovat chytré smlouvy a identifikovat různá podvodná schémata.
Však už jsme to všechno udělali za vás! Přihlaste se k prémiovému předplatnému a získejte přístup k exkluzivním filtrům funkcí chytrých kontraktů a čerstvým analýzám. Zvyšte své šance na úspěšné investování do výnosných tokenů.
S pozdravem, tým Lotus Market.