Come si riconosce la firma digitale in Bitcoin?#

Come si riconosce la firma digitale in Bitcoin? Come si riconosce la firma digitale in Bitcoin?

Nel video precedente, abbiamo analizzato con la pratica come la transazione viene P2PK viene validata.

Ci si potrebbe domandare: Come riesce il software a sapere cosa inserire all’interno dello stack?

Come spiegato nei precedenti video, Bitcoin utilizza script, linguaggio di programmazione necessario per validare lo stack.

Prima di analizzare come lo stack riesce a capire cosa inserire al suo interno, è necessario spiegare alcune informazioni di base.


Il bit è l’acronimo di binary digit, ed è un’unità di misura informatica.

0 spento
1 acceso

Il byte è formato da 8 bit (2⁸).

Il nibble invece è formato da 4 bit.


Analizziamo anche i sistemi di numerazione. Base2, sistema di numerazione binaria, base della potenza è due. Simboli a disposizione sono 0 e 1.

10 = (1*2¹+0*2⁰) = (1*2+0*1) = 2

Ed ecco come il simbolo 10 corrisponde a 2 in base10. Base10, sistema di numerazione decimale, ha come base della potenza è 10, ed è quello che utilizziamo noi umani. I simboli a disposizione sono da 0–9.
Prendendo come riferimento l’esempio precedente, vediamo come è interpretiamo il numero 5201.

5201=(5*10³+2*10²+0*10¹+1*10⁰) = 5000+200+0+1 = 5201.

Piu semplicemente, ogni elemento viene moltiplicata per la sua posizione, per questo si chiama anche sistema di numerazione posizionale.

5*1000 + 2*100 + 0*10 + 1*1 = 5201

Ogni unità viene moltiplicata per la sua posizione, ottenendo così:

5*1000 + 2*100 + 0*10 + 1*1 = 5201

Il sistema esadecimale, o base16 o hex, è formato da 16 simboli

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, A, B, C, D, E, F.

Ogni carattere esadecimale corrisponde a un nibble, per questo motivo è possibile rappresentare 1 byte con due caratteri esadecimali.

Ad esempio il numero 52 corrisponde a 0x34

il numero 52 corrisponde a 34 in esadecimale. il numero 52 corrisponde a 34 in esadecimale.

Il numero 52 in base due è rappresentato da 0011 0100, in totale 1 byte, 8 bit. Dato che un carattere esadecimale può essere rappresentato da un nibble, possiamo dividerlo a “meta”, 4 bit e 4 bit

0011 = (0*2³)+(0*2²)+(1*2¹)+(1*2⁰) = 0+0+2+1 = 30100 = (0*2³)+(1*2²)+(0*2¹)+(0*2⁰) = 0+4+0+0 = 4

Potete utilizzare il comando obase, per ottenere numeri in esadecimale

$ echo "obase=16;52" | bc34

Arriviamo quindi al momento di analizzare la transazione dell’articolo precedente:

$ bitcoin-cli getrawtransaction f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16 2 | jq

...

"scriptSig": {"asm": "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d09[ALL]","hex": "47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901"},

Analizziamo il primo dello scriptSig, ovvero l’esadecimale 47.

47 non è mappato su nessuna Operation code, ma ci indica quanti elementi prendere successivamente.

Ricorda che sono caratteri esadecimali, quindi per sapere il numero in base10 dobbiamo convertire 47 in base10.

quindi:

(4*16¹) + (7*16⁰) = 71

Sappiamo che un byte può essere rappresentato da 2 caratteri esadecimali, quindi:

71*2 = 144

Quindi saranno 144 i caratteri esadecimali da prendere in considerazione. Ed ecco come 47 ci indicati inserire 144 esadecimali nello stack (quelli in italico)

47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901

I quali rappresentano la firma digitale.
Successivamente si inserisce lo scriptPubKey, della UTXO (0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9) di riferimento. Lo scriptPubKey viene interpretato nel medesimo modo.

"vout": [

{

"value": 50,

"n": 0,

"scriptPubKey": {

"asm": "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG",

"hex": "410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac",

"type": "pubkey"

}

}

],

Il primo byte che troviamo è 41, il quale ricade nel range delle costanti di Bitcoin script e ci indica quanti caratteri esadecimali prendere successivamente.

410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac

41 in base10 corrisponde a 65. Sappiamo che 1 byte può essere rappresentato da 2 caratteri esadecimale:

65*2 = 130

Dobbiamo inserire 130 caratteri esadecimali all’interno dello stack, i quali corrispondono alla chiave pubblica NON compressa.

Il byte successivo è rappresentato da ac. Attenzione l’esadecimale 0xac è tappato sull’operato code OP_CHECKSIG.

Quindi viene inserito nello stack.

Successivamente, come abbiamo affrontato nel precedente video, lo stack viene validato.

Estratto dell’articolo Estratto dell’articolo

I nostri libri disponibili su corsobitcoin.com I nostri libri disponibili su corsobitcoin.com