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 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 = 3
0100 = (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" | bc
34
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.
— — –
—
🐙 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