Hash do Bloco

A referência única de um bloco

Diagrama mostrando como um hash de bloco é criado fazendo o hash do cabeçalho do bloco.

Um hash de bloco (ou ID do bloco) é uma referência única para um bloco na blockchain.

Todo hash de bloco é único e é determinado pelo conteúdo do bloco. Você pode, portanto, usar o hash do bloco para procurar um bloco específico em um explorador de blocos. Por exemplo:

Não há nada de muito interessante nesses hashes, já que são, em última análise, só um monte de bytes de aparência aleatória.

Porém, você vai notar que todos os hashes de bloco começam com um monte de zeros. Isso porque, para um bloco ser adicionado à blockchain, um minerador precisa obter um hash para o seu bloco abaixo do valor de alvo atual. E, se o hash do bloco está abaixo desse valor de alvo, ele naturalmente terá vários zeros no início.

Criando

Como você cria um hash de bloco?

Um hash de bloco é criado fazendo o hash do cabeçalho do bloco.

Cabeçalho do Bloco

Decodifique e codifique um cabeçalho de bloco.

0 bytes
Cabeçalho do Bloco (Campos)

Versão

Versão: 0
0d
0d

Os passos para criar um hash de bloco são:

  1. Construir um bloco de transações.
  2. Construir um cabeçalho de bloco para esse bloco.
  3. Fazer o HASH256 do cabeçalho do bloco para obter o hash do bloco.
    • HASH256 é a abreviação de SHA-256 duplo; você passa o cabeçalho do bloco pela função de hash SHA-256 e passa o resultado pelo SHA-256 de novo.
Código
require 'digest'

# ------------
# cabeçalho do bloco (bloco gênese)
# ------------
version = "01000000"
previousblock = "0000000000000000000000000000000000000000000000000000000000000000"
merkleroot = "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"
time = "29ab5f49"
bits = "ffff001d"
nonce = "1dac2b7c"

blockheader = version + previousblock + merkleroot + time + bits + nonce

# ---------
# hash do bloco
# ----------

# Nota: não passe o cabeçalho do bloco para a função de hash como string.
#       Converta-o de hexadecimal para bytes brutos primeiro.

# converte string hexadecimal para sequência de bytes
bytes = [blockheader].pack("H*") # H = string hex (byte mais significativo primeiro), * = múltiplos bytes

# SHA-256 (primeira rodada)
hash1 = Digest::SHA256.digest(bytes)

# SHA-256 (segunda rodada)
hash2 = Digest::SHA256.digest(hash1)

# converte da sequência de bytes de volta para string hexadecimal
blockhash = hash2.unpack("H*")[0]

# imprime o resultado (ordem natural de bytes)
puts blockhash #=> 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000

# imprime o resultado (ordem de bytes invertida)
puts blockhash.scan(/../).reverse.join #=> 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Transações. Você notará que não estamos hasheando diretamente as transações dentro do bloco. Porém, o cabeçalho do bloco contém uma raiz de Merkle, que é o hash das transações, então as transações dentro do bloco fazem parte do cabeçalho.

Hashes de Bloco Válidos. Nem todos os hashes de bloco terão um monte de zeros no início (a princípio). Os mineradores incrementam o valor do nonce no cabeçalho do bloco para tentar obter um hash de bloco que esteja abaixo do alvo.

Ordem de Bytes. O resultado de fato de hashear o cabeçalho do bloco produz um hash de bloco em ordem natural de bytes. Porém, ao procurar blocos em um explorador, o hash do bloco fica em ordem de bytes invertida.

Uso

Onde os hashes de bloco são usados no bitcoin?

Os hashes de bloco são usados em dois lugares:

  1. São usados ao procurar um bloco específico na blockchain.
  2. São colocados dentro do campo de bloco anterior do cabeçalho para conectar os blocos na blockchain.
Diagrama mostrando blocos conectados entre si por meio dos hashes de bloco no cabeçalho, usando o campo bloco anterior.
Os blocos são conectados pelos seus hashes de bloco.

Então, na maioria das vezes você vai usar os hashes de bloco ao procurar um bloco específico em um explorador de blocos, mas o campo de bloco anterior é de importância crítica, pois é a cola que mantém a blockchain unida.

Perguntas Frequentes

O hash do bloco é só bytes ou é um número?

É os dois.

Tudo o que sai da função de hash SHA-256 é só um monte de bytes sem significado. Mas eles são únicos (para aquele dado específico), então são perfeitos como referência única para um dado específico. Isso permite que você procure e referencie blocos anteriores com confiança ao construir uma blockchain.

Novamente, este é o hash de bloco único do bloco gênese:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Os caracteres hexadecimais que você vê aqui estão apenas representando 32 bytes de dados sem significado.

Porém, no bitcoin, durante o processo de mineração, esses hashes de bloco também são interpretados como números. Se você converter este hash de bloco de hexadecimal para decimal, obtém:

10628944869218562084050143519444549580389464591454674019345556079

Fazendo isso, você pode verificar se o hash do bloco está abaixo do alvo e, se estiver, o bloco pode ser adicionado à blockchain.

Então faz sentido pensar no hash do bloco como sendo um número único.

Ícone Ferramenta Conversor de Números

Conversor de Números

Converta um número entre bases diferentes (binário, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos