chaos | entropie | generátor| hash | mmBIP32-84 | adresy | 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í.
https://developer.bitcoin.org/devguide/transactions.html
Input: Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6 Index: 0 scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d10 90db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501
Output: Value: 5000000000 scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549d OP_EQUALVERIFY OP_CHECKSIG
| transakce v první tisícovce bloků | BTCscripts | learnBTC | equalverify | agamapoint.com/blocks/blocks-1-1000-v01.html
transaction – https://en.bitcoin.it/wiki/Transaction
P2PK
P2PK (Pay to Public Key) je historicky nejstarší metoda, která umožňuje posílat bitcoiny přímo na veřejný klíč. Nevýhodou této metody je, že veřejný klíč příjemce je odhalen už při samotném přijetí prostředků, což snižuje bezpečnost a soukromí.
Bezpečnost: P2PK odhaluje veřejný klíč příjemce už při vytváření transakce. To znamená, že útočník, který by našel slabinu v eliptické křivce secp256k1, by mohl teoreticky napadnout klíč dříve, než by byl utracen. P2PKH místo toho uchovává veřejný klíč skrytý až do okamžiku, kdy je transakce utracena, což výrazně zvyšuje bezpečnost.
Adresa P2PK není ve skutečnosti standardní „adresa“ jako taková, ale přímo veřejný klíč (který je obvykle 65 bajtů dlouhý) a je přímo součástí skriptu. Veřejný klíč je tedy viditelný již při odesílání transakce!
<public key> OP_CHECKSIG
Při utrácení prostředků je nutné předložit podpis, který odpovídá tomuto veřejnému klíči.
P2PKH [1]
P2PKH (Pay to Public Key Hash) vznikl jako vylepšení, které zachovává veřejný klíč skrytý až do okamžiku, kdy jsou prostředky utraceny, a zároveň zmenšuje velikost transakce.
První platba typu P2PKH se uskutečnila 15. července 2010 (blok 74850), což bylo dříve, než byly formálně předloženy BIPy 13, 32, a 44.
BIP13 byl předložen jako první z těchto tří BIPů v roce 2012, ačkoliv nepřímo podporoval P2PKH adresy standardizací formátu Base58Check.
BIP32 a BIP44 se týkají hierarchických deterministických peněženek, což je technologie, která usnadňuje správu klíčů a adres, včetně P2PKH adres, ale byly předloženy až po tom, co se P2PKH adresy běžně používaly.
Adresa začínající číslem 1 je standardní adresa typu „Pay to Public Key Hash„. Vzniká zahashováním veřejného klíče pomocí SHA-256 a poté RIPEMD-160, přidáním prefixu verze (0x00) a následným zakódováním do formátu Base58Check.
BIP13 | BIP32 | BIP44
Platby na P2PKH jsou směrovány „na hash“ veřejného klíče, což znamená, že veřejný klíč zůstává skrytý až do chvíle, kdy jsou prostředky utraceny.
Adresa P2PKH je také kratší než veřejný klíč použitý v P2PK, což šetří místo v blockchainu.
OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
Při utrácení prostředků musí příjemce poskytnout veřejný klíč (který odpovídá hashi) a podpis, který odpovídá tomuto veřejnému klíči.
scripty:
Alice: OP_DUP OP_HASH160 <Bob_public_key_hash> OP_EQUALVERIFY OP_CHECKSIG Bob: OP_DUP OP_HASH160 <Charlie_public_key_hash> OP_EQUALVERIFY OP_CHECKSIG --> <Bob_signature> <Bob_public_key> OP_DUP OP_HASH160 <Bob_public_key_hash> OP_EQUALVERIFY OP_CHECKSIG
Směrování na hash veřejného klíče: P2PKH adresy obsahují hash veřejného klíče příjemce, což zvyšuje bezpečnost a efektivitu.
Odhalení veřejného klíče při utracení: Při utrácení prostředků musí příjemce poskytnout svůj veřejný klíč a podpis, které jsou zahrnuty ve vstupním skriptu transakce.
Proces ověření: Bitcoinový skriptový systém ověří, že hash poskytnutého veřejného klíče odpovídá hashi uloženému ve výstupním skriptu, a že podpis odpovídá tomuto veřejnému klíči.
https://learnmeabitcoin.com/technical/script/p2pkh/
P2SH [3]
Adresa začínající číslem 3 je adresa typu „Pay to Script Hash„. Skript vytvořený příjemcem je zahashován pomocí SHA-256 a RIPEMD-160. Tento hash je pak zakódován do formátu Base58Check s prefixem verze (0x05).
| BIP16 |
Definition:
OP_HASH160 <Redeem Script Hash> OP_EQUAL
Redeem Script Hash: 20-byte-hash-value
scriptSig: [signature] {[pubkey] OP_CHECKSIG}
scriptPubKey: OP_HASH160 [20-byte-hash of {[pubkey] OP_CHECKSIG} ] OP_EQUAL
Pay-to-Script-Hash 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žívá hash skriptu.
P2WPKH [bc1q]
Adresa začínající „bc1q“ je SegWit adresa typu „Pay to Witness Public Key Hash„. Je zakódována do formátu Bech32 a používá witness program (0x00) o délce 20 bajtů. Umožňuje efektivní a levnější transakce než klasické P2PKH.
BIP141 | BIP173
P2TR [bc1p]
Adresa začínající „bc1p“ je SegWit adresa využívající Taproot. Je zakódována do formátu Bech32m a má specifický witness program (0x01) o délce 32 bajtů. Využívá schnorr podpisy a umožňuje efektivní a soukromé transakce.
BIP340 | BIP341 | BIP342
„prehistoricky“ se používaly (dost často jen „jednorázově“) adresy generované z WIF (wallet import format)
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
…
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
prvních několik transakcí: https://www.agamapoint.com/blocks/blocks-1-1000-v01.html
{ '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:
- OP_DUP – Zkopíruje horní prvek zásobníku.
OP_DUP
- OP_HASH160 – Zpracuje
RIPEMD-160
hash zSHA-256
hashe horního prvku zásobníku.OP_HASH160
- OP_EQUAL – Porovná dva prvky na vrcholu zásobníku a vrátí
true
, pokud jsou stejné.OP_EQUAL
- OP_EQUALVERIFY – Kombinuje
OP_EQUAL
aOP_VERIFY
, což znamená, že porovná dva prvky na vrcholu zásobníku a pokud nejsou stejné, script selže.OP_EQUALVERIFY
- OP_CHECKSIG – Zkontroluje, zda podpis odpovídá veřejnému klíči a transakčnímu hash.
OP_CHECKSIG
- OP_CHECKMULTISIG – Zkontroluje více podpisů proti sadě veřejných klíčů.
OP_CHECKMULTISIG
- OP_VERIFY – Zkontroluje horní prvek zásobníku a pokud není pravdivý, skript selže.
OP_VERIFY
úplný přehled: https://en.bitcoin.it/wiki/Script
Jak funguje Bitcoinový skript
Každá Bitcoinová transakce má dva základní typy skriptů:
- 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“.
- 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ů:
- 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.
- 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:
- Data: Bajty reprezentující například podpis, veřejný klíč nebo hash.
- Operátory (opcode): Speciální instrukce, které definují operace, které se mají provést (např. OP_DUP, OP_EQUALVERIFY).
- 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 probíhá následovně:
OP_DUP
: Zkopíruje horní prvek zásobníku (duplikuje ho).OP_HASH160
: Vypočte hash z veřejného klíče a umístí ho na vrchol zásobníku.<Public Key Hash>
: Veřejný klíč je nahrazen jeho hashem na zásobníku.OP_EQUALVERIFY
: Porovnává horní dva prvky zásobníku (hash a hash) a potvrzuje jejich shodu.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.
- OP_PUSHBYTES_32 0906446c605a3d49e097b3804f92f518b4e3fea5354711dc19d516b43f00c720: Toto je první veřejný klíč (32 bajtů dlouhý).
- 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á.
- OP_PUSHBYTES_32 58b1995fca8269039e3771953445a3b207c4dad0aaf85ff64cbfccc95068625f: Toto je druhý veřejný klíč (32 bajtů dlouhý).
- OP_CHECKSIGVERIFY: Tento operátor ověří podpis pomocí druhého veřejného klíče a pokud je podpis platný, pokračuje ve skriptu.
- OP_PUSHBYTES_32 b6f8942cd6dc8706e710f5ed6a11095fb64ec654d0d2682abb990f67ab87114b: Toto je třetí veřejný klíč (32 bajtů dlouhý).
- 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.
- OP_PUSHNUM_1: Toto je operátor, který na zásobník umístí číslo 1.
- 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
- Vytvoření transakce: Uživatel vytvoří transakci, která zahrnuje vstupy a výstupy, a přiřadí k nim odpovídající skripty.
- Provádění skriptu: Když je transakce prováděna, Bitcoinový uzel spustí skript, který ověří podpisy a další podmínky.
- 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.
- 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:
- Začátek: Zásobník je prázdný.
- Po OP_PUSHBYTES_32 0906446c…: Na zásobníku je první veřejný klíč.
- Po OP_CHECKSIGVERIFY: Ověřený podpis je odstraněn a skript pokračuje.
- Po OP_PUSHBYTES_32 58b1995f…: Na zásobníku je druhý veřejný klíč.
- Po OP_CHECKSIGVERIFY: Ověřený podpis je odstraněn a skript pokračuje.
- Po OP_PUSHBYTES_32 b6f8942c…: Na zásobníku je třetí veřejný klíč.
- 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
- 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).
- 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í.
- 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
- 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.
- 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.
- 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:
- Výstup:
OP_PUSHNUM_1
OP_PUSHBYTES_32 <Taproot veřejný klíč>
- 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ě.
GhatGPT-01: 2024/09
[{'txid': '0000000000000000000000000000000000000000000000000000000000000000', 'vout': 4294967295, 'prevout': None, 'scriptsig': '04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73', 'scriptsig_asm': 'OP_PUSHBYTES_4 ffff001d OP_PUSHBYTES_1 04 OP_PUSHBYTES_69 5468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73', 'is_coinbase': True, 'sequence': 4294967295}]
[{'scriptpubkey': '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', 'scriptpubkey_asm': 'OP_PUSHBYTES_65 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG', 'scriptpubkey_type': 'p2pk', 'value': 5000000000}]
Vstupní část transakce (Input):
- txid:
0000000000000000000000000000000000000000000000000000000000000000
- Toto je hash předchozí transakce. V případě coinbase transakce (první transakce v bloku, která generuje nové mince) je tento hash nulový, protože není žádná předchozí transakce.
- vout:
4294967295
- Toto je index výstupu předchozí transakce. Hodnota
4294967295
(což je maximální 32bitové číslo, také zapsané jako0xffffffff
) se používá pro coinbase transakce.
- Toto je index výstupu předchozí transakce. Hodnota
- prevout:
None
- Neexistuje žádný předchozí výstup, na který by se tato transakce odkazovala.
- scriptsig:
04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
- Toto je podpisový skript (scriptSig), který obvykle obsahuje podpis a veřejný klíč. V případě coinbase transakce obsahuje libovolná data, často označovaná jako „coinbase data“.
- scriptsig_asm: Sestavený skript v assembleru, ukazuje operace prováděné ve scriptSig.
- is_coinbase:
True
- Označuje, že se jedná o coinbase transakci.
- sequence:
4294967295
- Sekvenční číslo transakce, v coinbase transakcích obvykle nastavena na maximum.
- Když tento hexadecimální řetězec převedeme na text, získáme:
- 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73
- „The Times 03/Jan/2009 Chancellor on brink of second bailout for banks“
Výstupní část transakce (Output):
- scriptpubkey:
4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac
- Toto je scriptPubKey, který určuje podmínky, za kterých mohou být mince utraceny. V tomto případě se jedná o skript typu Pay-to-Public-Key (P2PK).
- scriptpubkey_asm:
OP_PUSHBYTES_65 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61de... OP_CHECKSIG
- Skript pushne 65-bajtový veřejný klíč na stack a poté použije operaci OP_CHECKSIG k ověření podpisu při budoucím utrácení těchto mincí.
- scriptpubkey_type:
p2pk
- Typ skriptu je Pay-to-Public-Key.
- value:
5000000000
- Hodnota výstupu v satoshi. 5 000 000 000 satoshi odpovídá 50 BTC, což byla odměna za vytěžení bloku v té době.
Jak by transakce vypadala s privátním klíčem „1“:
Pokud bychom použili privátní klíč s hodnotou 1
, odpovídající veřejný klíč by byl vypočítán pomocí eliptické křivky secp256k1. Poskytnuté souřadnice veřejného klíče jsou:
- Public Key (x, y):
x = 55066263022277343669578718895168534326250603453777594175500187360389116729240
y = 32670510020758816978083085130507043184471273380659243275938904335757337482424
Tento veřejný klíč lze zapsat ve formátu:
- Nezkomprimovaný veřejný klíč:
04
následované hodnotamix
ay
v hexadecimálním formátu.
Příklad:
04 + x (v hex) + y (v hex)
Sestavení transakce v Pythonu:
Pro vytvoření takové transakce bychom potřebovali knihovnu, která podporuje práci s Bitcoin transakcemi, například bitcoinlib
nebo bitcoin
(pybitcointools). Níže je jednoduchý příklad využití bitcoin
knihovny:
from bitcoin import *
# Privátní klíč
private_key = 1
# Převod na hexadecimální formát
private_key_hex = '%064x' % private_key
# Generování veřejného klíče
public_key = privtopub(private_key_hex)
# Vytvoření scriptPubKey
script_pub_key = mk_pubkey_script(public_key)
# Vytvoření coinbase transakce
coinbase_tx = mktx([], [{'value': 50*100000000, 'script': script_pub_key}])
# Přidání coinbase dat (např. zpráva)
coinbase_message = "Můj vlastní genesis blok"
coinbase_script_sig = encode_coinbase_script(coinbase_message.encode('utf-8'))
# Aktualizace scriptSig v transakci
coinbase_tx = deserialize(coinbase_tx)
coinbase_tx['ins'][0]['script'] = coinbase_script_sig
coinbase_tx = serialize(coinbase_tx)
print("Coinbase transakce:", coinbase_tx)
Poznámky:
- V reálném světě nemůžete vytvořit vlastní genesis blok a připojit jej k existujícímu blockchainu.
- Privátní klíč
1
je extrémně nezabezpečený a neměl by být používán v praxi. - Tento příklad je pouze pro vzdělávací účely a neměl by být použit v produkčním prostředí.
Důležité upozornění:
Práce s privátními klíči a vytváření vlastních transakcí vyžaduje hluboké znalosti kryptografie a blockchain technologie. Nesprávné použití může vést ke ztrátě prostředků nebo bezpečnostním rizikům. Vždy používejte bezpečné a osvědčené knihovny a postupy.
Zjednodušeně – a bez knihoven
Upozornění:
- Bezpečnost: Tento kód je určen pouze pro vzdělávací účely. Práce s kryptografickými klíči a transakcemi může být složitá a potenciálně nebezpečná. Nepoužívejte tento kód v produkčním prostředí ani s reálnými prostředky.
- Jednodušení: Kód zjednodušuje některé aspekty bitcoinových transakcí a neposkytuje plnou funkcionalitu potřebnou pro interakci s reálnou Bitcoin sítí.
Přehled kroků
- Generování veřejného klíče z privátního klíče
- Vytvoření scriptPubKey
- Sestavení coinbase transakce
- Serializace transakce do hexadecimální podoby
Krok 1: Generování veřejného klíče z privátního klíče
Privátní klíč 1
v hexadecimálním tvaru je 0x1
. Veřejný klíč získáme pomocí násobení generátorového bodu G eliptické křivky secp256k1 s privátním klíčem.
Protože používáme privátní klíč 1
, veřejný klíč bude přímo generátorový bod G.
Souřadnice bodu G jsou:
- x:
55066263022277343669578718895168534326250603453777594175500187360389116729240
- y:
32670510020758816978083085130507043184471273380659243275938904335757337482424
V hexadecimálním tvaru:
- x_hex:
79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
- y_hex:
483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
Nezkomprimovaný veřejný klíč sestavíme jako 04
+ x_hex
+ y_hex
.
x_hex = '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
y_hex = '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'
public_key = '04' + x_hex + y_hex
Krok 2: Vytvoření scriptPubKey
ScriptPubKey určuje podmínky, za kterých mohou být mince utraceny. Pro typ Pay-to-Public-Key (P2PK) je scriptPubKey ve formátu:
<OP_PUSHDATA><Public Key><OP_CHECKSIG>
V hexadecimálním tvaru:
OP_PUSHDATA
pro 65 bajtů (délka nezkomprimovaného veřejného klíče) je41
.OP_CHECKSIG
jeac
.
Sestavení scriptPubKey:
pythonZkopírovat kód# ScriptPubKey
script_pub_key = '41' + public_key + 'ac'
script_pub_key_bytes = bytes.fromhex(script_pub_key)
script_pub_key_length = '{:02x}'.format(len(script_pub_key_bytes))
Krok 3: Sestavení coinbase transakce
Coinbase transakce je speciální transakce, která nemá žádné skutečné vstupy a slouží k přidělení odměny těžaři.
Vstupní data (Input)
- Previous Transaction Hash: 32 bajtů nul (
00
* 32) pro coinbase transakce. - Output Index:
0xffffffff
pro coinbase transakce. - ScriptSig: Libovolná data (např. zpráva).
- Sequence:
0xffffffff
.
Sestavení ScriptSig:
pythonZkopírovat kód# Coinbase data
coinbase_data = 'Můj vlastní genesis blok'
coinbase_data_hex = coinbase_data.encode('utf-8').hex()
script_sig = coinbase_data_hex
script_sig_bytes = bytes.fromhex(script_sig)
script_sig_length = '{:02x}'.format(len(script_sig_bytes))
Výstupní data (Output)
- Value: Odměna za vytěžení bloku v satoshi (např. 50 BTC = 50 * 10^8 satoshi).
- ScriptPubKey: Určuje veřejný klíč, na který budou mince připsány.
Sestavení hodnoty:
pythonZkopírovat kód# Hodnota výstupu (50 BTC v satoshi)
value = 50 * 100000000 # 50 BTC
value_hex = '{:016x}'.format(value)
# Převod na little-endian formát
value_hex_le = ''.join([value_hex[i:i+2] for i in range(0, len(value_hex), 2)][::-1])
Krok 4: Sestavení a serializace transakce
Sestavíme transakci z jednotlivých částí v následujícím pořadí:
- Version (4 bajty, little-endian)
- Input Count (varint)
- Inputs
- Output Count (varint)
- Outputs
- Locktime (4 bajty)
pythonZkopírovat kód# Verze transakce
version = '01000000' # Verze 1 v little-endian formátu
# Počet vstupů
input_count = '01' # Jeden vstup
# Vstupní data
prev_tx_hash = '00' * 32 # 32 bajtů nul
prev_tx_out_index = 'ffffffff' # Output index pro coinbase
sequence = 'ffffffff' # Sequence number
# Počet výstupů
output_count = '01' # Jeden výstup
# Délka ScriptPubKey
script_pub_key_length = '{:02x}'.format(len(script_pub_key_bytes))
# Locktime
lock_time = '00000000' # Nulová hodnota
# Sestavení transakce
tx = (
version +
input_count +
prev_tx_hash +
prev_tx_out_index +
script_sig_length +
script_sig +
sequence +
output_count +
value_hex_le +
script_pub_key_length +
script_pub_key +
lock_time
)
print("Hexadecimální reprezentace transakce:")
print(tx)
Kompletní kód
Zde je kompletní kód s komentáři:
pythonZkopírovat kód# Krok 1: Veřejný klíč
x_hex = '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
y_hex = '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'
public_key = '04' + x_hex + y_hex
# Krok 2: ScriptPubKey
script_pub_key = '41' + public_key + 'ac' # OP_PUSHDATA(65 bytes) + Public Key + OP_CHECKSIG
script_pub_key_bytes = bytes.fromhex(script_pub_key)
script_pub_key_length = '{:02x}'.format(len(script_pub_key_bytes))
# Krok 3: Coinbase data
coinbase_data = 'Můj vlastní genesis blok' # Zpráva
coinbase_data_hex = coinbase_data.encode('utf-8').hex()
script_sig = coinbase_data_hex # ScriptSig je zpráva v hex
script_sig_bytes = bytes.fromhex(script_sig)
script_sig_length = '{:02x}'.format(len(script_sig_bytes))
# Krok 4: Sestavení transakce
version = '01000000' # Verze 1
input_count = '01' # Jeden vstup
prev_tx_hash = '00' * 32 # 32 bajtů nul
prev_tx_out_index = 'ffffffff' # Coinbase index
sequence = 'ffffffff' # Maximální sequence number
output_count = '01' # Jeden výstup
value = 50 * 100000000 # 50 BTC v satoshi
value_hex = '{:016x}'.format(value)
# Převod hodnoty na little-endian
value_hex_le = ''.join([value_hex[i:i+2] for i in range(0, len(value_hex), 2)][::-1])
lock_time = '00000000' # Locktime
# Sestavení transakce
tx = (
version +
input_count +
prev_tx_hash +
prev_tx_out_index +
script_sig_length +
script_sig +
sequence +
output_count +
value_hex_le +
script_pub_key_length +
script_pub_key +
lock_time
)
print("Hexadecimální reprezentace transakce:")
print(tx)
Vysvětlení výsledku
Hexadecimální řetězec tx
reprezentuje binární podobu transakce v hexadecimálním formátu. Každá část transakce byla sestavena podle bitcoinového protokolu.
Rozklad transakce:
- Version (4 bajty):
01000000
- Input Count (1 bajt):
01
- Input:
- Previous Transaction Hash (32 bajtů):
00
* 32 - Output Index (4 bajty):
ffffffff
- ScriptSig Length (varint): délka
script_sig
- ScriptSig: hexadecimální reprezentace zprávy
- Sequence (4 bajty):
ffffffff
- Previous Transaction Hash (32 bajtů):
- Output Count (1 bajt):
01
- Output:
- Value (8 bajtů):
value_hex_le
- ScriptPubKey Length (varint): délka
script_pub_key
- ScriptPubKey:
41
+ veřejný klíč +ac
- Value (8 bajtů):
- Locktime (4 bajty):
00000000
.:.:.