Řekněte mi, jak funguje bitcoin #13: P2PKH skript

Řekněte mi, jak funguje bitcoin #13: P2PKH skript

Pohled na fundamentální transakční skript Bitcoinu. Pay to Public Key Hash je nejčastější výstupní skript používaný pro ukládání a posílání Bitcoinů. Transakce platící bitcoinové adrese obsahují P2PKH skripty, které jsou vyřešeny odesláním utrácející transakce pomocí veřejného klíče a digitálního podpisu vytvořeného na základě korespondujícího soukromého klíče.

Obsah: derivace veřejného klíče, skript neutracené a utracené transakce, stack

Adresa tohoto skriptu je P2PKH otisk (hash) veřejného kryptografického klíče převedeného kódováním Base58 (které udělá to, že z adresy odstraní opticky zaměnitelné znaky jako nulu a ó apod.), a hash checksumu (kontrolní součet pro kontrolu tvaru bitcoinové adresy).

Zveřejnění otisku veřejného klíče (pomocí hashovacích funkcí SHA256 a poté RIPEMD160) namísto veřejného klíče samotného ho chrání proti kryptoanalytickým útokům.

Ilustrace k rozdílu skriptů P2PK a P2PKH. Zdroj: https://en.bitcoinwiki.org/wiki/File:PPKH.png

Tento typ skriptu je bezpečnější než Pay to Public Key (P2PK), protože není veřejný klíč zveřejněný na blockchainu, dokud neobdrží první utrácející transakci z této adresy. Co to znamená? Alice odesílá Bitcoiny Bobovi, a místo toho, aby do transakčního skriptu napsala jeho veřejný klíč v čisté podobě a ušetřila tak práci hackerům a kryptoanalytikům, tak tam napíše jen jeho otisk. Ve chvíli, kdy pak tuto „neutracenou“ transakci vyšle na blockchain, jsou totiž data vidět a veřejný klíč příjemce by byl vidět ještě předtím, než by vůbec provedl s novým výstupem nějakou transakci. A kde by byl vidět? Na blockchainu uvnitř podpisového skriptu neutracené transakce. K tomu se ještě vrátím.

Utrácení

K vytvoření a utracení z výstupu zatíženého P2PKH skriptem je třeba poskytnout podpisový (odemykací) skript. Podpisový skript (sigScript) se skládá z podpisu a veřejného klíče (ten základní – existuje více druhů). Ověření vstupu podepsané transakce (resp. neutraceného výstupu jiné transakce) začíná vykonáním podpisového skriptu, až poté P2PKH skriptu, což uvidíte na obrázku ve shrnutí.

Příklad

Alice a Bob

Alice chce Bobovi poslat Bitcoiny.

  • Bob vygeneruje asymetrickou dvojici veřejného a soukromého kryptografického klíče (jak a proč?). Použije k tomu moderní kryptografickou metodu ECDSA, o níž bude specializovaný článek pro skalní příznivce blockchainové matematiky.
  • Veřejný klíč (Public Key, PubKey) je poté kryptograficky zahashován (otisknut), což ho podstatně zkrátí, zjednoduší a lépe zabezpečí proti rekonstrukci soukromého klíče z klíče veřejného (což je extrémně náročné, protože hashování je tzv. jednosměrná funkce).
  • Bob tento hash poskytne Alici ve formě zakódované bitcoinové adresy (kódování Base58 ho převede na opticky přijatelnější verzi, kde se neplete nula s óčkem apod.). To lze provést tzv. jednosměrným médiem tak, aby nebylo možné odesílatele kontaktovat (maximální anonymita) – např. podobně, jako to dělá TOR, nebo jednoduše a neanonymně pomocí naskenování QR kódu (třeba v obchodě na kase přijímající Bitcoiny).
  • Jakmile Alice obdrží adresu, tak ji dekóduje zpět na PubKeyHash a vytvoří první transakci, resp. standardní P2PKH transakční výstup obsahující instrukce, které kohokoliv, kdo prokáže kontrolu odpovídajícího privátního klíče adresy, opravňují výstup utratit. Tento krok se nazývá pubkey script nebo sciptPubKey. Kontrolu nad prostředky tak převede na držitele veřejného a soukromého klíče (na Boba).
  • Aby to mohla udělat, musí transakci podepsat, což funguje zrcadlově úplně stejným způsobem (každý neutracený transakční výstup se může stát vstupem).
  • Nyní transakci vyšle na blockchain jako tzv. UTXO (zkratka pro Unspent Transaction Output – neutracená transakce) a Bobova peněženka ji po chvíli uvidí jako utratitelnou bilanci. Bob totiž počká, až se stane součástí bloku, který bude tak hluboko v blockchainu, aby nešel zfalšovat, a až pak předá Alici zboží, za nějž pomocí Bitcoinů zaplatila.

Kdo kontroluje privátní klíč, tak dokáže manipulovat s prostředky na Bitcoinové adrese (vlastně na svém veřejném klíči, ještě přesněji na jeho otisku), a to tak, že vytvoří k transakci podpis skládající se z jejího obsahu a ze soukromého klíče. Soukromý klíč nikdy nevstupuje na scénu holý. Princip je takový: pokud mi adresa patří, tak jsem si vygeneroval dvojici soukromého a veřejného klíče, a tudíž dokážu pomocí toho soukromého (který je s tím veřejným v kryptografickém vztahu) vytvořit platný podpis. Kryptografický důkaz vlastnictví znamená skrze vlastnictví určité informace – soukromého klíče.

Na tomto faktu stojí drtivá většina všech konceptů pohrávajících si s termíny jako chytrý majetek, decentralizované právo nebo autonomní firma a stroj.

  • Když se Bob někdy v budoucnu rozhodne UTXO utratit, tak vytvoří vstup (tzv. trasnaction identifier, txid), který odkazuje na Alicinu transakci vytvořenou z otisku jeho veřejného klíče), a na specifický výstup, který použila (přes jeho výstupní index).

Výstupní index je specifický výstup z odkazované (Aliciny) transakce.

Poté už jen vytvoří signature script (scriptSig) – data, která uspokojují podmínky, které Alice vložila do své transakce.

Zdroj: https://bitcoin.org/en/transactions-guide

Obrázek výše demonstruje platbu. TX1 Output je neutracená transakce Alice. K utracení dojde vytvořením UTXO pro Boba. Public Key Hash je surová (raw) podoba bitcoinové adresy. Neutracená transakce Alice pro Boba potřebuje čistou podobu veřejného klíče Boba a korespondujícího podpisu vytvořeného pomocí dat transakce a soukromého klíče, který je s tím veřejným v páru.

Bezpečnost

A zde je právě vidět vyšší zabezpečení – transakce Boba vyžaduje jeho veřejný i soukromý klíč. Kdysi těsně po vzniku Bitcoinu existoval pouze P2PK, což bylo značně nebezpečné, protože stačilo prolomit, který soukromý klíč koresponduje k tomu uvedenému na transakci, a bylo. S P2PKH musí útočník prolomit jednosměrnou funkci, která de facto zašifrovala veřejný klíč, a pak ještě prolomit derivaci soukromého klíče z veřejného. Výpočetně exponenciálně mnohem náročnější.

Opakované použití bitcoinové adresy

Pravděpodobně se budu opakovat. Při podepsání a vyslání UTXO od Alice byl na blockchainu zveřejněn pouze hash veřejného klíče příjemce, nikoliv veřejný klíč v čisté podobě.

P2PKH je bezpečnější než P2PK, protože není veřejný klíč příjemce zveřejněn na blockchainu, dokud sám neprovede další utrácející transakci. Pokud je adresa použita znovu po první odchozí transakci (tzn. po vyslání UTXO), bezpečnost klesá na P2PK, protože veřejný klíč je již zveřejněn na blockchainu uvnitř podpisového skriptu první utrácející transakce.

Jakákoliv útrata z adresy už odstraní výhodu zahashovaného veřejného klíče. Posílat si proto cashback při placení zpátky na tu samou adresu, z níž platíte, je nebezpečné (bitcoinové peněženky standardně vytvářejí hromady adres, kam cashback posílají). Na adrese, z níž provádíte transakci/e, by neměl zbýt ani jeden satoshi.

To je velmi technické odůvodnění, proč bychom pro každou transakci měli použít jinou adresu. Možná vás teď napadá, aha, a nedojdou jednou všechny adresy, když se s nimi bude takto plýtvat? Napsal jsem pro tento dotaz speciální článek zde.

Kontext bitcoinové sítě

Role těžařů

Podmínky pro utracení transakce ověřují těžaři, kteří následují bitcoinový protokol a vědí, že platná je jen ta transakce, u níž soukromý a veřejný klíč navzájem odpovídají. Pokud přijde upgrade protokolu, ať od Segregated Witness (SEGWIT – vymoženost pro aktualizaci protokolu bez nutnosti hard forku) nebo od vývojářů Bitcoin Core, znamená to, že těžaři mají nové instrukce, podle nichž ověřovat platnost.

Jak je to s podpisy a soukromím

Alice podepíše, že její Bitcoiny jsou toho, kdo prokáže vlastnictví k Bobově adrese. V tu chvíli, než transakci Bob utratí, tak zná Alicin veřejný klíč k její adrese, kterým Alice neutracenou transakci podepsala.

V širších souvislostech – na blockchainu jsou tisíce UTXO a tisíce veřejných klíčů i podpisů zcela pseudoanonymně (o googlování na blockchainu je tento článek). Bezpečnost soukromí bitcoinové adresy (tedy přiřazení konkrétního člověka ke konkrétní adrese generované konkrétním veřejným klíčem) je vždy nejnižší mezi přímo vázanými stranami odesílatel-příjemce platby. Aby příjemce platby nemohl sledovat další odesílatelovy transakce, je třeba neplatit ostatní věci pořád z té stejné adresy. Pokud si Alice zbytek peněz pošle jinam, Bob nemůže nijak zjistit, zda zaplatila za nějaké zboží nebo zda si poslala Bitcoiny na další z tisícovky adres, k nímž má soukromý klíč.

ScriptSig a PubkeyScript

PubkeyScript jsou instrukce (podmínky) pro utracení výstupu bitcoinové transakce od posledního odesílatele. Říkají, jak může další osoba pomocí tzv. signature scriptu odemknout přijaté Bitcoiny a utratit je. PubkeyScript má dva paramenty:

  • Public Key Hash (bitcoinová adresa)
  • Digital Signature (digitální podpis)

Aby Bob Bitcoiny utratil spending transakcí („utrácecí“ transakcí), tak musí vytvořit tzv. scriptSig, sestávající z jeho veřejného klíče a digitálního podpisu. PubkeyScript udává podmínky pro převod Bitcoinů. V případě P2PKH jsou podmínky: pouze ten, kdo prokáže vlastnictví bitcoinové adresy, dokáže předat Bitcoin dál.

Vysoce technický příklad

Pokud jste s kryptovzděláním začali postupně, tak se nyní můžete zasmát sami sobě. Dostali jste se k detailům, i když na začátku pro vás byly hranaté závorky a anglická slova za hranicí vašeho zájmu. Pustíme se do praktické části, tzn. jak to vypadá „pod pokličkou příkazového řádku“. Kdysi totiž neexistovalo nic jako peněženka na mobil apod. a transakce se skutečně odesílaly přes příkazový řádek jednoduchého bitcoinového klienta.

Programovací jazyk Bitcoinu funguje formou fronty – tzv. stacku (napravo). Hranaté závorky označují, co je třeba zadat.

První fáze

Zdroj: https://medium.com/@bitaps.com/exploring-bitcoin-signing-the-p2pkh-input-b8b4d5c4809c
  1. Ukázka skriptu. Nic není ještě zadáno.
  2. Existuje mnoho druhů podpisů doslova podle toho, co přesně na transakci podepisují (kromě podepsání množství a prokázání vlastnictví vstupu existují i další, jako např. SIGHASH_SINGLE. Na ty se podíváme v dalších dílech.
  3. Vložení veřejného klíče. Bavíme se o „uspokojování“ podmínek Aliciny transakce. Napravo vidíte, že úkon se opět stává součástí stacku.
  4. Funkce OP_DUP duplikuje první položku ve stacku, tedy zadaný veřejný klíč.
  5. Poté ho vyjme ze stacku a zahashuje jednosměrnou funkcí (resp. vytvoří z něj v podstatě bitcoinovou adresu), čímž vytvoří bezpečnostní krok navíc, a to právě o poskytnutím čistého veřejného klíče. Pátý krok trochu detailněji (tzn. tvorba bitcoinové adresy):
    1. Vezmi soukromý klíč.
    2. Vygeneruj z něj pomocí eliptické kryptografie ECDSA veřejný klíč.
    3. Vezmi veřejný klíč a prožeň ho hashovací jednosměrnou funkcí SHA256, výsledek pak ještě skrze RIPEMD160 (proto je v kódu napsáno HASH160) a pak máš hotovo. Toto vše dělá počítač.
Zdroj: https://learnmeabitcoin.com/glossary/public-key-hash160
Jednosměrné funkce (hashovací funkce) hrají v kryptografii naprosto zásadní roli. Obecně fungují jako derivace visacího zámku z klíče – udělat to obráceně je velmi složité. K vytvoření hashe (tedy otisku) jsou třeba jen data veřejného klíče, nic víc. A ano – lze teoreticky uhodnout, co bylo původně zahashováno (je to však extrémně nepravděpodobné).

Důvod, proč je použit RIPEMD, je jednoduchý – kvůli kratšímu zápisu. A proč SHA256? Protože RIPEMD samotný není dostatečně silná hashovací funkce.

Zdroj: https://learnmeabitcoin.com/glossary/public-key-hash160

6. Nakonec se výsledek vloží zpátky do stacku.

Druhá fáze

Zdroj: https://medium.com/@bitaps.com/exploring-bitcoin-signing-the-p2pkh-input-b8b4d5c4809c
  1. Dej do stacku HASH160 (řečí lidskou – adresa, z níž transakce utrácí; tu uvidí Bob ve svém bitcoinovém klientu jako neutracený výstup).
  2. Vezmi dvě vrchní položky stacku, pokud nejsou stejné, ověření selhalo. Právě probíhá ověřovací krok navíc, který u P2PK nenajdeme.
  3. Opět vezmi dvě vrchní položky a ověř elektronický podpis oproti veřejnému klíči.
  4. Pokud je podpis v pořádku, dej do stacku jedničku. Co se teď stalo? Prokázali jste, že můžete utrácet z určité bitcoinové adresy. Vynechávám zdrojový kód s počtem Bitcoinů a s adresou, na níž Bitcoiny posíláte.
  5. Dalším krokem by totiž bylo vytvoření stejných podmínek s adresou člověka, kterému Bitcoiny posíláte – tedy poskytni public key a private key k této adrese. Pokud by příjemce zalhal, mohly by být Bitcoiny navěky zamraženy na adrese, která ještě neexistuje, resp. od které nemá nikdo veřejný klíč, protože si ji nikdo nevygeneroval.

Pokud tedy přijímáte Bitcoiny, nemusíte dělat vůbec nic – jen sledovat blockchain, až se v něm objeví UTXO s vaší adresou.

Adresa a adresa

Na začátku jsem říkal, že je bitcoinová adresa ještě kódována pro vizuálně výhodnější zápis a že obsahuje chcecksum, prefix verze atd. To je pravda, ale Bitcoin nakonec všechny tyto ozdoby odebere a pracuje s PubkeyHashem (surová tzv. „raw“ verze bitcoinové adresy). Detailněji se na to určitě zaměříme v dalších dílech, abyste z toho pedantství neměli v hlavě nepořádek.

Shrnutí

Nejprve bych zopakoval veškeré odbornější termíny a zkratky, s nimiž se setkáte v drtivé většině dokumentů o kryptu.

  • Public key hash – veřejný klíč prohnaný funkcí HASH160
  • Adresa – veřejný klíč prohnaný funkcí HASH160 a zakódovaný Basem58
  • TX – zkratka pro bitcoinovou transakci
  • UTXO – neutracená transakce
  • P2PK skript – Pay to Public Key
  • P2PKH skript – Pay to Public Key Hash (vyšší bezpečnost)
  • SkriptSig – skript, který „uspokojuje utrácecí podmínky transakce
  • TXID – transakční vstup

Aby byla vidět exekuce jednotlivých částí P2PKH skriptu, tak v galerii níže je více objektově orientovaný obrázek.

p2pkh-step1
« 1 z 14 »

Závěr

Pokud byste měli jakékoliv dotazy, neváhejte napsat komentář nebo odeslat dotazový formulář. Udělám vše proto, abych Vám pomohl s pochopením krypta.

Zdroje

https://medium.com/@bitaps.com/exploring-bitcoin-signing-the-p2pkh-input-b8b4d5c4809c – proces pohledem skriptovacího jazyka Bitcoinu

https://en.bitcoinwiki.org/wiki/Pay-to-Pubkey_Hash – bitcoinové transakce obecněji

https://en.bitcoin.it/wiki/Transaction – transakční index

https://medium.com/@genesisblockhk/crypto-classroom-lesson-5-p2pkh-952e29d55b5 – detailnější pohled na načasování úkonů při vytváření platby

https://learnmeabitcoin.com/glossary/public-key-hash160 – detailní pohled na hashování veřejného klíče

https://learnmeabitcoin.com/glossary/p2pkh – zdroj perfektní animace, kterou jsem rozfázoval

 

Sdílet příspěvek

Napsat komentář

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..