Visão Geral de Hashing
Hashing e hashes de blocos já foram mencionados várias vezes, mas o conceito em si ainda não foi examinado em detalhes. Agora é o momento de compreender o que realmente é hashing.
Hashing é um processo que recebe uma entrada e produz uma sequência de bytes de tamanho fixo, normalmente expressa como um número hexadecimal. O resultado, conhecido como hash, parece aleatório e muda completamente com qualquer alteração na entrada, uma propriedade conhecida como "efeito avalanche".
Propriedades das Funções Hash
Na blockchain, funções hash são utilizadas para:
- Proteger transações criando uma impressão digital única para cada uma;
- Gerar endereços a partir de chaves públicas;
- Criar os elos na blockchain por meio dos hashes de blocos.
Com isso em mente, uma boa função hash para blockchain possui várias propriedades essenciais:
A hash, especialmente quando se utiliza uma boa função de hash, pode ser comparada ao preparo de um smoothie. Veja a ilustração a seguir:
Na verdade, é possível encontrar a entrada original a partir de um hash, porém, isso exigiria tanto tempo que não seria algo prático.
Hash de Bloco
Para obter o hash de um determinado bloco, o Bitcoin utiliza a função de hash SHA-256, que gera um hash de 256 bits (32 bytes). Ela faz parte da família SHA-2, desenvolvida pela Agência de Segurança Nacional (NSA) e reconhecida por suas fortes propriedades de segurança, tornando-a resistente a colisões, ataques de pré-imagem e outras vulnerabilidades criptográficas.
O hash de um bloco do Bitcoin é calculado utilizando os dados do cabeçalho do bloco. Esses dados são inseridos na função de hash SHA-256 duas vezes em um processo conhecido como double SHA-256.
Veja a imagem para esclarecer:
O hash de 256 bits resultante deve atender a certos critérios definidos pelo alvo de dificuldade da rede. Se o hash não estiver abaixo do alvo, o nonce é ajustado e o hash é recalculado até que um hash qualificado seja encontrado. Esse hash final é o identificador único do bloco.
Raiz de Merkle
A raiz de Merkle é um único hash que representa todas as transações incluídas em um bloco. Seu cálculo começa com os hashes de cada transação individual, utilizando duplo SHA-256.
Cada hash de transação é então pareado com outro, e o par é hasheado junto para produzir um novo hash. Esse processo de pareamento e hash continua camada por camada até restar apenas um hash. O hash final é a raiz de Merkle, que encapsula todo o conjunto de transações e garante sua integridade ao codificá-las em um único valor. Essa estrutura hierárquica é conhecida como árvore de Merkle.
O exemplo a seguir ilustra como uma árvore de Merkle é formada:
Como pode ser observado, nosso bloco contém 6 transações (cada uma rotulada como Tx) e, por meio do hash e pareamento de novos hashes, uma raiz de Merkle é calculada.
Sempre que o hash mais à direita não possui um par, como ocorre com o Hash56 em nosso exemplo, esse último hash é duplicado para formar um par. Essa técnica mantém a integridade e a eficiência da estrutura da árvore de Merkle mesmo com números ímpares de transações ou hashes em determinado momento.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 6.25
Visão Geral de Hashing
Deslize para mostrar o menu
Hashing e hashes de blocos já foram mencionados várias vezes, mas o conceito em si ainda não foi examinado em detalhes. Agora é o momento de compreender o que realmente é hashing.
Hashing é um processo que recebe uma entrada e produz uma sequência de bytes de tamanho fixo, normalmente expressa como um número hexadecimal. O resultado, conhecido como hash, parece aleatório e muda completamente com qualquer alteração na entrada, uma propriedade conhecida como "efeito avalanche".
Propriedades das Funções Hash
Na blockchain, funções hash são utilizadas para:
- Proteger transações criando uma impressão digital única para cada uma;
- Gerar endereços a partir de chaves públicas;
- Criar os elos na blockchain por meio dos hashes de blocos.
Com isso em mente, uma boa função hash para blockchain possui várias propriedades essenciais:
A hash, especialmente quando se utiliza uma boa função de hash, pode ser comparada ao preparo de um smoothie. Veja a ilustração a seguir:
Na verdade, é possível encontrar a entrada original a partir de um hash, porém, isso exigiria tanto tempo que não seria algo prático.
Hash de Bloco
Para obter o hash de um determinado bloco, o Bitcoin utiliza a função de hash SHA-256, que gera um hash de 256 bits (32 bytes). Ela faz parte da família SHA-2, desenvolvida pela Agência de Segurança Nacional (NSA) e reconhecida por suas fortes propriedades de segurança, tornando-a resistente a colisões, ataques de pré-imagem e outras vulnerabilidades criptográficas.
O hash de um bloco do Bitcoin é calculado utilizando os dados do cabeçalho do bloco. Esses dados são inseridos na função de hash SHA-256 duas vezes em um processo conhecido como double SHA-256.
Veja a imagem para esclarecer:
O hash de 256 bits resultante deve atender a certos critérios definidos pelo alvo de dificuldade da rede. Se o hash não estiver abaixo do alvo, o nonce é ajustado e o hash é recalculado até que um hash qualificado seja encontrado. Esse hash final é o identificador único do bloco.
Raiz de Merkle
A raiz de Merkle é um único hash que representa todas as transações incluídas em um bloco. Seu cálculo começa com os hashes de cada transação individual, utilizando duplo SHA-256.
Cada hash de transação é então pareado com outro, e o par é hasheado junto para produzir um novo hash. Esse processo de pareamento e hash continua camada por camada até restar apenas um hash. O hash final é a raiz de Merkle, que encapsula todo o conjunto de transações e garante sua integridade ao codificá-las em um único valor. Essa estrutura hierárquica é conhecida como árvore de Merkle.
O exemplo a seguir ilustra como uma árvore de Merkle é formada:
Como pode ser observado, nosso bloco contém 6 transações (cada uma rotulada como Tx) e, por meio do hash e pareamento de novos hashes, uma raiz de Merkle é calculada.
Sempre que o hash mais à direita não possui um par, como ocorre com o Hash56 em nosso exemplo, esse último hash é duplicado para formar um par. Essa técnica mantém a integridade e a eficiência da estrutura da árvore de Merkle mesmo com números ímpares de transações ou hashes em determinado momento.
Obrigado pelo seu feedback!