La migliore guida passo passo agli script Bitcoin Parte 1

Lo scopo di questa guida è aiutarti a comprendere la logica alla base di Bitcoin Script. Poiché ci sarà troppo da coprire, la guida sarà divisa in due parti.

Bitcoin è stato creato per un solo scopo … le transazioni. Bitcoin è stato in grado di mostrare al mondo che un sistema di pagamento può esistere su un sistema peer-to-peer decentralizzato. Tuttavia, cosa succede dietro le quinte di queste transazioni? Dietro ogni piccola transazione, c’è del codice che funziona in background. Questo codice è il Bitcoin Scripting Language o semplicemente Bitcoin Script in breve.

La migliore guida agli script Bitcoin

Introduzione a Bitcoin Script

Lo script è un linguaggio di Turing incompleto, simile a Forth, stack-based, reverse-polish. Sì, sembra molto complicato, ma in realtà non lo è. Esaminiamo ogni termine dal contrario.

Turing incompleto

Un linguaggio di Turing Incomplete avrà funzionalità limitate e non sarà in grado di eseguire salti e / o loop. Quindi non possono entrare in un ciclo infinito. Essere Turing Complete significa che, date le risorse e la memoria, un programma Turing Complete sarà in grado di risolvere qualsiasi problema. Solidity è un esempio di un linguaggio Turing Complete.

Allora perché Bitcoin Script Turing non è completo?

Perché non è necessario. Bitcoin Script non deve essere complicato come uno smart contract di Ethereum. In effetti, se uno script fosse Turing Complete, avrebbe dato ai malintenzionati la libertà di creare transazioni complicate e consumare l’hash rate della rete Bitcoin e rallentare l’intero sistema.

Polacco inverso

La notazione polacca inversa è un sistema in cui gli operatori seguono gli operandi.

Significato:

  • 3 + 4 apparirà come 34+.
  • Quindi, per somme più lunghe e complicate:
  • 5 * 3 + 4 apparirà come 534 + *.

Basato su stack

Gli stack sono una delle strutture di dati più popolari in circolazione. Secondo Wikibooks, possono essere logicamente pensati come una struttura lineare rappresentata da una pila o pila fisica reale, una struttura in cui l’inserimento e la cancellazione di elementi avvengono ad un’estremità chiamata cima della pila.

L’idea di base dello stack è LIFO o Last In First Out. Considera la seguente pila di libri:

La migliore guida agli script Bitcoin

Qual è stato il primo libro che è stato messo in questa pila? Lupo solitario & Cucciolo giusto? Qual è stato l’ultimo libro? Giardini della Luna.

Se uno dovesse estrarre un libro da questa pila, Lupo Solitario & Cub non sarà il libro che tirerai fuori per primo, Gardens of the Moon sarà il primo che tirerai fuori.

Quindi, Last In First Out.

L’ultimo libro che è stato messo in questa pila sarà il primo libro estratto.

Ora, ci sono due operazioni sullo stack che devi conoscere:

  • spingere.
  • Pop.

spingere: L’atto di aggiungere cose nello stack è chiamato push.

Pop: L’atto di rimuovere le cose dalla pila è chiamato popping. Come è stato detto prima, l’ultimo oggetto che è stato inserito nella pila viene estratto per primo.

La migliore guida agli script Bitcoin

Credito immagine: Wikimedia

Forth-Like

Questo è piuttosto semplice. Bitcoin Script sembra assomigliare al linguaggio di programmazione “Forth” che è anche basato sullo stack.

Quindi, ora almeno sappiamo cos’è lo script, capiamo come funzionano le transazioni.

Come funzionano le transazioni in un Bitcoin?

Prima di continuare, un enorme ringraziamento al professor Donald J Patterson e al suo canale Youtube “djp3” per la spiegazione.

Supponiamo che Alice voglia inviare un certo numero di bitcoin a Bob. Come funziona il sistema di transazione in bitcoin? Le transazioni bitcoin sono molto diverse dalle transazioni del portafoglio Fiat. Se Alice dovesse dare $ 2 a Bob, prenderebbe fisicamente 2 dollari dal suo portafoglio e li darebbe a Bob. Tuttavia, le cose non funzionano in questo modo in bitcoin. Non possiedi fisicamente alcun bitcoin, quello che hai è la prova che hai bitcoin.

Ci sono altre due cose che devi sapere:

  • I minatori convalidano le tue transazioni inserendo i dati all’interno delle miniere che hanno bloccato. In cambio della fornitura di questo servizio, addebitano una commissione di transazione.

  • Quando si parla di valuta FIAT, non si tiene traccia di come e da dove si è ottenuta quella specifica nota. Per esempio. Apri subito il tuo portafoglio ed estrai tutte le banconote e le monete in esso contenute. Puoi dire da dove hai preso esattamente ogni nota e moneta specifica? È probabile che tu non lo sia. Tuttavia, in bitcoin, viene presa nota della cronologia di ogni singola transazione bitcoin.

Ok, quindi ora facciamo un tuffo nel modo in cui avviene una transazione bitcoin tra Alice e Bob. Ci sono due lati di una transazione, l’input e l’output. L’intera transazione avrà un nome che scopriremo alla fine. Per ora, esaminiamo le dinamiche.

Input della transazione

Affinché questa transazione avvenga, Alice deve ottenere bitcoin che ha ricevuto da varie transazioni precedenti. Ricorda, come abbiamo detto prima, in bitcoin, ogni moneta viene contabilizzata tramite una cronologia delle transazioni.

Quindi, supponiamo che Alice abbia bisogno di estrarre bitcoin dalle seguenti transazioni che chiameremo TX (0), TX (1) e TX (2). Queste tre transazioni verranno sommate e questo ti darà la transazione di input che chiameremo TX (Input).

Schematicamente, sarà simile a questo:

La migliore guida agli script Bitcoin

Quindi, questo è dal lato di input, vediamo come sarà il lato di output.

Output della transazione

L’output avrà fondamentalmente il numero di bitcoin che Bob possiederà, dopo la transazione e qualsiasi modifica rimanente rimasta, che verrà quindi rimandata ad Alice. Questa modifica diventa quindi il suo valore di input per tutte le transazioni future.

Una rappresentazione pittorica del lato di output è simile a questa:

La migliore guida agli script Bitcoin

Ora, questa è una transazione molto semplice che ha un solo output (a parte CHANGE), ci sono transazioni che sono possibili con più output.

Questo è l’aspetto del layout di base della transazione. Affinché l’intera cosa vada a buon fine, tuttavia, devono essere soddisfatte determinate condizioni.

Condizioni di una transazione

  • TX (ingresso) > TX (uscita). La transazione di input deve essere sempre maggiore della transazione di output. In qualsiasi transazione, il deficit tra l’input e l’output (output + cambiamento) è rappresentato dalle commissioni di transazione che i miner riscuotono. Così:

    Commissioni di transazione = TX (Input) – (TX (output) + Modifica).

  • Sul lato input:

    TX (0) + TX (1) + TX (2) = TX (ingresso).

    Se Alice non ha i fondi necessari per eseguire le transazioni, i miner rifiuteranno semplicemente le transazioni.

  • Bob dovrà dimostrare di poter fornire la prova necessaria per ottenere i bitcoin. Alice bloccherà le transazioni con l’indirizzo pubblico di Bob. Dovrà produrre la sua chiave privata per sbloccare le transazioni e ottenere l’accesso alle sue commissioni.

  • Alice deve anche verificare di avere i diritti necessari per inviare i bitcoin in primo luogo. Il modo in cui lo fa è firmare la transazione con la sua firma digitale (ovvero la sua chiave privata). Chiunque può decodificarlo utilizzando la sua chiave pubblica e verificare che sia stata davvero Alice a inviare i dati. Questa prova è chiamata “Dati della firma”. Ricordalo perché in seguito sarà molto importante.

Allora, quale sarà il nome di questa intera transazione?

I dati di input (inclusi i dati della firma) e di output vengono sommati e sottoposti a hashing utilizzando l’algoritmo di hashing SHA 256. L’hash di output è il nome assegnato a questa transazione.

Quindi, ora diamo uno sguardo dietro le quinte e vediamo come appare effettivamente la transazione.

La transazione dello script bitcoin: dietro le quinte

Questo è l’aspetto della transazione nel modulo del codice.

Supponiamo che Alice voglia inviare 0,0015 BTC a Bob e per farlo, invii input che valgono 0,0015770 BTC. Ecco come appaiono i dettagli della transazione:

La migliore guida agli script Bitcoin

Immagine per gentile concessione: canale youtube djp3.

La prima riga che vedi:

La migliore guida agli script Bitcoin

Nome della transazione noto anche come hash del valore di input e output.

Vin_sz è il numero di dati di input poiché Alice sta inviando i dati utilizzando solo una delle sue transazioni precedenti, è 1.

Vout_sz è 2 perché gli unici output sono Bob e il cambiamento.

Questi sono i dati di input:

La migliore guida agli script Bitcoin

Vedi i dati di input? Alice sta usando solo una transazione di input (nell’esempio che abbiamo dato sopra, questo sarà TX (0)), questo è il motivo per cui vin_sz era 1.

Sotto i dati di input ci sono i dati della sua firma.

Sotto tutto questo ci sono i dati di output:

La migliore guida agli script Bitcoin

La prima parte dei dati indica che Bob sta ottenendo 0,0015 BTC.

La seconda parte indica che 0,00005120 BTC è ciò che Alice sta ottenendo come resto.

Ora, ricorda che i dati di input in uscita erano 0,0015770 BTC? È maggiore di (0,0015 + 0,00005120). Il deficit di questi due valori è la commissione di transazione che i minatori stanno riscuotendo.

Uno sguardo più da vicino agli output delle transazioni

Come abbiamo visto sopra, ogni input in una transazione si trasforma in output, alcuni di questi output vengono spesi, mentre altri non vengono spesi e diventano cambiamento. Questa modifica è nota anche come UTXO o Unspent Transaction Output. UTXO continua a diventare Input nelle transazioni future.

Ogni output di transazione è costituito da due parti:

  • Il valore di quell’output.

  • Il puzzle crittografico che ha chiamato uno script di blocco o uno script testimone o uno scriptPubKey. Il puzzle deve essere sbloccato per poter spendere i soldi. Questo puzzle è codificato utilizzando il linguaggio Bitcoin Script.

Quindi, esaminiamo gli output di una transazione per identificare le parti sopra menzionate. Codice tratto da Andreas M. Antonopoulos. “Padroneggiare bitcoin.”

“Vout": [

{

"valore": 0,01500000,

"scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"

},

{

"valore": 0,08450000,

"scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",

}

]

Va bene, quindi abbiamo due output nel codice sopra.

Un’uscita ha un valore di 0,015 BTC mentre l’altra ha un valore di 0,0845 BTC. Per sbloccare il valore di 0,015, lo script di blocco che è necessario sbloccare funziona in questo modo:

“ScriptPubKey”: “OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG”

Uno sguardo ancora più attento agli input delle transazioni

Ora diamo un’occhiata all’altra faccia della medaglia, gli input delle transazioni.

Per eseguire un input, il portafoglio dell’utente passa attraverso i propri UTXO e seleziona quelli che hanno un valore sufficiente per la transazione.

Per esempio. se Alice vuole inviare 0.15 BTC a Bob e qui il set UTXO ha questo aspetto:

  • UTXO A = 0,09 BTC
  • UTXO B = 0,2 BTC
  • UTXO C = 0,005 BTC

Quali UTXO verranno scelti per questa transazione? È corretto, verranno scelti A e B e tutto ciò che resta diventerà l’UTXO per la prossima transazione di Alice.

Ora, diamo un’occhiata a un codice di input.

“Vin": [

{

"txid": "7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",

"vout": 0,

"scriptSig" : "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 [ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",

"sequenza": 4294967295

}

]

Vediamo cosa include ogni parte dello script di input:

  • txid: L’ID transazione si riferisce alla transazione da cui è stato generato questo UTXO. Questo aiuta a tenere traccia della transazione

  • vout: Si riferisce a quale output di quella transazione viene utilizzato. Per esempio. se quella transazione aveva due UTXO il primo sarà etichettato 0 (perché come abbiamo visto prima il conteggio parte da 0 e non 1) e il secondo sarà etichettato 1. In questo caso, stiamo usando il primo UTXO ieUTXO 0.

  • scriptSig: Come accennato in precedenza, ogni UTXO contiene uno script di blocco. Lo scriptSig include i dati necessari per sbloccare i dati.

  • sequenza: È stato incluso per aiutare le persone ad aggiornare le loro transazioni prima che siano confermate e finalizzate in un blocco, non proprio così rilevante per aiutare a comprendere le basi.

Serializzazione delle transazioni

Ora mettiamolo insieme e vediamo cosa abbiamo. Quando una transazione viene inoltrata su una rete, vengono serializzate. Come dice Andreas Antonopoulos,

“La serializzazione è il processo di conversione della rappresentazione interna di una struttura di dati in un formato che può essere trasmesso un byte alla volta, noto anche come flusso di byte.”

Nelle due sezioni precedenti, abbiamo visto una semplice transazione di input e una di output. se dovessimo serializzarlo e memorizzarlo in formato esadecimale, come sarebbe?

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73 4d2804fe65fa35779000000008b483045022100884d142d86652a3f47 ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84 16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1 7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6 8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000 1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

Sì, questo autore non ha sbattuto accidentalmente la testa sulla tastiera qui … è così che sembra.

Tuttavia, non aver paura. Avremo un senso abbastanza presto. Da qualche parte in quel flusso esadecimale, abbiamo i dati di input ei nostri dati di output. Troviamoli entrambi!

La serializzazione dell’output

La serializzazione della parte di output della transazione contiene le seguenti parti:

La migliore guida agli script Bitcoin

Credito immagine: Andreas Antonopoulos “Mastering Bitcoin”

Ora, quali dati sull’output sappiamo effettivamente?

  • Sono disponibili due valori di output.

  • Un valore di output vale 0,015 BTC o 1.500.000 satoshi

  • In esadecimale 1.500.000 è 16 e3 60, che se codificato in little-endian, cioè la prima notazione del byte meno significativo, dà 60 e3 16.

  • La lunghezza di scriptPubKey è di 25 byte, ovvero 19 in esadecimale.

Quindi, prendi nota di queste informazioni, cerchiamo i nostri dati di output.

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73 4d2804fe65fa35779000000008b483045022100884d142d86652a3f47 ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84 16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1 7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6 8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000 1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 00000000

La serializzazione dell’input

La serializzazione dell’input contiene i seguenti componenti:

La migliore guida agli script Bitcoin

Ora puoi individuare l’input della sua transazione?

0100000001186f9f998a5aa6f048e51dd8419a14d8a0f1a8a2836dd73 4d2804fe65fa35779000000008b483045022100884d142d86652a3f47 ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039 ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813 01410484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade84 16ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc1 7b4a10fa336a8d752adfffffffff0260e31600000000001976a914ab6 8025513c3dbd2f7b92a94e0581f5d50f654e788acd0ef800000000000 1976a9147f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a888ac 000000

Bene, quindi cosa abbiamo visto finora?

  • Gli output di una transazione e gli UTXO.
  • Gli input di una transazione.
  • Modalità di serializzazione dell’intera transazione.

Ora sappiamo che gli UTXO possono essere usati solo se sono sbloccati. Sappiamo che i valori di input hanno scriptSig che aiuta a sbloccarli. Come interagiscono tra loro?

Prima di arrivare a questo, però, dovremmo avere un’idea di come avvengono i calcoli e le operazioni in uno script bitcoin.

Come funziona lo script?

Prima di continuare con Script, sarà utile capire come funziona un sistema di pulitura inversa basato su stack.

Semplice aggiunta in un sistema di lucidatura inversa basato su stack

Come abbiamo detto prima 3 + 4 in reverse-polish apparirà come 34+, eseguiamo l’operazione di addizione usando uno stack.

La migliore guida agli script Bitcoin

Ecco come viene eseguita una semplice operazione di aggiunta sullo stack. Ora che questo è fatto, come sarebbe se fosse uno script?

OP_3 OP_4 OP_ADD

Cambia solo l’aspetto, il resto dell’operazione rimane lo stesso mostrato sopra. Il prefisso “OP_” è una firma del linguaggio Script.

Se vuoi un primer sui diversi codici operativi utilizzati in uno script quindi fare clic qui.

Semplice aggiunta utilizzando Bitcoin Script con un assegno

Supponiamo ora di voler fare 2 + 3 = 5.

In polacco inverso apparirà come 23 + 5 =.

Nella notazione dello script apparirà così:

OP_2 OP_3 OP_ADD OP_5 OP_EQUAL

La migliore guida agli script Bitcoin La migliore guida agli script Bitcoin

Ora, cosa sarebbe successo se avessimo usato il suffisso VERIFY in EQUAL? Significa che invece di OP_EQUAL abbiamo usato OP_EQUALVERIFY?

Nel momento in cui aggiungi il suffisso VERIFY, TRUE o FALSE non viene inserito nello stack, lo script continua esecuzione se TRUE o it fermate in esecuzione se è FALSE.

Questo è ciò che accade quando aggiungi “VERIFY” a un codice operativo. Tienilo a mente per esempi futuri.

Va bene, facciamo un ultimo esempio.

Semplice duplicazione nello script

Stiamo prendendo questo esempio solo per presentarti un codice operativo estremamente importante, DUP aka duplicato.

Vogliamo inserire un numero in una pila, duplicarlo e vedere se i due numeri sono uguali o meno (cosa che ovviamente sarà).

Useremo questo script:

OP_5 OP_DUP OP_EQUALVERIFY

La migliore guida agli script Bitcoin

Bene, ora hai un’idea di come vengono elaborati i calcoli in bitcoin Script, continuiamo con le nostre transazioni e vediamo come vengono eseguite.

Il gioco del blocco e dello sblocco

Le transazioni in bitcoin sono un gioco costante di blocco e sblocco. Gli UTXO sono bloccati da scriptPubKey mentre gli input della transazione contengono scriptSig. L’idea di scriptPubKey è quella di offrire un puzzle crittografico che può essere sbloccato solo tramite lo script corrispondente.

Allora, cosa succede esattamente e come si gioca a questo gioco?

Supponiamo che Alice voglia inviare a Bob un po ‘di bitcoin. L’indirizzo pubblico di Bob è di dominio pubblico e lei invierà i suoi Bitcoin all’indirizzo pubblico di Bob insieme a una condizione, Bob deve dimostrare che è davvero lui a ottenere il bitcoin.

Ora, torniamo un po ‘indietro e rivisitiamo alcuni concetti di base.

Tutti in bitcoin hanno due chiavi:

La chiave pubblica è derivata crittograficamente dalla chiave privata.

Ora, per ricevere denaro, tutti devono avere un indirizzo pubblico. Il pubblico viene eseguito attraverso due algoritmi di hashing, SHA-256 e RIPEMD-160. Il motivo per cui lo facciamo è assicurarci di avere un ulteriore livello di protezione, SE nel caso in cui qualcuno in qualche modo capisca come generare la tua chiave privata usando la tua chiave pubblica (che non è fattibile).

Nota: La chiave pubblica passa prima attraverso SHA-256 per fornire un hash di output a 256 bit, quindi quell’hash viene eseguito tramite RIPEMD-160 che fornisce un hash di output a 160 bit. Quindi, l’output finale è un hash a 160 bit.

Va bene, quindi Alice invierà i soldi all’indirizzo pubblico di Bob insieme a una condizione che Bob mostri una prova, che è davvero lui che ha ottenuto i soldi.

La prova che Bob usa per sbloccare i fondi è la sua firma digitale, che è derivata crittograficamente dalla sua chiave privata.

Pensa alle transazioni che Alice invia a Bob come una cassa chiusa e alla firma di Bob come passcode.

Ora, tornando al nostro script.

Alice invia a Bob un output che ha lo scriptPubKey, che include l’indirizzo di Bob.

Bob sblocca l’input utilizzando la sua firma di scriptSig che include la sua firma e la sua chiave pubblica.

Quindi, come lo rappresentiamo nel codice?

scriptPubKey = OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG.

Nota: Come funzionano OP_HASH160 e OP_CHECKSIG ti sarà presto chiaro.

scriptSig =

Per sbloccare l’output e utilizzare i suoi fondi Bob concatena o si unisce a scriptSig e scriptPubKey in questo modo:

La migliore guida agli script Bitcoin

Credito immagine: CryptoCompare

Bene, ora vediamo come funziona la sceneggiatura per consentire al povero Bob di accedere ai suoi fondi. Lo script in questo momento ha questo aspetto:

OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG.

Implementazione dello script del processo di sblocco / verifica

Ok, ora vediamo come funziona l’implementazione dello script dell’intero processo di verifica / sblocco.

In questo momento, il codice ha questo aspetto

La migliore guida agli script BitcoinLa migliore guida agli script Bitcoin

La migliore guida agli script Bitcoin

OP_CHECKSIG si apre e controlla per vedere la loro validità per sapere che sono firme e indirizzi pubblici validi.

Al termine dell’intero processo, Bob può sbloccare la transazione e ottenere l’accesso ai suoi fondi.

Congratulazioni! Hai appena effettuato un’intera transazione bitcoin!

Quello che vedi qui è il tipo più comune di transazione bitcoin: il P2PKH aka The pay to public key hash.

Allora, cos’è questo misterioso operatore CHECKSIG e come funziona? Bene, per questo dobbiamo guardare la crittografia dietro bitcoin.

Come funziona CHECKSIG?

Per sapere come funziona CHECKSIG, avremo bisogno di sapere cos’è una firma digitale. Una firma digitale è un codice digitale (generato e autenticato dalla crittografia a chiave pubblica) allegato a un documento trasmesso elettronicamente per verificarne il contenuto e l’identità del mittente.

L’algoritmo di firma digitale utilizzato da bitcoin è ECDSA o Elliptical Curve Digital Signature Algorithm.

Crittografia a curva ellittica è ciò che viene utilizzato da bitcoin, ethereum ecc. per i loro scopi di crittografia. Allora, cos’è una curva ellittica? Una curva ellittica è qualsiasi curva che soddisfa la seguente equazione:

Y ^ 2 = x ^ 3 + ascia + b

Dove (x, y) è un punto sulla curva e aeb sono costanti.

Ci sono infinite curve che puoi realizzare. Quello che segue è l’aspetto generale di una di queste curve:

La migliore guida sui bitcoin

Credito immagine: canale youtube CSBreakdown

Quali sono le proprietà di una curva ellittica?

  • La curva è simmetrica rispetto all’asse x.
  • Qualsiasi linea che passa per 2 punti sulla curva intersecherà la curva su un terzo punto.
  • Qualsiasi tangente sulla curva intersecherà la curva in un altro punto.

Esecuzione di matematica sulla curva.

Proprietà di addizione della curva

Supponiamo che ci siano due punti sulla curva V e A. Tracciamo quelli sulla curva e tracciamo una linea attraverso di essi. Questo intersecherà la curva su un terzo punto.

La migliore guida agli script Bitcoin

Credito immagine: canale youtube CSBreakdown

Chiameremo questo terzo punto X e lo rifletteremo sulla curva in questo modo:

La migliore guida agli script Bitcoin

Credito immagine: canale youtube CSBreakdown

Il riflesso di X è un punto che sarà incidentalmente (V + A). Questa è la proprietà additiva della curva ellittica.

Nota interessante. Se aggiungiamo due riflessioni tra loro, ovvero se dovessimo aggiungere X e V + A nel grafico sopra, otterremo infinito. Il motivo è che la linea che passa per X e (V + A) intersecherà la curva all’infinito.

Proprietà di moltiplicazione della curva

Ora, cosa succede se vogliamo aggiungere un numero a se stesso? Supponiamo di avere un punto V, cosa dobbiamo fare per trovare 2V? Eseguiremo una tangente attraverso V e la intersecheremo in un punto nel grafico, quindi troveremo il riflesso del punto sulla curva. Quella riflessione sarà 2V.

La migliore guida agli script Bitcoin

Credito immagine: canale youtube CSBreakdown

Questa è anche la proprietà moltiplicativa del grafico perché stiamo trovando punti che sono fondamentalmente la moltiplicazione di un intero con il punto stesso. Supponiamo ora di voler trovare 3V. Uniremo V e 2V e quindi rifletteremo il punto di intersezione, in questo modo:

La migliore guida agli script Bitcoin

Credito immagine: canale youtube CSBreakdown

Vedi come i punti scorrono nel grafico? Questo è ciò che gli dà la sua sicurezza.

Proprietà matematiche di una curva ellittica

Proprietà n. 1: I punti sulla curva formano un gruppo abeliano

Le proprietà del gruppo abeliano sono le seguenti:

  • Hanno un’identità.
  • Hanno riflessi alias inversi.
  • I punti hanno un significato associativo per tre punti A, B e C sulla curva: (A + B) + C = A + (B + C).
  • I punti sono chiusi sulla curva.
  • I punti hanno un significato commutativo per due punti A e B. A + B = B + A.

Proprietà n. 2: la moltiplicazione sulla curva è veloce

Tutte le moltiplicazioni eseguite sulla curva possono essere eseguite molto velocemente. Supponiamo ora di avere un punto P e di voler trovare 100P. Invece di aggiungere il numero a se stesso 100 volte, possiamo fare quanto segue:

  • Aggiungi il punto P a se stesso per ottenere 2P.
  • Aggiungi 2P e P per ottenere 3P.
  • Aggiungi 3P a se stesso per ottenere 6P.
  • Aggiungi 6P a se stesso per ottenere 12P.
  • Aggiungi 12P a se stesso per ottenere 24P.
  • Aggiungi 24P e P per ottenere 25P.
  • Aggiungi 25P a se stesso per ottenere 50P.
  • Aggiungi 50P a se stesso per ottenere 100P.

Quindi, invece di eseguire 99 passaggi, riduci l’intera operazione a soli 8 passaggi.

Proprietà n. 3: la divisione sulla curva è lenta

Mentre la moltiplicazione è veloce, la divisione è molto lenta. Supponiamo di avere Q = nP e di voler trovare il valore di n dividendo Q per P. Non possiamo davvero farlo. Dovremo scorrere manualmente i numeri uno per uno per trovare un valore che soddisfi l’equazione. Questo lo rende molto lento. Questo è chiamato problema logaritmico discreto e questo è ciò che dà alle curve la sua funzione di botola, cioè è facile moltiplicare n e P per ottenere Q ma dati Q e P, non è possibile ottenere n.

Quindi come funziona la verifica della firma sulle curve ellittiche?

(Nota: questo è ciò che accade specificamente in bitcoin)

Prima di vedere come funziona il processo, esaminiamo alcune variabili e il loro significato che utilizzeremo nelle seguenti equazioni.

Chiave privata = d.

Messaggio = z.

Chiave pubblica = Q.

G sarà un punto costante sul grafico che sarà fornito da bitcoin.

“K” è un numero casuale che verrà generato automaticamente per ogni firma univoca.

“N” è un’altra costante che verrà fornita da bitcoin.

Ok, quindi ora vediamo come funzionano i calcoli alla base della verifica.

Firmare un messaggio

Chiave pubblica Q = dG. (è impossibile ottenere la chiave privata da Q e G a causa della divisione in non fattibile).

Ora moltiplicheremo la G con il numero casuale “k” e tracciamo quel punto sul grafico. Le coordinate di quel punto sono (x, y). cioè (x, y) = kG

Successivamente, determiniamo due valori r e s tali che:

r = x mod n.

s = (z + rd) k ^ -1 mod n

Il motivo per cui generiamo r e s è che queste sono le coordinate della nostra firma.

Quindi, inviamo il punto (r, s) per la verifica.

Verifica di un messaggio

I verificatori condurranno una semplice equazione:

z * s ^ -1 * G + r * s ^ -1 * Q

Il valore di questa equazione ci darà il punto (x, y).

Ora, i verificatori possono semplicemente confrontare le coordinate x. Non hanno la coordinata x data loro direttamente dal mittente MA hanno i valori di r e n.

E poiché sappiamo già che r = x mod n, e quindi possono semplicemente risolvere per x.

Se i valori di x corrispondono, significa che la firma è verificata!

Bonus: uno sguardo più approfondito alla matematica

Esaminiamo l’equazione che i verificatori dovranno ripetere ancora una volta:

Passo 1: z * s ^ -1 * G + r * s ^ -1 * Q

Sappiamo che Q = d * G, sostituiamo semplicemente il valore.

Passo 2: z * s ^ -1 * g + r * s ^ -1 * d * G

Possiamo prendere (z + r * d) comune

Passaggio 3: (z + r * d) * s ^ -1 * G

Ora ricorda, abbiamo già stabilito che s = (z + r * d) * k ^ -1 mod n, sostituiamo i valori qui:

Passaggio 4: (z + r * d) * (z + r * d) ^ – 1 * k * G

Gli (z + r * d) * (z + r * d) ^ – 1 si annullano a vicenda e ci ritroviamo con:

Passaggio 5: k * G che è la coordinata (x, y) originariamente inviata dal mittente.

Cosa potrebbe andare storto nelle curve ellittiche?

Anche se è ovvio che le curve ellittiche sono la migliore modalità di crittografia disponibile, resta il fatto che ha ancora poche vulnerabilità:

  • E se fosse stata scelta una curva sbagliata? Se la curva contiene un loop, è possibile che 1001P = P per qualsiasi punto P sulla curva.

  • È possibile scegliere una curva debole che può essere suddivisa.

Ha i suoi punti deboli ma sono debolezze abbastanza gestibili.

FINE DELLA PARTE 1

Qui è dove finiremo la parte 1 della nostra Guida agli script di Bitcoin. Nella parte 2 tratteremo:

  • Transazioni con più firme.
  • Paga a Script Hash.
  • Controllo del flusso.
  • Timelocks.

Restate sintonizzati per la prossima parte!

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me