Glossario / Riferimento per sviluppatori
Script PP
- Che cos'è lo script PP?
- Lo script PP era il campo obbligatorio di un output BIP70 che conteneva lo script di blocco grezzo che il pagatore doveva riprodurre, gli stessi byte che finiscono in un output di transazione.
Specificato nel BIP-70.
Di tutto ciò che BIP70 metteva in rete, lo script è l'unica parte sopravvissuta sulla blockchain. I certificati, le note e le scadenze sono rimasti tutti off-chain, mentre lo script di blocco è entrato alla lettera nella transazione e oggi si trova nell'insieme degli output non spesi. Quei byte, e nient'altro nella richiesta, decidono chi può spendere i bitcoin.
Come funziona
Stato: storico. Lo script era il campo 2 del messaggio Output e l'unica sua parte che un esercente non poteva omettere, dato che l'importo assumeva zero come valore predefinito. Bitcoin Core ha smesso di analizzarne qualsiasi parte nella 0.20.0, pubblicata il 3 giugno 2020.
Inviare uno script invece di un indirizzo era una scelta deliberata. Un indirizzo è un formato di trasporto per le persone: base58check o bech32, con un prefisso, un checksum e un insieme di caratteri scelto per resistere alla scrittura e alla lettura ad alta voce. Un wallet che ne riceve uno deve decodificarlo in uno script prima di poter costruire qualcosa. BIP70 saltava il passaggio e indicava la destinazione nella forma che la rete usa davvero.
Le forme standard hanno dimensioni fisse, e conoscerle rende un block explorer molto più facile da leggere:
- Pay to public key hash, 25 byte: duplica, calcola l'hash, inserisci 20 byte, verifica l'uguaglianza, verifica la firma.
- Pay to script hash, 23 byte: calcola l'hash, inserisci 20 byte, verifica l'uguaglianza.
- SegWit a chiave singola, 22 byte: un byte di versione zero e un hash di 20 byte.
- SegWit script hash, 34 byte: versione zero e un hash di 32 byte.
- Taproot, 34 byte: versione uno e una chiave di 32 byte.
Ciò a cui il formato rinunciava era il rilevamento degli errori. Bech32 garantisce che quattro caratteri sostituiti qualsiasi in un indirizzo fino a 89 caratteri vengano individuati, e base58check individua la corruzione con un hash di quattro byte. I byte grezzi di uno script non hanno né l'uno né l'altro. Un bit invertito in un indirizzo produce una stringa che il tuo wallet rifiuta; un bit invertito in uno script produce un output valido che nessuno potrà mai spendere.
Dove lo vedi
I tipi di script sono il motivo per cui due prelievi della stessa dimensione possono costare commissioni diverse.
Un exchange che ti lascia scegliere un formato di indirizzo sta scegliendo uno script per te. Un output SegWit a chiave singola occupa 22 byte contro 25 della forma legacy, il che è irrilevante, ma spenderlo in seguito non lo è: quell'input costa circa 68 byte virtuali dove uno legacy ne costa circa 148, quindi i bitcoin che ricevi oggi determinano parte delle tue commissioni per tutta la vita di quei bitcoin. A 20 sat/vB la differenza è di circa 1.600 satoshi per ogni input che alla fine spenderai.
Gli explorer indicano il tipo di ogni output che mostrano, ed è così che puoi verificare su quale tipo di output hai ricevuto il pagamento. Il software più recente descrive le destinazioni con gli output descriptor, una forma testuale compatta che copre un'intera famiglia di script e la loro derivazione invece di uno script alla volta.
L'abitudine che vale la pena conservare da tutto questo è semplice. Conferma la destinazione su un dispositivo con uno schermo proprio, perché il malware che sostituisce un indirizzo nei tuoi appunti è comune e un wallet hardware che mostra il destinatario reale è il controllo che lo intercetta.
Script PP vs pubkey script
Il campo di BIP70 era un contenitore; un pubkey script è la cosa in sé. Un pubkey script, detto anche scriptPubKey o script di blocco, compare in ogni output di transazione mai creato e stabilisce la condizione che chi spende deve soddisfare. Lo script PP era un luogo particolare in cui ne viaggiava una copia, dentro un protocollo che nessuno esegue. Usa il nome del campo solo quando leggi la documentazione di BIP70, e il nome generale in ogni altro caso.