Ověřování chytrých kontraktů
Stránka naposledy aktualizována: 22. října 2025
Chytré kontrakty jsou navrženy tak, aby byly „bez nutnosti další důvěry“, což znamená, že uživatelé by před interakcí s kontraktem neměli důvěřovat třetím stranám (např. vývojářům a společnostem). Podmínkou pro to je, aby uživatelé a další vývojáři mohli ověřit zdrojový kód chytrého kontraktu. Ověření zdrojového kódu zajišťuje uživatelům a vývojářům, že zveřejněný kód kontraktu je stejný kód, který běží na adrese kontraktu na blockchainu Etherea.
Je důležité rozlišovat mezi „ověřováním zdrojového kódu“ a „formálním ověřováním“. Ověřování zdrojového kódu, které bude podrobně vysvětleno níže, se týká ověření, že se daný zdrojový kód chytrého kontraktu ve vysokoúrovňovém jazyce (např. Solidity) zkompiluje do stejného bytekódu, který má být spuštěn na adrese kontraktu. Formální ověřování však popisuje ověření správnosti chytrého kontraktu, což znamená, že se kontrakt chová podle očekávání. Ačkoli ověřování kontraktu závisí na kontextu, obvykle se vztahuje na ověření zdrojového kódu.
Co je ověřování zdrojového kódu?
Před nasazením chytrého kontraktu do Ethereum Virtual Machine (EVM) vývojáři kompilují zdrojový kód kontraktu – instrukce napsané v Solidity nebo jiném vysokoúrovňovém programovacím jazyce – do bytekódu. Jelikož EVM nedokáže interpretovat vysokoúrovňové instrukce, je pro provádění logiky kontraktu v EVM nutná kompilace zdrojového kódu do bytekódu (tj. nízkoúrovňových strojových instrukcí).
Ověřování zdrojového kódu je porovnávání zdrojového kódu chytrého kontraktu a zkompilovaného bytekódu použitého při vytváření kontraktu s cílem odhalit případné rozdíly. Ověřování chytrých kontraktů je důležité, protože inzerovaný kód kontraktu se může lišit od toho, který běží na blockchainu.
Ověřování chytrých kontraktů umožňuje zkoumat, co kontrakt dělá, prostřednictvím vysokoúrovňového jazyka, ve kterém je napsán, aniž by bylo nutné číst strojový kód. Funkce, hodnoty a obvykle i názvy proměnných a komentáře zůstávají stejné jako v původním zdrojovém kódu, který je zkompilován a nasazen. Čtení kódu je tak mnohem snazší. Ověřování zdrojových kódů také zajišťuje dokumentaci kódu, aby koncoví uživatelé věděli, k čemu je chytrý kontrakt určen.
Co je úplné ověření?
Některé části zdrojového kódu nemají na zkompilovaný bytekód vliv, například komentáře nebo názvy proměnných. To znamená, že dva zdrojové kódy s různými názvy proměnných a různými komentáři budou schopny ověřit stejný kontrakt. Záškodník tak může do zdrojového kódu přidat klamavé komentáře nebo uvést zavádějící názvy proměnných a nechat ověřit kontrakt s jiným zdrojovým kódem, než je původní zdrojový kód.
Tomu je možné se vyhnout tak, že se k bytekódu připojí další data, která slouží jako kryptografická záruka přesnosti zdrojového kódu a jako otisk prstu informací o kompilaci. Potřebné informace se nacházejí v metadatech kontraktu Solidityopens in a new tab a haš tohoto souboru je připojen k bytekódu kontraktu. Můžete si to prohlédnout v akci v metadata playgrounduopens in a new tab.
Soubor metadat obsahuje informace o kompilaci kontraktu včetně zdrojových souborů a jejich hashů. To znamená, že pokud se změní nastavení kompilace nebo dokonce jediný bajt v některém ze zdrojových souborů, změní se i soubor metadat. V důsledku toho se změní i hash souboru metadat, který je připojen k bytekódu. To znamená, že pokud se bytekód kontraktu + připojený hash metadat shodují s daným zdrojovým kódem a nastavením kompilace, můžeme si být jisti, že se jedná o přesně stejný zdrojový kód, který byl použit při původní kompilaci, a že se neliší ani o jediný bajt.
Tento typ ověření, který využívá haš metadat, se označuje jako „úplné ověřeníopens in a new tab“ (také „dokonalé ověření“). Pokud se hashe metadat neshodují nebo nejsou při ověřování brány v úvahu, jedná se o „částečnou shodu“, což je v současné době běžnější způsob ověřování kontraktů. Je možné vložit škodlivý kódopens in a new tab, který by se v ověřeném zdrojovém kódu bez úplného ověření neprojevil. Většina vývojářů si není vědoma úplného ověření a neuchovává soubor s metadaty o své kompilaci, proto je částečné ověření dosud de facto metodou ověřování kontraktů.
Proč je ověřování zdrojového kódu důležité?
Nevyžadování důvěry
Nevyžadování důvěry je pravděpodobně největším předpokladem pro chytré kontrakty a decentralizované aplikace (dapps). Chytré kontrakty jsou „neměnné“ a nelze je pozměnit; kontrakt provede pouze obchodní logiku definovanou v kódu v době nasazení. To znamená, že vývojáři a podniky nemohou manipulovat s kódem kontraktu po jeho nasazení na Ethereu.
Aby chytrý kontrakt fungoval bez nutnosti další důvěry, měl by být kód kontraktu dostupný pro nezávislé ověření. Zatímco zkompilovaný bytekód pro každý chytrý kontrakt je veřejně dostupný na blockchainu, nízkoúrovňový jazyk je obtížně srozumitelný jak pro vývojáře, tak pro uživatele.
Projekty snižují předpoklady důvěryhodnosti zveřejněním zdrojového kódu svých kontraktů. To však vede k dalšímu problému: je obtížné ověřit, zda zveřejněný zdrojový kód odpovídá bytekódu kontraktu. V tomto případě je hodnota bezdůvěryhodnosti ztracena, protože uživatelé musí věřit vývojářům, že nezmění obchodní logiku kontraktu (tj. změnou bytekódu) před jeho nasazením do blockchainu.
Nástroje pro ověřování zdrojového kódu poskytují záruky, že soubory zdrojového kódu chytrého kontraktu odpovídají kódu sestavení. Výsledkem je ekosystém bez nutnosti další důvěry, kde uživatelé slepě nedůvěřují třetím stranám a místo toho si před vložením prostředků do kontraktu ověřují kód.
Bezpečnost uživatelů
U chytrých kontraktů je obvykle v sázce spousta peněz. To vyžaduje vyšší bezpečnostní záruky a ověření logiky chytrého kontraktu před jeho použitím. Problém spočívá v tom, že bezohlední vývojáři mohou uživatele oklamat vložením škodlivého kódu do chytrého kontraktu. Bez ověření mohou mít škodlivé chytré kontrakty zadní vrátkaopens in a new tab, kontroverzní mechanismy řízení přístupu, zneužitelné zranitelnosti a další věci, které ohrožují bezpečnost uživatelů a které by zůstaly neodhaleny.
Zveřejnění souborů se zdrojovým kódem chytrého kontraktu usnadňuje zájemcům, například auditorům, posouzení kontraktu z hlediska možných vektorů útoku. Díky tomu, že chytrý kontrakt nezávisle ověřuje více stran, mají uživatelé větší záruku jeho bezpečnosti.
Jak ověřit zdrojový kód pro chytré kontrakty na Ethereu
Nasazení chytrého kontraktu na Ethereu vyžaduje odeslání transakce s datovým payloadem (zkompilovaným bytekódem) na speciální adresu. Datový payload je generován kompilací zdrojového kódu a argumenty konstruktoruopens in a new tab instance kontraktu, připojené k datovému payloadu v transakci. Kompilace je deterministická, což znamená, že při použití stejných zdrojových souborů a nastavení kompilace (např. verze překladače, optimalizátor) je vždy vytvořen stejný výstup (tj. bytekód kontraktu).
Ověření chytrého kontraktu v podstatě zahrnuje následující kroky:
-
Vložte zdrojové soubory a nastavení kompilace do kompilátoru.
-
Kompilátor vrátí bytekód kontraktu
-
Vezměte bytekód nasazeného kontraktu na dané adrese
-
Porovnejte nasazenýho bytekód s překompilovaným bytekódem. Pokud se kódy shodují, kontrakt se ověří pomocí zadaného zdrojového kódu a nastavení kompilace.
-
Pokud se navíc hashe metadat na konci bytekódu shodují, jedná se o úplnou shodu.
Berte na vědomí, že se jedná o zjednodušený popis ověření a existuje mnoho výjimek, na které by se tento postup nevztahoval, například existence neměnných proměnnýchopens in a new tab.
Nástroje pro ověřování zdrojového kódu
Tradiční proces ověřování kontraktů může být složitý. Proto máme nástroje pro ověřování zdrojového kódu chytrých kontraktů nasazených na Ethereu. Tyto nástroje automatizují velkou část ověřování zdrojových kódů a také kurátorsky zpracovávají ověřené kontrakty pro potřeby uživatelů.
Etherscan
Ačkoli je Etherscan známý především jako prohlížeč blockchainu Etherea, nabízí také službu ověřování zdrojového kóduopens in a new tab pro vývojáře a uživatele chytrých kontraktů.
Etherscan umožňuje překompilovat bytekód kontraktu z původního datového payloadu (zdrojový kód, adresa knihovny, nastavení kompilátoru, adresa kontraktu atd.). Pokud je znovu zkompilovaný bytekód spojen s bytekódem (a parametry konstruktoru) kontraktu na blockchainu, pak je kontrakt ověřenopens in a new tab.
Po ověření obdrží zdrojový kód vašeho kontraktu označení „Ověřeno“ a je zveřejněn na Etherscanu, kde ho mohou kontrolovat ostatní. Přidá se také do sekce Ověřené kontraktyopens in a new tab – úložiště chytrých kontraktů s ověřenými zdrojovými kódy.
Etherscan je nejpoužívanějším nástrojem pro ověřování kontraktů. Ověřování kontraktů na Etherscanu má však nevýhodu: nedokáže porovnat haš metadat bytekódu na blockchainu a znovu zkompilovaného bytekódu. Shody v programu Etherscan jsou proto pouze částečné.
Více o ověřování kontraktů na Etherscanuopens in a new tab.
Blockscout
Blockscoutopens in a new tab je open-source prohlížeč blockchainu, který také poskytuje službu ověřování kontraktůopens in a new tab pro vývojáře a uživatele chytrých kontraktů. Jako open-source alternativa nabízí Blockscout transparentnost v tom, jak se ověřování provádí, a umožňuje komunitě přispívat ke zlepšení procesu ověřování.
Podobně jako jiné ověřovací služby vám Blockscout umožňuje ověřit zdrojový kód vašeho kontraktu tak, že znovu zkompiluje bytekód a porovná jej s nasazeným kontraktem. Po ověření získá váš kontrakt stav ověření a zdrojový kód se stane veřejně dostupným pro audit a interakci. Ověřené kontrakty jsou také uvedeny v úložišti ověřených kontraktůopens in a new tab Blockscout pro snadné procházení a vyhledávání.
Sourcify
Sourcifyopens in a new tab je další open-source a decentralizovaný nástroj pro ověřování kontraktů. Není to prohlížeč bloků a ověřuje pouze kontrakty v různých sítích založených na EVMopens in a new tab. Funguje jako veřejná infrastruktura pro další nástroje, které na ní mohou stavět, a jejím cílem je umožnit lidsky přívětivější interakce s kontrakty pomocí komentářů ABI a NatSpecopens in a new tab, které se nacházejí v souboru metadat.
Na rozdíl od Etherscanu podporuje Sourcify úplné shody s hashem metadat. Ověřené kontrakty se poskytují v jeho veřejném úložištiopens in a new tab přes HTTP a IPFSopens in a new tab, což je decentralizované úložiště s adresováním podle obsahuopens in a new tab. To umožňuje načtení souboru metadat kontraktu přes IPFS, protože připojený hash metadat je hash IPFS.
Kromě toho lze přes IPFS načíst také soubory se zdrojovým kódem, protože v metadatech IPFS se nacházejí také hashe těchto souborů. Kontrakt lze ověřit poskytnutím souboru metadat a zdrojových souborů prostřednictvím jeho API nebo UIopens in a new tab, nebo pomocí pluginů. Monitorovací nástroj Sourcify také aktivně sleduje vytváření kontraktů na nových blocích a snaží se ověřit kontrakty, pokud jsou jejich metadata a zdrojové soubory zveřejněny na systému IPFS.
Více o ověřování kontraktů na Sourcifyopens in a new tab.
Tenderly
Platforma Tenderlyopens in a new tab umožňuje vývojářům Web3 vytvářet, testovat, monitorovat a provozovat chytré kontrakty. Tenderly kombinuje ladicí nástroje s pozorovatelností a stavebními bloky infrastruktury a pomáhá vývojářům urychlit vývoj chytrých kontraktů. Aby mohli vývojáři plně využívat funkce Tenderly, musí provést ověření zdrojového kóduopens in a new tab pomocí několika metod.
Kontrakt je možné ověřit soukromě nebo veřejně. Pokud je chytrý kontrakt ověřen soukromě, je viditelný pouze pro vás (a ostatní členy vašeho projektu). Veřejné ověření kontraktu ho zviditelní všem uživatelům platformy Tenderly.
Své kontrakty můžete ověřit pomocí Dashboarduopens in a new tab, pluginu Tenderly Hardhatopens in a new tab nebo CLIopens in a new tab.
Při ověřování kontraktů prostřednictvím hlavního panelu je třeba importovat zdrojový soubor nebo soubor metadat vygenerovaný kompilátorem Solidity, adresu/síť a nastavení kompilátoru.
Použití pluginu Tenderly Hardhat umožňuje větší kontrolu nad procesem ověřování s menším úsilím a umožňuje volit mezi automatickým (bez kódu) a ručním (na základě kódu) ověřováním.
