Co jsou chytré kontrakty na Ethereu
Chytrý kontrakt je program běžící na Ethereum Virtual Machine (EVM), který deterministicky vykonává logiku při volání funkcí nebo přijímání transakcí. Kontrakty uchovávají stav v storage, zapisují události (events) do logů a komunikují s jinými kontrakty. Protože běží v decentralizovaném a nezvratném prostředí, kladou vysoké nároky na bezpečnost, auditovatelnost a ekonomickou efektivitu (gas).
EVM a transakční model
- EVM: zásobníkový virtuální stroj, který vykonává bytecode; pracuje s 256bitovými slovy, má vlastní instrukční sadu a deterministický výpočetní model.
- Transakce: mění stav a spotřebovávají gas. Volání financuje zdroj (EOA nebo účet s abstrakcí), a to včetně podvolání jiných kontraktů.
- Gas: poplatek za výpočet a úložiště; zápis do storage (SSTORE) patří k nejdražším operacím, čtení (SLOAD) je levnější a čistě paměťové operace jsou levné.
- Determinismus: zakázána je náhoda i přístup k externímu světu mimo definovaná rozhraní (orákla, předem zapsaná data).
Jazyk Solidity a ABI
- Solidity je staticky typovaný jazyk inspirovaný JavaScriptem/C++, který se kompiluje do EVM bytecode.
- Pragma: používejte pevné verze (
pragma solidity ^0.8.24;) a při kompilaci optimalizace viaIR pro lepší využití gasu. - ABI (Application Binary Interface): definuje kódování vstupů a výstupů; generuje se z rozhraní a klientům (web3.js/ethers) slouží k volání funkcí.
- Knihovny a dědičnost: kontrakty OpenZeppelin pro standardy a bezpečnostní primitiva, knihovny pro sdílenou logiku (linking/using for).
Struktura kontraktu: storage, memory, events
- Storage: perzistentní mapování 32B slotů; packing menších typů do jednoho slotu snižuje náklady. Pozor na rozložení při upgradech.
- Memory: dočasná paměť v rámci volání, levnější než storage, ale pomíjivá.
- Events: logy s indexovanými parametry (
indexed) pro efektivní filtrování; nejsou přístupné z kontraktů, pouze zvenčí. - Errors/Custom errors: pro úsporu gasu definujte typy
errormístorequire(string).
Standardy tokenů a rozhraní
- ERC-20 (zaměnitelný token):
transfer,approve,transferFrom, událostiTransfer/Approval. Doporučené rozšíření: permit (EIP-2612) pro schvalování podpisem. - ERC-721 (NFT):
ownerOf,safeTransferFrom, rozšířeníERC721Metadata. FunkcionERC721Receivedimplementujte bezpečně. - ERC-1155 (multi-token): dávkové operace, efektivní řešení pro herní a sběratelské případy.
- EIP-712: podepsaná strukturovaná data (typed data) pro bezpečné off-chain podpisy.
- EIP-2981: autorské odměny za NFT (royalties) – pouze signální.
Bezpečnostní principy a typické zranitelnosti
- Reentrancy: používejte vzor checks-effects-interactions,
ReentrancyGuarda upřednostňujte pull platby (withdraw pattern) před push platbami. - Aritmetika: od Solidity 0.8 jsou přetečení kontrolována; pro mikrooptimalizace lze použít
unchecked, pokud je bezpečnost doložena. - Řízení přístupu:
Ownable,AccessControl, role a timelocky. Pro privilegované akce používejte správu prostřednictvím multisigu (např. Gnosis Safe). - Front-running/MEV: používejte commit-reveal, limity minOut na DEX a zvažte privátní mempooly/relaye.
- Odepření služby: smyčky přes neomezené kolekce, externí volání bez omezení gasu, zablokování prostředků; navrhujte s horními limity a mechanismy fail-open/claim.
- Init a selfdestruct: ošetřete inicializační funkce u proxy; počítejte s tím, že
SELFDESTRUCTje na L1 de facto omezen a jeho chování se vyvíjí. - Náhodnost: nepoužívejte
blockhash/timestamp; využijte orákla VRF (např. Chainlink VRF).
Upgradovatelnost a proxy vzory
- Transparent/UUPS proxy: oddělení implementation a proxy; rozložení storage musí být stabilní, nepřidávejte proměnné doprostřed. Využívejte sloty EIP-1967.
- Initializers: u proxy nahrazují konstruktory; chraňte je modifikátorem
initializer. - Beacon/Diamond (EIP-2535): modulární upgrade více kontraktů facet; správa je složitější.
- Governance: upgrady předřaďte timelocku, on-chain hlasování (OpenZeppelin Governor) a transparentnímu procesu.
Vývojové nástroje a workflow
- Hardhat: prostředí TypeScript, lokální EVM, tasks, pluginy (ethers, waffle, gas-reporter, coverage), forking mainnetu pro testování.
- Foundry:
forge/cast, rychlé testy v Solidity, fuzzing a invarianty, vestavěný profilátor a měření gasu. - OpenZeppelin: auditované implementace standardů a bezpečnostních modulů; upgrade plugins pro proxy.
- Lintery a analyzátory: Slither (statická analýza), Mythril/ConsenSys Diligence (symbolická analýza), šablony Semgrep.
Testování: jednotkové testy, fuzzing a invarianty
- Jednotkové testy: pokrývají pozitivní i negativní větve, události a chování v hraničních podmínkách.
- Fuzzing: generuje náhodné vstupy a hledá stavy porušující invarianty (Foundry forge-fuzz, Echidna).
- Testování invariantů: definujte ekonomické a bezpečnostní invarianty (např. totalSupply = Σ balances), testujte je na náhodných sekvencích operací.
- Pokrytí a gas: sledujte pokrytí kódu (statistiky nejsou vše), zároveň vykazujte a regresně kontrolujte gas.
Optimalizace gasu a návrhová rozhodnutí
- Přístupy ke storage: minimalizujte SSTORE; načtěte data do paměti, proveďte výpočty a zapište je pouze jednou.
- Packing: slučujte malé typy (
uint128,uint64,bool) do jednoho slotu; pořadí členů je důležité. - Immutable/constant:
immutablešetří storage,constantšetří prostředky za běhu. - Custom errors a events: šetří bajty a data logů; atribut
indexedpoužívejte střídmě. - Návrh smyček: vyhýbejte se neomezeným smyčkám; upřednostňujte pull nároky na výplatu a stránkování (iterace přes cursor).
Interakce s dalšími sítěmi a L2
- Layer-2: optimistic rollupy (Optimism, Arbitrum) a ZK rollupy (zkSync, Scroll) – levnější gas, jiná finalita a modely přemostění.
- Mosty (bridges): rizikové body – upřednostňujte oficiální nebo auditované brány; v aplikacích modelujte riziko zpoždění a oken reorg.
- Abstrakce účtů (EIP-4337): smart accounts, user operations, sponzorované transakce a flexibilnější ověřování (passkeys, obnova prostřednictvím sociálních kontaktů).
Orákla a přístup k externím datům
- Cenové feedy: používejte konsolidované zdroje s decentralizovaným vykazováním; ověřujte staleness a odchylky od parity.
- VRF: prověřené generování náhodných čísel s kryptografickým důkazem.
- Optimistické oráklo: modely s možností vznést námitku a s úschovou prostředků (delší finalita, nižší náklady).
Migrace, nasazení a správa verzí
- Nasazení: deterministické adresy pomocí CREATE2 (salt), skripty v Hardhat/Foundry s artefakty ABI a adresami.
- Verifikace: Etherscan/Sourcify pro transparentnost; CI pipeline s automatickou verifikací po nasazení.
- Konfigurace: oddělte parametry pro jednotlivé sítě (chainId), používejte dotenv/správce tajných údajů a vícestupňové schvalování.
Integrace frontendu a UX
- Klientské knihovny: ethers.js/viem, bezpečné stavové automaty pro transakce a opakované pokusy s ohledem na EIP-1559.
- Meta-transakce: uživatelská zkušenost bez gasu (forwardery EIP-2771), podpisy EIP-712, relaye s limity a pravidly proti zneužití.
- Chyby: dekódování custom errors, povinné zobrazování limitů minOut, poplatků a rizik.
Audit a provozní bezpečnost
- Před auditem: interní kontrola, statická analýza, fuzzing, formální specifikace klíčových invariantů.
- Externí audit: vybírejte zkušené týmy, sdílejte model hrozeb, reagujte na zjištění a udržujte changelog.
- Bug bounty: programy s jasnými pravidly, rozsahem a odměnami; rychlé kontaktní kanály.
- Reakce na incidenty: timelock pro časové okno k reakci, nouzové přepínače (
Pausable), komunikace s komunitou.
Ekonomické modelování a aspekty teorie her
- Tokenomika: emisní křivky, inflace/deflace, alokace, vesting a sladění motivací účastníků.
- Návrh mechanismů: pobídky proti útokům Sybil, proof-of-stake/práce ve vlastních protokolech, tresty a odměny.
- Poplatky: základní poplatek EIP-1559 + příplatek; nastavte přiměřené hodnoty maxFeePerGas/maxPriorityFeePerGas a limity kontraktů.
Kvalita kódu, styl a dokumentace
- Názvy a komentáře: NatSpec (
@notice,@dev,@param,@return) pro generátory dokumentace a Etherscan. - Modifikátory a require: jasná chybová hlášení nebo custom errors; minimalizujte vnořování a upřednostňujte guard clauses.
- Rozhraní: pro volání mezi kontrakty používejte samostatné
interface; vyhnete se pevné závislosti na implementaci.
Kontrolní seznam pro bezpečné vydání
- Všechna externí volání jsou chráněna proti reentrancy a mají definované failure modes.
- Privilegované funkce jsou chráněny rolemi, multisigem a ideálně timelockem.
- Testy zahrnují fuzzing a invarianty, včetně ekonomických scénářů a útoků MEV.
- Nasazení je deterministické a verifikované (Sourcify/Etherscan); adresy a ABI jsou zveřejněny.
- Existuje plán reakce na incidenty, program bug bounty a komunikační kanály.
- Byla provedena analýza gasu a odstraněny zbytečné zápisy do storage.
Závěr: disciplína je důležitější než technologie
Vývoj chytrých kontraktů na Ethereu kombinuje kryptografii, distribuované systémy a ekonomii. Úspěšné projekty stojí na disciplíně: konzervativním bezpečnostním návrhu, srozumitelné architektuře, důsledném testování, auditu a transparentním provozu. Standardy (ERC/EIP), auditované knihovny, moderní nástrojové řetězce a vědomé řízení rizik umožňují vytvářet aplikace, které obstojí v otevřeném prostředí veřejného blockchainu i ve škálovaných sítích L2.
