Glossario / Protocollo e aggiornamenti
Impegno del witness
- Che cos'è l'impegno del witness?
- L'impegno del witness è un hash di 32 byte in un output della transazione coinbase che lega ogni wtxid di un blocco all'albero di merkle già presente nell'header.
Specificato nel BIP-141.
Segregated witness serviva a registrare una seconda radice di merkle senza toccare l'header del blocco, e il BIP-141 la inserisce in un output coinbase così che la modifica potesse essere distribuita come soft fork. Lo script deve misurare almeno 38 byte e iniziare con 0x6a24aa21a9ed. L'impegno lega le firme che autorizzano i tuoi bitcoin al blocco che li ha minati, dato che un txid esclude per costruzione i dati witness.
Come funziona
Il BIP-141 specifica l'impegno del witness fino all'opcode, e un nodo ricalcola il valore prima di accettare il blocco.
I nodi costruiscono un secondo albero di merkle sul blocco, usando i wtxid come foglie al posto dei txid e combinandoli nello stesso modo in cui è costruito l'albero dell'header. La foglia della transazione coinbase stessa non è il suo wtxid reale: il BIP-141 suppone che quel valore sia 32 byte a zero, perché il numero calcolato vive dentro quella stessa transazione e nulla può calcolare l'hash di se stesso. Ciò che viene scritto nell'output è un doppio SHA-256 dell'hash della radice witness unito a un valore riservato del witness di 32 byte, e quel valore riservato deve comparire come unico elemento nel campo witness dell'input coinbase.
Byte per byte, lo script dell'output recita: un byte di OP_RETURN (0x6a), un byte che inserisce i successivi 36 byte (0x24), un header dell'impegno di quattro byte (0xaa21a9ed), poi l'hash di 32 byte. Questi danno 38 byte, e tutto ciò che va dal 39º byte in poi sono dati opzionali senza significato di consenso.
Due regole limite impediscono che lo schema venga manipolato o applicato in eccesso. Quando più output corrispondono, conta quello con l'indice di output più alto, così un'esca inserita prima non può sostituire il valore reale. E quando nessuna transazione di un blocco porta dati witness, l'impegno è opzionale. La regola è stata distribuita tramite i bit di versione del BIP9 con il nome segwit sul bit 1, con una finestra di segnalazione sulla mainnet dalla mezzanotte del 15 novembre 2016 UTC alla mezzanotte del 15 novembre 2017 UTC.
Dove lo vedi
Un impegno del witness compare su un block explorer come un output della transazione coinbase il cui script inizia con OP_RETURN.
Apri la prima transazione di qualsiasi blocco recente e gli output si dividono in due tipi: quelli che pagano il pool e i suoi clienti, e uno il cui script in esadecimale inizia con 6a24aa21a9ed. I 32 byte dopo quel prefisso sono l'impegno stesso, e tutto ciò che segue i primi 38 byte è spazio libero.
Il software di mining incontra questo campo più spesso di chiunque altro. Il valore è un hash su ogni wtxid del blocco, quindi va ricalcolato ogni volta che cambia l'insieme delle transazioni candidate, e riscritto nella coinbase prima ancora che l'header venga sottoposto a hash.
Il valore riservato è la parte da tenere d'occhio. Il BIP-141 oggi non gli attribuisce alcun significato di consenso e lo tiene da parte deliberatamente, così che un futuro soft fork possa annidare un nuovo impegno dentro quello esistente calcolando prima l'hash del nuovo valore insieme al valore riservato. Il documento vieta che usi estranei al consenso, come il merge mining, occupino quello spazio, e indica a cosa è destinato: alberi di somma sulle commissioni, contatori per la dimensione del blocco e per le sigops, e collegamenti all'indietro verso gli output che una transazione spende. Insieme, questi darebbero a un client leggero una prova breve che un blocco è invalido anziché il blocco stesso.
Impegno del witness vs radice di merkle
L'impegno del witness e la radice di merkle sono le radici di due alberi distinti, e solo una delle due ha un posto nell'header del blocco.
La radice di merkle è un campo dell'header le cui foglie sono i txid, e un txid esclude per costruzione i dati witness. L'impegno del witness vive in un output di transazione, le sue foglie sono i wtxid, che includono quei dati, e la sua foglia coinbase è azzerata. L'annidamento è il trucco. La transazione coinbase sta nell'albero più vecchio come una foglia qualsiasi, quindi modificare l'impegno cambia la coinbase, cambia la radice di merkle dell'header e rompe il blocco anche per il software che non ha mai sentito parlare di segregated witness.