Vai al contenuto
buybitcoinsmart

Glossario / Nodi e software

Intestazione del messaggio

Che cos'è l'intestazione del messaggio?
L'intestazione del messaggio di Bitcoin è una busta fissa di 24 byte che avvolge ogni messaggio peer-to-peer: una stringa di avvio della rete, un nome di comando, una lunghezza del payload e un checksum.

Niente nel protocollo peer-to-peer descrive se stesso, quindi la busta deve farlo. I suoi quattro campi non cambiano mai dimensione né ordine, permettendo a un nodo di leggere esattamente 24 byte, sapere quanto altro sta per arrivare e chiudere la connessione con chiunque dichiari più dei 4.000.000 byte che Bitcoin Core accetta. Non ne vedrai mai una, ma un'intestazione malformata è il motivo per cui a volte una connessione con un peer sparisce senza spiegazione.

Come funziona

I quattro campi dell'intestazione si leggono in un ordine fisso, e ognuno condiziona ciò che accade dopo.

I byte da 0 a 3 contengono la stringa di avvio che identifica la rete. I byte da 4 a 15 contengono il comando: un nome ASCII in minuscolo riempito con byte nulli fino a dodici caratteri, ed è per questo che ogni tipo di messaggio in bitcoin ha un nome breve e che cmpctblock, con dieci caratteri, resta vicino al limite. I byte da 16 a 19 contengono la lunghezza del payload come intero senza segno in little-endian. I byte da 20 a 23 contengono un checksum, i primi quattro byte di un doppio SHA-256 calcolato sul payload.

Mettere la lunghezza prima del payload è la vera misura di sicurezza del progetto. Un nodo che ha consumato 24 byte sa già se il mittente dichiara qualcosa di assurdo, e Bitcoin Core rifiuta qualsiasi cosa oltre i 4.000.000 byte e si disconnette, senza allocare un buffer né attendere dati che potrebbero non arrivare mai. Con la lunghezza dopo il corpo, ci si affida al fatto che il mittente si fermi.

Il checksum merita meno rispetto di quanto di solito riceve. Quattro byte di hash intercettano un bit alterato su un collegamento difettoso, e non servono a nulla contro un peer che mente, dato che un mittente ostile calcola semplicemente il checksum su ciò che ha scelto di inviare. In bitcoin l'integrità deriva dalla validazione del contenuto rispetto alle regole di consenso, mai da questo campo.

Nel software più recente l'intera struttura è opzionale. Il trasporto della versione 2 di BIP324 cifra la connessione e sostituisce la busta in chiaro con una lunghezza offuscata che delimita ogni messaggio, più un identificatore corto di un byte per i tipi di messaggio più comuni, così un osservatore passivo non può più leggere i nomi dei comandi che passano sulla rete. Bitcoin Core lo ha introdotto come impostazione opzionale nella versione 26.0 e lo ha attivato per impostazione predefinita in una versione successiva.

Dove lo vedi

Le intestazioni dei messaggi compaiono nelle catture dei pacchetti e nella diagnostica del nodo stesso.

Esegui Bitcoin Core con -debug=net e il log registra i tipi e le dimensioni dei messaggi per ogni peer, che è il modo pratico per osservare cosa sta facendo davvero una connessione. Le righe che riportano PROCESSMESSAGE: INVALID MESSAGESTART indicano che un peer ha inviato byte che non iniziavano con la stringa di avvio di questa rete, cosa quasi sempre dovuta a qualcosa configurato male dall'altra parte e non a un attacco. Il dissettore bitcoin di Wireshark analizza gli stessi 24 byte per etichettare ogni frame.

Intestazione del messaggio vs intestazione del blocco

Un'intestazione del messaggio è l'imballaggio del trasporto; un'intestazione del blocco è un dato di consenso, e non condividono altro che la parola. L'intestazione del messaggio è di 24 byte, esiste solo per la durata di una consegna e viene scartata appena il payload è stato letto. L'intestazione del blocco è di 80 byte, contiene la versione, l'hash del blocco precedente, la radice di Merkle, la marca temporale, l'obiettivo di difficoltà e il nonce, e viene sottoposta a hash per produrre la proof of work che identifica quel blocco in modo permanente. Una è l'etichetta con l'indirizzo su un pacco; l'altra è ciò che c'è dentro.

Da non confondere con

Domande frequenti

Quanto è grande un'intestazione del messaggio di bitcoin?

Esattamente 24 byte: quattro per la stringa di avvio della rete, dodici per il nome del comando riempito con byte nulli, quattro per la lunghezza del payload e quattro per un checksum preso dai primi byte di un doppio SHA-256 calcolato sul payload.

Il checksum dell'intestazione del messaggio rende sicura la connessione?

No. Rileva solo una corruzione accidentale. Un peer ostile ricalcola il checksum su qualunque cosa invii, quindi la sicurezza deriva dalla validazione del payload rispetto alle regole di consenso, oppure dal trasporto cifrato BIP324 che sostituisce del tutto l'intestazione in chiaro.

Termini correlati

Altro in Nodi e software

Leggi questa pagina in inglese