Come creare un address P2SH–P2PK Bitcoin
Pay To Script Hash — Pay To Public Key#
Come creare un address P2SH–P2PK
Nell’articolo precedente abbiamo analizzato ad alto livello come è costruito l’address P2SH, che cosa è il redeem script, che cosa è il redeem script hash e dove è posizionato per la generazione dell’address.
In questo articolo andiamo più nel dettaglio ed iniziamo a mettere il primo mattoncino per la generazione di un address P2SH-P2PK
Il nostro compitò sarà quindi quello di creare un redeem script che conterrà la logica del P2PK classico, il primo address che abbiamo analizzato in questa playlist.
Il codice che stiamo per mostrare lo potete trovare nel libro Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts e di conseguenza nel nostro GitHub di riferimento.
Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts
Quindi andiamo a vedere con la pratica come è possibile creare un address P2SH-P2PK
In Action#
Al momento non è possibile creare questo tipo di address da Bitcoin-core in quanto si preferisce utilizzare P2SH-SegWit, ma è comunque indispensabile per capire il corretto funzionamento.
Tralasciamo la generazione delle chiavi pubblica e privata e soffermiamoci alla costruzione del redeem script.
Come vedete per questo esempio utilizzo direttamente il libro Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts.
$ cat compressed_public_key_1.txt
Partendo da questa chiave pubblica andiamo a creare il redeem script, che sarà formato dalla chiave pubblica e dall’operation code OP_CHECKSIG, proprio come un normale P2PK.
PBLENGTH=$(char2hex.sh $(cat compressed_public_key_1.txt | wc -c))
#P2PK Script#PB LENGTH - PB - OP_CHECKSIG
SCRIPT=$PBLENGTH$(cat compressed_public_key_1.txt)"AC"
printf $SCRIPT > redeem_script.txt
Abbiamo quindi creato il Redeem script che contiene la la chiave pubblica, la sua relativa lunghezza e l’operation code OP_CHECKSIG rappresentato dall’esadeciamle AC Successivamente creiamo parte del scriptPubKey, ovvero il redeem script hash, ottenuto applicando le funzioni crittografiche SHA256 e RIPEMD160.
#---------- scriptPubKey ---------
ADDR_SHA=`printf $SCRIPT | xxd -r -p | openssl sha256| sed 's/^.* //'`
ADDR_RIPEMD160=`printf $ADDR_SHA |xxd -r -p | openssl ripemd160 | sed 's/^.* //'`
printf $ADDR_RIPEMD160 > scriptPubKey.txt
Il digest del redeem script lo troveremo nello scriptPubKey, come avremo modo di vedere successivamente. Ed infine applichiamo il version prefix e il base58 checksum, ottenendo così l’address P2SH-P2PK
#ADDRESS
VERSION_PREFIX_ADDRESS=C4
ADDR=`printf $VERSION_PREFIX_ADDRESS$ADDR_RIPEMD160 | xxd -p -r | base58 -c`
echo $ADDR > address_P2SH.txt
Avviando il nostro script possiamo verificare l’address il redeem script utilizzando il comando cat.
Possiamo verificare il nostro redeem script.
$ cat redeem_script.txt
210250a1991342dd7f57792df122baa02c6a5c98aa8daeb8e106ae7d2345d020f082AC
Il nostro scriptPubKey, o redeem script Hash
$ cat scriptPubKey.txt
3647d6bf3fb8e75f26f15888a471808cb4253afb
e il nostro address:
$ cat address_P2SH.txt
---------- 🔑 ADDRESS P2SH ---------
2MxCEY6QTacDQhHFx9rmNeXkpfXEQ17xZQM
Utilizzando il comando decodescript sul redeem script possiamo analizzare il nostro redeem script in formato assembly:
bitcoin-cli decodescript $(cat redeem_script.txt)
{
"asm": "02329013c3c2c6bd4a5b1597b008a1ce6e750aa43cf8d2e509e8497bc491c6cb64 OP_CHECKSIG",
"type": "pubkey",
"p2sh": "2MxWUqeZaaBgKyNMxx9PzLJywr8LqkRUUor",
"segwit": {
"asm": "0 83e34929132fffbdcffe251c289b68fb178fda06",
"hex": "001483e34929132fffbdcffe251c289b68fb178fda06",
"reqSigs": 1,
"type": "witness_v0_keyhash",
"addresses": [
"bcrt1qs035j2gn9llmmnl7y5wz3xmglvtclksx2j0yk6"
],
"p2sh-segwit": "2N7G1k7HomEQA8GZemXQQN3JLRPUDY75Keq"
}
}
Nel prossimo articolo vedremo come è costruita una transazione!
Ciao alla prossima!