Glossario / Nodi e software
Start string
Noto anche come Magic byte di rete.
- Che cos'è lo start string?
- Lo start string è il prefisso di quattro byte che apre ogni messaggio della rete bitcoin e indica su quale rete si trova il mittente prima che venga letto qualsiasi altra cosa.
Quattro byte impediscono alle reti parallele di bitcoin di parlarsi per errore. La mainnet usa f9beb4d9 e la regtest usa fabfb5da, e un nodo che legge un valore inatteso scarta il messaggio e di solito anche la connessione. Il controllo intercetta errori di configurazione, non attaccanti, perché chiunque può inviare i quattro byte corretti.
Come funziona
Lo start string occupa i byte da zero a tre di un messaggio e viene verificato prima che il nodo allochi memoria per qualsiasi cosa che segua.
Bitcoin Core fissa nel codice un valore per catena. La mainnet è 0xf9beb4d9. La testnet3 è 0x0b110907. La testnet4, aggiunta insieme al BIP94 in Bitcoin Core 28.0, è 0x1c163f28. La regtest è 0xfabfb5da. La signet è il caso interessante: invece di una costante, i suoi quattro byte si ricavano calcolando l'hash dello script di sfida che definisce chi può firmare i blocchi di quella signet, così la signet pubblica predefinita e una privata che avvii per fare test si rifiutano automaticamente di parlarsi.
I valori non sono stati scelti per essere belli. Sono sequenze di byte improbabili nei dati ordinari di un flusso, così un client che legge un flusso TCP corrotto o desincronizzato può avanzare scansionando finché ritrova il pattern e riprendere da quel punto invece di scartare tutto.
Gli stessi quattro byte vengono scritti su disco. Nei file blk00000.dat che contengono i blocchi grezzi, ogni blocco memorizzato è preceduto dallo start string della sua rete e da una lunghezza di quattro byte. È questa struttura che permette a un nodo di scorrere un file di blocchi che non ha finito di scrivere, individuare il confine tra i record e scartare solo la coda troncata invece dell'intero file.
Dove lo vedi
Lo start string compare ogni volta che il traffico bitcoin viene ispezionato invece che semplicemente usato.
Apri una cattura di pacchetti sulla porta 8333 e ogni frame della conversazione inizia con f9 be b4 d9. Gli analizzatori di protocollo si basano proprio su quella firma per etichettare il traffico. Ogni progetto che ha biforcato il codice ha cambiato i quattro byte come uno dei suoi primi atti, ed è per questo che le biforcazioni non possono connettersi tra loro anche se le loro negoziazioni iniziali (handshake) sono per il resto identiche.
Per un utente comune compare una volta sola, sotto forma di un silenzio poco utile. Punta un wallet configurato per la testnet verso un nodo della mainnet e non ottieni nessun errore, nessun avviso di rifiuto, nessuna connessione: il nodo legge quattro byte che non riconosce, scarta il messaggio e alla fine disconnette il peer. Confermare che entrambe le estremità sono sulla stessa rete è la prima cosa da controllare quando un nodo e un wallet si rifiutano di vedersi.
Start string vs intestazione del messaggio
Lo start string è un campo; l'intestazione del messaggio è l'insieme di tutti e quattro. Un'intestazione è di 24 byte, formata dallo start string, poi da un nome di comando di dodici byte in ASCII, poi da una lunghezza del payload di quattro byte, poi da un checksum di quattro byte. Lo start string risponde a quale rete, il comando a che tipo di messaggio, la lunghezza a quanto altro leggere. Le persone usano i due nomi in modo intercambiabile quando intendono l'intestazione, il che diventa davvero confuso nel momento in cui conti gli offset dei byte in un dump esadecimale.