---
# System prepended metadata

title: Comprobando una firma de Transacción
tags: [macos, bitcoin, cli, nodo, node]

---

# 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?