Vai al contenuto
buybitcoinsmart

Glossario / Riferimento per sviluppatori

MSG_WITNESS_BLOCK

Che cos'è MSG_WITNESS_BLOCK?
Il tipo di inventario witness block è il modo in cui un nodo che gestisce segwit richiede un blocco nella serializzazione estesa, con tutte le firme allegate invece che rimosse.

Specificato nel BIP-144.

Due nodi possono avere lo stesso blocco e non essere d'accordo su quanti byte occupi. MSG_WITNESS_BLOCK è il codice 0x40000002, una normale richiesta di blocco con aggiunto il bit witness, ed esiste da quando il segregated witness si è attivato al blocco 481.824 il 24 agosto 2017. Se gestisci un tuo nodo, questa è la richiesta che recupera le firme di cui la tua macchina ha bisogno prima di fidarsi della catena.

Come funziona

Bitcoin Core mantiene due modi di scrivere lo stesso blocco e sceglie tra loro in base a chi lo richiede.

Il flag witness è un unico bit alto, 0x40000000. Aggiungilo al tipo di inventario block, che è 2, e ottieni 0x40000002. BIP144 ha introdotto sia quel flag sia il bit di servizio NODE_WITNESS, valore 8, che un nodo annuncia nel suo messaggio version per dire di poter servire i dati più completi. Il flag compare solo in una richiesta getdata. Gli annunci viaggiano come semplici inventari block, perché un annuncio è solo un hash e l'hash è lo stesso in entrambi i casi.

È proprio quest'ultimo punto a permettere la coesistenza di due serializzazioni. Un'intestazione di blocco si impegna su una radice di Merkle costruita dai txid, e un txid è calcolato sulla transazione con il witness rimosso. Togli ogni firma e il blocco ha ancora lo stesso identificatore di 32 byte. I dati witness sono vincolati separatamente, in un output della transazione coinbase il cui script arriva ad almeno 38 byte e si apre con il tag di quattro byte 0xaa21a9ed seguito da una radice di Merkle witness di 32 byte.

È sulla dimensione che la differenza si fa sentire. Il limite di un blocco è di 4.000.000 unità di peso, calcolate come tre volte la dimensione senza witness più la dimensione completa, il che consente a un blocco carico di dati witness di avvicinarsi a 4 MB sulla rete. Il blocco 774.628, minato il 1º febbraio 2023, è arrivato a circa 3,96 MB, quasi tutto occupato da una sola iscrizione nello spazio witness. Applica quella formula del peso al contrario e a un blocco così grande non resta quasi nulla nella forma senza witness. Un peer vecchio che chiedesse la serializzazione legacy avrebbe ricevuto lo scheletro e nessun dato utile, ed è proprio per questo che tali peer sono considerati incapaci di validare i blocchi attuali.

Dove lo vedi

Due luoghi rendono visibile MSG_WITNESS_BLOCK senza leggere alcun codice sorgente: i log del nodo stesso e le sue statistiche sui peer.

Avvia bitcoind con la categoria di debug net e vedrai scorrere righe getdata per tutta la fase di download iniziale dei blocchi, ognuna con il flag witness, perché un nodo moderno scarica blocchi solo da peer che gestiscono il witness. La chiamata RPC getpeerinfo suddivide i byte inviati e ricevuti per tipo di messaggio, quindi è facile vedere il traffico dei blocchi dominare una sincronizzazione. Bitcoin Core 23.0 ha aggiunto getblockfrompeer, che chiede a un peer specifico un blocco preciso per hash, e lo recupera nella forma con witness.

I nodi potati complicano il quadro. Un nodo con la potatura attiva, il cui valore minimo consentito è 550 MiB, annuncia NODE_NETWORK_LIMITED e serve solo i 288 blocchi più recenti, circa due giorni di storico. Chiedigli qualcosa di più vecchio e non torna nulla.

Per chi compra e detiene bitcoin, il significato è netto. Verificare la catena da solo significa scaricare ogni firma e controllarla. Un wallet su smartphone che interroga un server non invia mai questa richiesta, non vede mai un witness e si fida della parola di qualcun altro per il saldo sul tuo schermo.

MSG_WITNESS_BLOCK vs MSG_BLOCK

MSG_BLOCK chiede lo stesso blocco con le firme rimosse, ed è ormai una richiesta legacy. Entrambi i tipi indicano un blocco con lo stesso hash, ed entrambi ricevono in risposta un messaggio block. La differenza sta nella presenza dei byte marker e flag e degli stack witness dentro ogni transazione. Un nodo che richiede MSG_BLOCK per un blocco recente non può verificare nemmeno una spesa segwit al suo interno, perciò Bitcoin Core riserva quella forma ai peer che non hanno mai segnalato NODE_WITNESS.

Da non confondere con

Domande frequenti

Perché un blocco ha due dimensioni diverse?

Perché il segregated witness ha diviso la serializzazione in due. La forma senza witness elimina ogni stack witness, la forma estesa le conserva, ed entrambe hanno lo stesso identificatore di blocco perché l'intestazione si impegna su una radice di Merkle costruita dai txid e non dagli hash witness.

Leggi anche

Termini correlati

Altro in Riferimento per sviluppatori

Leggi questa pagina in inglese