Visão Geral
Um hash é a saída de uma função hash — uma cadeia de caracteres de tamanho fixo que representa de forma única uma entrada de qualquer tamanho. No Bitcoin, os hashes são usados de forma generalizada: para identificar transações, para vincular blocos entre si, para criar o puzzle de prova de trabalho, e para derivar endereços a partir de chaves públicas. O hash é frequentemente descrito como uma "impressão digital digital" porque mesmo uma pequena mudança na entrada produz uma saída completamente diferente.
Propriedades de um Bom Hash
Entrada: "Hello" → SHA-256 → 185f8db32271fe25f561a6fc938b2e26...
Entrada: "Hello." → SHA-256 → 2d8bd7d9bb5f85ba643f0110d50cb506...
Entrada: "hello" → SHA-256 → 2cf24dba5fb0a30e26e83b2ac5b9e29e...
Observações-chave:
1. Comprimento fixo: Sempre 256 bits (64 caracteres hexadecimais) independente do tamanho da entrada
2. Determinístico: A mesma entrada sempre produz o mesmo hash
3. Efeito avalanche: Pequena mudança na entrada → hash completamente diferente
4. Sentido único: Não é possível recuperar a entrada a partir do hash
5. Resistente a colisões: Praticamente impossível encontrar duas entradas diferentes
que produzam o mesmo hash
Como o Bitcoin Usa os Hashes
IDs de transação (TXIDs): Cada transação é identificada pelo hash SHA-256 duplo de seus dados serializados. Isso fornece um identificador compacto e único para cada transação.
Hashes de bloco: Cada bloco é identificado pelo hash SHA-256 duplo de seu cabeçalho de 80 bytes. Esse hash deve estar abaixo do alvo atual para que o bloco seja válido (prova de trabalho).
Vinculação da blockchain: Cada cabeçalho de bloco contém o hash do bloco anterior, criando uma cadeia inquebrável:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Bloco N │ │ Bloco N+1│ │ Bloco N+2│
│ │ │ │ │ │
│ Prev: ◄──┼────│ Prev: ◄──┼────│ Prev: │
│ Hash │ │ Hash │ │ Hash │
│ │ │ │ │ │
│ Merkle │ │ Merkle │ │ Merkle │
│ Root │ │ Root │ │ Root │
└──────────┘ └──────────┘ └──────────┘
Árvores de Merkle: Os hashes de transação são emparelhados e hasheados repetidamente para formar uma árvore de Merkle, com o hash raiz incluído no cabeçalho do bloco.
Geração de endereços: Os endereços de Bitcoin são derivados hasheando as chaves públicas através de SHA-256 e RIPEMD-160.
Funções Hash Usadas no Bitcoin
- SHA-256: Usado para mineração (SHA-256 duplo), IDs de transação e árvores de Merkle
- RIPEMD-160: Usado em combinação com SHA-256 para gerar hashes de endereço mais curtos (HASH160)
- SHA-512: Usado em HMAC-SHA512 para derivação de chaves de carteira HD
- SipHash: Usado internamente para operações de tabela hash para prevenir ataques DoS
Conceitos Equivocados Comuns
- Um hash não é criptografia. A criptografia é reversível com a chave correta; o hashing é um processo de sentido único.
- Embora colisões (duas entradas com o mesmo hash) sejam teoricamente possíveis, encontrar uma para SHA-256 é computacionalmente inviável com a tecnologia atual.
- O termo "hash" na mineração de Bitcoin refere-se a uma única tentativa de calcular o hash do cabeçalho de um bloco com um valor de nonce específico.