# Comprobando una firma de Transacción ###### tags: `bitcoin` `cli` `firma` _Validando que un script de desbloqueo satisface las condiciones de un script de bloqueo_ **Tabla de contenido** [TOC] ## Autores EntrePlanctonyBallenas. Twitter para correcciones, comentarios o sugerencias: [@entreplanctony1](https://twitter.com/Entreplanctony1) El presente tutorial fue elaborado para el [Seminario socrático de Mastering Bitcoin](https://libreriadesatoshi.com/) a través de [@libreriadesatoshi](https://twitter.com/libdesatoshi). ## Elabora una transacción para gastar El presente tutorial asume que has creado una transacción usando una billetera sin "**descriptors**" con una dirección de tipo "**legacy**" en tu billetera y que has fondeado dicha billetera para tener bitcoin testnet en esa dirección. Puedes ver más información sobre como lograr esto en los siguientes enlaces: [Configurar una wallet en Bitcoin Core](https://hackmd.io/@entreplanctonyballenas/wallets-nodo) [¿Cómo crear una transacción usando bitcoin-cli para hacer pruebas?](https://hackmd.io/@entreplanctonyballenas/tx-bitcoin-cli-spa) Se tiene la siguiente transacción **sin firmar** ``` json= $ bitcoin-cli decoderawtransaction 020000000179d5220fa628d9fd463fa6fb5cf45df7b49b81467a6eb7fd7d948e3a6ec0f22b0000000000ffffffff0200e1f505000000001976a914b47a6f225525f7f4674952ce91ddbc8ef755aee188ac1fb23f71000000001976a914a16ef9a4f940070c8360f7a9bb8853756d5ca2c988ac00000000 { "txid": "aefd489df6b3f1b824922bf23733b95bd19e5c99aad2ceef503a95b187f8df9c", "hash": "aefd489df6b3f1b824922bf23733b95bd19e5c99aad2ceef503a95b187f8df9c", "version": 2, "size": 119, "vsize": 119, "weight": 476, "locktime": 0, "vin": [ { "txid": "2bf2c06e3a8e947dfdb76e7a46819bb4f75df45cfba63f46fdd928a60f22d579", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967295 } ], "vout": [ { "value": 1.00000000, "n": 0, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 b47a6f225525f7f4674952ce91ddbc8ef755aee1 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a914b47a6f225525f7f4674952ce91ddbc8ef755aee188ac", "address": "mwyEbTMHvYKaNaJnAVNzhRRCFUyb1B7mQC", "type": "pubkeyhash" } }, { "value": 18.99999775, "n": 1, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 a16ef9a4f940070c8360f7a9bb8853756d5ca2c9 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a914a16ef9a4f940070c8360f7a9bb8853756d5ca2c988ac", "address": "mvEY2dS4Ah1oG58eF36pvk6bfqTAqZs8Rs", "type": "pubkeyhash" } } ] } ``` Si filtramos la salida de **decoderawtransaction** para visualizar únicamente los campos del arreglo de **vin** de nuestra transacción _(agregamos al comando **| jq .<campo>**)_, podemos ver que el campo llamado **scriptsig** se encuentra vacío. Esto implica que nuestra transacción no esta firmada todavía. ``` json= $ bitcoin-cli decoderawtransaction 020000000179d5220fa628d9fd463fa6fb5cf45df7b49b81467a6eb7fd7d948e3a6ec0f22b0000000000ffffffff0200e1f505000000001976a914b47a6f225525f7f4674952ce91ddbc8ef755aee188ac1fb23f71000000001976a914a16ef9a4f940070c8360f7a9bb8853756d5ca2c988ac00000000 |jq .vin [ { "txid": "2bf2c06e3a8e947dfdb76e7a46819bb4f75df45cfba63f46fdd928a60f22d579", "vout": 0, "scriptSig": { "asm": "", "hex": "" }, "sequence": 4294967295 } ] ``` :::success :bulb: **Filtrando las salidas con el comando jq** El comando **jq** se puede utilzar para filtrar datos de un **arreglo json** para mirar unicamente los datos que nos interesen. Puedes mirar como instalar **jq** en este link: [Download JQ](https://jqlang.github.io/jq/download/). Ejemplos útiles para utilizarlo: [jq for Creating and Updating JSON](https://spin.atomicobject.com/2021/06/08/jq-creating-updating-json/) ::: ## Encuentra los datos de salida de la transacción padre Ahora miramos los datos de la salida de transacción que vamos a gastar. ``` json= $ bitcoin-cli getrawtransaction 2bf2c06e3a8e947dfdb76e7a46819bb4f75df45cfba63f46fdd928a60f22d579 02000000000101f7414d339ad4f721b680f4c085bb6b169b2a746557f924a60c43ff912032fcbd0100000000feffffff0200943577000000001976a91400573e46e99808aed09a23a5adab6d009323bea388acdebe9a3b000000001600144e46d9555cc0a946d2f564808a269df43e6e38040247304402201e218cb74066756b839f468a107bb3b670c970483d415869381350a1760ee62702202bc7e6cca2ed2d95f27dada4de585dd61d3752532c1c30e694db9f76c4ac996e012103aeb1de40909bc2e3e3a573121b962bb5718484cb952f00ba537dd2600f6624c165000000 ``` Mirando a detalle los datos de la salida a gastar únicamente, vemos que el campo **scriptPubKey** tiene varios campos, entre ellos un campo llamado "**asm**". El campo "**asm**" son los datos "decodificados" del **script de bloqueo** que indica que esta salida esta bloqueada usando un script de tipo "**Pay-to-Public-Key-Hash (P2PKH)**" ([ver esta definición en el libro de MB](https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch06.asciidoc#pay-to-public-key-hash-p2pkh)). ``` json= $ bitcoin-cli decoderawtransaction 02000000000101f7414d339ad4f721b680f4c085bb6b169b2a746557f924a60c43ff912032fcbd0100000000feffffff0200943577000000001976a91400573e46e99808aed09a23a5adab6d009323bea388acdebe9a3b000000001600144e46d9555cc0a946d2f564808a269df43e6e38040247304402201e218cb74066756b839f468a107bb3b670c970483d415869381350a1760ee62702202bc7e6cca2ed2d95f27dada4de585dd61d3752532c1c30e694db9f76c4ac996e012103aeb1de40909bc2e3e3a573121b962bb5718484cb952f00ba537dd2600f6624c165000000 |jq .vout[0] { "value": 20.00000000, "n": 0, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 00573e46e99808aed09a23a5adab6d009323bea3 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a91400573e46e99808aed09a23a5adab6d009323bea388ac", "address": "mfYkopfgCymnGRiDK64nS9CjfspoTUKoxk", "type": "pubkeyhash" } } ``` El siguiente diagrama indica el orden en el que se ejecutan estos scripts, se van checando de izquierda a derecha, comenzando por los campos **<sig>** y **<PubK>**. Donde **<sig>** es la firma criptografica con la llave privada de todo el contenido de la transacción no firmada, y **<PubK>** es la llave Pública de la dirección que se está usando. ![p2pkh](https://github.com/bitcoinbook/bitcoinbook/blob/develop/images/mbc2_0605.png?raw=true) Si queremos mirar la llave publica de una direccion que poseemos ``` json= $ bitcoin-cli -rpcwallet=Pruebas -named getaddressinfo address=mfYkopfgCymnGRiDK64nS9CjfspoTUKoxk |jq -r .pubkey 03865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45de ``` ## Firma la transacción y mira los datos que se llenan Ahora miremos que datos se llenan en la transacción cuando se firma con la wallet: ``` json= $ bitcoin-cli -rpcwallet=Pruebas signrawtransactionwithwallet 020000000179d5220fa628d9fd463fa6fb5cf45df7b49b81467a6eb7fd7d948e3a6ec0f22b0000000000ffffffff0200e1f505000000001976a914b47a6f225525f7f4674952ce91ddbc8ef755aee188ac1fb23f71000000001976a914a16ef9a4f940070c8360f7a9bb8853756d5ca2c988ac00000000 |jq -r .hex 020000000179d5220fa628d9fd463fa6fb5cf45df7b49b81467a6eb7fd7d948e3a6ec0f22b000000006a47304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d5012103865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45deffffffff0200e1f505000000001976a914b47a6f225525f7f4674952ce91ddbc8ef755aee188ac1fb23f71000000001976a914a16ef9a4f940070c8360f7a9bb8853756d5ca2c988ac00000000 $ bitcoin-cli decoderawtransaction 020000000179d5220fa628d9fd463fa6fb5cf45df7b49b81467a6eb7fd7d948e3a6ec0f22b000000006a47304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d5012103865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45deffffffff0200e1f505000000001976a914b47a6f225525f7f4674952ce91ddbc8ef755aee188ac1fb23f71000000001976a914a16ef9a4f940070c8360f7a9bb8853756d5ca2c988ac00000000 |jq .vin [ { "txid": "2bf2c06e3a8e947dfdb76e7a46819bb4f75df45cfba63f46fdd928a60f22d579", "vout": 0, "scriptSig": { "asm": "304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d5[ALL] 03865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45de", "hex": "47304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d5012103865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45de" }, "sequence": 4294967295 } ] ``` El campo **asm** contiene el **script de desblqueo** (decodificado) necesario para poder gastar esta salida. ## Desbloqueo vs Bloqueo Finalmente para poder confirmar que el **script de desblqueo** satisface las condiciones establecidas por el **script de bloqueo** debemos ejecutar de izquierda a derecha comenzando por el script de desbloqueo, como lo muestra la siguiente imagen: ![mbc2_0603](https://raw.githubusercontent.com/bitcoinbook/bitcoinbook/develop/images/mbc2_0603.png) Decodificamos el script de desbloqueo de la transaccion firmada, tomamos solo el campo **asm**. ``` json= $ bitcoin-cli decodescript 47304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d5012103865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45de { "asm": "304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d501 03865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45de", "type": "nonstandard", "p2sh": "2N85jCBcRsoG4qFN9o9zw9aVoXsxCNsRKxs", "segwit": { "asm": "0 1948bb32108965460f6dd638b9ba7935f45a6ee0e02dcbe8d254703d727ccf18", "hex": "00201948bb32108965460f6dd638b9ba7935f45a6ee0e02dcbe8d254703d727ccf18", "address": "bcrt1qr9ytkvss39j5vrmd6cutnwnexh695mhquqkuh6xj23cr6unueuvqezxrsv", "type": "witness_v0_scripthash", "p2sh-segwit": "2N5PsDhW4nNPwf5gqREofWYnoRZQ4V9wgP6" } } ``` Agregando los datos que tenemos: :::info 304402207363809dea44ee307f4ce74e6b51b451984625d9212bf8f30bb5862311bfcb8302201312bce412e43550cb4002eab96967abdfc527f161bb47181c86473b0df7e0d501 03865176c3174200de1b60f0dae80f3ed28c920fe78bff02eb0d028d65fcaa45de OP_DUP OP_HASH160 00573e46e99808aed09a23a5adab6d009323bea3 OP_EQUALVERIFY OP_CHECKSIG ::: Introduzcamos estos datos en la siguiente pagina para validar paso a paso lo que hace nuestro script: [Bitcoin IDE](https://siminchen.github.io/bitcoinIDE/build/editor.html) ¿Pudes decir cual es el resultado?