Pokyny pro zabezpečení smart kontraktů
Řiďte se těmito doporučeními na vysoké úrovni, abyste mohli vytvářet bezpečnější chytré kontrakty.
Pokyny pro návrh
Návrh kontraktu by měl být prodiskutován předem, ještě před napsáním jakéhokoli řádku kódu.
Dokumentace a specifikace
Dokumentaci lze psát na různých úrovních a měla by být aktualizována při implementaci kontraktů:
- Jednoduchý srozumitelný popis systému, který popisuje, co kontrakty dělají a jaké jsou předpoklady týkající se kódové základny.
- Schémata a architektonické diagramy, včetně interakcí kontraktů a stavového automatu systému. Slither printersopens in a new tab mohou pomoci s generováním těchto schémat.
- Důkladná dokumentace kódu, pro Solidity lze použít formát Natspecopens in a new tab.
Výpočty on-chain vs. off-chain
- Ponechte co nejvíce kódu off-chain. Udržujte on-chain vrstvu malou. Předzpracujte data pomocí kódu off-chain tak, aby ověření on-chain bylo jednoduché. Potřebujete seřazený seznam? Seřaďte seznam off-chain, poté pouze zkontrolujte jeho pořadí on-chain.
Vylepšitelnost
O různých řešeních vylepšitelnosti jsme diskutovali v našem příspěvku na bloguopens in a new tab. Před napsáním jakéhokoli kódu učiňte vědomé rozhodnutí, zda vylepšitelnost podporovat, či nikoliv. Toto rozhodnutí ovlivní, jak budete strukturovat svůj kód. Obecně doporučujeme:
- Upřednostňujte migraci kontraktůopens in a new tab před vylepšitelností. Migrační systémy mají mnoho stejných výhod jako ty vylepšitelné, ale nemají jejich nevýhody.
- Používejte vzor oddělení dat namísto vzoru delegatecallproxy. Pokud má váš projekt jasné oddělení abstrakce, vylepšitelnost pomocí oddělení dat bude vyžadovat jen několik úprav. Delegatecallproxy vyžaduje odborné znalosti EVM a je vysoce náchylný k chybám.
- Zdokumentujte postup migrace/vylepšení před nasazením. Pokud budete muset reagovat pod stresem bez jakýchkoli pokynů, uděláte chyby. Napište si postup s předstihem. Měl by zahrnovat:
- Volání, která iniciují nové kontrakty
- Kde jsou uloženy klíče a jak k nim přistupovat
- Jak zkontrolovat nasazení! Vytvořte a otestujte skript, který se spustí po nasazení.
Pokyny pro implementaci
Usilujte o jednoduchost. Vždy používejte nejjednodušší řešení, které vyhovuje vašemu účelu. Každý člen vašeho týmu by měl být schopen porozumět vašemu řešení.
Skládání funkcí
Architektura vaší kódové základny by měla usnadňovat revizi kódu. Vyhněte se architektonickým rozhodnutím, která snižují schopnost posoudit jeho správnost.
- Rozdělte logiku vašeho systému, buď do více kontraktů, nebo seskupením podobných funkcí (například ověřování, aritmetika, ...).
- Pište malé funkce s jasným účelem. To usnadní revizi a umožní testování jednotlivých komponent.
Dědičnost
- Udržujte dědičnost zvládnutelnou. Dědičnost by se měla používat k rozdělení logiky, nicméně váš projekt by se měl snažit minimalizovat hloubku a šířku stromu dědičnosti.
- Použijte inheritance printeropens in a new tab od Slitheru ke kontrole hierarchie kontraktů. Tento nástroj vám pomůže zkontrolovat velikost hierarchie.
Události
- Zaznamenávejte všechny klíčové operace. Události pomohou při ladění kontraktu během vývoje a při jeho monitorování po nasazení.
Vyhněte se známým nástrahám
- Mějte na paměti nejběžnější bezpečnostní problémy. Existuje mnoho online zdrojů, kde se můžete o běžných problémech dozvědět, jako například Ethernaut CTFopens in a new tab, Capture the Etheropens in a new tab nebo Not so smart contractsopens in a new tab.
- Věnujte pozornost sekcím s varováními v dokumentaci Solidityopens in a new tab. Sekce s varováními vás informují o ne zcela zjevném chování jazyka.
Závislosti
- Používejte dobře otestované knihovny. Importování kódu z dobře otestovaných knihoven sníží pravděpodobnost, že napíšete kód s chybami. Pokud chcete napsat kontrakt ERC20, použijte OpenZeppelinopens in a new tab.
- Používejte správce závislostí; vyhněte se kopírování kódu. Pokud se spoléháte na externí zdroj, musíte jej udržovat aktuální s původním zdrojem.
Testování a ověřování
- Napište důkladné jednotkové testy. Rozsáhlá sada testů je klíčová pro vytvoření vysoce kvalitního softwaru.
- Napište vlastní kontroly a vlastnosti pro Slitheropens in a new tab, Echidnaopens in a new tab a Manticoreopens in a new tab. Automatizované nástroje pomohou zajistit bezpečnost vašeho kontraktu. Projděte si zbytek této příručky, abyste se naučili, jak psát efektivní kontroly a vlastnosti.
- Používejte crytic.ioopens in a new tab. Crytic se integruje s GitHubem, poskytuje přístup k soukromým detektorům Slither a spouští vlastní kontroly vlastností z Echidny.
Solidity
- Upřednostňujte Solidity 0.5 před verzemi 0.4 a 0.6. Podle našeho názoru je Solidity 0.5 bezpečnější a má lepší vestavěné postupy než verze 0.4. Solidity 0.6 se ukázalo jako příliš nestabilní pro produkční nasazení a potřebuje čas na dozrání.
- Pro kompilaci používejte stabilní vydání; pro kontrolu varování používejte nejnovější vydání. Zkontrolujte, zda váš kód nemá žádné hlášené problémy s nejnovější verzí kompilátoru. Solidity má však rychlý cyklus vydávání a v minulosti se v něm objevily chyby kompilátoru, takže nejnovější verzi pro nasazení nedoporučujeme (viz doporučení verze solcopens in a new tab od Slitheru).
- Nepoužívejte inline assembly. Assembly vyžaduje odborné znalosti EVM. Nepište kód EVM, pokud jste neovládli žlutou knihu.
Pokyny pro nasazení
Jakmile je kontrakt vyvinut a nasazen:
- Monitorujte své kontrakty. Sledujte logy a buďte připraveni reagovat v případě kompromitace kontraktu nebo peněženky.
- Přidejte své kontaktní údaje do blockchain-security-contactsopens in a new tab. Tento seznam pomáhá třetím stranám vás kontaktovat, pokud je objevena bezpečnostní chyba.
- Zabezpečte peněženky privilegovaných uživatelů. Pokud ukládáte klíče v hardwarových peněženkách, řiďte se našimi osvědčenými postupyopens in a new tab.
- Mějte plán reakce na incidenty. Počítejte s tím, že vaše chytré kontrakty mohou být kompromitovány. I když jsou vaše kontrakty bez chyb, útočník může převzít kontrolu nad klíči vlastníka kontraktu.
Stránka naposledy aktualizována: 14. února 2026