Glossario / Riferimento per sviluppatori
Bitcoin Script
Noto anche come Script.
- Che cos'è Bitcoin Script?
- Bitcoin Script è il piccolo linguaggio basato su stack che ogni output di bitcoin porta con sé, e che stabilisce le condizioni che qualcuno deve soddisfare prima che quei bitcoin possano essere spesi di nuovo.
I bitcoin non si inviano a persone. Sono bloccati dietro un breve programma, e spenderli significa fornire dati che fanno terminare il programma con un valore vero in cima allo stack. Il linguaggio non ha cicli né ricorsione, e uno script legacy si ferma a 10.000 byte e 201 operazioni, quindi un validatore sa sempre che il lavoro finirà. Per questo bitcoin non ha mai avuto un contratto fuori controllo.
Come funziona
Bitcoin Script è una macchina a stack che legge da sinistra a destra e non fa altro.
Le spinte di dati finiscono su uno stack; le operazioni ne estraggono gli argomenti e vi ripongono i risultati. Non ci sono variabili, né salti all'indietro, né alcun modo di leggere qualcosa al di fuori della transazione in fase di validazione. Uno script ha successo quando l'esecuzione termina senza errori e lascia un valore vero in cima.
Due parti si incontrano al momento della spesa. L'output speso porta il blocco, chiamato pubkey script. L'input che lo spende porta la prova, chiamata signature script per gli output più vecchi o witness per quelli segwit. Vengono eseguiti in sequenza con lo stack che passa dall'uno all'altro, mai concatenati in un unico programma, una separazione introdotta presto, quando divenne chiaro che chi spendeva, potendo inserire operatori nel lato che blocca, avrebbe potuto riscrivere le condizioni.
Lo script più comune nella storia di bitcoin vale la pena leggerlo per intero. Un output pay-to-public-key-hash contiene OP_DUP, OP_HASH160, un hash di 20 byte, OP_EQUALVERIFY e OP_CHECKSIG. Chi spende fornisce una firma e una chiave pubblica. L'esecuzione spinge entrambe, duplica la chiave pubblica, calcola l'hash della copia fino a 20 byte, spinge l'hash atteso, confronta i due e si interrompe se differiscono, poi verifica la firma rispetto a una serializzazione della transazione stessa. Sei passaggi, e l'intera sicurezza di un indirizzo legacy si basa su di essi.
I limiti sono deliberati e precisi. Uno script legacy o P2SH non può superare 10.000 byte né 201 operazioni diverse dalle spinte di dati. Nessun singolo elemento sullo stack può superare 520 byte. Lo stack non può contenere più di 1.000 elementi. Un solo OP_CHECKMULTISIG non può nominare più di 20 chiavi pubbliche. Ogni limite esiste perché il costo di validare un blocco resti circoscritto, qualunque cosa scriva chiunque.
Il linguaggio è cresciuto due volte, dando un significato reale a codici no-op riservati. Il BIP65 ha definito OP_CHECKLOCKTIMEVERIFY a dicembre 2015, permettendo a un output di rifiutarsi di muoversi prima di un tempo o di un'altezza indicati. Il BIP112 ha fatto lo stesso per OP_CHECKSEQUENCEVERIFY, attivo dal blocco 419.328 a luglio 2016, aggiungendo timelock relativi misurati dal momento in cui il bitcoin è stato confermato. Quei due opcode sono il motivo per cui i canali Lightning, il deposito a garanzia con scadenza e gli schemi di eredità con timelock possono esistere.
Perché questo conta quando compri bitcoin
L'indirizzo verso cui prelevi è un tipo di script, e la scelta si vede sulla commissione successiva.
Spendere un input legacy pay-to-public-key-hash costa circa 148 byte virtuali. Spendere un input segwit nativo costa circa 68, perché lo sconto sul witness introdotto dal BIP141 addebita i dati del witness a un quarto del prezzo, e una spesa taproot key-path è ancora più piccola. A una commissione di 20 sat/vB quel divario è gran parte del costo di un piccolo prelievo, ripetuto ogni volta che muovi bitcoin. Dove un exchange ti permette di scegliere il formato dell'indirizzo verso cui prelevare, scegliere quello moderno è uno sconto permanente.
Script è anche ciò che in realtà è una cassaforte multisig. Una configurazione 2-di-3 è uno script che nomina tre chiavi pubbliche e richiede due firme, e se un dato dispositivo possa mostrarne uno e firmarlo in modo onesto è una questione che le nostre recensioni dei wallet hardware affrontano direttamente. Lo stesso vale per qualsiasi piano di eredità basato su un timelock: i bitcoin sono recuperabili solo se qualcuno ha ancora lo script, ed è per questo che i descrittori di output, la ricetta in testo semplice per ricostruirlo, devono stare nel tuo backup insieme alla frase di recupero.
Un avvertimento pratico. Quando una piattaforma rifiuta di inviare a un indirizzo che hai incollato, la causa è quasi sempre che il suo codice di prelievo non sa costruire quel tipo di script, non che il tuo indirizzo sia sbagliato. Prova qualsiasi formato di indirizzo che non conosci con una piccola somma prima di muovere un saldo a cui tieni.
Il bug dei 184 miliardi di bitcoin e gli opcode che Satoshi ha disattivato
Il 15 agosto 2010, il blocco 74.638 conteneva una transazione che ha creato 184.467.440.737,09551616 bitcoin, divisi in due output da circa 92,2 miliardi ciascuno.
Il controllo che gli output di una transazione non superassero gli input usava aritmetica con segno a larghezza fissa, e output abbastanza grandi da mandare in overflow quell'aritmetica sommavano a un numero negativo, così il controllo passava. Un client corretto è apparso in circa cinque ore, e la catena onesta ha superato quella difettosa all'altezza 74.691. Quei bitcoin non sono mai esistiti sulla catena che tutti usano.
Quell'episodio, insieme a una famiglia di bug correlati nelle operazioni sulle stringhe e aritmetiche, è il motivo per cui quindici opcode sono disattivati in modo permanente: OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT e OP_RSHIFT. Una transazione il cui script ne contenga anche solo uno è invalida, eseguito o no. La disattivazione è stata uno strumento brusco applicato sotto pressione di tempo, e annullarne in parte è lavoro in corso: il BIP347 propone di ripristinare OP_CAT dentro tapscript, dove i limiti più recenti rendono molto più difficile abusarne.
Bitcoin Script vs tapscript
Tapscript è Bitcoin Script con il regolamento riscritto, e si applica solo all'interno di una spesa taproot script-path. Il BIP342 ha eliminato sia il limite di 10.000 byte per la dimensione dello script sia il limite di 201 operazioni, ha disattivato OP_CHECKMULTISIG e OP_CHECKMULTISIGVERIFY e ha aggiunto OP_CHECKSIGADD al loro posto, così le politiche multisig possono essere verificate in batch. I controlli di firma sono misurati invece che contati: ogni input riceve un budget di 50 più la dimensione serializzata del suo witness, e ogni controllo di firma eseguito ne consuma 50. Stessa macchina a stack, contabilità diversa.
Bitcoin Script vs un pubkey script
Bitcoin Script è il linguaggio; un pubkey script è un programma scritto in esso. Un output contiene un pubkey script, che è il blocco. L'input che lo spende contiene un signature script o un witness, che è la chiave. Entrambi sono Bitcoin Script, e chiamare l'uno o l'altro semplicemente "lo script" è la fonte di confusione più comune quando si legge una transazione grezza, perché le due metà vengono valutate separatamente e solo una di esse era vincolata quando i bitcoin sono stati ricevuti.