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.
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.)
Cabeçalho do Bloco
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:
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).
Raiz de Merkle
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.
Unix Time
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.
Target / Bits
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).
Compact Size
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.