Bytes

A unidade básica de dados nos dados brutos do Bitcoin

Diagrama mostrando 8 bits individuais formando um único byte hexadecimal.

Este é um guia rápido para explicar o que são bytes e como são usados no bitcoin. Será útil se você está trabalhando com transações e outros dados brutos do bitcoin.

Você vai fazer alguma programação de baixo nível ao trabalhar com dados do bitcoin, então é bom saber o que está olhando.

Introdução

Ao usar bitcoin no dia a dia, você verá frequentemente bytes brutos de dados:

Ao trabalhar com bitcoin, você logo descobre que todos os dados centrais também são feitos de bytes brutos:

O Bitcoin é um programa de computador, e computadores leem e se comunicam usando bytes. Então, se você planeja trabalhar com bitcoin no nível técnico, é útil saber o que é um byte, como ele é exibido e os tipos de dados que ele armazena.

Básico

Antes de chegar aos bytes, precisamos saber o que é um "bit".

Bit

Um bit é a menor unidade de dados que um computador pode guardar. Pode ser um 1 ou um 0 (ou seja, um único transistor "ligado" ou "desligado"):

Esses bits são os blocos de construção para armazenar dados dentro dos computadores.

Se você travar ao programar, lembre que, no fim das contas, é tudo só um monte de uns e zeros.

Byte

Um byte é só um grupo de 8 bits individuais:

Ícone Ferramenta

Byte

Clique nos bits para alterná-los e veja as diferentes interpretações de um byte.

00000000

Um byte é uma unidade conveniente de armazenamento de dados em um computador. Assim como às vezes é mais prático medir peso em quilogramas em vez de gramas, às vezes é mais prático medir dados em bytes em vez de bits.

Bytes são, na verdade, a medida padrão para dados, e a maioria dos dados com que você vai trabalhar no bitcoin é medida em bytes.

Um byte são 8 bits individuais. Então uma chave privada de 32 bytes tem 256 bits (32 × 8 = 256).

Representando Bytes

Podemos representar um byte de duas formas:

Isso funciona porque, se você dividir um byte em duas metades de 4 bits, cada metade consegue lidar com 16 combinações diferentes de 1s e 0s. Então, se você der a cada metade o seu próprio caractere hexadecimal, pode representar um byte usando apenas dois caracteres em vez de oito.

Essa representação mais curta é chamada de byte hexadecimal.

Frequentemente exibimos bytes em formato hexadecimal para economizar espaço, o que é muito mais conveniente ao representar vários bytes de dados:

Ícone Ferramenta

Bytes

Digite uma string hexadecimal e veja-a dividida em bytes individuais.

Então, da próxima vez que você ver uma chave privada assim:

61dc9ff8b15450212970c6fa997338bb205dd48ffaca3a056b09a3b44a244d76

Você está, na verdade, olhando para 32 bytes individuais:

61 dc 9f f8 b1 54 50 21 29 70 c6 fa 99 73 38 bb 20 5d d4 8f fa ca 3a 05 6b 09 a3 b4 4a 24 4d 76

Quando comecei a trabalhar com Bitcoin, cometi o erro de interpretar coisas como chaves privadas como strings de letras e números individuais. Mas, na realidade, é uma sequência de bytes, em que cada dois caracteres são um byte.

Armazenando Dados em Bytes

Então, como podemos armazenar coisas úteis como números, texto e outras coisas dentro desses bytes?

Honestamente, depende só de como você interpreta os bits.

Um byte pode conter diferentes tipos de dados dependendo de como você o interpreta. Por exemplo, o byte 01100111 poderia representar a letra "g" ou o número 103. Tudo depende de que tipo de dado você está trabalhando.

Números

Você pode usar bytes para armazenar números inteiros:

Ícone Ferramenta

Byte

Clique nos bits para alterná-los e veja as diferentes interpretações de um byte.

00000000

Se queremos armazenar um número em um computador, nós o armazenamos usando sua representação binária dentro dos bits de um byte. E, se queremos armazenar números maiores, simplesmente usamos mais bytes.

Exemplos

Números são muito comuns dentro dos dados do bitcoin: chave privada (número de 32 bytes), valor de saída (8 bytes), VOUT (4 bytes), nonce (4 bytes), alvo (32 bytes), locktime (4 bytes) e tempo do bloco (4 bytes, em Unix Time).

Texto

Você também pode usar bytes para armazenar texto, atribuindo a cada caractere o seu próprio byte.

Não há um padrão oficial para codificar texto dentro dos dados do bitcoin, mas o mapeamento de caracteres-para-bytes mais usado é o ASCII:

Ícone Ferramenta

Byte

Clique nos bits para alterná-los e veja as diferentes interpretações de um byte.

00000000

Como você pode ver, cada byte representa um caractere diferente. Você só precisa da tabela ASCII à mão para ver qual byte corresponde a qual caractere.

Exemplos

Texto não é frequentemente armazenado nos dados do Bitcoin, mas aparece em alguns lugares: OP_RETURN (dados arbitrários em uma saída), o scriptsig da transação coinbase (texto do minerador), o tipo/"comando" no cabeçalho de cada mensagem (12 bytes ASCII) e o campo User-Agent na mensagem "version".

Configurações (Bit Field)

Às vezes você pode usar os bits dentro de bytes de dados para representar várias configurações de ligado/desligado.

Isso é conhecido como bit field (campo de bits), e é uma forma eficiente de armazenar várias configurações no menor espaço possível.

Ícone Ferramenta

Byte

Clique nos bits para alterná-los e veja as diferentes interpretações de um byte.

00000000

Exemplos

Bit fields são usados em alguns lugares no bitcoin: o campo Services na mensagem "version" (8 bytes/64 bits indicando os serviços de um nó), o campo version do cabeçalho de bloco (4 bytes/32 bits para sinalizar prontidão para atualizações) e o campo sequence de uma transação (interpretado como bit field ao definir o locktime relativo).

Apenas Bytes

Às vezes os bytes não precisam representar nada em particular. Eles podem ser úteis simplesmente como um pedaço único de dados.

Exemplos

A saída de uma função de hash é só uma série única de bytes, e isso os torna úteis como "impressões digitais" de dados: TXID (identificador único de transação), hash de bloco (identificador único de bloco) e hash de chave pública. E às vezes usamos apenas um conjunto de bytes de aparência aleatória, sem significado, como os magic bytes (f9beb4d9) usados como marcador entre mensagens.

Dados Personalizados

No fim, você pode usar bytes para representar o que quiser. Não precisa ser só números e texto (embora sejam os mais comuns). Tudo depende de como você escolhe interpretar as combinações de 1s e 0s dentro desses bytes.

Exemplos

Estas são algumas codificações exclusivas do bitcoin: Script (um byte em um scriptpubkey/scriptsig pode se referir a uma operação "OP_CODE"), Compact Size e o campo bits do cabeçalho de bloco (armazena o alvo atual de forma compacta).

Trabalhando com Bytes

Conseguir trabalhar com bytes brutos no bitcoin é especialmente importante quando se trata de rede ou quando você está fazendo o hash de dados.

A boa notícia é que você pode trabalhar com bytes brutos em qualquer linguagem de programação decente. Isso varia entre linguagens, mas normalmente envolve escrever o valor de cada byte individual em algum tipo de string ou array especial, assim:

"\xF9\xBE\xB4\xD9"
{0xF9, 0xBE, 0xB4, 0xD9}

Mas esse tipo de formato não é fácil de passar adiante, então você frequentemente vai converter esses bytes em strings hexadecimais para fins de exibição:

"f9beb4d9"

É assim que eu normalmente exibo bytes neste site, e como você normalmente verá bytes sendo exibidos em exploradores de blockchain.

Às vezes você também vai querer obter o valor inteiro que esses bytes representam:

4190024921

Então, ao trabalhar com dados do Bitcoin, você quer conseguir converter de um lado para o outro entre bytes de verdade, strings hexadecimais e inteiros na sua linguagem de programação preferida.

# bytes <-> hexadecimal <-> inteiro (Ruby)
bytes = ["f9beb4d9"].pack("H*")  # string hex -> bytes
hex   = bytes.unpack1("H*")       # bytes -> string hex  => "f9beb4d9"
int   = hex.to_i(16)              # hex -> inteiro        => 4190024921

Resumo

Um bit é a menor unidade de dados (um 1 ou 0), e um byte é um grupo de 8 bits. Os bytes são a unidade básica dos dados brutos do Bitcoin.

Normalmente exibimos bytes em formato hexadecimal (2 caracteres por byte) para economizar espaço. E um byte pode armazenar diferentes tipos de dados — números, texto, configurações, impressões digitais — dependendo de como você interpreta os seus bits.

Quando você começa a trabalhar com dados brutos do Bitcoin, é tudo só uma questão de saber o que aqueles bytes representam.