Glossario / Transazioni e commissioni
PSBT
Noto anche come Partially Signed Bitcoin Transaction, BIP174.
- Che cos'è un PSBT?
- Un PSBT è un file di transazione non ancora completato: contiene gli input, gli output e tutto ciò che serve a chi firma per verificarli, e viaggia tra dispositivi invece che sulla rete.
Specificato nel BIP-174.
Firmare bitcoin significava consegnare le tue chiavi private a qualunque programma costruisse la transazione. Il BIP174 ha separato le due cose nel 2018 e Bitcoin Core ha introdotto il supporto nella versione 0.17.0, così il dispositivo che custodisce le chiavi può essere diverso da quello collegato a internet. Oggi lo usano tutti i wallet hardware e tutti i coordinatori multisig.
Come funziona
Un PSBT è un contenitore di mappe chiave-valore: una mappa globale che descrive la transazione in fase di assemblaggio, poi una mappa per ogni input e una per ogni output.
Il file si apre con cinque byte magici, 70 73 62 74 ff, che compongono "psbt" più un separatore. Base64 è il modo abituale di trasportarlo, quindi un PSBT incollato in una casella di testo inizia sempre con i caratteri cHNidP8. Una stringa che inizia in qualunque altro modo non è un PSBT, qualunque cosa dica chi la invia.
Ogni mappa di input contiene le informazioni che un firmatario offline non può recuperare da solo:
- l'output speso, così il dispositivo conosce l'importo esatto e il locking script che sta autorizzando
- il redeem script o il witness script, quando i bitcoin sono protetti da una policy anziché da una sola chiave
- un percorso di derivazione e l'impronta della chiave master per ogni chiave che deve firmare, così un dispositivo con il seed giusto può trovare la chiave figlia giusta
- le firme parziali raccolte fino a quel momento, una per firmatario
Anche le mappe di output contengono informazioni di derivazione, ed è questo che permette a un firmatario di confermare che l'output di resto appartiene davvero al wallet che sta proteggendo.
Il BIP174 divide il lavoro in ruoli anziché in programmi. Un creator produce lo scheletro, un updater completa i dettagli degli input, i signer aggiungono le firme parziali, un combiner unisce i file firmati separatamente, un finalizer trasforma le firme parziali in uno script valido o in un witness valido, e un extractor produce la transazione grezza pronta per la trasmissione. Spesso un solo software svolge più ruoli insieme, ma è proprio questa separazione a rendere interoperabili i file di fornitori diversi.
Il formato è stato costruito per tollerare l'ignoranza. Ogni campo porta un byte di tipo, e un firmatario che non capisce un campo deve lasciarlo passare intatto invece di scartarlo, ed è così che un wallet scritto nel 2018 può ancora passare un file a uno scritto per Taproot. Il BIP371 ha aggiunto i campi Taproot; il BIP370 definisce una versione 2 in cui input e output possono ancora essere aggiunti dopo la creazione, la proprietà di cui hanno bisogno le transazioni collaborative.
Perché questo conta quando compri bitcoin
Nel momento in cui sposti i bitcoin da un exchange al tuo wallet hardware, stai usando il formato PSBT, che qualche schermata lo dica o no.
Tiene le chiavi fuori dal tuo computer. Il tuo portatile costruisce la spesa e produce un PSBT, Trezor o Ledger lo legge, ti mostra ciò che dice, firma e te lo restituisce. Nulla di segreto attraversa il cavo. È la differenza tra un portatile compromesso, che è superabile, e una frase di recupero compromessa, che non lo è.
Difende dallo scambio dell'indirizzo di resto. Un malware che ha il controllo del tuo computer può mostrare una schermata di pagamento onesta mentre instrada di nascosto il resto verso un indirizzo che possiede, e di solito il resto è l'importo maggiore. Poiché il file indica un percorso di derivazione per ogni output, il dispositivo di firma può verificare che il resto discenda dal suo stesso seed e avvisarti quando non è così. Leggi lo schermo del dispositivo, mai la scheda del browser.
Rende il multisig praticabile per chi non è un ingegnere. Un 2-di-3 distribuito tra due wallet hardware e un backup in un altro edificio funziona solo se una transazione non firmata può viaggiare su scheda SD, codice QR o email senza far trapelare nulla. Un PSBT non contiene chiavi private, quindi perderne uno durante il trasporto non ti costa assolutamente nulla.
È il pezzo che servirà ai tuoi eredi. Una busta con le parole del seed non è un piano di recupero per nulla di più complicato di un wallet a chiave singola. Abbina ai seed l'output descriptor del wallet e una nota che indichi un software che legge i PSBT, e il piano ti sopravviverà. La nostra guida alla sicurezza copre il resto di quella configurazione.
Firmare un prelievo 2-di-3, passo per passo
Supponi di comprare 0,4 BTC su un exchange e di prelevarli verso una cassaforte sotto il controllo di tre chiavi, due qualsiasi delle quali possono spendere.
Mesi dopo vuoi spostarne una parte. Un wallet watch-only sul tuo portatile, caricato con il descriptor della cassaforte e senza nessuna chiave, costruisce la transazione: un input, un output di pagamento e un output di resto. Un input native segwit 2-di-3 occupa circa 105 byte virtuali e i due output circa 62 in più, quindi con l'overhead il tutto arriva vicino a 177 byte virtuali, e a 8 sat/vB la commissione ammonta a circa 1.400 satoshi.
Il portatile scrive un PSBT. Colleghi il primo wallet hardware, che legge il file, mostra il destinatario, l'importo e la commissione, e scrive una firma nella mappa dell'input. Poi porti il file su una scheda microSD al secondo dispositivo, che non ha mai toccato una rete, e questo aggiunge la seconda firma.
Di nuovo sul portatile, il combiner unisce i due file, il finalizer assembla le firme in un witness nell'ordine che lo script si aspetta e l'extractor produce una transazione grezza. Solo allora qualcosa raggiunge la rete. Fino a quel momento nessuna chiave ha lasciato un dispositivo e nulla di ciò che hai fatto è stato visibile a nessuno.
PSBT vs transazione serializzata
Una transazione serializzata è finita; un PSBT è uno spazio di lavoro. Se trasmetti un PSBT, ogni nodo lo rifiuta, perché non è un formato che il protocollo peer-to-peer trasporta. La differenza vale anche nell'altro senso: un PSBT contiene un contesto che una transazione finita getta via, come il valore di ogni input speso e da quale chiave è stato derivato ogni indirizzo, ed è proprio l'informazione che serve a un wallet hardware e che un blocco non ha.
PSBT vs output descriptor
Un output descriptor descrive un wallet; un PSBT descrive una singola spesa. Il descriptor è una singola riga che indica il tipo di script, le chiavi e i percorsi di derivazione, e non cambia da un anno all'altro. I PSBT sono usa e getta, uno per transazione. Per un wallet a chiave singola la frase di recupero da sola recupera tutto, ma per il multisig servono entrambi: il descriptor per capire quali indirizzi sono tuoi e i PSBT per spostare qualcosa da quegli indirizzi.