Transazione P2PKH nel Bitcoin Playground

Bitcoin In Action
6 min readMar 17, 2021

Dopo alcuni articoli di teoria, siamo arrivati alla pratica. In questo video analizzeremo come sia possibile creare una transazione P2PKH utilizzando un nodo bitcoin in modalità Regtest.

Per questo esempio utilizzeremo un progetto che stiamo portando avanti io a Alessandro, ovvero un playground. Faremo un video dettagliato prima possibile, ma per adesso vi basta pensare che è, accedendo dei container docker, abbiamo a disposizione due nodi, Hansel e Gretel, che parlano tra loro, e alcuni utility tra cui un blockchain explorer.

Se volete replicare l’esempio che stiamo per vedere, potete creare il vostro ambiente di lavoro, clonando il progetto e seguendo le istruzioni che trovate nella pagina del playground.

La transazione P2PKH nel Playgroung https://youtu.be/_9C958OkcMs

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

‌Nel libro Libro Bitcoin dalla teoria alla pratica e Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts , 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:

Enter a caption for this image (optional)

Enter a caption for this image (optional)

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

Se non ricordi come si verifica la firma digitale, guarda questo video.‌

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”.‌

Di seguito è riportata la lavagna utilizzata durante quel video:

Che cosa ci rimane da fare?‌

Minare!

$ bitcoin-cli generatetoaddress 1 $ADDR_MITT

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

Se volete divertivi con il nostro playground, ecco il link! https://app.gitbook.com/@corsobitcoin/s/bitcoin-in-action-playground/

Ciao alla Prossima!

Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts e Bitcoin dalla teoria alla pratica

–––––

🐳 Playground Bitcoin in Action

🎥 Bitcoin in Action (YouTube)

🐙 GitHub: https://bit.ly/2Lj3yeY

–––

📕 Bitcoin In Action – SegWit, Bitcoin Script e Smart Contracts (Amazon)

📕 Bitcoin In Action – SegWit, Bitcoin Script e Smart Contracts (pagamento in bitcoin)

–––

📒 Libro Bitcoin dalla teoria alla pratica (Amazon)
📒 Libro Bitcoin dalla teoria alla pratica (pagamento in bitcoin)
📒 Book Bitcoin from theory to practice (Amazon)

📒 Book Bitcoin from theory to practice (accept bitcoin)

🎥 Video Corso Bitcoin dalla teoria alla pratica


📙 Tascabile Bitcoin 199 domande (Amazon)
📙 Tascabile Bitcoin 199 domande (pagamento in bitcoin)

📙 Pocket Book Bitcoin 199 questions (Amazon)
📙 Pocket Book Bitcoin 199 questions (accept bitcoin)

► ITA: Twitter , Facebook, Medium, Instagram, Youtube, GitHub

► ENG: Twitter , Facebook, Medium, Instagram, Youtube, GitHub

Television isn’t a good idea (Radio Stations)
Email isn’t a good idea (Post offices)
Amazon isn’t a good idea (Retail stores)
Bitcoin isn’t a good idea (Central banks)

In crypto we trust

--

--