Bitcoin Multisig: La Tua Guida Sicura e Affidabile alla Firma delle Transazioni

Nel nostro viaggio nel mondo del Bitcoin, affrontiamo oggi un altro passaggio cruciale: la firma delle transazioni per gli indirizzi Multisig P2SH. Sei pronto a immergerti nel processo?

Come sempre, useremo l’ambiente Docker per garantire un’esperienza sicura e isolata mentre impariamo insieme.

Passo dopo Passo: Mettiamoci all’Opera!

Per cominciare, utilizzeremo i wallet descriptor, strumento fondamentale per gestire gli indirizzi. Avviamo quindi un’istanza regtest e creiamo un wallet dedicato:

bitcoin-cli stop && sleep 5 && rm -Rf $HOME/.bitcoin/regtest && bitcoind && sleep 5
bitcoin-cli -named createwallet wallet_name="bitcoin in action"

Una volta pronto, recuperiamo l’indirizzo creato in precedenza e miniamo 101 blocchi per avere a disposizione 50 Bitcoin:

ADDR_MITT=`bitcoin-cli getnewaddress "mittente" "legacy"`
# Recuperiamo l'indirizzo P2SH
ADDR_DEST=`cat address_P2SH.txt`

# Miniamo 101 blocchi per ottenere il reward
bitcoin-cli generatetoaddress 101 $ADDR_MITT >> /dev/null

Con il reward ottenuto, salviamo le informazioni necessarie per creare la prossima transazione verso l’indirizzo multisignature:

TXID=$(bitcoin-cli listunspent 1 101 '["'$ADDR_MITT'"]' | jq -r '.[0].txid')
VOUT=$(bitcoin-cli listunspent 1 101 '["'$ADDR_MITT'"]' | jq -r '.[0].vout')
AMOUNT=$(bitcoin-cli listunspent 1 101 '["'$ADDR_MITT'"]' | jq -r '.[0].amount-0.001')

Successivamente, creiamo la transazione grezza e ne esaminiamo i dettagli:

printf  "\n \e[31m######### TX_DATA #########\e[39m \n"
TX_DATA=`bitcoin-cli createrawtransaction '[{"txid":"'$TXID'","vout":'$VOUT'}]' '[{"'$ADDR_DEST'":'$AMOUNT'}]'`
bitcoin-cli decoderawtransaction $TX_DATA | jq

Una volta ispezionati i dettagli, procediamo con la firma e l’invio:

TX_DATA_SIGNED=$(bitcoin-cli signrawtransactionwithwallet $TX_DATA | jq -r '.hex')
TXID=`bitcoin-cli sendrawtransaction $TX_DATA_SIGNED`
bitcoin-cli generatetoaddress 6 $ADDR_MITT

Ora, con i Bitcoin disponibili dall’indirizzo P2SH, creiamo l’output della transazione e recuperiamo le chiavi private:

AMOUNT=`bitcoin-cli getrawtransaction $TXID 2 | jq -r '.vout[0].value-0.0001'`
VOUT=0

PK1=`cat compressed_private_key_WIF_1.txt`
PK2=`cat compressed_private_key_WIF_2.txt`
PK3=`cat compressed_private_key_WIF_3.txt`

Dopo l’importazione del descriptor e il recupero del redeem script, siamo pronti a creare e firmare la transazione:

CHECKSUM=$(bitcoin-cli getdescriptorinfo "sh(multi(2,$PK1,$PK2,$PK3))" | jq -r .checksum)
bitcoin-cli importdescriptors '[{ "desc": "sh(multi(2,'$PK1','$PK2','$PK3'))#'$CHECKSUM'", "timestamp": "now", "internal": true }]'

REDEEM=`cat redeem_script.txt`

Infine, creiamo e firmiamo la transazione:

SCRIPTPUBKEY="A914"`cat scriptPubKey.txt`"87"
TX_DATA=$(bitcoin-cli createrawtransaction '[{"txid":"'$TXID'","vout":'$VOUT',"scriptPubKey":"'$SCRIPTPUBKEY'","redeemScript":"'$REDEEM'"}]' '[{"'$ADDR_MITT'":'$AMOUNT'},{"data":"636f72736f626974636f696e2e636f6d0a"}]')
TX_SIGNED=$(bitcoin-cli signrawtransactionwithwallet $TX_DATA '[{"txid":"'$TXID'","vout":'$VOUT',"scriptPubKey":"'$SCRIPTPUBKEY'","redeemScript":"'$REDEEM'"}]'  | jq -r '.hex')

Con la transazione firmata, è tempo di inviarla:

bitcoin-cli generatetoaddress 6 $ADDR_MITT

Dopo aver completato la transazione, possiamo esaminarne la validità passo dopo passo utilizzando btcdeb.

Conclusione

Con questo tutorial, hai imparato come firmare transazioni Multisig Bitcoin in modo sicuro e affidabile. Ricorda sempre di seguire attentamente ogni passaggio per garantire la sicurezza delle tue operazioni.

Per approfondimenti e ulteriori esempi, unisciti a noi nel nostro libro “Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts