Vai al contenuto
buybitcoinsmart

Glossario / Riferimento per sviluppatori

Ordine dei byte interno

Che cos'è l'ordine dei byte interno?
L'ordine dei byte interno è la disposizione che bitcoin usa all'interno delle strutture serializzate: i numeri interi scritti con il byte meno significativo per primo e i digest degli hash scritti nell'ordine in cui li ha prodotti SHA-256.

Sotto un unico nome viaggiano due convenzioni. Ogni campo intero di una transazione o di un'intestazione di blocco è little endian, quindi un numero di versione 2 si scrive 02000000, e ogni hash di 32 byte compare nei dati grezzi esattamente come lo ha emesso la funzione di hash. Gli strumenti destinati alle persone invertono quegli hash prima di stamparli, ed è il motivo più comune per cui un parser scritto a mano non concorda con un block explorer.

Come funziona

L'ordine dei byte interno si impara meglio smontando l'intestazione di 80 byte del blocco genesi, dato che ogni suo campo è abbastanza piccolo da poterlo verificare a occhio.

Inizia con 01000000, il numero di versione 1 in quattro byte little endian. Poi 32 byte a zero, perché il primo blocco non ha un blocco padre. Poi la radice di Merkle, memorizzata come 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a, che è il digest che ogni explorer stampa come 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b scritto al contrario un byte alla volta. Poi 29ab5f49, il timestamp 1231006505, cioè 18:15:05 UTC del 3 gennaio 2009. Poi ffff001d, il campo di difficoltà il cui valore logico è 0x1d00ffff. Poi 1dac2b7c, il nonce 2083236893.

Gli importi seguono la stessa regola. Un bitcoin è 100.000.000 satoshi, e un output che ne paga esattamente quella cifra porta gli otto byte 00e1f50500000000.

La ragione è storica e piuttosto banale. Bitcoin è stato scritto per macchine x86, che memorizzano i numeri interi con il byte meno significativo per primo, e il codice più antico scriveva le strutture nella disposizione in cui il processore le aveva già. Gli hash non sono mai stati invertiti. Quello che è cambiato è la stampa, perché Bitcoin Core memorizza un digest in una classe che lo tratta come un unico numero enorme, e i numeri si stampano con la parte più significativa a sinistra.

Dove lo vedi

L'ordine dei byte interno è quello che ottieni ogni volta che uno strumento ti consegna byte grezzi invece di una risposta formattata.

Recupera una transazione con getrawtransaction senza flag verbose, o un'intestazione con getblockheader e verbose impostato su false, e tutto il contenuto arriva in questo ordine. Lo stesso vale per un PSBT esportato da un wallet hardware, per l'esadecimale dietro la scheda dei dati grezzi di un explorer e per i file dei blocchi che si trovano nella directory blocks di un nodo.

Il campo che trae in inganno è l'outpoint all'inizio di ogni input. Indica la transazione spesa con 32 byte che si leggono come l'inverso dell'identificatore mostrato dall'explorer. Nulla è corrotto quando quelle due stringhe non coincidono: invertine una e coincidono.

Ordine dei byte interno vs ordine dei byte RPC

L'ordine dei byte interno e l'ordine dei byte RPC descrivono gli stessi 32 byte percorsi in direzioni opposte, e la regola per convertire tra i due ha un'eccezione importante. I digest degli hash vengono invertiti all'uscita verso una persona e invertiti di nuovo all'ingresso. I numeri interi no. Un'altezza di blocco, un timestamp e un importo in satoshi sono tutti presentati come normali numeri decimali, e invertirne uno all'ingresso o all'uscita produce semplicemente un valore sbagliato, non uno scritto in modo diverso. Inverti gli hash e nient'altro, e la maggior parte dei bug di ordine dei byte sparisce.

Da non confondere con

Domande frequenti

Perché gli hash sembrano invertiti dentro una transazione grezza?

Non sono invertiti: lo è la versione stampata. Un digest è memorizzato nell'ordine in cui lo ha prodotto SHA-256, mentre gli strumenti di visualizzazione lo invertono perché Bitcoin Core tratta un hash come un unico numero grande e stampa per prima la parte più significativa.

Devo invertire ogni campo quando analizzo dati bitcoin grezzi?

No. I numeri interi sono little endian e si leggono come tali, e gli hash di 32 byte sono gli unici valori che vengono invertiti, e solo quando vuoi confrontarli con ciò che mostra un explorer o una chiamata RPC.

Leggi anche

Termini correlati

Altro in Riferimento per sviluppatori

Leggi questa pagina in inglese