transakce

chaos | entropie | generátor | hash | mmBIP32-84 | transakce | blockchain | halving |


Bitcoinová transakce je proces, při kterém jsou bitcoiny převedeny z jedné adresy na druhou v rámci blockchainu. Transakce zahrnuje vstupy, což jsou reference na předchozí transakce, kde bitcoiny původně pocházejí, a výstupy, což jsou nové adresy, na které jsou bitcoiny posílány. Každá transakce je digitálně podepsána soukromým klíčem odesílatele, což zajišťuje autentizaci a integritu. Transakce jsou vysílány do bitcoinové sítě, kde jsou ověřovány uzly a poté zařazeny do bloku těžaři. Těžaři validují transakce tím, že řeší kryptografický problém (Proof of Work), kdo ho vyřeší nejdříve, má právo přidat blok do blockchainu (a získává také odměnu, ve formě nově vzniklých bitcoinů). Tento proces zabezpečuje síť proti dvojímu utrácení a zajišťuje nezměnitelnost transakcí.



| transakce v první tisícovce bloků | BTCscripts | learnBTC | equalverify | agamapoint.com/blocks/blocks-1-1000-v01.html

transaction – https://en.bitcoin.it/wiki/Transaction


HMAC – Keyed-hash Message Authentication Code
je typ autentizačního kódu zprávy počítané s použitím kryptografické HASHovací funkce v kombinaci s tajným šifrovacím klíčem https://en.wikipedia.org/wiki/HMAC
UTXO – Unspent transaction output – neutracené transakční výstupy


 {
  'txid': '000000...000000000000',
  'vout': 4294967295,
  'prevout': None,
  'scriptsig': '04ffff001d0102',
  'scriptsig_asm': 'OP_PUSHBYTES_4 ffff001d OP_PUSHBYTES_1 02',
  'is_coinbase': True,
  'sequence': 4294967295
}

vstup transakce:
txid: „Transaction ID“ (ID transakce) je unikátní identifikátor pro danou transakci. V tomto případě je txid samé nuly, což naznačuje, že jde o coinbase transakci.
vout: „Output Index“ (index výstupu) je číslo, které označuje konkrétní výstup předchozí transakce. 4294967295 (hexadecimálně 0xFFFFFFFF) se používá u coinbase transakcí.
prevout: „Previous Output“ (předchozí výstup) je výstup z předchozí transakce, který je zde prázdný (None), protože jde o coinbase transakci.
scriptsig: „Script Signature“ je skript, který poskytuje důkaz, že majitel výstupu souhlasí s touto transakcí. V případě coinbase transakce zde vidíme speciální hodnotu 04ffff001d0102.
scriptsig_asm: Assemblerová reprezentace scriptsig.

  • OP_PUSHBYTES_4 ffff001d: Příkaz pro vložení 4 bajtů (ffff001d).
  • OP_PUSHBYTES_1 02: Příkaz pro vložení 1 bajtu (02).

is_coinbase: Indikuje, že tato transakce je coinbase (nově vytěžené bitcoiny).
sequence: Hodnota 4294967295 (hexadecimálně 0xFFFFFFFF) znamená, že sequence číslo není použito.

{
  'scriptpubkey': '4104d46c...725bac',
  'scriptpubkey_asm': 'OP_PUSHBYTES_65 04d46c4968bde...725b OP_CHECKSIG',
  'scriptpubkey_type': 'p2pk',
  'value': 5000000000
}

výstup transakce:
scriptpubkey: „Script Public Key“ je skript, který určuje podmínky, za kterých může být výstup utracen. Tento konkrétní skript obsahuje veřejný klíč a OP_CHECKSIG operátor.
scriptpubkey_asm: Assemblerová reprezentace scriptpubkey.

  • OP_PUSHBYTES_65: Příkaz pro vložení 65 bajtů (04d46c...725bac).
  • OP_CHECKSIG: Operátor, který zajišťuje, že podpis transakce odpovídá veřejnému klíči.

scriptpubkey_type: Typ scriptpubkey, zde p2pk (pay-to-public-key), což znamená, že bitcoiny lze utratit podpisem odpovídajícím tomuto veřejnému klíči.
value: Hodnota výstupu v satoshi. 5000000000 satoshi je 50 BTC, což byla odměna za vytěžení bloku v počátečních fázích bitcoinu.


{
  'txid': '0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9',
  'vout': 0,
  'prevout': {
    'scriptpubkey': '410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac',
    'scriptpubkey_asm': 'OP_PUSHBYTES_65 0411db93e1...60bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG',
    'scriptpubkey_type': 'p2pk',
    'value': 5000000000
  },
  'scriptsig': '47304402204e45e1...768d1d0901',
  'scriptsig_asm': 'OP_PUSHBYTES_71 304402204e45e169.....68d1d0901',
  'is_coinbase': False,
  'sequence': 4294967295
}

vstup transakce:
txid: ID transakce, ze které pochází tento vstup. 0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9 je unikátní identifikátor předchozí transakce.
vout: Index výstupu v předchozí transakci, který je použit jako vstup v této transakci. V tomto případě je to výstup s indexem 0.
prevout: Obsahuje informace o výstupu z předchozí transakce, který je zde použit jako vstup.

  • scriptpubkey: Skript veřejného klíče předchozího výstupu.
  • scriptpubkey_asm: Assemblerová reprezentace scriptpubkey.
  • scriptpubkey_type: Typ scriptpubkey, zde p2pk (pay-to-public-key).
  • value: Hodnota předchozího výstupu v satoshi (5000000000 satoshi = 50 BTC).

scriptsig: Skript, který poskytuje důkaz, že majitel výstupu souhlasí s touto transakcí. Obsahuje podpis.
scriptsig_asm: Assemblerová reprezentace scriptsig.

  • OP_PUSHBYTES_71: Příkaz pro vložení 71 bajtů (3044...d0901).

is_coinbase: Indikuje, že tato transakce není coinbase (nově vytěžené bitcoiny).
sequence: Hodnota 4294967295 (hexadecimálně 0xFFFFFFFF) znamená, že sequence číslo není použito.

[
  {
    'scriptpubkey': '4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac',
    'scriptpubkey_asm': 'OP_PUSHBYTES_65 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c OP_CHECKSIG',
    'scriptpubkey_type': 'p2pk',
    'value': 1000000000
  },
  {
    'scriptpubkey': '410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac',
    'scriptpubkey_asm': 'OP_PUSHBYTES_65 0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG',
    'scriptpubkey_type': 'p2pk',
    'value': 4000000000
  }
]

výstup transakce:

  • scriptpubkey: Skript veřejného klíče, který určuje podmínky, za kterých může být výstup utracen. Obsahuje veřejný klíč a OP_CHECKSIG operátor.
  • scriptpubkey_asm: Assemblerová reprezentace scriptpubkey.
    • OP_PUSHBYTES_65: Příkaz pro vložení 65 bajtů.
    • OP_CHECKSIG: Operátor, který zajišťuje, že podpis transakce odpovídá veřejnému klíči.
  • scriptpubkey_type: Typ scriptpubkey, zde p2pk (pay-to-public-key).
  • value: Hodnota výstupu v satoshi.
    • První výstup má hodnotu 1000000000 satoshi (10 BTC).
    • Druhý výstup má hodnotu 4000000000 satoshi (40 BTC).

Shrnutí

Tato transakce přebírá 50 BTC z předchozí transakce (identifikované txid a vout) a rozděluje je na dva výstupy: 10 BTC (první výstup) a 40 BTC (druhý výstup). Skripty veřejného klíče (scriptpubkey) definují podmínky, za kterých mohou být tyto prostředky utraceny v budoucích transakcích.


Běžné Bitcoin opcodes:

  1. OP_DUP – Zkopíruje horní prvek zásobníku.
    OP_DUP
  2. OP_HASH160 – Zpracuje RIPEMD-160 hash z SHA-256 hashe horního prvku zásobníku.
    OP_HASH160
  3. OP_EQUAL – Porovná dva prvky na vrcholu zásobníku a vrátí true, pokud jsou stejné.
    OP_EQUAL
  4. OP_EQUALVERIFY – Kombinuje OP_EQUAL a OP_VERIFY, což znamená, že porovná dva prvky na vrcholu zásobníku a pokud nejsou stejné, script selže.
    OP_EQUALVERIFY
  5. OP_CHECKSIG – Zkontroluje, zda podpis odpovídá veřejnému klíči a transakčnímu hash.
    OP_CHECKSIG
  6. OP_CHECKMULTISIG – Zkontroluje více podpisů proti sadě veřejných klíčů.
    OP_CHECKMULTISIG
  7. OP_VERIFY – Zkontroluje horní prvek zásobníku a pokud není pravdivý, skript selže.
    OP_VERIFY

Příklad skriptu P2PKH (Pay-to-PubKey-Hash)

Pay-to-PubKey-Hash (P2PKH) je jeden z nejběžnějších Bitcoinových skriptů, který říká, že k utracení výstupu musíte poskytnout veřejný klíč a podpis, které odpovídají hash veřejného klíče.

OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG

Příklad skriptu P2SH (Pay-to-Script-Hash)

Pay-to-Script-Hash (P2SH) umožňuje vytváření složitějších skriptů, které se provádějí při utracení. Místo hash veřejného klíče se použije hash skriptu.

OP_HASH160 <Redeem Script Hash> OP_EQUAL

Příklad skriptu Multisig

Multisig (vícepodpisová) transakce vyžaduje, aby bylo více podpisů poskytováno k utracení výstupu.

OP_1 <Public Key 1> <Public Key 2> <Public Key 3> OP_3 OP_CHECKMULTISIG

Jak funguje Bitcoinový skript

Každá Bitcoinová transakce má dva základní typy skriptů:

  1. ScriptPubKey (Output Script): Tento skript je součástí výstupu (output) transakce. Definuje podmínky, za kterých může být tento výstup utracen. ScriptPubKey je často nazýván „zámek“.
  2. ScriptSig (Input Script): Tento skript je součástí vstupu (input) transakce. Obsahuje data, která odemykají výstup. ScriptSig je často nazýván „klíč“.

Kdy a kde se provádí Bitcoinový skript

Skript se provádí během ověřování transakce, kdy se kontroluje, zda transakce splňuje podmínky stanovené předchozím výstupem. Proces provádění skriptu se skládá ze dvou kroků:

  1. Sestavení skriptu: Když se vytvoří nová transakce, každý vstup obsahuje ScriptSig, který se sestaví se ScriptPubKey z předchozí transakce. ScriptSig je umístěn před ScriptPubKey, a výsledkem je kompletní skript.
  2. Provádění skriptu: Sestavený skript je prováděn virtuálním strojem Bitcoin Script VM. Pokud skript provede bez chyb a vrátí true, transakce je považována za platnou. Pokud dojde k chybě nebo vrátí false, transakce je neplatná.

Pojem „umístění na zásobník“ je klíčovým konceptem v Bitcoinovém skriptovacím jazyce. Zde je přesné vysvětlení:

Zásobník (Stack) v Bitcoinovém skriptování

Zásobník je datová struktura, která se používá v Bitcoinovém skriptování k ukládání a manipulaci s daty a mezivýsledky během provádění skriptu. Zásobník je obvykle implementován jako LIFO (Last In, First Out) struktura, což znamená, že poslední položka umístěná na zásobník je první, která bude odebrána.

Umístění na zásobník

Když říkáme, že něco (například data, operátor, výsledek operace) se umístí na zásobník, myslíme tím, že daná položka je přidána na vrchol zásobníku. V Bitcoinovém skriptování může být na zásobník umístěno několik různých typů dat:

  1. Data: Bajty reprezentující například podpis, veřejný klíč nebo hash.
  2. Operátory (opcode): Speciální instrukce, které definují operace, které se mají provést (např. OP_DUP, OP_EQUALVERIFY).
  3. Mezivýsledky: Výsledky operací, které jsou dočasně uloženy na zásobníku a mohou být později použity v dalších operacích.

Proces umístění na zásobník v praxi

Například, pokud máme Bitcoinový skript
OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG,
proces umístění na zásobník by mohl probíhat následovně:

  1. OP_DUP: Zkopíruje horní prvek zásobníku (duplikuje ho).
  2. OP_HASH160: Vypočte hash z veřejného klíče a umístí ho na vrchol zásobníku.
  3. <Public Key Hash>: Veřejný klíč je nahrazen jeho hashem na zásobníku.
  4. OP_EQUALVERIFY: Porovnává horní dva prvky zásobníku (hash a hash) a potvrzuje jejich shodu.
  5. OP_CHECKSIG: Ověřuje, že podpis transakce odpovídá veřejnému klíči.

Každá operace (opcode) a data jsou postupně umisťovány na zásobník, kde jsou poté zpracovávány podle požadavků skriptu.

Důležitost zásobníku v Bitcoinovém skriptování

Správné použití zásobníku je klíčové pro bezpečné a efektivní provádění Bitcoinových transakcí. Zásobník je prostředkem, jak manipulovat s daty a operátory, které definují podmínky utracení výstupů transakcí. Chyby v manipulaci se zásobníkem mohou vést k neplatným transakcím nebo zranitelnostem v bezpečnosti Bitcoinové sítě.



Přehled Taproot a Tapscript

Taproot je nová funkce Bitcoinu, která byla aktivována prostřednictvím soft forku v listopadu 2021. Taproot zlepšuje soukromí a efektivitu Bitcoinu tím, že kombinuje schopnosti Schnorr podpisů a MAST (Merkelized Abstract Syntax Tree).

Tapscript je nový skriptovací jazyk, který je součástí Taprootu a umožňuje složitější a efektivnější skriptování transakcí.

FFtx | …

OP_PUSHBYTES_32 0906446...19d516b43f00c720
OP_CHECKSIGVERIFY
OP_PUSHBYTES_32 58b199...cbfccc95068625f
OP_CHECKSIGVERIFY
OP_PUSHBYTES_32 b6f8942cd6d...ab87114b
OP_CHECKSIG

Tento Tapscript obsahuje tři veřejné klíče a tři podpisy.

  1. OP_PUSHBYTES_32 0906446c605a3d49e097b3804f92f518b4e3fea5354711dc19d516b43f00c720: Toto je první veřejný klíč (32 bajtů dlouhý).
  2. OP_CHECKSIGVERIFY: Tento operátor ověří podpis pomocí prvního veřejného klíče a pokud je podpis platný, pokračuje ve skriptu. Pokud ne, transakce je neplatná.
  3. OP_PUSHBYTES_32 58b1995fca8269039e3771953445a3b207c4dad0aaf85ff64cbfccc95068625f: Toto je druhý veřejný klíč (32 bajtů dlouhý).
  4. OP_CHECKSIGVERIFY: Tento operátor ověří podpis pomocí druhého veřejného klíče a pokud je podpis platný, pokračuje ve skriptu.
  5. OP_PUSHBYTES_32 b6f8942cd6dc8706e710f5ed6a11095fb64ec654d0d2682abb990f67ab87114b: Toto je třetí veřejný klíč (32 bajtů dlouhý).
  6. OP_CHECKSIG: Tento operátor ověří podpis pomocí třetího veřejného klíče a pokud je podpis platný, transakce je považována za platnou.



nSequence 0xfffffffd

Hodnota nSequence určuje časové nebo jiné podmínky, za kterých může být transakce zahrnuta do bloku. Hodnota 0xfffffffd znamená, že se nepoužívají žádné zvláštní podmínky pro zamčení (locktime).

Předchozí výstupní skript (Previous Output Script)

OP_PUSHNUM_1 OP_PUSHBYTES_32 bcf4e88bd0ed48373025ee12ecde569b691266d72ddde0f3fcb1f9b3b84f25e4

Toto je skript, který byl použitý k určení předchozího výstupu, který se utrácí v této transakci.

  1. OP_PUSHNUM_1: Toto je operátor, který na zásobník umístí číslo 1.
  2. OP_PUSHBYTES_32 bcf4e88bd0ed48373025ee12ecde569b691266d72ddde0f3fcb1f9b3b84f25e4: Toto je hash veřejného klíče (32 bajtů dlouhý).


Předchozí typ výstupu (Previous Output Type)

V1_P2TR

Toto označuje, že předchozí výstup byl typu Pay-to-Taproot (P2TR), což znamená, že využívá Taproot skriptování.

Jak Tapscript funguje

  1. Vytvoření transakce: Uživatel vytvoří transakci, která zahrnuje vstupy a výstupy, a přiřadí k nim odpovídající skripty.
  2. Provádění skriptu: Když je transakce prováděna, Bitcoinový uzel spustí skript, který ověří podpisy a další podmínky.
  3. Ověření podpisů: Skript provede řadu ověřovacích operací (jako je OP_CHECKSIGVERIFY), které zajistí, že podpisy odpovídají veřejným klíčům a že transakce splňuje všechny stanovené podmínky.
  4. Výsledek: Pokud všechny operace ve skriptu proběhnou úspěšně a všechny podpisy jsou platné, transakce je považována za platnou a může být zahrnuta do bloku.

Zásobník v akci

Zde je, jak by mohl vypadat zásobník během provádění tohoto Tapscriptu:

  1. Začátek: Zásobník je prázdný.
  2. Po OP_PUSHBYTES_32 0906446c…: Na zásobníku je první veřejný klíč.
  3. Po OP_CHECKSIGVERIFY: Ověřený podpis je odstraněn a skript pokračuje.
  4. Po OP_PUSHBYTES_32 58b1995f…: Na zásobníku je druhý veřejný klíč.
  5. Po OP_CHECKSIGVERIFY: Ověřený podpis je odstraněn a skript pokračuje.
  6. Po OP_PUSHBYTES_32 b6f8942c…: Na zásobníku je třetí veřejný klíč.
  7. Po OP_CHECKSIG: Ověřený podpis je odstraněn a pokud je platný, transakce je úspěšná.

Závěr

Tato transakce je složitější než základní Bitcoinové transakce, protože využívá nových funkcí Taprootu a Tapscriptu. Pomocí těchto nových technologií Bitcoin umožňuje efektivnější a soukromější transakce s vyšší flexibilitou a funkcionalitou.



V1_P2TR: Význam a kontext

  • V1: Označuje verzi Bitcoinového skriptu nebo transakce. Verze 1 je specifická pro Taproot transakce.
  • P2TR (Pay-to-Taproot): Typ výstupu transakce, který kombinuje výhody Schnorr podpisů a MAST (Merkelized Abstract Syntax Tree).

Jak funguje V1_P2TR

  1. Veřejný klíč Taprootu:
    • P2TR výstupy obsahují jediný 32-bajtový veřejný klíč Taprootu. Tento klíč může být přímo veřejný klíč nebo kořenový hash stromu skriptů (MAST).
  2. Schnorr podpisy:
    • Taproot využívá Schnorr podpisy, které jsou kratší a rychlejší než tradiční ECDSA podpisy používané v předchozích verzích Bitcoinových transakcí.
    • Schnorr podpisy umožňují vytvářet agregované podpisy (muSig), což zvyšuje soukromí a snižuje velikost transakcí.
  3. MAST (Merkelized Abstract Syntax Tree):
    • MAST umožňuje zakódovat více možných skriptů do jednoho stromu a odhalit pouze ten konkrétní skript, který je potřeba k utrácení.
    • To zvyšuje soukromí, protože ostatní skripty zůstávají skryté.

Proces provádění V1_P2TR transakce

  1. Vytvoření výstupu:
    • Když je vytvořen P2TR výstup, je zahrnut Taproot veřejný klíč (32 bajtů).
    • Výstup je identifikován jako V1 (verze 1) P2TR.
  2. Vytvoření vstupu:
    • Když se utrácí P2TR výstup, jsou zahrnuty podpisy vytvořené pomocí Schnorr schématu.
    • Pokud výstup odkazuje na MAST, musí být odhalen konkrétní skript a cesta k němu.
  3. Ověření transakce:
    • Bitcoinové uzly ověřují Schnorr podpisy a provádějí odpovídající skript.
    • Pokud je skript platný a všechny podpisy jsou ověřeny, transakce je považována za platnou.

Příklad V1_P2TR transakce

Představme si, že máme transakci s V1_P2TR výstupem a chceme ji utratit:

  1. Výstup:
    • OP_PUSHNUM_1
    • OP_PUSHBYTES_32 <Taproot veřejný klíč>
  2. Vstup:
    • nSequence – 0xfffffffd (nejsou žádné zvláštní podmínky pro zamčení)
    • Skript, který zahrnuje:
      • OP_PUSHBYTES_32 <podpis>
      • OP_CHECKSIG

Výhody V1_P2TR

  • Zvýšené soukromí: Použití MAST umožňuje skrýt nevyužité skripty, čímž se zvyšuje soukromí.
  • Vyšší efektivita: Schnorr podpisy jsou kratší a rychlejší na ověřování, což zlepšuje škálovatelnost.
  • Flexibilita: Možnost kombinovat více skriptů a odhalit pouze ten potřebný poskytuje vyšší flexibilitu.

Shrnutí

V1_P2TR je pokročilý typ Bitcoinové transakce, který využívá nové funkce Taprootu a Tapscriptu. Přináší zlepšení v oblasti soukromí, efektivity a flexibility transakcí, což zvyšuje celkovou užitnost a bezpečnost Bitcoinové sítě.


.:.:.


Napsat komentář