Vai al contenuto
buybitcoinsmart

Glossario / Riferimento per sviluppatori

Script di blocco

Noto anche come Pubkey script, scriptPubKey, Locking script.

Che cos'è lo script di blocco?
Lo script di blocco, o pubkey script, è il breve frammento di Bitcoin Script allegato a ogni output di transazione, che stabilisce le condizioni da soddisfare prima che i bitcoin di quell'output possano muoversi di nuovo.

I bitcoin non sono custoditi in un indirizzo: si trovano negli output, ciascuno protetto da uno script di blocco. Bitcoin Core chiama il campo scriptPubKey e, per un ordinario output moderno, è lungo 22 o 34 byte. Quando dai un indirizzo a qualcuno, gli stai consegnando la ricetta dello script di blocco che il suo wallet scriverà.

Come funziona

Ogni output di una transazione serializzata è tre cose in fila: otto byte di valore in satoshi, un prefisso di lunghezza e lo script di blocco stesso. Nulla nell'output nomina un destinatario. Lo script è il destinatario, e un indirizzo è solo una codifica con checksum della manciata di byte che contiene.

Cinque template coprono quasi tutto ciò che oggi è sulla blockchain. Un blocco legacy pay-to-public-key-hash occupa 25 byte e nomina quattro opcode attorno a un hash di 20 byte. Un blocco pay-to-script-hash è di 23 byte e termina con OP_EQUAL. Il SegWit nativo è deliberatamente più semplice in confronto: un byte di versione seguito da un solo push, 22 byte per una singola chiave e 34 byte per un hash di script, senza alcuna logica nell'output. Anche Taproot è di 34 byte, un byte di versione e una chiave di 32 byte.

La policy di relay riconosce quella breve lista e rifiuta di inoltrare qualsiasi altra cosa, ed è per questo che non puoi inventare un formato di output tuo e aspettarti che un wallet lo paghi. Il consenso qui è meno restrittivo della policy, ma l'effetto pratico è che i cinque template sono l'intero menù.

Il nome è un fossile. Nelle prime transazioni lo script conteneva davvero una chiave pubblica: l'output coinbase del blocco genesi è di 67 byte e contiene una chiave non compressa di 65 byte seguita da OP_CHECKSIG, e puoi leggerlo nel codice sorgente di Bitcoin Core stesso. Pagare un hash invece di una chiave è diventato la norma nel corso del 2011, e oggi la maggior parte degli script di blocco non contiene alcuna chiave pubblica, ma solo un vincolo crittografico a una chiave.

Dove lo vedi

Chiedi a qualsiasi nodo di decodificare una transazione grezza e ogni output porta un oggetto scriptPubKey con quattro campi: l'assembly leggibile, l'esadecimale grezzo, la stringa del tipo e l'indirizzo a cui il tipo corrisponde. I block explorer mostrano la stessa cosa, di solito con l'etichetta locking script o output script.

È anche il punto in cui risiede la configurazione watch-only di un wallet. Importare un indirizzo significa dire al tuo software quali script di blocco scansionare sulla blockchain, ed è per questo che un descriptor, una definizione che genera l'intera famiglia di script che una chiave può produrre, ha sostituito l'importazione indirizzo per indirizzo negli strumenti più seri.

L'abilità pratica di lettura è breve. Se lo script inizia con 0 e contiene 20 byte, qualcuno lo spenderà con una firma e un input economico. Se contiene 32 byte, dietro c'è un contratto che non puoi vedere. Se inizia con 1 e contiene 32 byte, è Taproot e può essere una singola chiave o un intero albero di condizioni con lo stesso aspetto.

Script di blocco vs script di firma

Lo script di blocco pone la domanda e lo script di firma tenta di rispondervi, e sono scritti da persone diverse in momenti diversi. Chi ti manda denaro scrive lo script di blocco, dall'indirizzo che gli hai dato, e paga i suoi byte. Tu scrivi lo script di firma più tardi, quando spendi, e paghi quei byte tu stesso. È per questo che inviare a un indirizzo Taproot costa al mittente un po' di più che inviare a uno legacy, mentre a te fa risparmiare parecchio di più quando alla fine muovi i bitcoin. I due script inoltre vengono eseguiti separatamente e non come un unico programma unito, una modifica introdotta nel 2010 dopo che l'esecuzione combinata originale si era rivelata sfruttabile.

Da non confondere con

Domande frequenti

Un indirizzo bitcoin è la stessa cosa di uno script di blocco?

No. L'indirizzo è una codifica che il wallet mittente riconverte in uno script di blocco. Alcuni script, come un output OP_RETURN nudo, non hanno alcun indirizzo, ed è per questo che gli explorer a volte mostrano un output con uno script e senza destinatario.

Perché si chiama pubkey script se non contiene alcuna chiave pubblica?

Il nome risale al 2009, quando gli output contenevano davvero una chiave pubblica grezza seguita da OP_CHECKSIG. Pagare un hash della chiave ha sostituito quello schema nel corso del 2011, ma il nome del campo scriptPubKey è rimasto nel codice e nella documentazione.

Termini correlati

Altro in Riferimento per sviluppatori

Leggi questa pagina in inglese