Ověřování chytrých kontraktů
Poslední úpravy: @FoltinV(opens in a new tab), 23. listopadu 2023
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 vysoce ú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 Virtuálního stroje Etherea (EVM) vývojáři kompilují zdrojový kód kontraktu – instrukce napsané v jazyce 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 Solidity(opens in a new tab) a hash tohoto souboru je připojen k bytekódu kontraktu. Můžete si je prohlédnout v akci na metadatovém hřišti(opens 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á hash 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ů. Bez úplného ověření je možné vložit škodlivý kód(opens in a new tab), který by se v ověřeném zdrojovém kódu 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é?
Bez nutnosti další důvěry
Skutečnost, že není potřeba další důvěry je pravděpodobně největším předpokladem pro chytré kontrakty a decentralizované aplikace (dappky). 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átka(opens 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 chytrých kontraktů 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 argumentů konstruktoru(opens 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 v úvahu, že se jedná o zjednodušený popis ověřování a existuje mnoho výjimek, které by v tomto případě nefungovaly, například neměnné proměnné(opens 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ódu(opens 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 překompilovaný bytekód spojen s bytekódem (a parametry konstruktoru) kontraktu na blockchainu, pak je smlouva ověřena(opens 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é kontrakty(opens 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í kontraktu na Etherscanu má však nevýhodu: nepodaří se mu porovnat hash metadat bytekódu na blockchainu a překompilovaného bytekódu. Shody v programu Etherscan jsou proto pouze částečné.
Více o ověřování kontraktů na Etherscanu(opens in a new tab).
Sourcify
Sourcify(opens in a new tab) je další nástroj pro ověřování kontraktů, který je open-source a decentralizovaný. Není to průzkumník bloků a ověřuje pouze kontrakty v různých sítích založených na EVM(opens 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 NatSpec(opens 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 jsou doručovány do jeho veřejného úložiště(opens in a new tab) na HTTP a IPFS(opens in a new tab), což je decentralizované, obsahem adresované(opens in a new tab) úložiště. 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 rozhraní API nebo UI(opens 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 informací o ověřování kontraktů na Sourcify(opens in a new tab).
Tenderly
Platforma Tenderly(opens 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ádět ověřování zdrojového kódu(opens 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.
Vaše kontrakty můžete ověřit pomocí Hlavního panelu(opens in a new tab), pluginu Tenderly Hardhat(opens in a new tab) nebo CLI(opens 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.