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