Vai al contenuto
buybitcoinsmart

Glossario / Protocollo e aggiornamenti

Script path spend

Che cos'è uno script path spend?
Uno script path spend sblocca un output Taproot rivelando un leaf script, gli input che lo soddisfano e un control block che dimostra che l'indirizzo aveva impegnato quel leaf.

Specificato nel BIP-341.

Gli script path spend sono la via alternativa per uscire da un output Taproot, usata quando la firma cooperativa che tutti speravano non è mai arrivata. La prova viaggia in un control block di 33 byte più altri 32 per ogni livello dell'albero, e il BIP-341 limita quell'albero a 128 livelli. Prendere questa via pubblica il ramo che hai usato, quindi l'unica condizione su cui ti sei effettivamente basato smette di essere privata.

Come funziona

Un nodo che valida uno script path spend legge lo stack del witness all'indietro, perché l'ultimo elemento fa la maggior parte del lavoro.

Quell'ultimo elemento è il control block, e la sua lunghezza viene controllata prima di ogni altra cosa. Deve essere esattamente di 33 + 32m byte, con m numero intero tra 0 e 128, e qualsiasi altra lunghezza fa fallire subito la verifica. Il BIP-341 pone il tetto a 128 perché un albero impacchettato in modo ottimale scende più in profondità solo per un leaf con una probabilità di essere usato inferiore a 1 su 2^128.

Il primo byte porta due cose senza rapporto tra loro. Applicandogli la maschera 0xfe si ottiene la versione del leaf, 0xc0 per le regole di tapscript; il bit rimosso dalla maschera è la parità della coordinata Y della chiave di output, presente perché lo spend possa essere verificato in batch. I successivi 32 byte sono la chiave pubblica interna, quella che avrebbe firmato uno spend cooperativo; tutto ciò che segue è il percorso di Merkle, 32 byte per livello.

Il nodo ricostruisce poi l'impegno. Calcola l'hash della versione del leaf insieme allo script rivelato ottenendo un tapleaf hash e incorpora uno alla volta ciascun elemento del percorso. La direzione non viene mai trasmessa: i due valori da 32 byte di ogni passo vengono ordinati lessicograficamente prima dell'hash, così il confronto decide l'ordine e nessun bit di direzione viene inviato. La radice e la chiave interna producono un tweak, e la chiave modificata deve coincidere con i 32 byte presenti nell'indirizzo, bit di parità incluso, prima che lo script sia autorizzato a essere eseguito.

Un solo byte può cambiare tutto ciò che lo precede. Se il witness contiene almeno due elementi e l'ultimo inizia con 0x50, quell'elemento viene rimosso come annex prima che inizi la validazione. Il BIP-341 non gli attribuisce alcun significato e avverte che includerne uno può portare a "PERMANENT FUND LOSS".

Dove lo vedi

Uno script path spend si riconosce su un block explorer come un input Taproot il cui witness, escluso l'annex, contiene più di un elemento.

L'esempio pratico dello stesso BIP-341 è un albero di cinque script, da A a E. Spendere con lo script D pubblica D, più un control block che contiene la chiave interna e tre hash: C, E e l'hash combinato di A e B. Quel control block misura 129 byte per un contratto a cinque condizioni, e gli altri quattro script non vengono mai pubblicati.

La prova però rivela qualcosa. La sezione sulla sicurezza del BIP-341 osserva che la profondità del leaf rivelato lascia trapelare la profondità minima dell'albero, il che "suggests specific wallet software that created the output and helps clustering". La difesa che il BIP-341 suggerisce è discostarsi dall'albero che le probabilità dei leaf renderebbero altrimenti ottimale.

La stessa sezione è netta sul riuso delle chiavi. Le chiavi devono essere nuove per ogni leaf, non solo per quello che hai speso, perché un ramo ripetuto riappare come hash ripetuto in una prova successiva, e leaf che condividono chiavi rendono poco costoso forzare per tentativi uno script non rivelato.

Script path spend vs tapscript

Uno script path spend è la via; tapscript è il linguaggio parlato alla sua fine. Il BIP-341 definisce tutto fino al momento in cui inizia l'esecuzione: il control block, la piegatura ordinata di Merkle, il controllo del tweak, il bit di parità. Ciò che viene eseguito dopo è deciso dalla versione del leaf.

Attualmente solo 0xc0 significa tapscript. Un leaf che porta qualsiasi altra versione non è un errore, perché il BIP-341 richiede che l'esecuzione riesca per le versioni di leaf sconosciute. È il gancio che consente a un successivo soft fork di definire un linguaggio di script diverso dentro lo stesso formato di indirizzo bc1p, il che rende lo script path spend la metà duratura della coppia.

Da non confondere con

Domande frequenti

Qualcuno può vedere le condizioni di spesa che non ho usato?

No. Uno script path spend pubblica un leaf script più gli hash fratelli sul suo percorso, e ogni altro ramo resta per sempre un hash illeggibile. Diventa pubblico invece il fatto che uno script path esisteva, e a quale profondità dell'albero si trovava il leaf rivelato.

Perché il control block porta un bit di parità?

Per rendere possibile la verifica in batch. Il bit meno significativo del primo byte registra se la coordinata Y della chiave di output è pari o dispari, il che consente a chi verifica di risalire dai 32 byte nell'indirizzo a un unico punto della curva invece di provarli entrambi.

Leggi anche

Fonti

Ultima revisione: 6 settembre 2026.

Termini correlati

Altro in Protocollo e aggiornamenti

Leggi questa pagina in inglese