Utracení UTxO může být podmíněny logikou definovanou skriptem. V takovém případě musí ten kdo chce utratit UTxO poskytnout skriptu taková data, která umožní odemknutí UTxO. V tomto článku se podíváme na to, jak uzamknout UTxO a jak jej odemknout spuštěním validátorového skriptu.
UTxO se utrácejí prostřednictvím transakcí
Pro pochopení článku je nutné pochopit účetní model UTxO, strukturu UTxO, Shelley adresy a běžný způsob utrácení UTxO prostřednictvím klíčových pověření (key credentials). Toto jsme popsali v předchozím článku.
Na obrázku níže můžete vidět adresu Shelley obsahující platební pověření (payment credentials) včetně dvou možností, jak utratit asociovaná UTxO. Jedna adresa může být spojena s více UTxOs.

Platební pověření je součástí adresy Shelley, která identifikuje, kdo vlastní prostředky na adrese, a tedy kdo může utrácet UTxO. Platební pověření může být buď pověření klíče (na základě veřejného/ověřovacího klíče) nebo pověření skriptu (hash skriptu).
Spouštěčem útraty UTxO je transakce. Kromě jiných parametrů musí transakce obsahovat svědka. Svědek je údaj, který dokazuje, že transakce je autorizována vlastníkem prostředků. Pokud je svědek platný, transakce může spotřebovat vstupní UTxO. Svědkem může být buď podpis (pro pověření klíče) nebo provedení skriptu (pro pověření skriptu).
V případě pověření klíčem je svědkem podpis provedený soukromým klíčem vlastníka. Podpis musí odpovídat údajům klíče (veřejnému klíči), které patří k adrese obsahující UTxO.
Když uživatelé chtějí poslat peníze někomu jinému, peněženka za ně vytvoří běžnou transakci. Peněženka vybere příslušné UTxO a požádá odesílatele, aby transakci podepsal. Na pozadí je do transakce vložen svědek pro každý UTxO, který má být utracen.
Pokud je transakce platná a bude dokončena sítí Cardano (trvale uložena v blockchainu), transakce spotřebuje vstupní UTxO, ze kterých se vytvoří nové UTxO (přesně tak, jak je definováno odesílatelem). Výdaje si lze zjednodušeně představit jako přesun UTxO (finančních prostředků) z jedné adresy na druhou. Během přesouvání může dojít k přerozdělení funds, ale celková hodnota musí být zachována (nebo být menší).
Na konci blockchainu se v pravidelných intervalech připojují nové bloky obsahující transakce. Blockchain Cardano lze považovat za účetní záznamy převodů UTxOs.
Podrobně jsme to popsali v předchozím článku. V tomto článku se zaměříme na případ, kdy je svědkem provedení skriptu.
Uzamykání UTxO
Utrácení UTxO prostřednictvím skriptu (validátorový skript) je dvoufázový proces, který zahrnuje dvě transakce. První transakce uzamkne prostředky a druhá transakce odemkne prostředky provedením skriptu. První transakci nazýváme zamykací transakcí a druhou útratovou (nebo výdajovou) transakcí.
První transakce je ta, která vytvoří UTxO, které se uzamkne na adrese skriptu. Když je UTxOs uzamčen na adrese skriptu, neprovede se žádný skript. Důležitá je pouze cílová adresa (definovaná ve výstupním UTxO zamykací transakce), což je adresa skriptu.
Druhá transakce se pokusí utratit UTxO držené adresou skriptu. Tím se spustí provádění skriptu validátoru. Návratová hodnota skriptu (výsledek spuštění skriptu) rozhodne, zda se UTxOs odemknou.
Na obrázku níže můžete vidět proces zamykání a odemykání UTxO pomocí skriptu. Uzamykací transakce má jeden výstup UTxO, jehož cílová adresa zobrazuje adresu skriptu. To uzamkne UTxO na adresu skriptu. Transakce útraty spotřebuje UTxO z adresy skriptu, což spustí spuštění skriptu na uzlu Cardano (červená šipka). Obrázek popisuje základní koncept. Níže si to vysvětlíme podrobněji.
Vysvětlíme si pojem adresa skriptu. Adresa Shelley je obecný termín pro jakoukoli adresu, která je podporována érou Shelley v Cardano. Adresa Shelley může mít různé typy a formáty v závislosti na credentials a tagu sítě. Adresa Shelley může mít jako pověření k platbě hash skriptu, což z ní dělá adresu skriptu. Pokud uslyšíte výraz adresy skriptů, víte, že utrácení UTxO je možné pouze prostřednictvím skriptu.
Adresa skriptu je odvozena z hash skriptu validátoru. Vývojáři vytvoří skript a vytvoří z něj hash. Hash se používá jako platební pověření adresy Shelley. Když se UTxO spojí s adresou skriptu, může být odemčeno pouze skriptem. Skript projde několika vstupy (o tom později) a pokud jeho provádění skončí s návratovou hodnotou True, prostředky mohou být utraceny.
Všimněte si jedné důležité věci. Byla vytvořena adresa skriptu, ale skript (obsah skriptu) není uložen v blockchainu. K vytvoření adresy skriptu byl použit pouze hash skriptu (a to ke spuštění nestačí). Níže se dozvíte, jak je obsah skriptu doručen do uzlu Cardano za účelem ověření platební transakce.
Na obrázku níže vidíte adresu, která má v platebních údajích nastaven hash skriptu. Když byl zdrojový kód skriptu dokončen (a otestován), vývojář jej použil jako základ pro vytvoření hashe skriptu. Hash skriptu je jedinečný identifikátor, který je odvozen z obsahu skriptu. Hash skriptu je forma krátkého digitálního otisku, který zajišťuje, že během ověřování (tj. provádění skriptu) bude použit přesný skript (obsah skriptu), který byl použit k vytvoření hashe. To zajišťuje, že podmínky pro útratu UTxO nelze změnit pomocí jiného skriptu.
Hash skriptu je ověřen uzlem Cardano, když je ověřeno, zda uzly ověřují správný skript. Pokud byste v původním skriptu změnili jeden znak, jeho hash by byl úplně jiný. Pokud je skript doručen prostřednictvím transakce, obsah skriptu musí produkovat stejný hash, který je identický s hashem uloženým v platebních pověřeních.
Vždy musí existovat shoda mezi hashem uloženým v platebních pověřeních a hashem zdrojového kódu skriptu, který má být proveden pro ověření transakce. Pokud jsou hodnoty hash odlišné, ověření se nezdaří.
Adresa skriptu musí být vytvořena předtím, než k ní transakce odešle (přidruží) prostředky. V opačném případě by zamykací transakce nevěděla, kam poslat prostředky a jak je zamknout pomocí skriptu.
Jakmile je adresa skriptu vytvořena, lze na ni posílat prostředky, jak můžete vidět na obrázku níže. Transakce má jeden vstup UTxO a dva výstupy. Odesílatelem transakce je Alice. Alice autorizuje transakci poskytnutím jediného svědka pro vstup UTxO. Alice chce poslat 1000 ADA na adresu skriptu, která patří DEX. V peněžence má pouze UTxO s 2500 ADA. První cílová adresa patří jí a vrátí 1500 ADA zpět na její adresu. Druhá cílová adresa je adresa skriptu, která patří do DEX.
Na obrázku níže můžete vidět adresu skriptu poté, co síť ověří (a dokončí) transakci. UTxO je spojeno s adresou skriptu.
Datum je volitelný parametr, který lze použít k uložení některých informací nebo stavu, které jsou relevantní pro utracení UTxO. Datum je uloženo vedle UTxO na adrese skriptu a lze k němu během provádění přistupovat pomocí validačního skriptu.
Datum se vloží do transakce, která uzamkne UTxO na adrese skriptu, a proto se také vloží do transakce, která odemkne UTxO z adresy skriptu.
Na obrázku níže můžete vidět transakci, která uzamkne UTxO na adrese skriptu spolu s Datum. Tato zamykací transakce se liší od předchozí zamykací transakce pouze tím, že obsahuje Datum, které bude spojeno s UTxO.
Na obrázku níže můžete vidět adresu skriptu poté, co síť ověří (a dokončí) transakci. UTxO je spojeno s adresou skriptu a obsahuje Datum.
Prostředky na adrese skriptu jsou řízeny samotným skriptem, který definuje podmínky pro útratu UTxO. Skript převezme některé vstupy, jako je svědek, Datum, Vykupitel a kontext skriptu, a vrátí hodnotu True nebo False, což naznačuje, zda je útrata platná nebo ne. O vstupech skriptů si povíme podrobně později.
Nyní máme UTxO uzamčeno na adrese skriptu.
Přístup ke skriptům
Než začneme vysvětlovat, jak se odemykají UTxO, musíme se podívat na to, jak uzly nacházejí skripty, které se používají k ověřování transakcí, které se snaží utratit UTxO z adres skriptů. Obsah skriptu musí být dostupný uzlu Cardano, aby jej mohl provést, tj. ověřit platební transakci.
Obsah skriptu lze vložit do údajů o útratách jako svědek skriptu. To znamená, že transakce, která se pokouší utratit UTxO, musí obsahovat obsah skriptu jako součást těla transakce. To zvyšuje velikost transakce a tím i poplatky. Obecně omezuje složitost skriptů, protože nutí vývojáře vytvářet skripty co nejmenší (velikost bloku je omezená a uživatelé nyní chtějí platit vysoké poplatky).
Pokud by uživatelé posílali více takových transakcí, obsah stejného skriptu by byl v blockchainu uložen vícekrát, což je zbytečné plýtvání místem.
Na obrázku níže můžete vidět platební transakci, která obsahuje obsah skriptu v sekci Svědek (červeně). Všimněte si, jak vstupní UTxO definuje pomocí hash skriptu, který skript musí být použit pro ověření. Uzel Cardano převezme obsah skriptu z těla transakce a vytvoří hash. Hodnota hash se musí shodovat s hodnotou hash skriptu obsaženou v platebních pověřeních (červené šipky).
Další možností je, že skript může být spojen s UTxO jako referenční skript. To znamená, že zamykací transakce, která vytváří UTxO, musí obsahovat skript jako součást výstupu transakce. Obsah skriptu je pak uložen na blockchainu jako referenční skript a lze k němu přistupovat pomocí jeho hashe.
Skripty tak mohou být uloženy na blockchainu pouze jednou a poté znovu použity v následných transakcích, aniž by bylo nutné zahrnout obsah skriptů. Místo toho mohou následné transakce odkazovat na skripty pomocí jejich hash, což je také způsob, jakým jsou identifikovány v adresách skriptů. To snižuje velikost a poplatky za transakce a umožňuje větší flexibilitu a škálovatelnost skriptů.
Na obrázku níže můžete vidět zamykací transakci, která ukládá obsah skriptu do blockchainu na adrese skriptu.
Nejprve se vytvoří adresa skriptu, jak je popsáno výše. Po vytvoření adresy skriptu neobsahuje obsah skriptu. Jakmile adresa skriptu existuje, obsah skriptu na ni může být uložen prostřednictvím transakce.
Na obrázku níže můžete vidět adresu skriptu poté, co síť ověří (a dokončí) transakci. Obsah skriptu je uložen v blockchainu a lze na něj odkazovat jinými transakcemi.
Vždy existuje pouze jedna adresa skriptu, která je spojena se skriptem. Uživatelé pak mohou posílat (a tedy zamykat) další UTxO na stejnou adresu skriptu prostřednictvím zamykacích transakcí a pokusit se je utratit z adresy prostřednictvím platebních transakcí (odemknutí vždy vyžaduje provedení skriptu).
UTxO se skriptem je vždy na adrese skriptu, pokud není vynaloženo uspokojením skriptu.
Transakce, která utratí UTxO, tedy může odkazovat na skript pomocí hashe, aniž by jej bylo nutné zahrnout do dat transakce.
Na obrázku níže můžete vidět adresu skriptu s UTxO, která ukládá obsah skriptu (červená) a také 3 UTxO (modrá), které byly odeslány na adresu jinými uživateli a které budou utraceny z adresy prostřednictvím provedení skriptu. Adresa bude znovu použita, dokud se bude skript používat.
Nyní víte, jak uzamknout UTxO na adrese skriptu a jak uzel Cardano získá obsah skriptů. Podívejme se blíže na odemykání UTxO.
Odemykání UTxO
UTxO, který je uzamčen na adrese skriptu, lze utratit prostřednictvím platební transakce, která spustí spuštění skriptu. Pokud je UTxO spojeno s adresou skriptu, musí být skript vždy spuštěn a nelze to nijak obejít.
Nezáleží na tom, jaké cílové adresy jsou definovány ve výstupních UTxO platební transakce a jak mají být prostředky distribuovány prostřednictvím nových UTxO.
Podívejme se, jak uzel Cardano ověřuje platební transakci, která vyžaduje provedení skriptu.
Uzel zkontroluje, zda je platební transakce platná ve fázi 1, což znamená, že je správně sestavena a může zaplatit poplatek za zpracování.
Transakce musí zaplatit dostatečné poplatky, aby pokryly náklady na provedení skriptu validátoru, které závisí na velikosti a složitosti skriptu. Poplatky se počítají pomocí parametru protokolu coinsPerUTxOWord, který určuje, kolik ADA je potřeba na bajt kódu skriptu.
Pokud transakce projde ověřením fáze 1, může být skript spuštěn, jinak je transakce zamítnuta.
Během ověřování fáze 2 se skript spustí. Transakce bude platná pouze v případě, že bude možné utratit (odemknout) každý vstup UTxO. Pro každý vstup UTxO, který je spojen s adresou skriptu, musí být návratová hodnota skriptu True.
Uzel načte skript, který je přidružen k UTxO, které se transakce pokouší utratit. Na skript lze buď odkazovat pomocí hashe, nebo jej vložit do transakčních dat. Uzel také zkontroluje, zda se hash načteného nebo vloženého skriptu shoduje s hashem uloženým v platebních přihlašovacích údajích na výstupu. Pokud není shoda, transakce je odmítnuta jako neplatná.
Uzel předá vstupy skriptu a provede jej. Skript validátoru může získat následující vstupy:
- Datum: Toto je část dat připojená k UTxO, která skript zamyká. Datum lze použít k uložení nějakého stavu nebo stavu, který je relevantní pro utracení UTxO.
- Redeemer: Toto je část dat připojená ke vstupu útraty. To se obvykle používá k poskytnutí vstupu do skriptu od utrácejícího. Může být použit k poskytnutí některých informací nebo logiky, která je potřebná k odblokování finančních prostředků. Redeemer je povinný pro jakýkoli vstupní UTxO, který má adresu založenou na skriptu, bez ohledu na typ nebo obsah skriptu.
- Transakční kontext: Jedná se o část dat, která představuje informace o útratové transakci. To se používá k vytváření tvrzení o způsobu, jakým je výstup utracen. Například logika skriptu může vyžadovat podpis. Podpis lze použít k prokázání vlastnictví některých finančních prostředků nebo tokenů, které skript vyžaduje.
Skript vrátí hodnotu True nebo False, což značí, zda je podmínka útraty splněna či nikoli. Pokud je True, transakce je přijata a UTxO je utraceno. Pokud je False, pak je transakce odmítnuta a UTxO zůstane neutraceno.
Níže uvedený obrázek ukazuje odemknutí UTxO prostřednictvím platební transakce. Vstupem transakce je UTxO, které je spojeno s adresou skriptu (modrá šipka).
Transakce odkazuje na skript (v tomto příkladu obsah skriptu není součástí těla transakce). Cardano uzel získává obsah skriptu, který je uložen v blockchainu (v UTxO) a porovnává hash obsahu skriptu s hashem skriptu v platebních pověřeních (červené šipky).
Dále je potřeba získat vstupy pro skript a předat mu je (zelené šipky).
Pokud je Datum již uloženo na blockchainu, není nutné jej znovu vkládat do výdajové transakce. Uzel může najít hodnotu Datum vyhledáním hash Datum, který je uložen v UTxO. Pokud však Datum není uloženo na blockchainu, musí výdajová transakce poskytnout hodnotu Datum, která odpovídá hash Datum v UTxO. Tím se zajistí, že skript bude mít přístup k hodnotě Datum při ověřování transakce.
Kromě toho jsou jako vstupy pro skript předány kontext transakce a Redeemer. Transakční kontext obsahuje všechny potřebné informace o transakci, tedy seznam vstupních UTxO a výstupních UTxO, poplatek, svědky (podpisy), Datumy, ověřovací skripty (nebo odkazy na ně) atd.
Vstupy jsou předány skriptu a je provedena logika skriptu. Vstupy ovlivňují návratovou hodnotu. V našem příkladu je návratová hodnota True, takže lze utratit UTxO (černé šipky). Prostředky budou přesunuty na novou cílovou adresu.
O logic DEX skriptů
V této kapitole se pokusíme vysvětlit některé další souvislosti týkající se smart kontraktů na Cardano.
V našem příkladu Alice poslala 1000 ADA na adresu skriptu DEX, což znamená, že vytvořila UTxO, které je uzamčeno adresou skriptu. Adresa skriptu je odvozena z hashe skriptu validátoru DEX, který obsahuje logiku pro výměnu tokenů na platformě DEX. Skript může obsahovat i logiku pro zrušení objednávky.
Jak je vlastně možné, že Alice nemusí transakci vytvářet ručně? Ona použila uživatelské rozhraní burzy, zadala svůj požadavek (swapový příkaz) a poté byla vyzvána k potvrzení transakce. DEX (aplikace) vytvořila transakci pro Alici.
Na obrázku níže můžete vidět, že v ekosystému Cardano lze chytrou smlouvu skládat z off-chain a on-chain částí aplikace. Off-chain logika je zodpovědná za konstrukci zamykacích a utrácecích transakcí. V případě DEX je off-chain logika zpracovávána na serveru (v cloudu). V článku jsme se zabývali pouze on-chain logikou, tedy validací skriptů, která na blockchainu probíhá prostřednictvím Cardano Virtual Machine.

Alice interaguje pouze s off-chain částí DEXu, která vytváří transakce. Uzamykací transakce (swapový příkaz) vyžaduje podpis Alice.
Alice může získat své prostředky zpět, pokud se rozhodne zrušit svou objednávku na DEXu. K tomu musí vytvořit transakci, která utratí UTxO, který je uzamčen adresou skriptu, a odešle jej zpět na její vlastní adresu. Transakce zrušení (výdaje) je konstruována off-chain logikou, takže Alice používá pouze rozhraní DEXu. Musí poskytnout svědka, který prokáže její vlastnictví UTxO, a Redeemer, který ukáže její úmysl zrušit objednávku. Skript validátoru pak ověří, zda je Alice skutečně vlastníkem UTxO.
Validátorové skripty různých DEXů (nebo jiných aplikací) se výrazně liší svou funkčností a možnostmi, které uživatelům nabízejí.
K odemknutí prostředků musí DEX, Alice nebo kdokoli jiný, kdo chce utratit UTxO, poskytnout správné vstupy do skriptu validátoru, jako je podpis, Redeemer nebo Datum. Skript validátoru pak zkontroluje, zda vstupy splňují pravidla výměny, jako je shoda s nabídkovou cenou, placení poplatků a respektování intervalu platnosti.
I když prostředky může utrácet v podstatě kdokoli, očekává se, že DEX bude odpovídat objednávkám a provede swap, tj. nejlépe splní podmínky skriptu. Jednou z podmínek skriptu však může být podpis soukromým klíčem Alice nebo DEX, takže je možné definovat skupinu těch, kteří mohou utrácet finanční prostředky.
DEX nemůže krást finanční prostředky na adresách skriptů. DEX může uspokojit skript pouze tím, že poskytne vstupy a tím provede příkazy uživatelů. Když DEX splní objednávku, podpis od Alice není vyžadován. DEX je schopen provést swap bez jakékoli další interakce s Alicí. Jinými slovy, DEX je schopen vytvořit utrácející transakci, která splňuje podmínky skriptu. Alice obdrží žetony na svou adresu jako výsledek požadované výměny páru žetonů.
Závěr
Validátorové skripty jsou obvykle velmi jednoduché a pracují s omezeným množstvím informací. V podstatě jen rozhodují o tom, zda lze z adresy skriptu utratit finanční prostředky. K tomu může stačit jednoduchá podmínka. Většina aplikační logiky by měla být v off-chain částech. Provádění ověřovacích skriptů spotřebovává zdroje distribuované sítě, což může být dražší než použití zdrojů serveru nebo lokálních počítačů uživatelů.
Článek připravili Cardanians s podporou od Cexplorer.
Přečtěte si celý článek v AJ: https://cexplorer.io/article/understanding-utxo-spending-through-a-script