Ottenere un address P2PKH e come è costruito (In Action!)

Bitcoin In Action
4 min readMar 10, 2021

Negli articoli precedenti abbiamo visto come un address P2PKH viene generato e come una transazione viene validata. È arrivato il momento di fare sul serio, creeremo un address P2PKH e analizzeremo step by step la transazione e come questa viene validata.

Vi ricordo velocemente che l’address P2PKH (pay to public key hash) ha nel suo scriptPubKey, l’hash della sua chiave pubblica compressa.

Nel libro Bitcoin In Action — SegWit, Bitcoin Script e Smart Contracts (Amazon) analizziamo e creiamo un address P2PKH manualmente, partendo dalla generazione della chiave privata.
In questo esempio, invece, utilizzeremo il metodo getnewaddress per ottenere un address dal nostro nodo di regtest.

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

Per prima cosa avviamo il nostro nodo regtest. (Se non sai come installarlo guarda questo articolo)

https://youtu.be/EAq99ZRlttA
$ bitcoind

Richiediamo quindi un address P2PKH, utilizzando il comando getnewsaddress. Per sapere che parametri accetta, è possibile utilizzare il comando help.

$ bitcoin-cli help getnewaddressgetnewaddress ( "label" "address_type" )

Bene, accetta come parametri una label, facoltativa, e il tipo di address voluto. Il P2PKH è un address legacy, per questo utilizzeremo il comando:

$ bitcoin-cli getnewaddress "P2PKH bitcoin in action" "legacy"mfXmGhk1qovdUdtyWbuA5MKdpTiC4Ybz4C

Abbiamo ottenuto un address che inizia o con N o con M, nel mio caso con M. Vi ricordate perchè? Durante la costruzione dell’address inseriamo un address prefixes. In questo caso è stato il software bitcoin core a farlo per noi. Se l’address P2PKH è destinato alla mainnet il primo carattere sarà 1, se invece l’address ha come destinazione la testnet o la regtest, l’address avrà come primo carattere la m o la n.

Analizziamo meglio l’address. Per comodità salvo l’address nella variabile d’ambiente ADDR, in modo tale da non dovermi portare in “giro” 34 caratteri esadecnmali. Per fare questa operazione digito:

ADDR=mfXmGhk1qovdUdtyWbuA5MKdpTiC4Ybz4C

Per poi verificare il contenuto di ADDR, utilizzo il comando echo, richiamando la variabile preceduta dal simbolo del dollaro.

$ echo $ADDRmfXmGhk1qovdUdtyWbuA5MKdpTiC4Ybz4C

Per comodità salvo anche l’address prefix del P2PKH per l’ambiente di regtest.

PREFIX=6F

Adesso possiamo utilizzare il metodo getaddressinfo , che come è facile intuire, restituisce una serie di informazioni relative all’address.

$ bitcoin-cli getaddressinfo $ADDR{"address": "mfXmGhk1qovdUdtyWbuA5MKdpTiC4Ybz4C","scriptPubKey": "76a914002736d4bb3c8a6bed4957a92047a46acbcc5aa988ac","ismine": true,"solvable": true,"desc": "pkh([664e540a/0'/0'/1']03844e497f4b43968c90a493fafcc33ecedcd49ff94e2a534143761d3040a54991)#hkffnnyc","iswatchonly": false,"isscript": false,"iswitness": false,"pubkey": "03844e497f4b43968c90a493fafcc33ecedcd49ff94e2a534143761d3040a54991","iscompressed": true,"label": "P2PKH bitcoin in action","ischange": false,"timestamp": 1612087963,"hdkeypath": "m/0'/0'/1'","hdseedid": "cf10b47c5eb95369ee420118c2c3e4ed86f9f9a3","hdmasterfingerprint": "664e540a","labels": [{"name": "P2PKH bitcoin in action","purpose": "receive"}]}

La chiamata restituisce un pò di informazioni, noi ci concentreremo su, scriptPubKey e Public Key.

Come abbiamo analizzato nei video precedenti, sappiamo che nello scriptPubKey, c’è l’hash160 della chiave pubblica compressa. Sappiamo inoltre che la public key che lèggiamo dalla chiamata getaddressinfo, è una public key compressa, perchè non inizia con il byte 04.

Vi ricordate come si ottiene l’address P2PKH? Ecco la lavagna di qualche lezione precedente.

Adesso abbiamo a disposizione, , l’address prefix e la chiave pubblica compressa. Applicando la funzione crittografica

hash160, che include lo SHA256 e successivamente il RIPEMD160. saremo in grado di ottenere il nostro address!

Per fare questo, utilizziamo ancora una variabile d’ambiente, ad esempio PB, per salvare il valore della chiave pubblica.

PB=03844e497f4b43968c90a493fafcc33ecedcd49ff94e2a534143761d3040a54991

Oppure per prenderla in maniera dinamica, possiamo anche utilizzare Jq.

PB=$(bitcoin-cli getaddressinfo $ADDR | jq -r '.pubkey')

Applichiamo la funzione crittografica SHA256

ADDR_SHA=`printf $PB | xxd -r -p | openssl sha256| sed 's/^.* //'`echo "digest SHA256 "$ADDR_SHA

Al digest ottenuto, applichiamo la funzione crittografica ripemd160

ADDR_RIPEMD160=`printf $ADDR_SHA |xxd -r -p | openssl ripemd160 | sed 's/^.* //'`echo "digest RIPEMD160 "$ADDR_RIPEMD160

Come vedete, per comodità ho utilizzato delle variabili d’ambiente.

Che cosa manca per ottenere l’address? Applicare l’encoding base58 checksum.

$ ADDR_2=$(printf $PREFIX$ADDR_RIPEMD160 | xxd -p -r | base58 -c)$ echo $ADDR_2mfXmGhk1qovdUdtyWbuA5MKdpTiC4Ybz4C

L’address che ottengo è lo stesso che ho ottenuto con la chiamata getnewsaddress.

Vi ricordate che cosa contiene lo scriptPubKey?

Contiene anche l’hash160 della chiave pubblica. quello che noi abbiamo calcolato all’interno della variabile d’ambiente ADDR_RIPEMD160.

$ echo $ADDR_RIPEMD160002736d4bb3c8a6bed4957a92047a46acbcc5aa9

Analizziamo nuovamente la chiamata getaddressinfo sfruttando jq

$ bitcoin-cli getaddressinfo $ADDR | jq -r '.scriptPubKey'76a914002736d4bb3c8a6bed4957a92047a46acbcc5aa988ac

Infatti troviamo corrispondenza!
Nel prossimo video vedremo come creare una transazione e come questa viene validata!

Ciao e alla prossima!

— — –

🎥 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

--

--