# Transazione P2PKH

Questa guida vuole essere la parte integrativa del [video](https://youtu.be/_9C958OkcMs) che trovate nel nostro canale [Bitcoin In Action](https://www.youtube.com/BitcoinInAction). \
\
Creeremo una transazione P2PKH utilizzando il nodo **Bitcoin** con la versione 0.21.0 e analizzeremo come la transazione è validata.

Per rendere le cose più semplici da spiegare, partiremo da una blockchain *vuota*, quindi prima di lanciare i container, utilizzo il comando `./regtest-delete.sh`, e successivamente avvio i container con `docker-compose up`.\
Il prossimo passaggio è sarà quello di entrare nel container di hansel, ovvero di un nodo,

```
$ docker exec -ti hansel bash
```

e verificare che la blockchain abbia 0 blocchi, utilizzando il comando:

```bash
$ bitcoin-cli getblockcount
```

La prima operazione che vado a fare è creare un wallet, con il comando:

```bash
$ bitcoin-cli createwallet "hansel"
```

Successivamente creo l'address del mittente e l'address del destinatario. Utilizzerò delle variabili d'ambiente per salvare il contenuto.

```bash
$ ADDR_MITT=$(bitcoin-cli getnewaddress 'mitt' 'legacy')
$ ADDR_DEST=$(bitcoin-cli getnewaddress 'dest' 'legacy')
```

In questo momento i miei wallet non hanno nessuna UTXO, ovvero non hanno nessun bitcoin disponibile, quindi mineremo 101 blocchi (in modo tale da soddisfare la `COINBASE_MATURITY`) utilizzando l'address `$ADDR_MITT`.

```bash
$ bitcoin-cli generatetoaddress 101 $ADDR_MITT > /dev/null
```

Adesso ho dei bitcoin a disposizione, o meglio delle UTXO, per visualizzarli posso usare la chiamata `listunspent`, la quale mi mostra tutte i saldi a disposizione. Utilizzo anche il Json Parser, JQ, per aiutarmi a estrapolare solamente le informazioni necessarie per effettuare la transazione.

Per prima cosa salvo tutta la UTXO all'interno della variabile d'ambiente `$UTXO`

```bash
$ UTXO=$(bitcoin-cli listunspent | jq -r .[0])
```

Successivamente creo la transazione utilizzando la chiamata sendtoaddress, utilizzando una fee\_rate e decidendo di sottrarre le fees direttamente dall'amount.

```bash
$ TXID=$(bitcoin-cli -named sendtoaddress address="$ADDR_DEST" amount=$(echo $UTXO | jq -r .amount) fee_rate=25 subtractfeefromamount=true)
```

Adesso possiamo finalmente analizzare la nostra transazione, la quale si troverà nella mempool, e quindi in attesa di essere minata.

Per analizzarla possiamo utilizzare il comando `getrawtransaction`, e utilizzare la TXID appena ottenuta

```bash
$ bitcoin-cli getrawtransaction $TXID 2 | jq
```

Nel libro [Libro Bitcoin dalla teoria alla pratica](https://www.corsobitcoin.com/prodotto/libro-bitcoin-dalla-teoria-alla-pratica/) e [Bitcoin In Action – SegWit, Bitcoin Script e Smart Contracts](https://bit.ly/38RtF9x) , spieghiamo byte per byte la transazione. \
Grazie al nostro docker, è possibile visualizzare la blockchain locale a anche la transazione che è in mempool.

In questo caso la nostra transazione ha come ID `49021cb4a1ebb0c74feaa3a9df2ea7e3e74afeb50df9a630023e8822786add73`, inserendola nel campo di ricerca otteniamo un qualcosa di simile:

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzKeH9LlZEtFgdAObJ%2Fimage.png?alt=media\&token=4d985798-ce11-46d9-b51e-9caaa0e4a07a)

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzKhuPPVBkfemY0geI%2Fimage.png?alt=media\&token=72304e27-da38-4bbe-873a-539337734eec)

Come possiamo analizzare lo stack e la sua esecuzione?

Utilizziamo il progetto btcdeb! I vostri parametri potrebbero cambiare, ma se avete seguito alla lettera il tutorial, lanciando questo comando, lo stack si popolerà.

```bash
$ btcdeb --tx=$(bitcoin-cli getrawtransaction $TXID) --txin=$(bitcoin-cli getrawtransaction $(echo $UTXO | jq -r .txid))
```

Al momento dell'avvio lo stack è vuoto, e premendo e digitando step, si effettua l'operazione successiva.

In questo caso con step, si inserisce prima lo scriptSig, ovvero la firma e successivamente la chiave pubblica compressa.

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzKtUXOJ4puvfSlJWK%2Fimage.png?alt=media\&token=dc023e88-4cc6-41aa-9db2-2ee024cbd5dc)

I vostri valori saranno sicuramente diversi, ma la logica non cambia.

Successivamente abbiamo lo scriptPubKey. Il primo elemento che inseriamo è `OP_DUP`, che come abbiamo visto nelle precedenti lezioni, duplica l'elemento on top, quindi la nostra chiave pubblica non compressa.

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzKxO9L1gxy9TkLBEj%2Fimage.png?alt=media\&token=05679a2c-e890-4c7b-a06e-30546d175cfb)

Successivamente, l'operazione che si effettua è `HASH160`, che ha il compito di prendere l'elemento on top e applicare la funzione crittografica `SHA256` e `RIPEMD160`.

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzL1hnayRzK8GShPz3%2Fimage.png?alt=media\&token=1cd04a0e-c52c-459a-a5d9-a7621fbc3068)

Successivamente si inserisce l'hash della chiave pubblica compressa.

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzL6QpKt2DjFDaal3s%2Fimage.png?alt=media\&token=c656ba02-1195-4f52-a9e5-fa8949573e69)

La prossima OP\_CODE è `OP_EQUALVERIFY`, la quale ha il compito di verificare due elementi, e se sono uguale non inserire niente, altrimenti invalida lo stack.

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzL9rAwFNCHkvMgqgl%2Fimage.png?alt=media\&token=978ee4c0-caa7-49a8-a793-d852179333ab)

In questo caso sono uguali, e quindi non viene inserito niente e lo stack è ancora valido. Ultimo OP\_CODE, `OP_CHECKSIG`, come è facile intuire, controlla la firma confrontandola utilizzando la chiave pubblica corrispondente.&#x20;

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzLCCMkCazBlnw1xoa%2Fimage.png?alt=media\&token=6e00cf2f-ce21-4488-b34e-c0ee9b8bf4e9)

Se non ricordi come si verifica la firma digitale, [guarda questo video](https://www.youtube.com/watch?v=RU7LHPP4Lvk\&list=PLpPLK7SGHncab_so9rB7lY3aKe2-Mqs5y\&index=18).

Le operazioni che si effettuano sono, POP della chiave pubblica, pop della firma, e verifica della firma stessa. Se la verifica va a buon fine, si pusha 1, validando la transazione.

Le operazioni che abbiamo fatto, sono le stesse che abbiamo visto nel video ["Come si valida una Transazione P2PKH"](https://youtu.be/DW_YSbIGi1g).

Di seguito è riportata la lavagna utilizzata durante quel video:

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzLXOkI2xAdtergTmj%2Fimage.png?alt=media\&token=08451e32-4b60-405b-9db4-673b89f1bc16)

Che cosa ci rimane da fare?

Minare!

```bash
$ bitcoin-cli generatetoaddress 1 $ADDR_MITT
```

A questo punto, utilizzando il nostro [explorer](http://localhost:8094/), potete analizzare l'ultimo blocco minato, il quale conterrà 2 transazioni, la coinbase e la transazione appena creata.

![](https://852358698-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQKJKgcTd2_-nxzyaak%2F-MVzHBwhBXtI-aYE4LmB%2F-MVzLjOXtByqfBBj7MOe%2Fimage.png?alt=media\&token=4565a76a-dd8d-4e7e-874d-87f60d17eaeb)
