Audit smart kontraktů

Proč se audit smart kontraktů týká i neprogramátorů

Smart kontrakty jsou automatizované dohody běžící na blockchainu. Neodpouštějí chyby: po nasazení často není možné zvrátit důsledky špatné logiky, slabého řízení oprávnění nebo nečekaných interakcí. Manažeři, produktoví vlastníci, právníci, správci treasury či zakladatelé projektů proto musí rozumět, co audit je a co není, jaké jsou jeho limity a jak z něj vytěžit maximum. Tento text je praktický průvodce auditem pro neprogramátory – s důrazem na rozhodnutí, rozpočty, termíny a rizika, nikoli na kód.

Co je audit a co není: definice a limity

  • Audit je systematické hodnocení bezpečnosti smart kontraktů: architektury, logiky, interakcí a konfigurace. Výstupem je zpráva s nálezy, závažností (severity), doporučeními a posouzením rizika zbytku (residual risk).
  • Audit není záruka bezchybnosti ani pojistka proti ztrátám. Je to snížení rizika – kvalita závisí na rozsahu, čase, odbornosti a spolupráci týmu.
  • Limity: omezený čas, neúplné specifikace, dynamické prostředí (oracly, DEX likvidita, L2 mosty) a nemožnost pokrýt všechny kombinace stavů. Proto se audit kombinuje s testováním, formálními metodami, bounty programy a monitoringem po nasazení.

Jak si připravit projekt na úspěšný audit

  1. Stabilizujte kód: zaveďte code freeze před začátkem auditu. Změny během auditu snižují kvalitu a zvyšují cenu.
  2. Připravte specifikaci: funkční požadavky, ekonomický design (tokenomie, poplatky), bezpečnostní model (kdo co může), správa klíčů, upgrade politika, pauzovatelnost, limity, časové zámky.
  3. Testovací sada: unit/integration testy, scénáře ekonomických útoků, invariance (co musí vždy platit), pokrytí testů (coverage) a ukázková konfigurace nasazení.
  4. Mapa závislostí: verze knihoven (např. OpenZeppelin), externí protokoly, oracly, mosty (bridges), L2 specifika. Uveďte přesné commit hashe.
  5. Provozní procesy: multisig role, timelocky, emergency pause, incident response plán a komunikační protokol pro uživatele.

Rozsah auditu: co by měl zahrnovat

  • Architektonický přehled: vztahy kontraktů, upgrade proxy, přístupové role, správa treasury.
  • Kontrola správnosti logiky: ekonomická pravidla, účtování poplatků, výpočty podílů, rozdělování odměn.
  • Bezpečnostní vzory: reentrancy guard, checks-effects-interactions, používání openzeppelin modulů, bezpečné volání (call vs. delegatecall).
  • Interakce s externím světem: oracly (manipulace cenou), MEV a pořadí transakcí, flash-loan scénáře, závislost na DEX likviditě.
  • Konfigurace nasazení: inicializační parametry, prahy, limity, whitelisty/blacklisty, oprávnění admin klíčů a jejich zabezpečení (multisig, HSM, MPC).
  • Formální tvrzení: vybrané bezpečnostní vlastnosti, které budou verifikovány (např. „zůstatky nikdy nebudou negativní“, „celková nabídka nepřekročí limit“).

Typická metodika auditu (zjednodušeně)

  1. Kickoff & scoping: sladění cílů, rozsahu, termínů, prostředí a kontaktních osob.
  2. Studium specifikace: pochopení funkcionality protokolu a identifikace kritických invariantů.
  3. Manuální čtení kódu: hledání logických chyb, nestandardních vzorů a nebezpečných závislostí.
  4. Analýza nástroji: statická analýza, symbolická exekuce, fuzzing (náhodné generování vstupů), differential testing (porovnání s referenční implementací).
  5. Modelování útoků: reentrancy, manipulace oracly, MEV/tx-ordering, front-running, únik oprávnění, zneužití admin funkcí, ekonomické vyprázdnění poolů.
  6. Ověření oprávnění: princip nejmenších privilegií, oddělení rolí, timelocky, přístupové kontrolní seznamy.
  7. Kontrola nasazení: migrace, inicializace proxy, správné adresy, pauza/obnova, aktualizační postupy.
  8. Správa nálezů: klasifikace (informational/low/medium/high/critical), dopady, pravděpodobnost, doporučení.
  9. Re-test: ověření oprav a aktualizace závěrů – klíčové pro stakeholdery a integrátory.

Nejčastější třídy zranitelností (vysvětlené „byznys“ řečí)

  • Reentrancy: kontrakt odešle externí volání dříve, než zamkne svůj vlastní stav. Útočník může „vytáhnout“ prostředky opakovanými návraty.
  • Manipulace cenového zdroje: pokud protokol spoléhá na slabý oracle nebo takový, který lze ovlivnit malým objemem na DEXu, útočník zkreslí cenu a získá neúměrnou výhodu.
  • Práva admina: příliš silné klíče, bez timelocku či multisigu. Riziko úmyslného/neopatrného zásahu nebo kompromitace klíče.
  • Delegatecall / proxy pasti: sdílení kontextu úložiště mezi kontrakty – jedna chyba v logice nebo inicializaci může „otevřít“ celý protokol.
  • Arithmetic a hraniční případy: overflow/underflow (moderní kompilátory je většinou zachytí), dělení nulou, nesprávné zaokrouhlování, přesnosti při výpočtech podílů.
  • Front-running a MEV: útočník předběhne transakci s citlivými parametry (např. nastavení ceny/slippage) a změní výsledek pro uživatele.
  • Permit/replay útoky: podepisované autorizované převody (EIP-2612) bez správné ochrany proti opakovanému použití.
  • Neúmyslné zmražení prostředků: chybějící rescue funkce, nevratné stavy při chybných parametrech, nepokrytí edge případů.
  • Chyby ve standardech: neúplná nebo nesprávná implementace ERC rozhraní (20/721/1155), které brání interoperabilitě.

Co má obsahovat dobrá auditní zpráva

  • Executive summary: rychlý přehled rizik, počet a typ nálezů, celkové hodnocení a doporučené kroky.
  • Scope & commit hash: přesná verze kódu, zahrnuté kontrakty, omezení a předpoklady.
  • Metodika: jaké nástroje a přístupy byly použity (manuální review, fuzzing, formální tvrzení).
  • Detail nálezů: popis problému, dopady, vektor útoku, příklady scénářů, návrhy oprav, posouzení rizika zbytku.
  • Stav po opravách: které nálezy jsou opravené, které jsou akceptované s rizikem, které jsou sporné.
  • Doporučení pro provoz: monitoring, limity, postup při incidentech, nastavení rolí a governance.

Jak číst „severity“ a prioritizovat opravy

Severity (závažnost) kombinuje dopad a pravděpodobnost. Pro neprogramátora je klíčové převést ji do priorit:

  1. Kritické: okamžitá akce před nasazením nebo aktivací funkcí. Pokud je protokol live, zvažte pause nebo limity.
  2. Vysoké: opravit před rozšířením kapacity (TVL, počet uživatelů), často vyžadují změny logiky.
  3. Střední: řešit v nejbližším release, mohou být mitigovány konfigurací.
  4. Nízké/informační: kvalita kódu, optimalizace gasu, dokumentace – důležité pro dlouhodobou udržitelnost.

Rozpočet, harmonogram a dodavatel: praktická rozhodnutí

  • Rozsah & složitost určují cenu a čas. Kontrakty s upgrady, složitou ekonomikou a externími závislostmi jsou dražší.
  • Nezávislost a reputace: zkuste kombinovat nezávislý tým (manuální review) a kolektivní hodnocení (soutěže, bounty) pro širší pokrytí.
  • Kontrakt a SLA: definujte scope, hranice odpovědnosti, počet re-testů, formu výstupu, práva na zveřejnění a časová okna.
  • Odhad času: zahrňte rezervu na opravy a re-test. Plánujte audit před token eventy a velkými integracemi.

Formální metody a fuzzing: co o nich potřebujete vědět

Formálně verifikovaná tvrzení dokazují, že vybrané vlastnosti platí pro všechny možné vstupy v rámci určitých předpokladů. Fuzzing simuluje obrovské množství náhodných a hraničních vstupů, aby odhalil neočekávané stavy. Pro rozhodovatele: ptejte se, jaké invariance byly ověřeny a jaké pokrytí dosáhl fuzzing (počet unikátních cest, zásahnuté větve).

Governance, klíče a provoz: bezpečnost není jen kód

  • Správa oprávnění: multisig pro admin funkce, timelocky pro neurgentní změny, pause guardian pro incidenty.
  • Upgrade politika: transparentní proces, on-chain hlasování, odklad (grace period), veřejná oznámení.
  • Segregace povinností: oddělené role pro nasazení, správu treasury a bezpečnost.
  • Havarijní plán: runbook pro incidenty, kontaktní kanály, nástroje pro zmírnění (limity, výběrová okna, vypnutí citlivých funkcí).

Ekonomická bezpečnost: když je kód správný, ale ekonomika ne

Mnohé ztráty nevznikly syntaktickou chybou, ale ekonomickým designem. Při auditu proto požadujte:

  • Analýzu incentiv: může účastník zneužít poplatkový model nebo odměny?
  • Simulace stresu: co se stane při extrémní volatilitě, vyschnutí likvidity nebo selhání oraclu?
  • Flash-loan scénáře: jednorázové velké přesuny kapitálu k ovlivnění ceny či stavu.

Bug bounty a kolektivní audity

Po formálním auditu zaveďte bug bounty s jasnými pravidly odměn, rozsahu, důkazů a právních záruk pro výzkumníky. Veřejné soutěže (crowd-audit) rozšíří množství očí a útočných modelů. Klíčová je rychlá triage a spravedlivé vyplácení – to zvýší důvěru komunity.

On-chain monitorování a detekce anomálií

  • Alerty na změny konfigurace, volání admin funkcí, velké přesuny, neobvyklé výběry, odchylky oraclů.
  • Limitery: denní limity, „circuit breakers“, postupné uvolňování kapacity (TVL caps).
  • Telemetrie: metriku provozu ukládat off-chain, ale korelovat s on-chain událostmi (eventy).

Kontrolní seznam pro neprogramátora (před nasazením)

  1. Máme alespoň jeden nezávislý audit a proběhly re-testy po opravách?
  2. Jsou specifikace úplné a sladěné s implementací?
  3. Je definována a vynucena správa oprávnění (multisig, timelock, pause)?
  4. Máme monitoring a incident response plán s jasnými rolemi?
  5. Jsou externí závislosti (oracly, DEXy, mosty) identifikovány a mají fallbacky?
  6. Je připraven bug bounty a proces pro rychlé nasazení oprav?
  7. Máme TVL limity a postupné škálování místo „all-in“?

Jak vybrat auditního partnera

  • Track record: veřejné zprávy, schopnost přiznat nejasnosti, kvalita doporučení.
  • Transparentnost metodiky: kombinace manuálu, nástrojů, fuzzingu a formálních tvrzení.
  • Komunikace: dostupnost, rychlost triage, ochota vysvětlovat ne-technickému publiku.
  • Konflikty zájmů: nezávislost na investičních či integračních vazbách na auditovaný projekt.

Příklady „červených vlajek“ v auditním procesu

  • Auditor odmítá sdílet metodiku, uvádí pouze generické fráze a žádá zveřejnění loga bez reálného review.
  • Audit probíhá během masivních změn kódu bez jasného code freeze a verzování.
  • Zpráva neobsahuje commit hash, stav po opravách ani konkrétní doporučení.
  • Projekt ignoruje doporučení pro governance a spoléhá na jediný admin klíč.

Specifika různých sítí a standardů