Úvod do smart kontraktů

V tomto článku se podíváme na to, co jsou smart kontrakty, jaké typy existují, seznámíme se s různými platformami smart kontraktů, jejich zvláštnostmi a také si probereme, jak fungují a jaké výhody mohou přinášet. Tento materiál bude velmi užitečný pro čtenáře, kteří nejsou dostatečně obeznámeni s tématem smart kontraktů, ale chtějí se k jeho porozumění přiblížit.

Běžný kontrakt vs. smart kontrakt

Než se ponoříme do detailů, pojďme si na příkladu vysvětlit rozdíly mezi běžným kontraktem, který je vyhotoven na papíře, a smart kontraktem, který je prezentován v digitální podobě.

Úvod do smart kontraktů

Jak to fungovalo před vznikem smart kontraktů? Představte si skupinu lidí, kteří chtějí stanovit určitá pravidla a podmínky pro rozdělení hodnot, a také určité mechanismy pro zajištění jejich dodržení podle stanovených pravidel a podmínek. Dříve se scházeli, vypracovali dokument, do kterého zapsali své identifikační údaje, podmínky, zapojené hodnoty, uvedli datum a podepsali. Tento kontrakt také ověřovala důvěryhodná strana, například notář. Poté se lidé rozcházeli s papírovou kopií kontraktu a začali vykonávat činnosti, které nemusely odpovídat samotnému kontraktu, tedy dělali jedno, zatímco na papíře bylo potvrzeno něco zcela jiného. A jak z této situace ven? V podstatě někdo z účastníků skupiny musel vzít tento dokument, poskytnout určité důkazy, jít k soudu a usilovat o shodu mezi kontraktem a skutečnými činnostmi. Často je obtížné dosáhnout spravedlivého plnění tohoto kontraktu, což může vést k nepříjemným následkům.

Co tedy můžeme říci o smart kontraktech? Spojují v sobě možnost sepsání podmínek kontraktu a mechanismus jejich přísného dodržování. Pokud byly podmínky stanoveny a byla podepsána odpovídající transakce nebo žádost, pak po přijetí této žádosti nebo transakce již není možné měnit podmínky nebo ovlivnit jejich plnění.

Existuje jeden validátor nebo celá síť, a také databáze, která uchovává všechny smart kontrakty, jež byly odeslány k realizaci ve striktní chronologické posloupnosti. Dále je důležité, aby tato databáze obsahovala všechny podmínky-spouštěče pro realizaci smart kontraktu. Navíc musí zohledňovat hodnotu, jejíž rozdělení je popsáno v kontraktu. Pokud se to týká nějaké digitální měny, musí tato databáze tuto hodnotu zohledňovat.

Jinými slovy, validátoři smart kontraktů musí mít přístup ke všem datům, se kterými smart kontrakt operuje. Například jedna databáze by měla být používána k současnému záznamu digitálních měn, zůstatků uživatelů, transakcí uživatelů a časových razítek. Pak může být podmínkou ve smart kontraktu zůstatek uživatele v určité měně, nastoupení určitého času nebo uskutečnění určité transakce, ale nic víc.

Definice smart kontraktu

Samotná terminologie byla vymyšlena badatelem Nickem Szabem a poprvé byla aplikována v roce 1994, přičemž byla zdokumentována v roce 1997 v článku, který popisuje samu myšlenku smart kontraktů.

Smart kontrakty předpokládají, že se provádí určitá automatizace distribuce hodnoty, která může záviset pouze na těch podmínkách, které jsou předem stanovené. V nejjednodušší variantě to vypadá jako kontrakt se striktně danými podmínkami, který je podepsán určitými stranami.

Smart kontrakty mají za cíl minimalizovat důvěru třetím stranám. Někdy se zcela vylučuje centrum rozhodování, od kterého vše závisí. Dále je pro takové kontrakty snazší provádět audit. To je důsledkem některých rysů návrhu takového systému, ale většinou chápeme smart kontrakt jako decentralizované prostředí s funkcemi, které umožňují každému analyzovat databázi a provést úplný audit plnění kontraktů. Tím se zaručuje ochrana proti retroaktivním změnám dat, které by vedly ke změnám v plnění samotného kontraktu. Digitalizace většiny procesů při vytváření a spuštění smart kontraktu často zjednodušuje technologii a náklady na jejich realizaci.

Jednoduchý příklad — Escrow služba

Pojďme si prohlédnout velmi jednoduchý příklad. Pomůže nám přiblížit se k pochopení funkcionality smart kontraktů a lépe se orientovat v situacích, kdy je vhodné je použít.

Úvod do smart kontraktů

Lze ho také realizovat pomocí Bitcoinu, i když se dnes Bitcoin těžko nazývá plnohodnotnou platformou pro smart kontrakty. Takže máme nějakého kupujícího a internetový obchod. Kupující chce koupit monitor v tomto obchodě. V nejjednodušším případě kupující uskuteční a odešle platbu, zatímco internetový obchod ji přijme, potvrdí, a poté zašle zboží. Nicméně v této situaci je potřeba vysoké důvěry — kupující musí důvěřovat internetovému obchodu na celou částku monitoru. Protože internetový obchod může mít nízkou reputaci v očích kupujícího, existuje riziko, že po přijetí platby obchod odmítne poskytovat služby a nepošle zboží kupujícímu. Proto se kupující ptá (a tedy se na tuto otázku ptá i internetový obchod), co lze v takovém případě aplikovat, aby se minimalizovala taková rizika a udělala podobné transakce spolehlivějšími.

V případě Bitcoinu lze poskytnout možnost, aby si kupující a prodávající nezávisle na sobě vybrali prostředníka. Existuje mnoho lidí, kteří se zabývají řešením sporných otázek. A naši účastníci si mohou vybrat z obecného seznamu prostředníků toho, kterému budou důvěřovat. Společně vytvoří multisignature adresu 2 z 3, kde jsou tři klíče a potřebné jsou dva podpisy libovolnými dvěma klíči, aby mohli utratit mince z této adresy. Jeden klíč bude patřit kupujícímu, druhý — internetovému obchodu a třetí — prostředníkovi. A na tuto multisignature adresu kupující odešle částku potřebnou k úhradě monitoru. Nyní, když prodávající vidí, že peníze jsou na nějakou dobu zablokovány na multisignature adrese, která závisí na něm, může bezpečně poslat monitor poštou.

Poté kupující obdrží balík, prohlédne si zboží a rozhodne se pro konečný nákup. Může souhlasit se službami a podepsat transakci svým klíčem, kde převede mince z multisignature adresy na prodejce, nebo může být s něčím nespokojen. V druhém případě kontaktuje zprostředkovatele, aby vytvořil alternativní transakci, která jinak rozdělí tyto mince.

Představme si, že monitor dorazil mírně poškrábaný a v balení chyběl kabel pro připojení k počítači, přestože na webových stránkách internetového obchodu stálo, že kabel by měl být součástí dodávky. Pak kupující zajišťuje důkazy potřebné k prokázání zprostředkovateli, že byl v této situaci podveden: dělá screenshots webu, fotografii účtenky z pošty, fotografii škrábanců na monitoru a ukazuje, že pečeť byla porušena a kabel byl vytažen. Internetový obchod na oplátku shromažďuje své důkazy a předává je zprostředkovateli.

Zprostředkovatel má zájem zároveň uspokojit rozhořčení kupujícího a zájmy internetového obchodu (což bude později jasné). Vytváří takovou transakci, ve které budou mince z multisignature adresy utraceny v určitém poměru mezi kupujícím, internetovým obchodem a zprostředkovatelem, protože si bere část jako odměnu za svou práci. Představme si, že 90 % z celkové částky půjde prodejci, 5 % zprostředkovateli a 5 % jako kompenzace kupujícímu. Tuto transakci zprostředkovatel podepisuje svým klíčem, ale ještě nemůže být použita, protože potřebuje dva podpisy, a zatím je pouze jeden. Takovou transakci posílá jak kupujícímu, tak prodejci. Pokud bude alespoň jeden z nich s tímto způsobem přerozdělení mincí spokojen, bude transakce dodatečně podepsána a rozšířena do sítě. Pro její validaci stačí, aby jeden z účastníků obchodu souhlasil s návrhem zprostředkovatele.

Je důležité nejprve vybrat zprostředkovatele, kterému budou oba účastníci důvěřovat. V takovém případě bude jednat nezávisle na zájmech jednoho nebo druhého a objektivně posoudí situaci. Pokud však zprostředkovatel nenabídne takovou možnost rozdělení mincí, která by uspokojila alespoň jednoho účastníka, mohou se společně dohodnout jak kupující, tak internetový obchod a převést mince na novou multisignature adresu, přičemž oba podepíší. Nová multisignature adresa bude vytvořena s jiným zprostředkovatelem, který může být v této záležitosti kompetentnější a nabídnout lepší možnost.

Příklad s kolejemi a ledničkou

Podívejme se na složitější příklad, který jasněji ilustruje možnosti chytré smlouvy.

Úvod do smart kontraktů

Představme si, že jsou tři kluci, kteří se nedávno nastěhovali do jedné místnosti na koleji. Všichni tři mají zájem koupit do své místnosti ledničku, kterou budou společně používat. Jeden z nich se nabídl, že shromáždí potřebnou částku na koupi ledničky a vyjedná s prodejcem. Nicméně se relativně nedávno seznámili a mezi nimi není dostatečná důvěra. Je zřejmé, že dva z nich riskují, když dávají peníze třetímu. Zároveň musí dosáhnout shody v výběru prodejce.

Mohou využít escrow službu, tedy vybrat zprostředkovatele, který dohlédne na provedení obchodu a vyřeší sporné otázky, pokud nějaké vzniknou. Pak se dohodnou, sestaví chytrou smlouvu a vymezí v ní určité podmínky.

Prvním požadavkem je, že do určitého času, například do jednoho týdne, musí na příslušný účet smart kontraktu dorazit tři platby z určitých adres na konkrétní částku. Pokud se tak nestane, smart kontrakt přestává fungovat a vrací mince všem účastníkům. Pokud je však podmínka splněna, nastaví se hodnoty identifikátorů prodávajícího a zprostředkovatele a také se ověří podmínka, že všichni účastníci souhlasí s výběrem prodávajícího a zprostředkovatele. Jakmile budou všechny podmínky splněny, prostředky budou převedeny na uvedené adresy. Tento přístup může účastníky ochránit před podvodem ze strany jakéhokoli účastníka a úplně eliminuje potřebu důvěry.

Na tomto příkladu vidíme samotný princip, že taková možnost krok za krokem nastavovat parametry pro splnění každé podmínky umožňuje vytvářet systémy jakékoli složitosti a hloubky vnoření. Kromě toho je možné nejprve v smart kontraktu definovat první podmínku a až po jejím splnění stanovit parametry pro další podmínku. Jinými slovy, formálně je podmínka definována, ale parametry pro ni mohou být stanovovány již během jejího plnění.

Klasifikace smart kontraktů

Pro klasifikaci lze definovat různé skupiny kritérií. Nicméně v současnosti jsou čtyři z nich relevantní vzhledem k vývoji technologií.

Smart kontrakty lze odlišovat podle prostředí provádění, které může být buď centralizované, nebo decentralizované. V případě decentralizace máme mnohem větší nezávislost a odolnost vůči poruchám při provádění smart kontraktů.

Lze je také odlišovat podle procesu nastavení a splnění podmínek: mohou být libovolně programovatelné, omezené nebo předem definované, tj. přísně typizované. Když na platformě smart kontraktů existují pouze čtyři konkrétní smart kontrakty, lze jejich parametry nastavovat libovolně. Odpovídajícím způsobem je nastavování mnohem jednodušší: vybereme kontrakt ze seznamu a předáme parametry.

Podle způsobu iniciace existují automatizované chytré kontrakty, což znamená, že se při splnění určitých podmínek samy vykonávají, a jsou také kontrakty, u nichž jsou podmínky stanoveny, ale platforma automaticky neprověřuje jejich splnění, je třeba je iniciovat zvlášť.

Kromě toho se chytré kontrakty liší úrovní soukromí. Mohou být buď zcela veřejné, částečně, nebo zcela důvěrné. To poslední znamená, že třetí strany nevidí podmínky chytrých kontraktů. Téma soukromí je však velmi obsáhlé a je lepší je projednat odděleně od aktuálního článku.

Níže se podrobněji zaměříme na první tři kritéria, abychom objasnili aktuální téma.

Chytré kontrakty podle prostředí provádění

Úvod do smart kontraktů

Podle prostředí provádění se rozlišují centralizované a decentralizované platformy chytrých kontraktů. V případě centralizovaných digitálních kontraktů je používán jeden servis, kde existuje pouze jeden validátor, a může existovat služba zálohování a obnovy, která je také centralizovaně řízena. Existuje jedna databáze, která uchovává všechny potřebné informace pro stanovení podmínek chytrého kontraktu a rozdělení hodnoty, která je evidována v této databázi služby. Taková centralizovaná služba má klienta, který určitými požadavky stanoví podmínky a využívá tyto kontrakty. Vzhledem k tomu, že platforma je centralizovaná, mohou být mechanismy autentizace méně spolehlivé než v kryptoměnách.

Jako příklad můžeme uvést poskytovatele mobilních služeb (různé mobilní operátory). Řekněme, že určitý operátor vede na svých serverech centralizovaným způsobem evidenci datového provozu, který může být přenášen v různých formátech, například: ve formě hlasových hovorů, přenosu SMS, datového provozu mobilního internetu a podle různých standardů a také eviduje finanční prostředky na účtech uživatelů. Tím pádem může mobilní poskytovatel sestavovat kontrakty pro evidenci poskytovaných služeb a jejich plateb s různými podmínkami. V takovém případě je snadné stanovit podmínky typu 'pošli SMS s takovým kódem na takové číslo a dostaneš takové podmínky rozdělení datového provozu'.

Můžeme uvést ještě jeden příklad: tradiční banky s rozšířenou funkcionalitou internetového bankovnictví a takové velmi jednoduché kontrakty, jako jsou pravidelné platby, automatická konverze příchozích plateb, automatické odvodnění procenta na určený účet atd.

Pokud mluvíme o smart kontraktech s decentralizovaným prováděním, máme skupinu validátorů. V ideálním případě se validátorem může stát vlastně někdo. Díky protokolu synchronizace databáze a dosažení konsensu máme určitou společnou databázi, která nyní bude uchovávat všechny transakce se striktně popsanými kontrakty, nikoli nějaké podmínkové požadavky, jejichž formáty se často mění a chybí otevřená specifikace. Zde transakce budou obsahovat pokyny k provádění kontraktu podle striktní specifikace. Tato specifikace je otevřená, a tudíž sami uživatelé platformy mohou provádět audit a validovat smart kontrakty. Zde vidíme, že decentralizované platformy předčí centralizované z hlediska nezávislosti a odolnosti vůči poruchám, avšak jejich návrh a údržba jsou mnohem složitější.

Smart kontrakty podle způsobu zadání a provádění podmínek

Nyní se podíváme podrobněji, jak se smart kontrakty mohou lišit podle způsobu zadání a provádění podmínek. Zde se zaměříme na smart kontrakty, které jsou programovány libovolně a jsou kompletní podle Turinga. Kompletní podle Turinga smart kontrakt umožňuje zadávat prakticky jakékoli algoritmy jako podmínky plnění kontraktu: zadávat cykly, nějaké funkce výpočtu pravděpodobnosti a podobně — až po své vlastní algoritmy elektronického podpisu. V tomto případě se myslí skutečně libovolné napsání logiky.

Dále se také rozlišují libovolné smart kontrakty, ale ne kompletní podle Turinga. Sem můžeme zahrnout Bitcoin a Litecoin se svým skriptem. Míní se tím, že v libovolném pořadí lze používat pouze určité operace, ale už nelze psát cykly a své vlastní algoritmy.

Kromě toho existují platformy pro chytré kontrakty, které implementují předem stanovené chytré kontrakty. Mezi ně patří Bitshares a Steemit. Bitshares nabízí celou řadu chytrých kontraktů pro obchodování, správu účtů, řízení platformy a jejích parametrů. Steemit je podobná platforma, ale zaměřuje se již nikoli na vydávání tokenů a obchodování, jako Bitshares, ale na blogování, tedy uchovává a zpracovává obsah decentralizovaným způsobem.

Mezi libovolné úplné Turingovy kontrakty patří platforma Ethereum a RootStock, která je ještě ve fázi vývoje. Proto se zde podrobněji zaměříme na platformu chytrých kontraktů Ethereum.

Chytré kontrakty podle způsobu iniciace

Podle způsobu iniciace lze chytré kontrakty rozdělit minimálně do dvou skupin: automatizované a ruční (neautomatizované). Pro automatizované kontrakty je charakteristické, že při všech známých parametrech a splněných podmínkách se chytrý kontrakt plně vykonává automaticky, tedy nevyžaduje odesílání žádných dodatečných transakcí a platbu dodatečního poplatku při každém dalším vykonání. Sama platforma má všechna data potřebná k tomu, aby určila, jakým způsobem bude chytrý kontrakt dokončen. Logika není libovolná, ale předem daná, a vše je předvídatelné. To znamená, že je možné předem posoudit složitost vykonání chytrého kontraktu, použít nějaký konstantní poplatek pro něj a všechny procesy jeho vykonání probíhají efektivněji.

Pro chytré kontrakty, které se programují libovolným způsobem, není vykonání automatizováno. Pro iniciaci takového chytrého kontraktu je fakticky na každém kroku potřeba vytvářet novou transakci, která spustí další fázi vykonání nebo další metodu chytrého kontraktu, zaplatit příslušný poplatek a čekat na potvrzení transakce. Vykonání může skončit úspěšně nebo ne, protože kód chytrého kontraktu je libovolný a mohou se objevit nepředvídatelné situace, jako nekonečná smyčka, nedostatek některých parametrů a argumentů, nezpracované výjimky atd.

Účty v Ethereum

Typy účtů Ethereum

Podíváme se na to, jaké typy účtů mohou existovat na platformě Ethereum. Existují pouze dva typy účtů a žádné další varianty. První typ se nazývá uživatelský účet, druhý — účet kontraktu. Pojďme si vysvětlit, čím se liší.

Uživatelský účet je řízen pouze osobním klíčem elektronického podpisu. Vlastník účtu generuje svůj pár klíčů pro elektronický podpis pomocí algoritmu ECDSA (Algoritmus digitálního podpisu na eliptické křivce). Stavy tohoto účtu mohou měnit pouze transakce podepsané tímto klíčem.

Pro účet smart kontraktu je navržena samostatná logika. Může být řízen pouze pomocí předem určeného programového kódu, který zcela určuje chování smart kontraktu: jak naloží se svými mincemi za určitých okolností, iniciativou kterého uživatele a za jakých dalších podmínek budou tyto mince distribuovány. Pokud některé aspekty nejsou v programovém kódu předem zohledněny vývojáři, mohou vzniknout problémy. Například smart kontrakt může dosáhnout určitého stavu, ve kterém nepřijme iniciaci dalšího provádění od žádného uživatele. V takovém případě budou mince fakticky zamrazené, protože smart kontrakt neumožňuje opustit tento stav.

Jak se vytvářejí účty v Ethereum

V případě uživatelského účtu si vlastník sám generuje pár klíčů podle ECDSA. Je důležité poznamenat, že Ethereum používá pro elektronický podpis stejný algoritmus a stejnou eliptickou křivku jako Bitcoin, ale adresa se vypočítává poněkud jiným způsobem. Zde již není použito výsledku dvojitého hashování, jako v Bitcoinu, ale je předpokládáno jednorázové hashování funkcí Keccak o délce 256 bitů. Z získané hodnoty se odřezávají nižší bity, konkrétně 160 nejnižších bitů výstupní hodnoty hash funkce. Nakonec získáváme adresu v Ethereum. Fakticky zabírá 20 bytů.

Všimněte si, že identifikátor účtu v Ethereum je zakódován v hex bez použití kontrolního součtu, na rozdíl od Bitcoinu a mnoha jiných systémů, kde je adresa zakódována v soustavě o základu 58 se začleněním kontrolního součtu. To znamená, že s identifikátory účtů v Ethereum je třeba pracovat opatrně: i jediná chyba v identifikátoru garantovaně povede ke ztrátě mincí.

Existuje důležitá zvláštnost a ta spočívá v tom, že účet uživatele na úrovni společné databáze je vytvořen v okamžiku, kdy přijme první příchozí platbu.

Pokud jde o vytvoření účtu smart kontraktu, uplatňuje se zcela jiný přístup. Nejprve někdo z uživatelů napíše zdrojový kód smart kontraktu, po čemž je kód zpracován speciálním kompilátorem pro platformu Ethereum, což přináší bajtkód pro vlastní virtuální stroj Ethereum. Získaný bajtkód je vložen do speciálního pole transakce. Ta je podepsána jménem iniciátora účtu. Následně je tato transakce distribuována po síti a umísťuje kód smart kontraktu. Poplatek za provedení transakce a tedy za vykonání kontraktu je stržen z bilance iniciátorského účtu.

Každý smart kontrakt obsahuje svůj konstruktor (tohoto kontraktu). Může být prázdný nebo může mít obsah. Poté, co je konstruktor vykonán, je vytvořen identifikátor účtu smart kontraktu, pomocí něhož je možné posílat mince, vyvolávat určité metody smart kontraktu atd.

Struktura transakce Ethereum

Aby to bylo jasnější, podíváme se na strukturu transakce Ethereum a příklad kódu smart kontraktu.

Úvod do smart kontraktů

Transakce Ethereum se skládá z několika polí. První z nich nonce — to je určitý pořadový číslo transakce vzhledem k samotnému účtu, který ji šíří a je jejím autorem. Je to zapotřebí k tomu, aby se odlišily dvojníci transakcí, tj. vyloučit případ, kdy je jedna a tatáž transakce přijata dvakrát. Díky použití identifikátoru má každá transakce unikátní hash hodnotu.

Následuje pole, jako je gas priceZde se uvádí cena, za kterou se základní měna Ethereum převádí na gas, který se používá k úhradě provádění smart kontraktů a přidělování prostředků virtuálního stroje. Co to znamená?

V Bitcoinu se poplatky platí přímo základní měnou — samotným bitcoinem. To je možné díky jednoduchému mechanismu výpočtu: platíme přísně objem dat, který se nachází v transakci. V Ethereum je situace složitější, protože se těžko vychází z objemu dat transakce. Transakce může také obsahovat programový kód, který bude spuštěn na virtuálním stroji, a každá operace virtuálního stroje může mít různou složitost. Existují také operace, které vyčleňují paměť pro proměnné. Ty budou mít svou vlastní složitost, od které se odvíjí platba za každou operaci.

Náklady na každou operaci v ekvivalentu gas budou konstantní. Ten je zaveden speciálně proto, aby se určila konstantní cena každé operace. V závislosti na zátěži sítě se změní gas price, tedy koeficient, podle kterého se základní měna převede na tuto pomocnou jednotku pro úhradu poplatku.

Existuje ještě jedna zvláštnost transakce v Ethereum: bajtový kód, který obsahuje pro provádění na virtuálním stroji, bude prováděn, dokud nedosáhne nějakého výsledku (úspěch-neúspěch) nebo dokud nevyčerpá určité množství mincí vyčleněných na úhradu poplatku. Právě aby se předešlo situaci, kdy z účtu odesílatele v případě nějaké chyby utratí všechny mince na poplatek (například pokud se spustí nějaká nekonečná smyčka na virtuálním stroji), existuje následující pole — start gas (často nazýváno gas limit) — určuje maximální objem mincí, které je odesílatel ochoten utratit na provedení určité transakce.

Další pole se nazývá destination address. Zde se zapisuje adresa příjemce mincí nebo adresa konkrétního smart kontraktu, jehož metody budou volány. Následuje pole value, do kterého se zapisuje částka mincí, která se posílá na destination address.

Dále se nachází zajímavé pole s názvem data, kam spadá celá struktura. Není to samostatné pole, ale celá struktura, ve které je určen kód pro virtuální stroj. Zde lze umístit libovolná data — pro to existují zvláštní pravidla.

A poslední pole se nazývá podpis. Obsahuje jak elektronický podpis autora této transakce, tak veřejný klíč, kterým bude tento podpis ověřen. Z veřejného klíče lze odvodit identifikátor účtu odesílatele této transakce, tedy jedinečně identifikovat účet odesílatele v samotném systému. V rámci struktury transakce jsme si objasnili hlavní údaje.

Příklad kódu smart kontraktu na Solidity

Podívejme se nyní podrobněji na nejjednodušší smart kontrakt na příkladu.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Výše je uveden zjednodušený zdrojový kód, který může uchovávat mince uživatelů a vracet je na požádání.

Takže existuje smart kontrakt Bank, který vykonává následující funkce: shromažďuje na svém zůstatku mince, to znamená, že při potvrzení transakce a umístění takového smart kontraktu se vytvoří nový účet, který může obsahovat na svém zůstatku mince; pamatuje uživatele a rozdělení mincí mezi nimi; má několik metod pro správu zůstatků, to znamená, že je možné provádět vklady, výběry a kontrolovat zůstatek uživatele.

Podívejme se na každou řádku zdrojového kódu. V tomto kontraktu jsou konstantní pole. Jedno z nich, s typem address, se nazývá owner. Zde kontrakt pamatuje adresu uživatele, který tento smart kontrakt vytvořil. Dále je zde dynamická struktura, která si uchovává odpovídající vazby mezi adresami uživatelů a jejich zůstatky.

Po tom následuje metoda Bank — má stejné jméno jako kontrakt. Je to tedy jeho konstruktor. Zde se proměnné owner přiřazuje adresa toho, kdo tento smart kontrakt umístil do sítě. To je jediné, co se v tomto konstruktoru děje. To znamená, že msg v tomto případě — to jsou právě ta data, která byla předána virtuálnímu stroji spolu s transakcí, obsahující veškerý kód tohoto kontraktu. Tudíž, msg.sender — to je autor této transakce, která umisťuje tento kód. Ten bude vlastníkem smart kontraktu.

Metoda deposit umožňuje převést transakcí určité množství mincí na účet kontraktu. V tomto případě smart kontrakt, když přijme tyto mince, ponechá si je na svém zůstatku, ale do struktury balances zapíše, kdo byl odesílatelem těchto mincí, aby věděl, komu patří.

Další metoda se nazývá withdraw a přijímá jeden parametr — částku mincí, kterou chce někdo vybrat z této banky. Provádí se zde kontrola, zda má uživatel volající tuto metodu dostatek mincí na svém zůstatku, aby je mohl odeslat. Pokud ano, smart kontrakt vrátí této osobě požadované množství mincí.

Následuje metoda pro kontrolu aktuálního zůstatku uživatele. Ten, kdo tuto metodu volá, se použije k získání tohoto zůstatku ve smart kontraktu. Je třeba poznamenat, že modifikátor této metody je view. To znamená, že sama metoda nijak nemění proměnné své třídy a ve skutečnosti je pouze metodou pro čtení. Pro volání této metody se nevytváří samostatná transakce, neplatí se žádný poplatek a veškeré výpočty se provádějí локálně, po čemž uživatel dostane výsledek.

Metoda kill je určena k destrukci stavu smart kontraktu. Je zde také další kontrola, zda je volající této metody vlastníkem kontraktu. Pokud ano, kontrakt se destruuje sám a funkce destrukce přijímá jeden parametr — identifikátor účtu, na který kontrakt odešle všechny mince zbývající na jeho zůstatku. V tomto případě zbývající mince automaticky odejdou na adresu vlastníka kontraktu.

Jak funguje plný uzel sítě Ethereum?

Podívejme se schematicky, jak se provádějí takové smart kontrakty na platformě Ethereum a jak funguje plný uzel sítě.

Úvod do smart kontraktů

Plný uzel sítě Ethereum musí mít alespoň čtyři moduly.
Prvním, jako u jakéhokoli decentralizovaného protokolu, je P2P networking module — modul pro síťové připojení a práci s jinými uzly, kde dochází k výměně bloků, transakcí a informací o jiných uzlech. To je tradiční komponenta pro všechny decentralizované kryptoměny.

Dále máme modul pro uchovávání dat blockchainu, zpracování, výběr prioritní větve, přidávání bloků, odpojování bloků, ověřování těchto bloků atd.

Třetí modul se nazývá EVM (Ethereum virtuální stroj) — to je virtuální stroj, který přijímá bajtkód z transakce Ethereum. Tento modul přijímá aktuální stav konkrétního účtu a provádí změny jeho stavu na základě přijatého bajtkódu. Verze virtuálního stroje na každém uzlu sítě musí být stejná. Výpočty na každém uzlu Ethereum probíhají naprosto identicky, ale ve asynchronním pořadí: někdo dříve ověří a přijme tuto transakci, tedy provede veškerý kód, který obsahuje, a někdo později. Při vytváření transakce se pak šíří v síti, uzly ji přijímají a během verifikace se přesně tak, jak se ve Bitcoin Script vykonává, zde vykonává bajtkód virtuálního stroje.

Transakce je považována za ověřenou, pokud byl proveden veškerý kód, který obsahuje, bylo vygenerováno nové aktuální pro určitou účet a uchováno, dokud nebude jasné, zda byla tato transakce uplatněna nebo ne. Pokud byla transakce aplikována, pak je tento stav považován nejen za provedený, ale už i aktuální. Existuje databáze, která uchovává stav každého účtu pro každý uzel sítě. Vzhledem k tomu, že všechny výpočty probíhají shodně a stav blockchainu je shodný, bude i databáze, která obsahuje stavy všech účtů, také stejná pro každý uzel.

Mýty a omezení smart kontraktů

Co se týče omezení, která existují pro platformy smart kontraktů podobné Ethereum, lze uvést následující:

  • vykonávání kódu;
  • alokace paměti;
  • data blockchainu;
  • posílat platby;
  • vytvořit novou smlouvu;
  • volat jiné smlouvy.

Pojďme se podívat na omezení, která jsou na virtuální stroj uvalena, a tím pádem rozptýlit některé mýty o smart kontraktech. Na virtuálním stroji, který nemusí být pouze v Ethereum, ale i na podobných platformách, lze provádět skutečně libovolné logické operace, tedy napsat kód a ten se tam spustí, lze také dodatečně přidělovat paměť. Nicméně poplatek se platí zvlášť za každý úkon a za každou dodatečně přidělenou jednotku paměti.

Dále může virtuální stroj číst data z blockchainové databáze, aby tato data použil jako spouštěč pro provedení různých logik smart kontraktů. Virtuální stroj může vytvářet a posílat transakce, může vytvářet nové kontrakty a vyvolávat metody jiných smart kontraktů, které již byly publikovány v síti: existují, jsou dostupné atd.

Nejrozšířenější mýtus spočívá v tom, že smart kontrakty Ethereum mohou používat informace z jakýchkoliv internetových zdrojů ve svých podmínkách. Pravda je však taková, že virtuální stroj nemůže poslat síťový dotaz nějakému externímu informačnímu zdroji na internetu, tedy nelze napsat takový smart kontrakt, který by distribuoval hodnotu mezi uživateli v závislosti na tom, jaké je venku počasí, kdo vyhrál v nějakém šampionátu nebo na základě nějaké další události, která se stala ve vnějším světě, protože informace o těchto událostech prostě nejsou v databázi samotné platformy. To znamená, že v blockchainu o tom nic není. Pokud se tam nevyskytne, virtuální stroj nemůže tato data použít jako spouštěče.

Nevýhody Ethereum

Pojďme si vyjmenovat hlavní nevýhody. První nevýhodou je, že existují určité složitosti při navrhování, vývoji a testování smart kontraktů v Ethereum (v Ethereum se pro psaní smart kontraktů používá jazyk Solidity). Praxe ukazuje, že velmi vysoké procento všech chyb spadá na lidský faktor. To platí také pro již napsané smart kontrakty Ethereum, které mají střední nebo vyšší složitost. Zatímco u jednoduchých smart kontraktů je pravděpodobnost chyby nízká, u složitých smart kontraktů se často objevují chyby, které vedou k krádeži prostředků, jejich zmrazení, k nečekanému zničení smart kontraktů a podobně. Je již známo mnoho takových případů.

Druhá nevýhoda spočívá v tom, že samotný virtuální stroj není dokonalý, neboť je také napsán lidmi. Může vykonávat libovolné příkazy a v tom spočívá zranitelnost: určité příkazy lze nakonfigurovat tak, aby vedly k nečekaným následkům. Je to velmi složitá oblast, ale existuje již několik studií, které ukazují, že tyto zranitelnosti existují v aktuální verzi sítě Ethereum a mohou vést k selhání mnoha smart kontraktů.

Ještě jedna velká složitost, kterou lze považovat za nevýhodu. Spočívá v tom, že lze prakticky nebo technicky dospět k tomu, že pokud se zkompiluje bajtový kód kontraktu, který bude vykonáván na virtuálním stroji, lze určit specifický pořádek operací. Při souhrnném vykonání tyto operace výrazně zatíží virtuální stroj a zpomalí ho nepoměrně vzhledem k provizím, které byly zaplaceny za vykonání těchto operací.

V minulosti existovalo období vývoje Etherea, kdy mnoho lidí, kteří podrobně rozuměli práci virtuálního stroje, objevovalo různé zranitelnosti. V podstatě transakce platily velmi malý poplatek, ale značně zpomalovaly provoz celé sítě. Tyto problémy se obtížně řeší, protože je nejprve nutné je determinovat, za druhé upravit cenu za provádění těchto operací a za třetí provést hard fork, což znamená aktualizaci všech uzlů sítě na novou verzi softwaru a poté současnou aktivaci těchto změn.

Pokud jde o Ethereum, bylo provedeno mnoho výzkumů a získáno velké množství praktických zkušeností: jak pozitivních, tak negativních, přesto však zůstávají složitosti a zranitelnosti, se kterými bude třeba se ještě nějak vypořádat.

Takže tematická část článku je u konce, pojďme se přejít k častým otázkám.

Často kladené otázky

— Pokud všechny strany platného smart kontraktu chtějí změnit podmínky, mohou zrušit tento smart kontrakt pomocí vícestupňového podpisu a poté vytvořit nový smart kontrakt s aktualizovanými podmínkami jeho plnění?

Odpověď bude dvojaká. Proč? Protože na jedné straně je smart kontrakt stanoven jednou a nezahrnuje žádné změny, na druhé straně může mít předem definovanou logiku, která umožňuje úplnou nebo částečnou změnu některých podmínek. To znamená, že pokud chcete něco změnit ve svém smart kontraktu, musíte předem stanovit podmínky, za kterých můžete tyto podmínky aktualizovat. Příslušným způsobem lze tedy zajistit aktualizaci kontraktu. Ale i zde se lze dostat do potíží: udělat nějakou chybu a dostat se ke zranitelnosti. Proto je nutné takové věci velmi podrobně a pečlivě navrhovat a testovat.

— A co když se mediátor domluví s jednou ze zúčastněných stran: escrow nebo smart kontraktem? Je mediátor v smart kontraktu povinný?

Zprostředkovatel není nezbytný ve smart kontraktu. Může chybět. Pokud se však v případě escrow zprostředkovatel domluví s jednou ze stran, pak tento systém ztrácí veškerou svoji hodnotu. Proto jsou zprostředkovatelé vybírání tak, aby jim důvěřovaly všechny strany zapojené do procesu. Následně jednoduše nebudete převádět mince na multisignature adresu s tím zprostředkovatelem, kterému nedůvěřujete.

— Lze jednou transakcí Ethereum převést mnoho různých tokenů ze své adresy na různé cílové adresy, například burzovní adresy, kde se tyto tokeny obchodují?

To je dobrá otázka a týká se modelu transakcí Ethereum a jeho rozdílu od modelu Bitcoin. A ten rozdíl je zásadní. Pokud v modelu transakce Ethereum jednoduše převádíte mince, tak se převádějí pouze z jedné adresy na druhou, bez vracení, jednoduše konkrétní suma, kterou uvedete. Jinými slovy, to není model neproinvestovaných výstupů (UTXO), ale model účtů a odpovídajících zůstatků. Jednou transakcí můžete teoreticky odeslat několik různých tokenů, pokud vytvoříte chytrý smart kontrakt, ale stejně budete muset provést mnoho transakcí, vytvořit kontrakt, poté mu předat tokeny a mince a poté vyvolat odpovídající metodu. To vyžaduje úsilí a čas, a proto to v praxi takto nefunguje a všechny platby v Ethereum se provádějí jednotlivými transakcemi.

— Jedním z mýtů o platformě Ethereum je, že není možné popsat takové podmínky, které by závisely na datech z externího internetového zdroje, co tedy dělat?

Řešení spočívá v tom, že samotný smart kontrakt může zahrnovat jednoho nebo několik takzvaných důvěryhodných oráclů, kteří shromažďují data o stavu věcí ve vnějším světě a předávají je do smart kontraktů prostřednictvím speciálních metod. Samotný kontrakt považuje za pravdivá ta data, která obdržel od důvěryhodných stran. Pro větší spolehlivost se jednoduše vybírá větší skupina oráclů a minimalizuje riziko jejich spiknutí. Samotný kontrakt může nezahrnovat data od oráclů, které jsou v rozporu s většinou.

Tématu se věnuje jedna z přednášek online kurzu o Blockchain — “Úvod do smart kontraktů”.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster