Glossário / Mineração e consenso
Hash do cabeçalho do bloco anterior
- O que é o hash do cabeçalho do bloco anterior?
- O hash do cabeçalho do bloco anterior é o campo de 32 bytes em cada cabeçalho de bloco que nomeia seu bloco pai, e é o único elo que transforma um monte de blocos em uma cadeia.
Cada bloco aponta para trás, nunca para frente. Como o ponteiro fica dentro dos 80 bytes sobre os quais o hash é calculado, editar qualquer coisa em um bloco antigo muda seu hash e quebra todos os blocos construídos sobre ele, de modo que desfazer um pagamento de um ano atrás significa refazer aproximadamente 52.000 blocos de prova de trabalho. Isso, e não alguma regra sobre apagar dados, é o que as pessoas querem dizer quando chamam o bitcoin de imutável.
Como funciona
O hash do cabeçalho do bloco anterior é produzido aplicando SHA-256 duas vezes sobre o cabeçalho de 80 bytes do bloco pai, e é a única referência que um bloco guarda a qualquer coisa fora de si mesmo.
Como o cabeçalho do bloco pai contém o hash de seu próprio bloco pai, e assim por diante até o começo, um único campo de 32 bytes se compromete com todo o histórico atrás dele. Um nó que verificou a ponta da cadeia verificou implicitamente que a cadeia que leva até ela é internamente consistente. Altere uma transação em um bloco minerado no verão passado e o hash do cabeçalho desse bloco muda, o que significa que a cópia que o bloco filho guarda dele não corresponde mais, o que significa que o bloco filho é inválido, e também tudo o que vem depois. Reparar o dano significa minerar de novo cada um desses blocos, a cerca de 144 blocos por dia, ou 52.560 por ano.
O bloco gênesis é a exceção, e precisa ser: não há nada antes dele, então o campo é de 32 bytes zero.
Nada em um bloco aponta para frente. Quando o Bitcoin Core informa um nextblockhash, ele está lendo seu próprio índice, não o bloco, e é exatamente por isso que esse valor pode mudar durante uma reorganização enquanto o hash do cabeçalho do bloco anterior nunca muda. Dois blocos nomearem o mesmo pai também não é um erro. É assim que uma bifurcação se parece do ponto de vista dos dados, e a rede a resolve preferindo o ramo com mais trabalho acumulado, em vez de declarar qualquer um dos dois ponteiros errado.
Onde você vê isso
O hash do cabeçalho do bloco anterior aparece com nomes um pouco diferentes dependendo do que você está olhando.
O Bitcoin Core o retorna como previousblockhash em getblockheader e getblock. Para o bloco 0 o campo simplesmente está ausente da resposta, porque não há pai a nomear. Os exploradores de blocos geralmente o rotulam como Previous Block e o transformam em um link, que é como funciona clicar para trás no histórico.
Ele também é toda a substância de uma sincronização da cadeia de cabeçalhos. Um nó que baixa cabeçalhos verifica duas coisas por cabeçalho: que este nomeia o último e que seu hash atende ao alvo. Só depois que essa cadeia se mantém coerente ele começa a pedir os corpos dos blocos. As carteiras leves nunca vão além disso, mantendo os elos e o trabalho e nada mais.
Se você algum dia construir o campo à mão, espere uma discussão com seus próprios olhos, porque os bytes no cabeçalho não estão escritos na ordem em que o hash costuma ser citado.
Hash do cabeçalho do bloco anterior vs ordem interna dos bytes
O hash do cabeçalho do bloco anterior é armazenado na ordem de bytes oposta à que todo mundo cita, e isso confunde quase todos que tentam verificar um cabeçalho manualmente. O bloco 1 carrega o hash de seu pai como 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000. Esse é o hash do gênesis, 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f, escrito ao contrário byte a byte. Os zeros à esquerda que a prova de trabalho produz acabam à direita no campo bruto. Nada está errado quando os dois não coincidem à vista: inverta os bytes e eles coincidem.