Glossario / Riferimento per sviluppatori
Script di riscatto
Noto anche come Redeem script.
- Che cos'è uno script di riscatto?
- Uno script di riscatto è il contratto di spesa completo nascosto dietro un output pay-to-script-hash, fornito da chi spende alla fine dello script di firma e di cui si calcola l'hash per verificare che corrisponda.
Specificato nel BIP-16.
Il BIP-16 ha permesso a un mittente di pagare un hash di 20 byte invece di un intero contratto, e lo script di riscatto è il contratto che quell'hash rappresenta. Deve stare in un solo elemento dello stack, quindi 520 byte è il tetto invalicabile. Se perdi quei byte le tue chiavi private non valgono nulla, e questo rende lo script di riscatto parte del tuo backup e non del tuo software.
Come funziona
Uno script di riscatto è invisibile finché i bitcoin restano fermi. L'output che li detiene contiene solo un hash e un pattern riconosciuto dal consenso, applicato su tutta la rete dal 1º aprile 2012, al blocco 173.805. Chi ti paga non scopre nulla sulle condizioni, e nemmeno un block explorer.
La rivelazione avviene nella spesa. Lo script di firma inserisce gli argomenti che il contratto richiede e termina con il contratto stesso serializzato. Un nodo che valida prende quell'ultimo elemento, ne calcola l'hash, confronta il risultato con l'hash nell'output e solo allora deserializza l'elemento e lo esegue come codice sul resto dello stack. Entrambe le fasi devono superare il controllo, e poiché il campo che lo trasporta può contenere solo operazioni di push, lo script stesso non può introdurre di nascosto alcun comportamento prima di essere verificato.
Lo script di riscatto più diffuso in assoluto non è affatto un contratto. Dal 2017 in poi, i wallet che volevano i risparmi di SegWit pur restando pagabili da software vecchio hanno avvolto un programma witness in un hash di script, così lo script di riscatto è di 22 byte: un byte di versione e un hash di chiave di 20 byte, senza nulla da eseguire. Milioni di indirizzi di prelievo degli exchange che iniziano con 3 nascondono esattamente questo e nulla di più.
Dove lo vedi
Bitcoin Core te ne fornisce uno ogni volta che crei un indirizzo di script, e il suo comando decodescript riconverte l'esadecimale in assembly leggibile. In un descriptor lo script è scritto esplicitamente come sh(wpkh(...)) o sh(multi(...)), che è il modo moderno di registrarlo, perché i wallet basati su descriptor sono arrivati in Bitcoin Core 0.21.0 a gennaio 2021 e hanno reso obsoleta la vecchia abitudine di importare indirizzi nudi.
La modalità di perdita è reale e specifica. Una frase di recupero rigenera le chiavi. Non rigenera uno script arbitrario e non può dirti le chiavi pubbliche degli altri cofirmatari, quindi un accordo 2-di-3 in cui ogni partecipante ha conservato solo la propria frase di recupero è impossibile da spendere. Alcune persone hanno perso bitcoin pur avendo un insieme completo di chiavi private e nessuna registrazione dello script in cui quelle chiavi erano disposte. Conserva il descriptor insieme a ogni backup della frase di recupero e ripristina da esso una volta, su un importo piccolo, prima che l'indirizzo contenga qualcosa che ti dispiacerebbe perdere.
L'altra cosa da sapere è il limite dimensionale. Quindici chiavi pubbliche compresse, più i loro prefissi di push e gli opcode circostanti, arrivano a 513 byte, che ci stanno appena; una sedicesima no. È quel tetto, e non una qualche regola sul multisig, a limitare un indirizzo di script a quindici cofirmatari.
Script di riscatto vs script witness
Uno script di riscatto e uno script witness occupano lo stesso posto concettuale in due epoche diverse, e la differenza sta in dove viaggiano i byte e in come vengono impegnati. Uno script di riscatto è impegnato con un hash di 160 bit e viaggia nello script di firma a quattro unità di peso per byte. Uno script witness è impegnato con un SHA-256 completo di 256 bit e viaggia nel witness a un'unità di peso per byte, ed è per questo che la stessa policy ha un costo di spesa pari a circa un quarto. Una configurazione annidata usa entrambi insieme: lo script di riscatto è il programma witness di 34 byte e lo script witness è il contratto vero e proprio. Se stai registrando un backup per un multisig SegWit avvolto, ti servono entrambi scritti, non uno solo.