Glossario / Riferimento per sviluppatori
Opcode
Noto anche come Opcode che spingono dati, Opcode che non spingono dati.
- Che cos'è un opcode?
- Un opcode è un singolo byte di Bitcoin Script che indica a un nodo di validazione cosa fare dopo, ovvero inserire dati sullo stack o eseguire un'operazione su ciò che è già presente.
Bitcoin Script ha un vocabolario fisso di 256 possibili valori di byte, divisi tra opcode che inseriscono dati letterali e opcode che agiscono sui dati già inseriti. Uno script legacy può eseguire al massimo 201 opcode operativi e non può superare 10.000 byte. Per chi compra bitcoin, quel vocabolario ridotto è il motivo per cui un wallet può indicare una commissione prima di trasmettere la transazione, e per cui bitcoin non offre alcuna superficie a bug incontrollati dei contratti.
Come funziona
Un nodo di validazione legge uno script un byte alla volta e cerca ogni byte in una tabella fissa. I valori da 0x01 a 0x4b non sono affatto istruzioni: ognuno indica che i successivi N byte sono dati letterali e vanno sullo stack, ed è per questo che una chiave pubblica compressa di 33 byte compare in uno script come 0x21 seguita dalla chiave stessa. Altri tre codici di push, OP_PUSHDATA1, OP_PUSHDATA2 e OP_PUSHDATA4, coprono gli elementi più lunghi, e i valori da 0x51 a 0x60 inseriscono gli interi piccoli da 1 a 16 che compaiono nei conteggi di quorum.
Tutto ciò che sta sopra 0x60 esegue un'operazione invece di trasportare dati, e sono questi che bitcoin conta. Uno script precedente a Taproot può contenerne al massimo 201, non può avere alcun elemento dello stack più grande di 520 byte, non può tenere più di 1.000 elementi sui suoi stack e non può superare 10.000 byte in totale. Tutti e quattro i valori provengono da script.h in Bitcoin Core, e tutti e quattro sono regole di consenso, non preferenze che l'operatore di un nodo possa allentare.
Quindici opcode sono elencati nella tabella ma sono morti. OP_CAT, OP_MUL, OP_LSHIFT e altri dodici sono stati disattivati nel 2010 dopo un bug che causava arresti anomali, e uno script che ne contenga anche solo uno fallisce, persino dentro un ramo che non viene mai eseguito. Nessuno è mai stato riattivato. Quella singola decisione è la ragione principale per cui lo scripting di bitcoin è più ristretto di quanto la parola "programmabile" porti a supporre.
Tapscript ha riscritto la contabilità per le spese Taproot. Il BIP-342, in vigore dal blocco 709.632 a novembre 2021, ha eliminato sia il tetto di 201 istruzioni sia il limite di dimensione di 10.000 byte, sostituendoli con un budget di firme: la transazione deve portare 50 unità di peso per ogni firma che lo script verifica. Ha anche trasformato un blocco di valori di byte non definiti in codici OP_SUCCESS, così uno script che ne contiene uno è valido senza essere affatto eseguito. È uno spazio lasciato di proposito per aggiornamenti futuri.
Perché questo conta quando compri bitcoin
Gli opcode decidono quanto costa il tuo prelievo. Un output legacy esplicita quattro istruzioni operative intorno a un hash di 20 byte in 25 byte; l'equivalente SegWit nativo è un byte di versione e un push, 22 byte; un output Taproot è di 34. Poiché SegWit ha spostato il lato di sblocco nel witness a un quarto del peso, spendere un output bech32 richiede circa 68 byte virtuali contro circa 148 per la versione legacy dello stesso pagamento. Scegliere bech32 o bech32m al momento del prelievo, ovunque l'exchange lo offra, è quasi la decisione più economica di questo glossario.
Gli opcode decidono anche cosa il tuo dispositivo di firma può davvero gestire. Un wallet hardware che riconosce solo i template standard a chiave singola non può cofirmare un vault con timelock o una policy insolita, quindi se la pianificazione successoria o il multisig rientrano in qualche modo nei tuoi piani, controlla il supporto degli script nelle recensioni prima di comprare il dispositivo, non dopo che i bitcoin sono già su di esso.
La ristrettezza è una proprietà di sicurezza, non una mancanza. Non ci sono cicli, non c'è modo di leggere un'altra transazione e non c'è stato che persista tra una spesa e l'altra, quindi la modalità di guasto che ha prosciugato miliardi di dollari dalle catene programmabili, un contratto che si comporta correttamente con input che il suo autore non ha mai considerato, non ha dove verificarsi. Le perdite di bitcoin derivano da exchange, phishing e backup smarriti, non da malfunzionamenti del motore degli script.
Esempio pratico: il giorno in cui OP_NOP2 ha messo i denti
OP_NOP2 era il byte 0xb1 e non faceva assolutamente nulla, uno dei dieci no-op numerati lasciati nella tabella per un uso futuro. Il BIP-65 gli ha assegnato un compito: verificare che il locktime della transazione sia trascorso e far fallire lo script in caso contrario. L'applicazione è iniziata al blocco 388.381 il 14 dicembre 2015, e da allora l'opcode si chiama OP_CHECKLOCKTIMEVERIFY.
Il trucco è che il software vecchio vedeva ancora un byte che non fa nulla, quindi continuava ad accettare le nuove transazioni come valide. Solo i nodi aggiornati applicavano il timelock. È quella asimmetria che rende morbido un soft fork, e per la stessa via OP_NOP3 è diventato OP_CHECKSEQUENCEVERIFY al blocco 419.328 a luglio 2016. Restano otto slot no-op riservati, che sono gran parte dello spazio di aggiornamento che rimane a bitcoin con le regole precedenti a Taproot e buona parte del motivo per cui tanta attenzione progettuale si è spostata sui valori OP_SUCCESS creati da Tapscript.
Opcode vs Bitcoin Script
Bitcoin Script è il linguaggio e un opcode è una parola del suo vocabolario. La distinzione conta quando leggi affermazioni su cosa bitcoin può o non può fare, perché quasi ogni proposta seria dell'ultimo decennio è stata una proposta di definire un nuovo opcode, non di cambiare il linguaggio che lo circonda. OP_CHECKTEMPLATEVERIFY, OP_CAT e OP_CHECKSIGADD sono ciascuno un singolo byte con un singolo compito, e le discussioni pubbliche sui covenant o sui vault sono discussioni su se a uno specifico byte debba essere permesso significare qualcosa. Lo stack, i limiti e l'assenza di cicli restano esattamente come sono quando arriva un nuovo opcode.