Bitcoin in Action playground
  • Bitcoin in Action playground
  • Playground bootstrap
  • Minare il primo blocco Bitcoin
    • Bitcoin Core desktop
    • Electrum desktop
  • Playground overview
  • Bitcoin Smart Contract 101
    • Attaccare uno Smart Contract
  • Transazione P2PKH
  • Bitcoin e Node.js
  • Video corso su Bitcoin
  • Playground e Libri
  • SegWit
  • Smart Contracts/Multisig
  • Lightning Network
  • Studiare Bitcoin a fondo
  • Bitcoin in Action bookmarks
  • Inviaci un feedback!
  • Bitcoin in Action YouTube
  • localhost bookmarks
  • Bitcoin regtest explorer
  • Bitcoin regtest reader
  • Hansel get blockchain info
  • Bitcoin regtest mempool
  • Hansel get raw mempool
  • Lightning Network Spark wallet
Powered by GitBook
On this page

Was this helpful?

Transazione P2PKH

PreviousAttaccare uno Smart ContractNextBitcoin e Node.js

Last updated 4 years ago

Was this helpful?

Questa guida vuole essere la parte integrativa del che trovate nel nostro canale . 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:

$ bitcoin-cli getblockcount

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

$ bitcoin-cli createwallet "hansel"

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

$ 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.

$ 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

$ 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.

$ 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

$ bitcoin-cli getrawtransaction $TXID 2 | jq

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

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à.

$ 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.

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.

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.

Successivamente si inserisce l'hash della chiave pubblica compressa.

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.

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.

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.

Di seguito è riportata la lavagna utilizzata durante quel video:

Che cosa ci rimane da fare?

Minare!

$ bitcoin-cli generatetoaddress 1 $ADDR_MITT

Nel libro e , spieghiamo byte per byte la transazione. Grazie al nostro docker, è possibile visualizzare la blockchain locale a anche la transazione che è in mempool.

Se non ricordi come si verifica la firma digitale, .

Le operazioni che abbiamo fatto, sono le stesse che abbiamo visto nel video .

A questo punto, utilizzando il nostro , potete analizzare l'ultimo blocco minato, il quale conterrà 2 transazioni, la coinbase e la transazione appena creata.

video
Bitcoin In Action
Libro Bitcoin dalla teoria alla pratica
Bitcoin In Action – SegWit, Bitcoin Script e Smart Contracts
guarda questo video
"Come si valida una Transazione P2PKH"
explorer