Bitcoin Script

Pubblicato da Matteo il

In questo primo articolo parleremo di Script, il linguaggio di programmazione utilizzato dal protocollo bitcoin.

Analizziamo le sue peculiarita:

  • Turing Incomplete
  • Stack Based
  • Reverse Polish

Un linguaggio #TuringComplete o #UniversalLanguage deve poter risolvere qualunque problema che la macchina di turing Universale sia in grado di  eseguire. 

Un linguaggio #TuringInComplete o #non-universal ha dei limiti, per esempio non ha la possibilita’ di fare dei loop, oppure richiamare una funzione saltando da un pezzo di codice all’altro.

Vi chiederete come mai un protocollo che sostiene una tecnologia cosi avanzata come la blockchain non possa adottare un linguaggio di programmazione “dei giorni nostri”…

E’ stato scelto per questioni di sicurezza.

Ogni singolo nodo che fa girare script deve garantire che il programma termini. Potendo utilizzare dei loop s’incorre nell’eventualita’ di entrare in cicli infiniti e questo non deve poter accadere nel modo piu’ assoluto!

i = 0

while i < 10:

    print(i)

    i += 1

La struttura dati alla base di #Script  e’ lo stack. la sua particolarita’ e’ che l’inserimento e la cancellazione degli oggetti avvengono a un’estremita’.

Script e’ un linguaggio stack based LIFO (Last in First Out), l’ultimo elemento che entra e’ il primo che esce.

Il comando Push “spinge” un elemento all;inizio dello stack, mentre Pop prende l’elemento all’inizio della pila per l’eventuale lavorazione.

Script mappa ogni esadecimale con delle opcode.

Alcuni opcode possono tornare un valore, come per esempio per delle operazioni matematiche, altri sono semplicemente di controllo booleano dove, quando non ritorna nessun valore,  vuol dire che il controllo e’ andato a buon fine.

Ma.. qual e’ lo scopo di Script? 

Gestire il processo di locking/unlocking delle transazioni.

I nodi, eseguendo Script, effettuano delle verifiche sulla transazione, inserendo nello stack prima l’unlocking script e poi il locking script.

Alla fine della sua verifica, Script ritorna un valore booleano che puo’ essere True o meglio il valore 1, quando la transazione e’ valida.

Quando non e’ valida?

  • Se lo Script e’ stato eseguito completamente, abbiamo un valore true, ma nello stack ci sono ancora dei dati.
  • Se a fine programma lo stack e’ vuoto.
  • Se a fine programma il valore ritornato e’ 0.

Facciamo un esempio di come funziona Script.

Facciamo la somma di due numeri, 200 e 300, il risultato deve essere 500.

La rappresentazione in script e’ la seguente:

200 300 OP_ADD 500 OP_EQUAL

Ricordiamo che:

  • Push e’ l’operazione d’inserimento.
  • Pop e’ l’operazione d’estrazione.
  • Inserimento LIFO.

Procediamo:

  • push 200
  • push 300
  • OP_ADD questo operatore aggiunge x+y, nel nostro caso 200+300, l’operazione e’ riprendere i due valori, sommarli e poi pushare il risultato.
  • pop 200
  • pop 300
  • push 500
  • OP_EQUAL ha il compito di pushare true se uno o due elementi sono uguali
  • pop 500
  • pop 500
  • push 1

Queste sono le operazioni che il nodo effettua per la verifica della transazione.

Se fosse un operazione cosi semplice a determinare il possesso di verifica non sarebbero molto al sicuro i nostri bitcoin. Ecco perche’ viene utilizzata la crittografia asimmetrica che elimina ogni singola possibilita’ di compromettere tale verifica.