January 17, 2026

Come creare una transazione con Bitcoin

Come creare una transazione con Bitcoin

Nel tutorial precedente abbiamo visto come sia possibile far comunicare due nodi sullo stesso computer e come si sincronizzano quando dei blocchi vengono minati.

Q: Quindi possiamo fare anche una transazione e vedere che essa sia propagata e capire tutti i passaggi che subisce prima che faccia parte della blockchain?
R: Si.

Se volete avere un ambiente “pulito” potete cancellare le cartelle regtest dei rispettivi nodi, così da avere zero blocchi minati e nessun reward assegnato.

Inseriamo in entrambi i nodi l’opzione txindex=1 in modo tale da avere tutta l’indicizzazione delle transazioni.

-txindex
Maintain a full transaction index, used by the getrawtransaction rpc
call (default: 0)

$ vim BTC_nodo2.conf
Configurazione nodo 2

stessa operazione per il nodo di default il cui percorso (default) nel mio computer è:

/Users/barno/Library/Application Support/Bitcoin/bitcoin.conf

Avviamo di nuovo entrambi i nodi.
Se avete cancellato la cartella regtest (come me), dovete seguire i passaggi del tutorial precedente così da avere a disposizione 50 bitcoin su un’indirizzo.
Già 50 bitcoin, nessun halving era ancora stato fatto.

Ottengo quindi 3 indirizzi, 2 dal nodo di default (bizantino) e 1 dal nodo2.

$ ADDR=`bitcoin-cli getnewaddress bizantino`
$ ADDR_RESTO=`bitcoin-cli getnewaddress bizantino_resto`
$ ADDR_DEST=`bitcoin-cli -conf=$PWD/bitcoin_nodo2.conf getnewaddress destinatario`

Dal nome delle variabili d’ambiente scelte si capisce il loro scopo.
Mino 101 blocchi per ottenere 50 bitcoin con l’indirizzo $ADDR.
Perché proprio 101? Per ottenere un reward spendibile e soddisfare la COINBASE_MATURITY.

$ BTC-cli generatetoaddress 101 $ADDR

Adesso entrambi i nodi devono avere 101 blocchi, se così non fosse torna al tutorial precedente.

Con il comando listunpsent otteniamo tutte le UTXO disponibili.

$ BTC-cli listunspent[]

Quello che interessa a noi per fare la transazione è la txid e il vout, per questo le salviamo in due variabili d’ambiente.

$ TXID=75b91cf262c98bdd57b0c3f2ec1a2597cceadc0cc2ef0a103e1a0013d81e332f$ VOUT=0

Siamo pronti a creare la transazione utilizzando il comando createrawtransaction. Sposteremo 1 bitcoin verso il destinatario, e 48.998 bitcoin verso l’indirizzo di resto. Una bella mancia per il miner!
Il risultato che otteniamo, la transaction data, la salviamo dentro la variabile d’ambiente TX_DATA.

$ TX_DATA=`bitcoin-cli createrawtransaction '[]' '[,]'`

Per vedere il contenuto della variabile d’ambiente,

$ echo $TX_DATA

NB: Nel libro Bitcoin dalla teoria alla pratica e nel video-corso viene analizzato byte per byte la transaction data.

Quello che dobbiamo fare adesso è firmare la transazione con la chiave privata di $ADDR che posso ottenere con il comando dumpprivkey.

$ PK=`bitcoin-cli dumpprivkey $ADDR`

Attenzione, non deriviamo la chiave privata dalla chiave pubblica ($ADDR) ma la otteniamo da una serie di indirizzi già pronti per il nostro wallet.
Per maggiori informazioni guarda il comando dumpwallet.

Bene, firmiamo la transazione.

$ BTC-cli signrawtransactionwithkey $TX_DATA '["'$PK'"]'

Per comodità salviamo dentro la variabile d’ambiente TX_DATA_SIGNED il valore di hex.
Inviamo la transazione.

$ BTC-cli sendrawtransaction $TX_DATA_SIGNEDd24f8de59e839ee3956f27b44ce8ed980405725acde903e5494450934f9a4db2

Quello che otteniamo è la TXID.
Che cosa succede adesso? La transazione è stata inviata ma non è ancora stata minata, quindi dove si trova?
Nella mempool!
Dobbiamo essere in grado di verificare la sua presenza in entrambi i nodi.

Estratto del libro e corso Bitcoin dalla teoria alla pratica
$ BTC-cli getrawmempool["d24f8de59e839ee3956f27b44ce8ed980405725acde903e5494450934f9a4db2"]$ BTC-cli -conf=$PWD/bitcoin_nodo2.conf getrawmempool["d24f8de59e839ee3956f27b44ce8ed980405725acde903e5494450934f9a4db2"]

Esatto, entrambi i nodi hanno a disposizione la transazione ed entrambi potrebbero minarla. Per verificare il candidate block il comando è getblocktemplate.

$ BTC-cli getblocktemplate ''

Quindi la transazione è verificata ma non confermata.
Possiamo trovare conferma dell’asserzione appena fatta con il comando getwalletinfo sul nodo2.

$  BTC-cli -conf=$PWD/bitcoin_nodo2.conf getwalletinfo

Possiamo leggere “unconfirmed_balance”: 1 !
Bene, miniamo facendo 6 blocchi così da rendere la transazione sicura.

$ BTC-cli generatetoaddress 6 $ADDR

Bene, la mempool è vuota e il destinatario ha a disposizione 1 bitcoin!

$ BTC-cli -conf=$PWD/bitcoin_nodo2.conf getwalletinfo
...
"balance": 1.00000000,
...

Possiamo verificare le operazioni sui log dei demoni, oppure utilizzando tail sul file di log.

$ tail -F regtest/debug.log

Ci provo?

$ BTC-cli sendrawtransaction $TX_DATA_SIGNEDerror code: -27
error message:
Transaction already in block chain

Il double spending non è andato a buon fine.

Published at Mon, 03 Feb 2020 09:39:53 +0000

{flickr|100|campaign}

Previous Article

The Last Time Bitcoin (BTC) Showed This Formation, It Dropped to $6,000

Next Article

BiKi.com: SEA CEO Ethan Ng Talks Supply Chain and Exchanges as Future Financial Institutions

You might be interested in …

STDEX Q4–2019 Token Burn – Roderick Warren

STDEX Q4–2019 Token Burn – Roderick Warren For this first quarterly burn, 1.5% of the total tokens coming from the company address (0xfd2069114c1c058768a782492dc66d65e1fcd0fe) have been destroyed. The result is STDEX total supply was reduced from […]