Model EUTXO Cardana umožňuje deterministickú povahu vykonávania skriptov Plutusu
Keďže hard fork Alonzo prináša do Cardana jadro inteligentných zmlúv - Plutus, hlavný ledger sa vyvíja tak, aby spĺňal rastúcu potrebu zavádzania decentralizovaných riešení. Návrh hlavnej knihy Cardano sa zameriava na vysokú istotu, bezpečnosť a osvedčené formálne overovanie. V súlade s touto stratégiou je tiež dôležité zabezpečiť, aby spracovanie transakcií bolo deterministické, čo znamená, že používateľ môže predvídať ich vplyv a výsledok ešte pred ich skutočným vykonaním.
Schopnosť zaručiť náklady na vykonanie transakcie a to, ako sa transakcia správa v účtovnej knihe pred jej odoslaním sa stáva ešte významnejšou po zavedení podpory inteligentných zmlúv. Takéto možnosti poskytujú blockchainy založené na Unspent Transaction Output (UTXO), ako napríklad Cardano. Blockchainy založené na účtoch, ako napríklad Ethereum, sú nedeterministické, čo znamená, že nemôžu zaručiť predvídateľnosť transakcie v reťazci. Toto predstavuje riziko peňažných strát, nepredvídateľne vysokých poplatkov a ďalšie príležitosti pre nepriateľské správanie.
V tomto príspevku sa bližšie pozrieme na výhody deterministického dizajnu Cardana, ktorý umožňuje bezpečné vyhodnotenie transakcií a skriptov pred ich vykonaním. V nasledujúcom blogu, ktorý vyjde koncom tohto týždňa, sa budeme venovať dvom fázam overovania transakcií v systéme Cardano.
Čo je to transakčný determinizmus a prečo je dôležitý?
Determinizmus je v kontexte spracovania transakcií a skriptov synonymom pre predvídateľnosť. To znamená, že používateľ môže lokálne (mimo reťazca) predvídať, ako jeho transakcia ovplyvní stav hlavnej knihy v reťazci, bez toho, aby došlo k:
- neočakávaným výsledkom alebo zlyhaniu validácie skriptu
- neočakávaným poplatkom
- neočakávaným aktualizáciám stavu účtovnej knihy alebo skriptu.
Transakcia v deterministickom systéme môže byť zamietnutá aj keď je správne zostavená. Odmietnutá znamená, že transakcia nemohla byť vôbec uskutočnená a teda nemá žiadny vplyv na stav ledgeru, takže sa neplatia žiadne poplatky. Dôvodom, prečo by k tomu mohlo dôjsť, sú zmeny v účtovnej knihe spôsobené inými transakciami spracovanými v čase medzi zostavením počiatočnej transakcie a jej spracovaním. To sa môže stať aj pri jednoduchých transakciách. Napríklad iná transakcia môže minúť UTXO, ktoré používateľ tiež plánoval minúť. Determinizmus zabezpečuje, že vždy, keď je transakcia prijatá, bude mať len predvídateľné účinky na stav účtovnej knihy.
Riešenie otázky neurčitosti
Indeterminizmus znamená, že pred vykonaním transakcie nemôžeme predpovedať, aký vplyv bude mať transakcia na účtovnú knihu. Pri návrhu účtovnej knihy, ako aj inteligentného kontraktu je dôležité predvídať podmienky, v ktorých by mohol nastať indeterminizmus a prijať návrhové rozhodnutia, aby sa im predišlo. Jedným z hlavných nebezpečenstiev v takomto prípade je prístup k mutabilným údajom účtovnej knihy - teda údajom, ktoré možno zmeniť alebo upraviť. Keď zmeny, ktoré transakcia alebo inteligentný kontrakt vykoná v účtovnej knihe závisia od jej stavu v čase spracovania a nie iba od obsahu transakcie, môže sa indeterminizmus stať problémom.
Ethereum je na tento problém mimoriadne náchylné. Napríklad ceny plynu alebo kurz decentralizovanej burzy (DEX) môžu kolísať v čase medzi odoslaním transakcie používateľom a jej spracovaním. To má za následok neočakávané poplatky za plyn alebo zmeny cien nakupovaných aktív. Alebo môže skript jednoducho zlyhať, čo má za následok vysoké náklady na vykonanie (stovky dolárov) a žiadny iný efekt. K tomu by mohlo dôjsť napríklad vtedy, ak sa v polovici vykonávania vyčerpajú prostriedky dostupné na pokrytie nákladov na plyn. Deterministický návrh účtovnej knihy tieto možnosti eliminuje.
Medzi ďalšie možné zdroje neurčitosti patrí umožnenie skriptom vidieť:
- údaje v bloku, ktorý obsahuje transakciu, ale nie sú zahrnuté v žiadnej transakcii, napr. systémová náhodnosť, hlavička bloku alebo číslo aktuálneho slotu
- údaje zmenené alebo nahradené protivníkom, čo by mohlo zmeniť výsledok overenia skriptu, pričom samotná transakcia zostáva spracovateľná.
Vo väčšine systémov existujú spôsoby, ako tieto problémy zmierniť pomocou lepších postupov písania skriptov alebo riešení na druhej vrstve. Cardano je navrhnuté tak, aby zaručovalo predvídateľné výsledky pre všetky skripty a transakcie.
Aké výhody má základný model UTXO z hľadiska determinizmu
Hlavná kniha Cardana je postavená na účtovnom modeli UTXO, čo znamená, že aktíva sú v hlavnej knihe uložené v nevyužitých výstupoch a nie v účtoch . Každý z týchto výstupov špecifikuje množstvá aktív, ktoré sú v ňom uložené, spolu s jeho adresou. Nespotrebované výstupy sú nezmeniteľné, takže transakcia môže spotrebovať celý výstup, ale nemôže ho zmeniť.
Pri prevode aktív sa transakciou spotrebuje jeden alebo viac výstupov a vytvoria sa nové výstupy, ktoré celkovo obsahujú rovnaké množstvo aktív ako tie, ktoré sa spotrebovali. Tieto množstvá - a ich adresy UTXO - sú uvedené vo výstupoch transakcie. Jediný spôsob, ako môže transakcia ovplyvniť účinok inej transakcie aplikovanej na účtovnú knihu je, že minie rovnaké UTXO, aké sa pokúša minúť neskoršia transakcia, čím spôsobí, že uzol ju odmietne. Toto je kľúčová vlastnosť, na ktorú sa model UTXO spolieha pri zachovaní determinizmu.
Hlavná kniha UTXO má oproti modelu založenému na účtoch výhody aj nevýhody. Napríklad menší počet prípadov vzájomného blokovania transakcií. Na rozdiel od UTXO sú účty premenlivými údajmi účtovnej knihy. Takže transakcia môže vidieť napríklad iné množstvo aktív na účte v závislosti od toho, či bola spracovaná pred alebo po inej transakcii, ktorá aktualizuje ten istý účet. Táto okolnosť nemusí spôsobiť odmietnutie transakcie, ale môže mať za následok rôzne - a nepredvídateľné - zmeny v účtovnej knihe.
Výstupy UTXO sú len jedným z príkladov činností, ktoré môže transakcia vykonať. Ďalej vysvetlíme, čo sú to transakčné akcie a ako ich možno overiť. Najvýznamnejším súborom zmien zavedených v systéme Alonzo sú zmeny v procese validácie akcií.
Overovanie akcií pomocou podpisov a skriptov
Dôležitým aspektom spracovania transakcie je overovanie vykonávaných činností. Transakcia vykonáva akciu, keď obsahuje údaje v konkrétnom poli pre túto akciu. Napríklad transakcia vykonáva UTXO U, keď vo svojom vstupnom poli obsahuje odkaz na U, a minting token X, keď jej minting pole obsahuje X.
Keď uzol spracúva transakciu, overuje, či môže vykonať zamýšľanú akciu. Na tento účel musí autor transakcie poskytnúť príslušné údaje, napr. skripty alebo podpisy. Bežným príkladom akcie, ktorá si vyžaduje overenie je vynaloženie UTXO uzamknutého verejným kľúčom. Na vykonanie tejto akcie musí transakcia poskytnúť podpis z príslušného súkromného kľúča.
Cardano používa na overovanie akcií skripty. Tieto skripty, čo sú časti kódu, implementujú čisté funkcie s výstupmi True alebo False. Overovanie skriptov je proces vyvolania interpretu skriptu na spustenie daného skriptu na príslušných argumentoch.
Overovanie skriptov je možné vykonať pre nasledujúce akcie:
- Užitie UTXO uzamknutého adresou skriptu: spustí sa skript, ktorého hash tvorí adresu.
- Minting tokenu: spustený skript je ten, ktorého hash tvorí ID politiky daného tokenu.
- Výber odmeny: spustený skript je ten, ktorého hash tvorí adresu stakingu.
- Uplatnenie certifikátu: spustí sa skript, ktorého hash tvorí poverenie autora certifikátu.
Okrem toho, že uzol vie, ktorý skript má spustiť, všetky transakčné akcie naznačujú ako zostaviť argumenty odovzdané tomuto skriptu.
Multiassetová účtovná kniha Cardano (Mary) podporuje jednoduché skripty multisig a timelock. Tie umožňujú používateľom špecifikovať podpisy potrebné na vykonanie akcie (ako je napríklad vydanie UTXO alebo razenie nezameniteľného tokenu (NFT)) a časový interval, v ktorom to možno vykonať. Skript časového zámku nikdy nemôže vidieť skutočné číslo slotu v transakcii, ktorá ho obsahuje. Timelock môže vidieť iba interval platnosti nosnej transakcie. Ak by sa skriptu timelock umožnilo vidieť aktuálne číslo slotu (t. j. údaje pochádzajúce z bloku a nie od autora), porušilo by to determinizmus. To je zabezpečené tým, že používateľ nemôže poznať presný slot, v ktorom sa transakcia spracúva a preto nemôže predvídať, ako sa skript bude správať.
Skripty v Mary sú na rozdiel od Plutus kontraktov v Alonzo veľmi obmedzené v tom, čo môžu vyjadriť. Hard fork Alonzo otvára novú éru výkonných - stavových kontraktov, ktoré neohrozujú vlastnosť deterministickej účtovnej knihy.
Plutus skripty
Alonzo zavádza nový prístup k overovaniu transakcií v Cardane vďaka implementácii skriptov Plutus. Výstup extended unspent transaction output (EUTXO), nasadený ako súčasť systému Alonzo, poskytuje infraštruktúru hlavnej knihy na podporu kontraktov Plutusu. Nižšie uvádzame prehľad zmien v hlavnej knihe a transakciách na vyššej úrovni. Podrobnejšie informácie o práci s hlavnou knihou a skriptami Plutus nájdete v programe Plutus Pioneer!
Alonzo zmení údaje v účtovnej knihe takto:
- Skripty Plutus môžu uzamknúť UTXO.
- Nový komponent, pridaný do obsahu výstupných častí UTXO, umožňuje funkcionalitu podobnú stavu skriptov. Okrem aktív a adresy obsahuje UTXO uzamknuté skriptami Plutus aj datum. Datum je časť údajov, ktorú možno považovať za interpretáciu stavu skriptu.
- Existuje niekoľko nových parametrov protokolu, ktoré sa používajú na uloženie dodatočných požiadaviek na validáciu transakcií. Patria medzi ne horné limity výpočtových zdrojov, ktoré môžu skripty spotrebovať.
Na podporu skriptov Plutus boli transakcie aktualizované takto:
- Pre každú svoju akciu teraz transakcia nesie používateľom zadaný argument, ktorý sa nazýva redeemer. V závislosti od skriptu môže redeemer slúžiť na rôzne účely. Môže napríklad fungovať ako ponuka, ktorú používateľ zadá v aukcii, alebo ako odhad používateľa v tipovacej hre, okrem mnohých iných funkcií.
- Transakcia určuje rozpočet na vykonanie pre každý skript.
- Na zabezpečenie toho, aby transakcia mohla zaplatiť svoj poplatok za vykonanie, zavádza Alonzo ďalšie údaje, ktoré rozoberieme v nasledujúcom blogovom príspevku.
- Transakcie obsahujú hash integrity, ktorý je potrebný na zabezpečenie toho, aby nebola ohrozená, zastaralá atď.
V porovnaní s Mary došlo aj k určitým zmenám v špecifikách validácie transakcií Alonzo. Pre každú akciu uzol zostaví argumenty skriptu, ktoré očakáva interpret Plutus, vrátane:
- datum
- redeemer
- rozpočet na vykonanie
- zhrnutie transakcie.
Uzol vykonáva nové, pre Alonzo špecifické kontroly, ktoré zabezpečujú správne zostavenie transakcie. Napríklad nesmie prekročiť maximálny rozpočet prostriedkov na vykonávanie. Taktiež vyvoláva interpreter skriptov Plutusuu na spustenie skriptov.
Dátové objekty vs. stav skriptu
Podobne ako mutačné účty, aj mutačný stav skriptov patrí do kategórie “mutačných údajov účtovnej knihy” zdrojov neurčitosti. Už sme videli, že model UTXO sa vyhýba problému neurčitosti meniteľných účtov. Môže nám tiež pomôcť znovu si predstaviť koncept stavu skriptu spôsobom, ktorý zachováva determinizmus. Ak je UTXO uzamknuté skriptom Plutus, kód tohto UTXO je spojený s jeho adresou. Stavový analóg tohto skriptu je údaj uložený v tomto UTXO. Keď transakcia minie toto UTXO, vymaže sa z účtovnej knihy vrátane dát. Obsah skriptu Plutus by si však mohol vynútiť aby transakcia, ktorá ho nesie, vytvorila aj UTXO obsahujúce konkrétny údaj, ktorý možno považovať za aktualizovaný stav skriptu.
Rozpočet na vykonanie skriptov
Nedeterministický model plynu môže používateľom účtovať nepredvídateľne vysoké poplatky. V skriptách Cardana je tento zdroj neurčitosti riešený požiadavkou, aby bol v transakcii zahrnutý samotný rozpočet zdrojov, ako aj poplatok potrebný na pokrytie tohto rozpočtu. V systéme Alonzo môže používateľ pri zostavovaní transakcie oboje predvídať lokálne. Vykonávanie skriptov nevyhnutne vracia buď True alebo False a nebude sa cykliť donekonečna. Dôvodom je, že každá operácia, ktorú skript vykoná, si vyžaduje nenulové množstvo zdrojov, ktoré interpreter sleduje. Ak je rozpočet určený transakciou prekročený, vykonávanie skriptu sa ukončí a vráti sa False .
Validácia transakcií v Alonzo
V súvislosti s možnými zdrojmi neurčitosti je možné predvídať výsledky overovania skriptov a transakcií vďaka nasledujúcim kľúčovým bodom:
- interpreter skriptu sa vždy ukončí a vráti rovnaký výsledok validácie, ak sa použije na rovnaké argumenty
- transakcia nevyhnutne fixuje všetky argumenty, ktoré budú počas validácie odovzdané interpretu skriptu
- transakcia špecifikuje všetky akcie, ktoré vykonáva a ktoré vyžadujú validáciu skriptu
- povinné podpisy transakcie zabezpečujú, že ju protivník nemôže zmeniť spôsobom, ktorý by spôsobil zlyhanie skriptov
- použitie transakcie v modeli účtovnej knihy EUTXO je deterministické.
Posledný bod je do veľkej miery zdedený z modelu UTXO, keďže aktualizácie protokolu Alonzo ledger zostávajú z veľkej časti konzistentné s aktualizáciami v predchádzajúcich období (vrátane schémy delegovania atď.). Po aktualizácii systému Alonzo má zlyhanie alebo úspech validácie skriptu vplyv na spôsob spracovania transakcie (viac o tom v druhej časti!). Výsledok Pravda alebo Nepravda, ako aj zmeny v účtovnej knihe spojené s oboma výsledkami, sú však pre danú transakciu predvídateľné.
Deterministické správanie skriptov Cardana a overovanie transakcií nie je prirodzeným výsledkom používania modelu EUTXO. Na zabezpečenie tejto vlastnosti musel tím IOG starostlivo sledovať zdroj každého údaju, ktorý môže skript vidieť.
Vlastnosť deterministického vyhodnocovania je formálne špecifikovaná v Alonzo špecifikácii a tím IOG tiež načrtol dôkaz, že interpreter dostane len tie argumenty, ktoré by túto vlastnosť neporušili.
V našom druhom príspevku na blogu sa bližšie pozrieme na dvojfázový proces overovania transakcií Cardano. Druhú časť si preto pozrite koncom tohto týždňa.
Pôvodný článok: No-surprises transaction validation on Cardano
Napísala Polina Vinpgradova z IOHK - preklad @Martin.M