Bloco

Um contêiner para transações

Um bloco é um contêiner para transações.

No topo de todo bloco há um cabeçalho de bloco, que resume todos os dados do bloco. Ele contém uma impressão digital (raiz de Merkle) de todas as transações do bloco, além de uma referência a um bloco anterior.

Os mineradores fazem o hash desse cabeçalho repetidamente para tentar obter um resultado abaixo do alvo atual. Se você conseguir um hash de bloco abaixo do alvo, o bloco pode ser adicionado à blockchain. Esse processo é chamado de mineração.

Os nós coletam novas transações em um bloco, fazem o hash delas em uma árvore de hash e percorrem valores de nonce para fazer o hash do bloco satisfazer os requisitos de prova de trabalho. Quando resolvem a prova de trabalho, transmitem o bloco para todos e o bloco é adicionado à cadeia de blocos.
Satoshi Nakamoto, Bitcoin v0.1 (main.h)

Exemplo

Aqui estão os dados brutos do bloco 1 (o primeiro bloco após o gênese), com os campos separados:

01000000 <- versão
6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000 <- bloco anterior
982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e <- raiz de merkle
61bc6649 <- tempo
ffff001d <- bits
01e36299 <- nonce
01 <- contagem de transações
01000000010000...00000000 <- transações

Este bloco só contém uma transação, mas a estrutura básica é a mesma para todo bloco. (Os campos do cabeçalho estão em little-endian / ordem natural.)

Todo bloco bruto começa com um cabeçalho de bloco. Ele contém um resumo do conteúdo do bloco e é usado para criar o hash do bloco. Tem 80 bytes e seis campos:

Ícone Ferramenta

Cabeçalho do Bloco

Monte os 80 bytes do cabeçalho e calcule o hash do bloco (HASH256 do cabeçalho, em ordem de bytes invertida).

Versão

O campo versão é usado para sinalizar atualizações do Bitcoin. Originalmente era um inteiro simples; desde 2015 (BIP 9), é interpretado como um bit field, onde cada bit pode ser atribuído a uma possível atualização. A versão padrão é 0x20000000 (não sinaliza para nenhuma atualização).

Bloco Anterior

O campo bloco anterior contém o hash de um bloco existente, sobre o qual o bloco atual se constrói. Os mineradores sempre querem estender a cadeia mais longa, então este campo contém o hash do bloco que está atualmente no topo (a "ponta").

Raiz de Merkle

O campo raiz de Merkle contém uma impressão digital de todos os dados de transação do bloco. Ele impede que o conteúdo do bloco seja alterado: todas as transações são "comprometidas" ao cabeçalho via a raiz de Merkle, então, se alguma transação for modificada depois, a raiz não vai mais bater (e o bloco será inválido).

Ícone Ferramenta Raiz de Merkle
Ícone Ferramenta

Raiz de Merkle

Calcule a raiz de Merkle a partir de uma lista de TXIDs (um por linha, na ordem de exibição/explorer).

Tempo

O campo tempo contém a hora em que o bloco foi construído como um timestamp Unix. Não precisa ser exato, mas deve estar dentro de cerca de duas horas em torno do tempo mediano da rede para os nós aceitarem o bloco.

Ícone Ferramenta Unix Time
Ícone Ferramenta

Unix Time

Converta entre um timestamp Unix (segundos desde 01/01/1970) e uma data legível (UTC).

Bits

O campo bits é uma representação compacta do alvo no momento em que o bloco foi minerado. Em vez de armazenar o valor de alvo completo de 32 bytes no cabeçalho, usamos a codificação compacta de 4 bytes.

Ícone Ferramenta Target / Bits
Ícone Ferramenta

Target / Bits

Converta o campo compacto bits do cabeçalho do bloco para o valor de alvo (target) completo.

0x

Nonce

O nonce é um campo extra de 4 bytes que os mineradores incrementam para obter hashes de bloco completamente diferentes, na esperança de encontrar um abaixo do alvo.

Transações

Após o cabeçalho do bloco vem uma contagem de transações (em formato compact size) seguida das transações em si. A primeira transação é sempre a transação coinbase (que reivindica a recompensa do bloco).

Ícone Ferramenta Compact Size
Ícone Ferramenta

Compact Size

Converta entre um número e sua codificação compact size (o varint usado no Bitcoin).

Peso (Weight)

O tamanho de um bloco é medido em unidades de peso (weight). Um bloco pode ter no máximo 4.000.000 unidades de peso. Um byte de dados "normais" (não testemunha) vale 4 unidades de peso, e um byte de dados de testemunha vale 1 unidade de peso. Essa métrica foi introduzida com o SegWit; antes, o limite era de 1.000.000 bytes (1 MB). Veja tamanho da transação para mais detalhes.

Localização

Os blocos brutos são armazenados no disco do seu nó nos arquivos blk.dat.