Hey, bizantino.

La transazione di Satoshi Nakamoto

Come è stata validata?

Come si valida una transazione P2PK?

Nell’articolo precedente abbiamo spiegato con la teoria come viene validata una transazione P2PK, adesso con l’aiuto del tool btcdeb, analizziamolo con la pratica. Vogliamo quindi analizzare la transazione avvenuta nel blocco 170, tra Hal Finney e Satoshi Nakamoto.

Se non siamo a conoscenza dell’esadecimale della transazione è necessario recuperarlo dal suo blocco. e dato che non sappiamo neanche l’hash del blocco, lo recuperiamo tramite la sua altezza.

 

$ bitcoin-cli getblockhash 170

Adesso possiamo recuperare le transazioni.

$ bitcoin-cli getblock 00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee

Le transazioni sono due, sappiamo però dai video precedenti, che la prima transazione è sempre la coinbase.

Analizziamo quindi la seconda transazione.

$ bitcoin-cli getrawtransaction f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16 2 | jq

Analizzando il vout possiamo vedere i due output generati da questa transazione, entrambi sono pubkey.
Il primo output ha 10 bitcoin, e la seconda transazione, che rappresenta il resto, è di 40 bitcoin.

Sono sicuro che rappresenti il resto perchè nello scriptPubKey troviamo la stessa chiave pubblica della transazione in ingresso, cioè 0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3

Analizziamo la transazione in ingresso, che troviamo nel vin:

$ bitcoin-cli getrawtransaction 0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9 2 | jq

Come vedete nel in hex troviamo la stessa chiave pubblica, nel prossimo video vedremo come identificarla meglio.

Cerchiamo invece di capire come lo stack viene validato sfruttando btcdeb.

Il software si aspetta la transazione d’ingresso, e la transazione di uscita per costruire lo stack. Per fare questo possiamo utilizzare le variabile d’ambiente. Chiamerò TX_IN la transazione in ingresso e TX_OUT la transazione in uscita, quella che contiene due output.

➜  ~ $ TX_IN=$(bitcoin-cli getrawtransaction 0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9)

Per verificare il valore delle variabili d’ambiente, possiamo utilizzare il comando echo.

➜  ~ $ echo $TX_IN

Utilizziamo quindi il programma btcdeb.

$ btcdeb --tx=$TX_OUT --txin=$TX_IN
 
Image for post

Come mostrato nei video precedenti dove veniva utilizzata la lavagna, il primo elemento che viene inserito nello stack è lo scriptSig, che in questo caso contiene la firma digitale.

l’operazione che viene effettuata è un’operazione di PUSH.

 
Image for post

Successivamente sono effettuate altre due operazioni di PUSH, quindi la chiave pubblica non compressa. Successivamente l’operation code OP_CHECKSIG ha il compito di fare POP di due elementi in top, quindi in cima alla pila, verificare firma, e pushare 1 se la firma è valida, 0 altrimenti

 
Image for post

La firma è valida, quindi il numero che viene inserito l’elemento 1.

Lo stack è stato eseguito con successo dato che l’ultimo e unico elemento dello stack è 1, il quale rappresenta la buon riuscita del programma.