Pular para o conteúdo
buybitcoinsmart

Glossário / Referência do desenvolvedor

Ordem de bytes interna

O que é a ordem de bytes interna?
A ordem de bytes interna é o formato que o bitcoin usa dentro de estruturas serializadas: os inteiros são escritos com o byte menos significativo primeiro, e os resumos de hash seguem a ordem em que o SHA-256 os produziu.

Duas convenções viajam sob um mesmo nome. Todo campo inteiro de uma transação ou de um cabeçalho de bloco é little endian, de modo que um número de versão 2 é escrito 02000000, e todo hash de 32 bytes fica nos dados brutos exatamente como a função de hash o emitiu. As ferramentas voltadas para pessoas invertem esses hashes antes de exibi-los, o que é o motivo mais comum de um analisador escrito à mão discordar de um explorador de blocos.

Como funciona

A ordem de bytes interna é melhor aprendida desmontando o cabeçalho de 80 bytes do bloco gênesis, já que cada campo dele é pequeno o bastante para ser conferido a olho.

Ele começa com 01000000, o número de versão 1 em quatro bytes little endian. Depois, 32 bytes zero, porque o primeiro bloco não tem pai. Depois, a raiz de Merkle, armazenada como 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a, que é o resumo que todo explorador exibe como 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b escrito de trás para frente, um byte por vez. Depois, 29ab5f49, o carimbo de data e hora 1231006505, ou seja, 18:15:05 UTC de 3 de janeiro de 2009. Depois, ffff001d, o campo de dificuldade cujo valor lógico é 0x1d00ffff. Depois, 1dac2b7c, o nonce 2083236893.

Os valores obedecem à mesma regra. Um bitcoin é 100.000.000 satoshis, e uma saída que pague exatamente isso carrega os oito bytes 00e1f50500000000.

A razão é histórica e bastante prosaica. O Bitcoin foi escrito para máquinas x86, que guardam os inteiros com o byte menos significativo primeiro, e o código mais antigo gravava as estruturas na disposição que o processador já tinha. Os hashes nunca foram invertidos. O que mudou foi a exibição, porque o Bitcoin Core guarda um resumo em uma classe que o trata como um único número enorme, e os números são exibidos com a parte mais significativa à esquerda.

Onde você vê isso

A ordem de bytes interna é o que você obtém sempre que uma ferramenta entrega bytes brutos em vez de uma resposta formatada.

Busque uma transação com getrawtransaction e sem a opção verbose, ou um cabeçalho com getblockheader e verbose definido como false, e tudo o que está dentro chega nessa ordem. O mesmo vale para um PSBT exportado por uma carteira de hardware, para o hexadecimal por trás da aba de dados brutos de um explorador e para os arquivos de bloco que ficam no diretório blocks de um nó.

O campo que pega as pessoas de surpresa é o outpoint no início de cada entrada. Ele nomeia a transação que está sendo gasta com 32 bytes que se leem como o inverso do identificador que o explorador exibiu. Nada está corrompido quando essas duas cadeias não coincidem: inverta uma e elas concordam.

Ordem de bytes interna vs ordem de bytes RPC

A ordem de bytes interna e a ordem de bytes RPC descrevem os mesmos 32 bytes em sentidos opostos, e a regra para converter entre elas tem uma exceção importante. Os resumos de hash são invertidos na saída para uma pessoa e invertidos de novo na entrada. Os inteiros não. Uma altura de bloco, um carimbo de data e hora e um valor em satoshis são todos apresentados como números decimais comuns, e inverter um deles na entrada ou na saída simplesmente produz um valor errado, não um valor escrito de outra forma. Inverta os hashes e nada mais, e a maioria dos erros de ordem de bytes desaparece.

Não confundir com

Perguntas frequentes

Por que os hashes parecem invertidos dentro de uma transação bruta?

Eles não estão invertidos, a versão exibida está. Um resumo é armazenado na ordem em que o SHA-256 o produziu, enquanto as ferramentas de visualização o invertem porque o Bitcoin Core trata um hash como um único número grande e exibe a parte mais significativa primeiro.

Devo inverter todos os campos ao analisar dados brutos de bitcoin?

Não. Os inteiros são little endian e são lidos como tal, e os hashes de 32 bytes são os únicos valores que são invertidos, e apenas quando você quer compará-los com o que um explorador ou uma chamada RPC mostra.

Leia a seguir

Termos relacionados

Mais em Referência do desenvolvedor

Ler esta página em inglês