Význam vybraného blockchainového účetního modelu je často podceňován, a to i přes jeho podstatný vliv na uživatelskou zkušenost a potenciál pro škálovatelnost. V tomto článku se ponoříme do složitosti modelu UTxO, který používají Cardano a Bitcoin, a modelu založeného na účtu, který využívá Ethereum a řada dalších blockchainů kompatibilních s EVM. Článek obsahuje mnoho vysvětlujících obrázků. Po přečtení pochopíte, proč je ověřování Ethereum transakcí nedeterministické a často selhávají, zatímco Cardano ověřuje transakce deterministicky. Vysvětlíme si také jaký je rozdíl mezi globálním stavem Ethereum a Cardano.
Účetnictví V Blockchainu
Účetnictví slouží jako základ moderního finančního prostředí. Každá finanční instituce je povinna vést evidenci jednotlivých zůstatků na účtech a peněžních toků. Tento proces musí být naprosto spolehlivý, bezpečný, auditovatelný a hlavně důvěryhodný.
Každá účetní kniha by měla být schopna přesně označovat vlastnictví aktiv v daném okamžiku. Jinými slovy, uživatel X vlastnil určité množství aktiv Y v čase Z. Vzhledem k tomu, že finanční interakce mezi jednotlivci jsou neustálým jevem, jsou položky v hlavní knize neustále v pohybu. Systém, ať už je centralizovaný nebo decentralizovaný, musí každou transakci přesně ověřit a řádně zaznamenat do účetní knihy.
Historicky byly papírové účetní knihy standardem. S příchodem počítačů však účetnictví prošlo digitální transformací. Nástup technologie blockchain umožnil možnost distribuovaného účetnictví.
Blockchainové sítě lze vnímat jako finanční systém. Lze na ně nahlížet jako na distribuovanou účetní knihu, tedy účetní systém, který není pod kontrolou žádného ústředního orgánu. Uživatelé se mohou zapojit do vzájemných finančních transakcí způsobem peer-to-peer. Zprostředkovatel, respektive subjekt ověřující transakci, však není centrální orgán, ale distribuovaná síť tvořená dobrovolníky. Za přidávání nových finančních položek do účetní knihy je zodpovědná skupina dobrovolníků.
Satoshi Nakamoto implementoval model UTxO v Bitcoinu. Vitalik Buterin se pro Ethereum rozhodl pro model založený na účtech. Tým IOG se rozhodl pro Cardano použít rozšířený model UTxO. Každá z těchto variant má své klady a zápory, kterým se budeme věnovat v následné analýze.
Stav Jako Nezbytný Předpoklad Pro Ověření Transakcí
Blockchain je technicky stavový stroj. Pamatuje si předchozí události, což se nazývá systémový stav nebo globální stav. Tyto události, většinou reprezentované transakcemi, jsou interakcemi mezi uživateli. Stav lze změnit za předem definovaných podmínek. Každý protokol má implementovanou sadu pravidel a logiky, která umožňuje tranzici ze stavu S-0 do stavu S-1. Blockchain v pravidelných intervalech připojuje nové bloky, ve kterých dochází k přechodu stavu.
Blok slouží jako základní jednotka přechodu ze stávajícího stavu do nového. Skládá se z transakcí. Producent bloku má za úkol vytvořit nový blok podle pravidel protokolu, což znamená, že musí být splněny všechny podmínky pro přijetí bloku. Aby byl blok považován za platný, musí obsahovat pouze platné transakce.
Validace transakce – což je převod hodnoty mezi dvěma nebo více stranami – vyžaduje určitý kontext nebo stav pro ověření. Systém musí mimo jiné ověřit, jako jsou platné podpisy, že na účtu odesílatele jsou dostatečné finanční prostředky. Musí také zabránit uživatelům utrácet stejné prostředky více než jednou, čímž se vyřeší nechvalně známý problém dvojího utrácení. Není možné ověřit transakci izolovaně. Validátor ověří transakci na základě aktuálního stavu účetní knihy.
Jak uzel pověřený vytvořením nového bloku, tak uzel, který ověřuje nově vytvořený blok, vyžadují pro ověření znalost kontextu, tedy aktuálního stavu účetní knihy. Kontext pro ověření je nejnovější platný blok v blockchainu.
Uzel produkující bloky, který vytváří nový blok v určitém kole, používá poslední blok představující aktuální stav jako vstup pro ověření. Následně vezme všechny transakce, které se mají vložit do nového bloku a ověří je. Poté k bloku připojí další požadovaná data a rozšíří je do sítě.
Na obrázku se uzel pokouší postavit nový blok, který by umožnil přechod ze stavu S+3 do dalšího stavu S+4.
Jak uzel, který vytváří nový blok, tak všechny ověřující uzly musí sdílet stejný kontext ověření, aby bylo možné přejít do nového stavu. Pokud by různé uzly používaly různé kontexty, mohl by nově navrhovaný blok přijmout pouze část uzlů v síti. Platný blok by prošel ověřením pouze na těch uzlech, které používaly stejný kontext jako producent bloku.
Globální stav se neustále mění, s každým nově přidaným blokem nebo dokonce s každou další ověřenou transakcí. Mezi odesláním transakce a jejím zpracováním sítí (tj. zařazením transakce do bloku) může uplynout značná časová prodleva, během níž by se mohl globální stav změnit. Kontext, který měl uživatel v době odeslání transakce, se může nebo nemusí změnit, když uzel producenta bloku začlení transakci do nového kandidáta na blok.
Jak je znázorněno na obrázku, uživatel odeslal transakci TX 10 krátce po přidání bloku N+2. Následně byl přidán blok N+3, což vedlo ke změně globálního stavu. Uzel producenta bloku je v procesu výstavby bloku N+4 a hodlá do něj začlenit transakci TX 10. Přidání bloku N+3 změnilo globální stav, což by mohlo potenciálně také upravit kontext přímo spojený s validací transakce TX 10.
Uživatel měl kontext, který byl platný po přidání bloku N+2. Producent bloku má však kontext, který je platný po přidání bloku N+3. Takže kontext je jiný.
Klíčový rozdíl mezi UTxO a modelem založeným na účtu je zakořeněn v kontextu požadovaném validátorem pro validaci transakcí a ve způsobu, kterým jsou transakce v rámci bloku validovány.
Základy UTxO
UTxO, zkratka pro Unspent Transaction Output, odkazuje na výstup předchozí transakce, který lze použít v budoucí transakci.
Model UTxO nezná pojmy jako účet a zůstatek. UTxO fungují spíše jako bankovky, schopné pojmout jakoukoli nominální hodnotu. Například UTxO může být 6,9 ADA, 47 ADA nebo 459,7 ADA.
Peněženky Cardano pomáhají uživatelům spravovat UTxO, jako by to byly zůstatky na účtech. Tři výše uvedené UTxO by se v Alicině peněžence objevily jako 513.6 ADA.
Takže, co se stane, když si Alice přeje poslat Bobovi 50 ADA?
Alice zahájí transakci v peněžence Cardano. Peněženka musí do transakce začlenit sadu UTxO, která bude adekvátní k pokrytí celkem 50 ADA plus poplatek 0,17 ADA.
Peněženka mohla pro transakci používat jeden vstupní UTxO s hodnotou 459,7 ADA nebo dva vstupní UTxO s hodnotami 6,9 ADA a 47 ADA. Peněženka se rozhodne pro druhou možnost a jako vstup pro transakci použije celkem 53,9 ADA.
Obvykle se jako výstup transakce vytvoří dva UTxO: 1) UTxO odeslané příjemci, 2) UTxO vrácené odesílateli.
Všimněte si, že transakční vstup je větší množství ADA, než Alice zamýšlí poslat Bobovi (včetně poplatku). Je tomu tak u většiny transakcí a je to v souladu s fungováním modelu UTxO.
Prostřednictvím transakce Alice utratí 50,17 ADA a prostřednictvím nově vytvořeného UTxO se jí na účet vrátí 3,73 ADA. Jen zřídka se stává, že je k dispozici UTxO s přesně takovou hodnotou, jakou chce odesílatel utratit.
Transakce přinese 2 výstupní UTxO: 50 ADA pro Boba a 3,73 ADA pro Alici.
Na obrázku níže můžete sledovat transakci, jak je popsána. Oba vstupní UTxO budou zcela vyčerpány a budou z nich generovány nové výstupní UTxOs. Hodnota výstupních UTxO bude snížena o transakční poplatek. Bob dostává přesně 50 ADA. Po odeslání transakce bude mít Alice v peněžence 2 UTxOs.
Cardano UTxO Model
Nyní víte, jak UTxO funguje z pohledu uživatele. Co to ale znamená pro ověřování transakcí a globálního stavu?
UTxO jsou nezávislé a neměnné objekty a lze zajistit exkluzivní přístup. Jakmile je UTxO vytvořen jako výstup transakce, zůstane nezměněn, dokud nebude utracen v nové transakci. Když je utracena, je zcela spotřebována a jako výstup nové transakce je vytvořen nový UTxO.
Kontext, který validátor potřebuje pro validaci transakce, je množina všech existujících UTxO v době validace. Tato sada UTxO představuje aktivní stav hlavní knihy blockchainu (globální stav).
Když je transakce odeslána, odkazuje na jeden nebo více UTxO jako vstupy, které mají být utraceny. Úkolem validátora je zkontrolovat, že:
- Všechny vstupní UTxO jsou skutečně součástí aktuálního globálního stavu, tj. nejsou utraceny a existují v účetní knize.
- Celková hodnota vstupních UTxO je větší nebo rovna celkové hodnotě výstupních UTxO, což zajišťuje zachování hodnoty (jakýkoli rozdíl se stává transakčními poplatky).
- Transakce je správně podepsána vlastníky vstupních UTxO, což zajišťuje, že pouze právoplatní vlastníci mohou utratit UTxO.
Aktuální stav blockchainu může být reprezentován množinou všech nevyčerpaných UTxO a historii blockchainu lze vidět jako graf všech UTxO, jak utracených, tak neutracených. Tento graf poskytuje kompletní, auditovatelnou historii všech transakcí, které se kdy na blockchainu vyskytly.
Na obrázku níže můžete vidět, jak jsou UTxO spotřebovávány transakcemi. Výstupní UTxO (zelená) se stanou vstupními UTxO (červená). Všechny UTxO, které nebyly utraceny, představují aktuální globální stav nebo aktivní sadu UTxO (modrá). Všechny modré UTxO se mohou stát transakčním vstupem, tj. být utraceny. Zelené UTxO již byly utraceny, takže je nelze znovu utratit.
Pro validaci nových transakcí není nutné znát celou historii blockchainu, ale pouze aktivní sadu nevyčerpaných UTxO (modré UTxO). Získání aktivní sady UTxO však obvykle vyžaduje zpracování celé historie blockchainu.
Všimněte si, že aktivní sada UTxO zahrnuje také ty UTxO vytvořené v minulosti.
V každém stavu N na obrázku byl vyroben jeden blok. V novém stavu N+5 bude pro validaci transakce použit kontext obsahující UTxOs ze stavů N+2, N+3 a N+4. V novém bloku ve stavu N+5 bude transakce 14, která se bude snažit utratit UTxO z transakce 10, a transakce 15 pokusí se utratit UTxO z transakce 11.
Ve stavu N+5 se vytvoří nový blok. Tím se také vytvoří nové UTxO a ty budou vloženy do aktivní sady UTxO.
Každý UTxO může být zpracován nezávisle a paralelně, takže validace transakcí jsou na sobě nezávislé. Nyní se dostáváme k vysvětlení, proč jsou transakce v Cardano validovány deterministicky.
V modelu UTxO je ověření transakce založeno na jejích vstupech a výstupech, čímž odpadá potřeba sdíleného globálního stavu. To by se mohlo zdát poněkud v rozporu s předchozím textem, kde jsem uvedl, že aktivní sada UTxO tvoří globální stav.
Celá sada UTxO není nutná pro ověření transakce, ale pouze její malá podmnožina, konkrétně vstupní UTxO. Zbývající UTxO v sadě UTxO jsou irelevantní.
Platnost transakce závisí pouze na tom, zda jsou spotřebované UTxO platné a nevyčerpané a zda se agregovaná hodnota vstupů shoduje s agregovanou hodnotou výstupů.
Transakční vstupy jsou nezávislé neměnné entity, proto je validace deterministická. Je možné s vysokou mírou jistoty předpovědět výsledek validace, včetně výstupních UTxO.
Validovat transakci je možné v okamžiku jejího odeslání, protože je jisté, že vstupy a výstupy zůstanou nezměněny v okamžiku, kdy bude stejná transakce validována sítí, tedy když výrobce bloku transakci začlení do nového kandidáta na blok. Výsledek ověření bude pravděpodobně v obou případech stejný. Pokud tedy transakce projde místním ověřením, projde také ověřením sítě.
Obrázek znázorňuje validátor, který staví nový blok, N+4, obsahující transakce TX 9 a TX 10. Vstupy pro validaci jsou transakce, které si uzel vezme ze svého mem-poolu, a aktivní sada UTxO, kterou každý uzel spravuje.
Nové transakce TX 9 a TX 10 spotřebují staré nevyužité výstupní UTxO (znázorněné modrými rámečky) a vytvoří vstupní UTxO (reprezentované červenými rámečky). Pořadí transakcí v rámci bloku je nedůležité, protože transakce jsou autonomní a vzájemně se neovlivňují. Transakce TX 10, odeslaná krátce po vygenerování bloku N+2, může využít UTxO z transakce v tomto bloku. Vytvoření nového bloku N+4 vede k vytvoření nových UTxO ze vstupních UTxO. S přidáním bloku N+4 do blockchainu přechází síť do nového globálního stavu.
Jak je znázorněno na obrázku, k blockchainu byl připojen nový blok N+4, což vedlo ke změně globálního stavu. Z aktivní sady UTxO budou vyřazeny UTxO, které byly použity v transakcích obsažených v bloku N+4 (zelená). Do sady byly přidány nově vytvořené UTxO (fialové). Blok je šířen po síti, takže aktivní sada UTxO bude aktualizována na všech uzlech v síti, které přijímají nový blok.
Deterministická Validace Transakcí
Vraťme se k příkladu, kdy má Alice ve své peněžence 3 UTxO, každý v hodnotě 6,9 ADA, 47 ADA a 459,7 ADA.
Alice má v úmyslu poslat 5 ADA třem jednotlivcům - Bobovi, Carol a Daveovi, přičemž pokaždé zahájí novou transakci. Zatímco Alice mohla odeslat jednu transakci se třemi příjemci, v tomto příkladu jsme záměrně zvolili tři samostatné transakce, abychom ilustrovali koncept determinismu. Všechny transakce byly odeslány v rychlém sledu a lze je zpracovat v následujícím bloku.
Jak je znázorněno na obrázku, každá transakce využívá jeden UTxO z Aličiny peněženky (reprezentovaný červenými rámečky), čímž je zajištěno, že každá transakce má nezávislý vstup. Každá transakce přináší dva výstupní UTxOs, reprezentované modrými rámečky. Jeden UTxO v hodnotě 5 ADA je přidělen příjemci a druhý UTxO obsahující zbývající ADA je vrácen do peněženky Alice.
Výstupní UTxO jsou určeny v době odeslání transakce. Pro zjednodušení byly v tomto příkladu vynechány transakční poplatky.
Po úspěšné místní validaci jsou transakce šířeny po síti. Všechny transakce jsou zpracovány v dalším bloku. Na následujícím obrázku můžete pozorovat UTxO v peněženkách Alice a všech příjemců.
Vezměte na vědomí, že vstupní UTxO byly spotřebovány (znázorněno zelenými rámečky). Bylo vygenerováno šest nových UTxO. Tři UTxO jsou vráceny Alici. Každý ze tří příjemců obdržel jeden UTxO.
Všimněte si, že v každé transakci je zachována hodnota. Součet vstupních UTxO se rovná součtu všech výstupních UTxO. To platí pro všechny transakce.
Pořadí, ve kterém jsou transakce ověřovány, je nepodstatné. Výsledek validace by zůstal nezměněn, i kdyby se do dalšího bloku dostala pouze jedna transakce a zbývající dvě byly zahrnuty do následujících bloků (z jakéhokoli daného důvodu). Globální stav může mezi ověřením transakce pro Boba a transakcemi pro Carol a Dave projít jakýmikoli změnami (v několika blocích), aniž by to mělo vliv na validaci transakcí.
Validace transakcí je na sobě nezávislá díky nezávislosti vstupních UTxO na sobě. Proto je ověřování transakcí deterministické. Přestože se globální stav může mezi odesláním transakce a jejím zpracováním sítí změnit, nemá to vliv na výsledek. Výsledek (platný nebo neplatný) lze určit pouze na základě samotné transakce a jejích vstupních UTxO.
Globální stav Cardana je kompilací nezávislých a neměnných UTxO. Vzhledem k nezávislosti těchto UTxO je možné s nimi pracovat paralelně. To znamená, že více transakcí může být ověřeno současně, což může výrazně zvýšit propustnost a efektivitu sítě.
Na obrázku můžete vidět, jak každá transakce exkluzivně spotřebovává UTxO ze sady UTxO. Pokud jsou všechny peněženky a DApp dobře navržené, nemůže se stát, že dvě transakce spotřebují stejné UTxO. Spotřebované UTxO jsou odstraněny z aktivní sady a jsou vloženy nové UTxO. Obrázek ilustruje pouze to jak transakce referencují vstupní UTxOs.
Další výhodou je, že zásady platné pro standardní transakce se rozšiřují také na provádění validátorových skriptů. Je možné vytvořit transakci, která projde místním ověřením, včetně spuštění skriptu. Taková transakce s vysokou pravděpodobností projde také ověřením sítě, protože všechny ověřovací vstupy, včetně Datum a Redeemer, zůstanou konzistentní. Jinými slovy, ani provedení validátoru skriptu není závislé na vnějším globálním stavu, ale pouze na transakčních vstupech. Jediný rozdíl je v tom, že v případě transakce skriptu je vstupů více.
Determinismus je podmíněn exkluzivitou přístupu k UTxO.
U standardních transakcí je vlastníkem UTxO ten, kdo transakce iniciuje. Peněženka jako agent zajišťuje, že každý UTxO je zahrnut do transakce pouze jednou.
V našem příkladu Alice vlastnila všechny UTxO, které chtěla utratit. Nikdo jiný nebyl schopen vytvořit transakci s platným podpisem.
Pokud by peněženka umožňovala odeslání dvou transakcí se stejným UTxO jako vstup, pouze jedna z transakcí by měla šanci na úspěch. Dobře navržená peněženka však uživateli takovou chybu nedovolí.
V případě decentralizovaných aplikací (DApps) může být agentem jiná entita než peněženka (například dávkovač/batcher). Tato entita je odpovědná za poskytování výhradního přístupu k UTxO při vytváření transakcí. Tím je zajištěno, že každý UTxO je použit právě jednou, čímž se zachovává determinismus a bezpečnost systému.
Na obrázku níže můžete vidět fond likvidity s tokeny X a Y. Dávkovači, což jsou v tomto případě off-chain části DEX, se pokoušejí provést 2 swapy. Konkrétně dávkovač 1 a dávkovač 3. Dávkovači spolu musí komunikovat mimo řetězec, aby si zajistili výhradní přístup k UTxO ve fondu likvidity (na obrázku je komunikace mimo řetězec znázorněna modře).
Pokud by dávkovači nekomunikovali mimo řetězec, mohli by zkusit použít stejné UTxO jako transakční vstup. Tuto situaci můžete vidět na obrázku. Dva dávkovači, kteří by navzájem neznali své záměry, by mohli každý zadat transakci, jejíž vstup by byl stejný UTxO z poolu likvidity. Obě transakce by prošly místním ověřením, ale pouze jedna z těchto transakcí by měla šanci projít síťovým ověřením.
Transakce Cardano může selhat, pokud jeden agent nebo několik agentů nezávisle na sobě odešle platné transakce se stejným vstupním UTxO. Tato situace je způsobena špatně navrženou peněženkou nebo Dapp.
Na závěr můžeme konstatovat, že transakce Cardano lze považovat za bezstavové.
Model založený na účtu Ethereum
Model založený na účtu Ethereum lze snadno popsat, protože chování je podobné jako u běžného bankovního účtu. Každý účet v Ethereu má přidružený stav, který zahrnuje jeho aktuální zůstatek Ether (ETH). Tento zůstatek je přímo uložen ve stavu účtu a lze jej aktualizovat pomocí transakcí.
Na obrázku níže můžete vidět přechod mezi stavy. Všimněte si změn zůstatků na uživatelských účtech. Pro jednoduchost existuje pouze jeden zůstatek představující ETH.
Globální stav Etherea lze zobrazit jako databázi všech účtů a jejich aktuálních zůstatků různých aktiv v síti. Při každém přidání nového bloku se stav systému aktualizuje podle všech transakcí obsažených v tomto bloku.
Tento globální stav je uložen lokálně na každém uzlu v síti Ethereum.
Když je transakce vytvořena, specifikuje účet odesílatele, účet příjemce, množství etheru, které má být převedeno, a volitelně některá data a GAS. Pokud je příjemcem smluvní účet, transakce spustí provedení kódu smlouvy.
Na obrázku vidíte transakci, která změní globální stav N na stav N+1. Transakce změní zůstatky na účtech Alice a Boba.
Když je transakce zpracována, síť Ethereum zkontroluje, zda má účet odesílatele dostatečný zůstatek na pokrytí nákladů na převod a GAS. Pokud kontrola projde, síť odečte příslušnou částku ze zůstatku odesílatele a přičte ji k zůstatku příjemce (nebo k zůstatku smlouvy, je-li příjemcem smluvní účet).
Globální stav Etherea se aktualizuje s každou zpracovanou transakcí a tento aktualizovaný stav se ukládá do každého nového bloku přidaného do blockchainu Etherea.
Když je transakce zpracována, EVM vypočítá nový stav na základě aktuálního stavu a transakce. Tento nový stav se pak stane aktuálním stavem pro další transakci. Tímto způsobem se stav Etherea blockchainu neustále vyvíjí s každou transakcí.
Jak je znázorněno na obrázku, posledním přidaným blokem je N+3, takže globální stav je N+3. Síť se pokouší přejít do nového stavu, N+4, a tak je zkonstruován nový blok N+4. Je důležité poznamenat, že ověření transakce TX 1 v bloku N+4 (označeném zeleným rámečkem) závisí na globálním stavu. TX 1 je první transakce, kterou se uzel producenta bloku pokouší zahrnout do nového bloku N+4.
Globální stav představuje aktuální stav všech účtů a smart kontraktů.
Jakmile je transakce TX 1 začleněna do bloku N+4, může být validována následná transakce, která bude záviset jak na globálním stavu, tak na předchozí transakci.
Obrázek ukazuje, že validace transakce TX 2 závisí nejen na globálním stavu, který byl platný v bloku N+3, ale také na transakci TX 1.
Uzel producenta bloků Ethereum zpracovává transakce postupně. Každá další transakce přidaná do nově postaveného bloku změní aktuální globální stav uzlu. Když je blok distribuován do sítě, validační uzly musí postupovat stejně, tj. ověřovat transakce sekvenčně přesně v pořadí, ve kterém byly vloženy do bloku uzlem produkujícím bloky.
Jedním z důvodů, proč mohou transakce Ethereum selhat, je nepředvídatelnost globálního stavu v době ověřování transakce. Když je transakce konstruována, není možné předvídat její výsledek. Globální stav během ověřování transakce se může lišit od stavu během vytváření transakce. V mezidobí mezi odesláním transakce a validací se mohly zůstatky na účtech účastníků transakce změnit. Tyto změny zůstatků na účtech by mohly zabránit provedení transakce tak, jak původně zamýšlel zadavatel.
Obrázek ilustruje období mezi odesláním transakce TX 10, ke kterému došlo kolem bloku N+2 (stav +2), a následnou validací transakce následující po validaci transakce TX 9. Během tohoto období došlo k četným změnám v globálním stavu. Ověření transakce TX 10 je závislé jak na globálním stavu, tak na změnách zavedených transakcí TX 9. Transakce TX 9 nebo jakákoli předchozí změna může potenciálně způsobit selhání transakce TX 10.
Transakční vstupy jsou zůstatky účtů a jedná se o sdílený zdroj. To znamená, že v době, kdy uživatel zadává transakci, může být zůstatek na účtu jiný než v době validace transakce. Transakční vstup není deterministický jako v případě modelu UTxO. Nemá smysl provádět místní ověření, které by odhalilo, zda transakce později projde ověřením sítě.
Nejlepší způsob, jak vysvětlit rozdíly, je vrátit se k příkladu s Alicí, která chce poslat 5 ETH 3 příjemcům. V případě Etherea mají všechny 3 zadané transakce stejný vstup, a to zůstatek Alicina účtu.
Validace transakcí probíhá sekvenčně a pokaždé je z Alicina zůstatku odečteno 5 ETH a připsáno na účet jednoho z příjemců.
Po přidání nového bloku obsahujícího všechny transakce budou uživatelské účty vypadat jako na obrázku.
Tento obrázek není přesný. Později si ukážeme, jak přesně probíhá přechod mezi stavy.
Ethereum ověřuje transakce deterministicky v tom smyslu, že při stejných vstupech (transakční data) a stejném stavu (aktuální globální stav blockchainu Ethereum) bude EVM vždy produkovat stejný výstup. Výsledek ověření transakce však není deterministický. Výsledek ověření se může lišit od očekávání uživatele.
Během odesílání transakce nemůže uživatel předvídat, jaký bude globální stav v době ověření transakce. Proto je nemožné odhadnout výsledek validace s vysokou mírou jistoty. Lze to jen předpokládat.
Pokud má více uživatelů přístup ke stejnému zůstatku, může se snadno stát, že bude odesláno více transakcí, které odečítají určitou částku ze stejného zůstatku. Řekněme, že částka je 1200 ETH. Tři uživatelé nezávisle odeslali transakci, která má z částky odečíst 500 ETH.
V době odesílání transakcí může být kontext takový, že je možné danou částku odečíst ze zůstatku. Žádná z transakcí dosud nebyla přidána do globálního stavu (akceptovaného sítí). Jakmile jsou však ověřeny 2 transakce, třetí selže. Tyto dvě transakce odečetly celkem 1000 ETH. Zůstatek bude pouze 200 ETH. Není tedy možné znovu odečíst 500 ETH. 2 transakce byly úspěšné a 1 neúspěšná.
Na obrázku vidíte, že uspěly pouze 2 transakce Boba a Carol, kteří chtěli získat (odečíst) 500 ETH z aplikačního účtu. Dave měl smůlu a jeho transakce se nezdařila.
Ani tento obrázek není zcela přesný, protože nezachycuje postupné změny vyvážení při stavových přechodech. Další obrázek to objasní.
Nyní si vysvětlíme důležitost pořadí při vkládání transakcí do bloku. I kdyby Dave předložil transakci jako první, před Bobem a Carol, mohl mít smůlu. Záleží na pořadí, ve kterém uzel producenta bloku vkládá transakce do nového bloku.
Analogicky, pokud by byly transakce Davea a Carol vloženy do bloku jako první a druhá, Bobova transakce by selhala.
V době, kdy Bob, Carol a Dave zadávají transakci, nemohou zajistit její úspěšné ověření sítí, protože není možné mít přístup k části zůstatku výhradně pro jejich transakci. To se liší od modelu UTxO, protože umožňuje transakci mít výhradní přístup ke vstupnímu UTxO.
Na obrázku vidíte 4 stavy představující změny stavu v rámci přípravy bloku. Bílé transakce jsou v mem-poolu. 2 zelené transakce jsou ty, které odečetly 500 ETH od zůstatku DApp ve stavech N+1 a N+2. Červeně je transakce, která selhala ve stavu N+3. Můžete vidět, jak se v každém novém stavu mění zůstatek DApp (od kterého byla hodnota postupně odečítána). Na začátku byla hodnota 1200, pak 700 a nakonec jen 200.
Všimněte si, že ve stavu N+2 všechny transakce odkazují na stejný DApp zůstatek, ale ten má jinou hodnotu než ve stavu N+1 a N.
Globální stav Etherea lze považovat za stav všech účtů a kontrakt účtů. Stav účtu zahrnuje jeho zůstatek Ether a u smluvních účtů aktuální stav smart kontraktu, včetně všech proměnných definovaných ve smlouvě.
Model založený na účtech Etherea vyžaduje, aby transakce byly zpracovávány postupně. Je to proto, že každá transakce může potenciálně ovlivnit stav jakéhokoli účtu v síti a výsledek transakce může záviset na pořadí, ve kterém je zpracována. Proto, aby byla zajištěna konzistence a zabránilo se dvojímu utrácení, musí být globální stav „uzamčen“ pro každou validaci, což znamená, že může být zpracována vždy pouze jedna transakce.
Uzamčení globálního stavu je nutné pro zajištění integrity systému. Bez tohoto zamykacího mechanismu by bylo možné, aby se dvě transakce současně pokusily utratit stejné prostředky, což by vedlo k nesrovnalostem v globálním stavu a potenciálně by umožnilo dvojí utrácení. Sekvenčním zpracováním transakcí a aktualizací globálního stavu po každé transakci Ethereum zajišťuje, že každá transakce je zpracována v konzistentním stavu a že pořadí transakcí neovlivňuje konečný stav systému.
Obrázek ilustruje globální stav Etherea. Každá transakce upravuje dva zůstatky. Červená šipka označuje odečtení hodnoty z zůstatku, zatímco zelená šipka znamená přičtení hodnoty k zůstatku. Všimněte si, že některé transakce zpracovávané postupně upravují stejné zůstatky. Například TX 1 a TX 2 odečítají hodnotu ze stejného zůstatku, zatímco TX 3 a TX 4 přidávají hodnotu ke stejnému zůstatku.
Ethereum transakce lze charakterizovat jako stavové.
Závěr
Bez kontextu nebo globálního stavu by bylo možné ověřit pouze určité vlastnosti transakce, jako je kryptografický podpis od vlastníka soukromého klíče. Schopnost utrácet zdroje vyžaduje kontext. Všechny uzly v síti musí udržovat konzistentní globální stav, který se využívá, když uzel konstruuje nový blok a také při jeho následné validaci ostatními uzly v síti.
Občas se uvádí, že Cardano postrádá sdílený globální stát. To je v kontextu významu globálního státu v případě Etherea celkem trefné přirovnání. Pro Cardano je však zásadní také kontext pro ověřování transakcí. V případě Cardano zahrnuje globální stav sadu jedinečných a nezávislých objektů, které lze spotřebovat pouze jednou v rámci jedné transakce. Spotřeba vstupního UTxO má za následek generování nových UTxO. V případě Etherea jsou zůstatky trvalé entity, které lze opakovaně upravovat transakcemi v kteroukoli danou chvíli. Dvě transakce Ethereum nemohou upravit stejný zůstatek současně. Proto je nutné sekvenční zpracování transakcí. V případě Cardana je paralelismus proveditelný, protože transakce jsou na sobě nezávislé.
Determinismus je výhodný pro ZK kryptografii. Například v ekosystému Cardano bude možné vytvořit ZK Rollup, který nevyžaduje sekvencer.
Článek připravili Cardanians s podporou od Cexplorer.
Přečtěte si celý článek: https://cexplorer.io/article/deep-dive-into-cardano-s-utxo-and-ethereum-s-account-based-models-models
1 post - 1 participant