Glossario / Riferimento per sviluppatori
Witness script
- Che cos'è il witness script?
- Il witness script contiene le reali condizioni di spesa di un output P2WSH e viaggia nel witness, dove i suoi byte pesano un quarto del costo abituale.
Specificato nel BIP-141.
SegWit ha dato agli script una sezione propria della transazione, e il witness script è ciò che finisce lì quando si spende un vault bc1q. Ogni byte dentro il witness conta come un'unità di peso invece di quattro, uno sconto del 75 per cento arrivato con il blocco 481.824 ad agosto 2017. È per quello sconto che la custodia multisig ha smesso di essere costosa.
Come funziona
Il witness script è impegnato da un semplice hash SHA-256 che sta nell'output, e resta segreto fino al giorno in cui qualcuno spende. Chi spende riempie lo stack del witness con gli argomenti richiesti dalle condizioni, poi aggiunge lo script serializzato come ultimo elemento. Un nodo calcola l'hash di quell'elemento, confronta i 32 byte con l'impegno ed esegue ciò che ha appena verificato.
Il consenso applica gli stessi tetti sullo script delle spese legacy: 10.000 byte di script e 201 istruzioni operative. La policy di relay si ferma molto prima, a 3.600 byte e non più di 100 elementi sullo stack, quindi qualsiasi cosa di più grande richiede un accordo diretto con un miner invece della normale trasmissione.
È l'aritmetica che ha cambiato il comportamento. Uno script 2-di-2 occupa 71 byte: due push di chiavi pubbliche da 33 byte, i due opcode di conteggio e l'opcode di verifica. Dentro un witness quei 71 byte costano 71 unità di peso, meno di 18 byte virtuali. Gli stessi 71 byte portati nel vecchio modo, in un signature script, costano 284 unità di peso, ovvero 71 byte virtuali. Sulla sicurezza non è cambiato nulla, solo il prezzo per usarla.
Dove lo vedi
Lightning funziona con i witness script. Ogni canale è finanziato in un output 2-di-2, e le transazioni di commitment dentro un canale sono costruite da una piccola raccolta di script per la revoca e per i pagamenti con blocco hash specificati in BOLT 3, il che significa che la maggior parte di essi viene creata e distrutta senza mai raggiungere la catena.
L'hardware per la firma li vede come un campo con un nome. Il formato PSBT definisce uno slot per il witness script sia sugli input sia sugli output, così un coordinatore può consegnare a un cofirmatario le condizioni esatte che si stanno soddisfacendo e il dispositivo può mostrare all'utente a cosa sta acconsentendo invece che a un hash.
Li vedi anche incapsulati. Un indirizzo P2SH-P2WSH annidato, comune sugli exchange che non hanno mai aggiornato le loro schermate di prelievo, porta un redeem script da 34 byte il cui unico compito è puntare al witness program, con il witness script sotto che fa il lavoro vero.
I backup richiedono i byte dello script, non solo le chiavi. Conserva l'output descriptor insieme a ogni seed, perché un witness script che nessuno ha messo per iscritto trasforma un quorum con tutte le firme in bitcoin che nessuno può muovere.
Witness script vs Tapscript
Un witness script è un unico script rivelato per intero; una foglia tapscript è un ramo di un albero in cui viene pubblicato solo il ramo che usi. Con il BIP-341 un output si impegna a una radice di Merkle su molte foglie, quindi un vault con cinque percorsi di recupero distinti ne mostra esattamente uno al momento della spesa e tiene gli altri quattro privati per sempre. Tapscript elimina anche il limite di 10.000 byte, disattiva OP_CHECKMULTISIG in favore di OP_CHECKSIGADD, adatto alla verifica in batch, e applica un budget di peso per le verifiche di firma invece di un conteggio fisso di istruzioni. Se il tuo wallet scrive bc1q, stai usando witness script; bc1p indica invece il design Taproot.