Úvod
Bitcoin je někdy označován jako programovatelné peníze. Díky své digitální povaze umožňuje uživatelům velkou míru flexibility, pokud jde o nastavení podmínek pro utrácení finančních prostředků.
Když mluvíme o bitcoinech, mluvíme o peněženkách a mincích. Můžeme si ale také představit peněženky jako klíče, mince jako šeky a blockchain jako řadu zamčených trezorů. Každý trezor má v sobě tenkou štěrbinu, takže kdokoli může vložit šeky nebo se podívat, jakou hodnotu má trezor. Dovnitř však bude mít přístup pouze držitel klíče.
Když chce držitel klíče dát peníze někomu jinému, odemkne svou schránku. Vyhotoví nový šek, který odkazuje na starší (který je poté zničen) a uzamknou jej do krabice, kterou může příjemce otevřít. Aby je nový příjemce utratil, proces zopakuje.
V tomto článku se blíže podíváme na Script, programovací jazyk interpretovaný uzly v bitcoinové síti. Skript je to, co řídí zamykací/odemykací mechanismus zmíněný u trezorů.
Jak Bitcoin funguje?
S přihlédnutím k naší analogii shora by se dalo říci, že každá transakce má dvě části – klíč (k odemčení schránky) a zámek. Pomocí klíče otevřete schránku obsahující šek, který chcete odeslat, a poté přidáte nový do nové schránky s jiným zámkem. Chcete-li utrácet z nové krabice, potřebujete další klíč.
Dost jednoduché. Můžete také získat trochu variace na typy zámků v systému. Možná některé trezory vyžadují, abyste poskytli více klíčů, a možná, že jiné potřebují, abyste prokázali, že znáte tajemství. Existuje spousta podmínek, které si lidé mohou nastavit.
Naším klíčem je to, co nazýváme scriptSig. Zámek je náš scriptPubKey. Pokud se na tyto komponenty podíváme trochu podrobněji, zjistíme, že se ve skutečnosti skládají z bitů dat a bloků kódu. Když se spojí, vytvoří malý program.
Když provedete transakci, vysíláte tuto kombinaci do sítě. Každý uzel, který jej přijme, zkontroluje program, který mu sdělí, zda je transakce platná. Pokud ne, bude prostě zahozen a uzamčené prostředky nebudete moci utratit.
Šeky (coiny), které držíte, se nazývají nevyužité transakční výstupy (UTXO). Prostředky může použít kdokoli, kdo může poskytnout klíč, který se hodí k zámku. Konkrétně je klíčem scriptSig a zámkem je scriptPubKey.
Pokud jsou UTXO ve vaší peněžence, pravděpodobně budou mít podmínku, která říká, že tyto prostředky může odemknout pouze osoba, která může prokázat vlastnictví tohoto veřejného klíče. Chcete-li jej odemknout, poskytnete scriptSig, který obsahuje digitální podpis, pomocí soukromého klíče, který se mapuje na veřejný klíč zadaný v scriptPubKey. To vše bude brzy jasnější.
Pochopení zásobníku bitcoinů
Skript je to, co je známé jako jazyk založený na zásobníku. To vše znamená, že když čteme sadu instrukcí, umísťujeme je do toho, co lze považovat za svislý sloupec. Seznam A, B, C by například vedl k zásobníku s A dole a C nahoře. Když nám instrukce říkají, abychom něco udělali, operujeme s jedním nebo více prvky začínajícími na vrcholu zásobníku.

Prvky A, B a C se přidávají a „vytahují“ ze zásobníku.
Můžeme rozlišovat mezi daty (věci jako podpisy, hashe a veřejné klíče) a instrukcemi (nebo operačními kódy). Pokyny odstraní data a něco s nimi udělají. Zde je velmi jednoduchý příklad toho, jak může skript vypadat:
<xyz> <md5 hasher> <d16fb36f0911f878998c136191af705e> <check if equal>
V červené barvě máme data a v modré máme operační kódy. Čteme zleva doprava, takže nejprve na zásobník vložíme řetězec <xyz>. Další na řadě je <md5 hasher> operační kód. Ten v bitcoinech neexistuje, ale řekněme, že odstraňuje horní prvek zásobníku (<xyz>) a hashuje jej pomocí algoritmu MD5. Poté se výstup přidá zpět do zásobníku. Výstup je zde d16fb36f0911f878998c136191af705e.
Jaká náhoda! Náš další prvek, který je třeba přidat, je <d16fb36f0911f878998c136191af705e>, takže náš zásobník má nyní dva identické prvky. Nakonec <check if equal> vysune dva prvky z horní části a zkontroluje, zda jsou stejné. Pokud jsou, přidá <1> do zásobníku. Pokud ne, přidá <0>.
Jsme na konci našeho seznamu pokynů. Náš skript mohl selhat dvěma způsoby – pokud by zbývající prvek byl nula, nebo pokud jeden z operátorů způsobil jeho selhání, když nebyly splněny některé podmínky. V tomto příkladu jsme žádné takové operátory neměli a skončíme s nenulovým prvkem (<1>), takže náš skript byl platný. Tato pravidla platí i pro skutečné bitcoinové transakce.
Byl to jen vymyšlený program. Pojďme se nyní podívat na některé skutečné.
Pay-to-Pubkey (P2PK)
Pay-to-Pubkey (P2PK) je neuvěřitelně přímočaré. Zahrnuje zamykání finančních prostředků na konkrétní veřejný klíč. Pokud byste chtěli dostávat prostředky tímto způsobem, poskytli byste odesílateli svůj veřejný klíč, nikoli bitcoinovou adresu.
Úplně první transakce mezi Satoshi Nakamotem a Halem Finneym v roce 2009 byla P2PK. Struktura byla hojně využívána v počátcích bitcoinu, ale v současnosti ji z velké části nahradil Pay-to-Pubkey-Hash (P2PKH).
Uzamykací skript pro transakci P2PK má formát <public key> OP_CHECKSIG. Dost jednoduché. Možná jste uhodli, že OP_CHECKSIG kontroluje podpis podle poskytnutého veřejného klíče. Jako takový bude náš scriptSig jednoduchý <signature>. Pamatujte, že scriptSig je klíčem k zámku.

O moc jednodušší to nebude. Do zásobníku se přidá podpis a poté veřejný klíč. OP_CHECKSIG je zobrazí oba a ověří podpis proti veřejnému klíči. Pokud se shodují, přidá do zásobníku <1>. V opačném případě přidá <0>.
Z důvodů, které rozvedeme v další části, se P2PK již ve skutečnosti nepoužívá.
Pay-to-Pubkey-Hash (P2PKH)
Pay-to-Pubkey-Hash (P2PKH) je nyní nejběžnějším typem transakce. Pokud se nesnažíte stahovat archaický software, vaše peněženka to pravděpodobně dělá ve výchozím nastavení.
scriptPubKey v P2PKH je následující:
OP_DUP OP_HASH160 <public key hash> OP_EQUALVERIFY OP_CHECKSIG
Než představíme scriptSig, pojďme si rozebrat, co nové operační kódy udělají:
OP_DUP
OP_DUP zobrazí první prvek a zduplikuje jej. Potom přidá oba zpět do zásobníku. Obvykle se to dělá tak, že můžeme provést operaci s duplikátem, aniž bychom ovlivnili originál.
OP_HASH160
Tím se objeví první prvek a dvakrát se hashuje. První kolo bude hašováno pomocí algoritmu SHA-256. Výstup SHA-256 je poté hašován pomocí algoritmu RIPEMD-160. Výsledný výstup je přidán zpět do zásobníku.
OP_EQUALVERIFY
OP_EQUALVERIFY kombinuje dva další operátory – OP_EQUAL a OP_VERIFY. OP_EQUAL zobrazí dva prvky a zkontroluje, zda jsou totožné. Pokud ano, přidá 1 do zásobníku. Pokud ne, přidá 0. OP_VERIFY zobrazí horní prvek a zkontroluje, zda je pravdivý (tj. nenulový). Pokud tomu tak není, transakce se nezdaří. Společně OP_EQUALVERIFY způsobí selhání transakce, pokud se dva horní prvky neshodují.
Tentokrát scriptSig vypadá takto:
<podpis> <veřejný klíč>
Chcete-li odemknout výstupy P2PKH, musíte zadat podpis a odpovídající veřejný klíč.

Na výše uvedeném GIFu můžete vidět, co se děje. Příliš se neliší od skriptu P2PK. Právě přidáváme další krok, abychom zkontrolovali, zda veřejný klíč odpovídá hash ve skriptu.
Je tu však něco, co je třeba poznamenat. V zamykacím skriptu P2PKH není veřejný klíč viditelný – vidíme pouze jeho hash. Pokud půjdeme do průzkumníka blockchainu a podíváme se na výstup P2PKH, který nebyl utracen, nemůžeme určit veřejný klíč. Odhalí se pouze tehdy, když se příjemce rozhodne převést prostředky.
To má několik výhod. První je, že hash veřejného klíče je jednoduše snazší předat než úplný veřejný klíč. Satoshi jej uvedl na trh v roce 2009 právě z tohoto důvodu. Hash veřejného klíče je to, co dnes známe jako bitcoinovou adresu.
Druhou výhodou je, že hash veřejného klíče může poskytnout další vrstvu zabezpečení proti kvantovým výpočtům. Protože náš veřejný klíč není znám, dokud prostředky neutratíme, je pro ostatní ještě obtížnější soukromý klíč vypočítat. Aby to získali, museli by obrátit dvě kola hašování (RIPEMD-160 a SHA-256).
➠ Chcete začít s kryptoměnou? Kupte si bitcoiny na Binance!
Pay-to-Script-Hash (P2SH)
Pay-to-Script-Hash (P2SH) byl pro bitcoiny velmi zajímavým vývojem. Umožňuje odesílateli uzamknout finanční prostředky na hash skriptu – nemusí vědět, co skript skutečně dělá. Vezměte následující hash SHA-256:
e145fe9ed5c23aa71fdb443de00c7d9b4a69f8a27a2e4fbb1fe1d0dbfb6583f1
Nemusíte znát vstup hashe, abyste do něj uzamkli prostředky. Utrácející však musí poskytnout skript, který byl použit k jeho hašování, a musí splnit podmínky tohoto skriptu.
Výše uvedený hash byl vytvořen z následujícího skriptu:
<násobit 2> <4> <zkontrolovat, zda se rovná>
Pokud chcete utratit mince vázané na tento scriptPubKey, poskytujete nejen tyto příkazy. Potřebujete také scriptSig, díky kterému bude dokončený skript vyhodnocen jako True. V tomto příkladu se jedná o prvek, který <vynásobíte 2> a získáte výsledek <4>. Samozřejmě to znamená, že náš scriptSig je pouze <2>.
V reálném životě je scriptPubKey pro výstup P2SH:
OP_HASH160 <redeemScript hash> OP_EQUAL
Nejsou zde žádní noví operátoři. Ale máme <redeemScript hash> jako nový prvek. Jak název napovídá, jedná se o hash skriptu, který musíme poskytnout k uplatnění prostředků (tzv. redeemScript). scriptSig se změní v závislosti na tom, co je v redeemScriptu. Obecně však zjistíte, že jde o nějakou kombinaci podpisů a připojených veřejných klíčů, za kterými následuje (povinný) redeemScript:
<signature> <public key> <redeemScript>
Naše hodnocení se trochu liší od provedení zásobníku, které jsme dosud viděli. Děje se to ve dvou částech. První jednoduše zkontroluje, zda jste zadali správný hash.

Všimněte si, že s prvky předcházejícími redeemScript nic neděláme. V tuto chvíli se nepoužívají. Dosáhli jsme konce tohoto miniprogramu a horní prvek je nenulový. To znamená, že je to platné.
Ještě jsme ale neskončili. Síťové uzly rozpoznávají tuto strukturu jako P2SH, takže ve skutečnosti mají prvky scriptSig čekající v jiném zásobníku. Tam se použije podpis a veřejný klíč.
Doposud jsme redeemScript považovali za prvek. Ale teď to bude interpretováno jako instrukce, což může být cokoliv. Vezměme si příklad uzamykacího skriptu P2PKH, kterému musíme poskytnout <signature> a <public key>, které odpovídá <public key hash> uvnitř <redeemScript>.

Jakmile bude váš redeemScript rozšířen, můžete vidět, že máme situaci, která vypadá přesně jako běžná transakce P2PKH. Odtud to prostě spustíte jako normální.
Ukázali jsme zde to, čemu se říká P2SH(P2PKH) skript, ale je nepravděpodobné, že byste našli jeden z těch ve volné přírodě. Nic vám nebrání v jeho vytvoření, ale nepřináší vám žádné další výhody a nakonec zabere více místa v bloku (a tedy stojí více).
P2SH se obecně hodí pro věci jako multisignature nebo transakce kompatibilní se SegWit. Multisig transakce mohou být velmi velké, protože mohou vyžadovat více klíčů. Před implementací Pay-to-Script-Hash by odesílatel musel ve svém zamykacím skriptu uvést všechny možné veřejné klíče.
Ale u P2SH nezáleží na tom, jak složité jsou výdajové podmínky. Hodnota hash redeemScriptu má vždy pevnou velikost. Náklady jsou tedy přeneseny na uživatele, kteří chtějí odemknout zamykací skript.
Kompatibilita SegWit je dalším případem, kdy se P2SH hodí (podrobnosti o tom, jak se liší struktura transakcí, se dostaneme v další části). SegWit byl soft fork, který vedl ke změně blokových/transakčních formátů. Protože se jedná o volitelný upgrade, ne každý software peněženky změny rozpozná. Nezáleží na tom, zda klienti zabalí hash skriptu SegWit do P2SH. Stejně jako u všech transakcí tohoto typu nemusí vědět, jaký bude odemykací redeemScript.
Transakce SegWit (P2WPKH a P2WSH)
Podrobnější úvod do SegWitu naleznete v Průvodci pro začátečníky k segregovaným svědkům.
Abyste pochopili formát transakcí v SegWitu, stačí vědět, že už nemáme jen scriptSig a scriptPubKey. Nyní máme také nové pole zvané svědek. Data, která jsme použili k uchování ve scriptSig, se přesunou do svědka, takže scriptSig je prázdný.
Pokud jste narazili na adresy začínající na „bc1“, nazýváme je nativní pro SegWit (na rozdíl od pouze kompatibilních se SegWit, které začínají „3“, protože se jedná o adresy P2SH).
Pay-to-Witness-Pubkey-Hash (P2WPKH)
Pay-to-Witness-Pubkey-Hash (P2WPKH) je SegWit verze P2PKH. Náš svědek vypadá takto:
<podpis> <veřejný klíč>
Všimněte si, že je to stejné jako scriptSig z P2PKH. Zde je scriptSig prázdný. Mezitím se scriptPubKey podobá následujícímu:
<OP_0> <public key hash>
To vypadá trochu divně, ne? Kde jsou operační kódy, abychom mohli porovnat podpis, veřejný klíč a jeho hash?
Další operátory zde neukazujeme, protože uzly, které přijímají transakci, vědí, co s ní mají dělat na základě délky <public key hash>. Vypočítají délku a pochopí, že musí být spuštěna ve stejném stylu jako dobrá stará transakce P2PKH.
Neupgradované uzly nevědí, jak transakci tímto způsobem interpretovat, ale na tom nezáleží. Podle starých pravidel není žádný svědek, takže čtou prázdný scriptSig a nějaká data. Vyhodnotí to a označí jako platné – pokud jde o ně, kdokoli by mohl utratit výstup. To je důvod, proč je SegWit považován za zpětně kompatibilní soft fork.
Pay-to-Witness-Script-Hash (P2WSH)
Pay-to-Witness-Script Hash (P2WSH) je nový P2SH. Pokud jste se dostali až sem, pravděpodobně si dokážete představit, jak to bude vypadat, ale stejně to projdeme. Naše svědectví je to, co bychom normálně dali do scénářeSig. V P2WSH, který zabalí transakci P2PKH, by to mohlo vypadat například takto:
<podpis 1> <veřejný klíč>
Zde je náš scriptPubKey:
<OP_0> <script hash>
Platí stejná pravidla. Uzly SegWit čtou délku hash skriptu a určují, že se jedná o výstup P2WSH, který je vyhodnocen podobně jako P2SH. Mezitím to staré uzly vidí jako výstup, který může kdokoli utratit.
Závěrečné myšlenky
V tomto článku jsme se dozvěděli něco o stavebních kamenech bitcoinu. Pojďme si je rychle shrnout:
Typ skriptu | Popis |
|---|---|
Pay-to-Pubkey (P2PK) | Uzamkne finanční prostředky na konkrétní veřejný klíč |
Pay-to-Pubkey-Hash (P2PKH) | Uzamkne prostředky na konkrétní hash veřejného klíče (tj. adresu) |
Pay-to-Script-Hash (P2SH) | Uzamkne prostředky na hodnotu hash skriptu, který může poskytnout příjemce |
Pay-to-Witness-Pubkey-Hash (P2WPKH) | Verze SegWit P2PK |
Pay-to-Witness-Script-Hash (P2WSH) | Verze SegWit P2SH |
Jakmile se ponoříte hlouběji do bitcoinu, začnete chápat, proč má tak velký potenciál. Transakce se mohou skládat z mnoha různých složek. Manipulací s těmito stavebními bloky mají uživatelé velkou flexibilitu, pokud jde o nastavení podmínek, jak a kdy mohou být finanční prostředky utraceny.
➠ Máte otázky ohledně skriptu? Zamiřte do Ask Academy!



