Criptomoedas – Hashs

Um dos assuntos que não deixa de aparecer em algum momento numa conversa hoje em dia são as criptomoedas, com destaque especial às duas mais populares, o Bitcoin e o Ethereum. Não abordaremos aqui se é um bom ou mau investimento, se o valor vai subir ou descer no futuro. Vamos abordar a parte técnica, mostrando como essas criptomoedas funcionam.

O Bitcoin foi imaginado com o propósito de propiciar transações eletrônicas ponto-a-ponto (peer-to-peer) sem a necessidade de uma instituição financeira para validar as transações ou evitar que o remetente envie para duas pessoas diferentes a mesma transação (tentando fraudar uma delas).

A solução proposta pelo autor do artigo original do Bitcoin (Satoshi Nakamoto – provavelmente um pseudônimo) foi fazer com que uma rede distribuída de computadores colocasse os valores hash das transações em uma cadeia crescente de provas de trabalho baseados em hash, formando uma cadeia que não pode ser modificada sem refazer a prova de trabalho. A cadeia mais longa, além de servir como prova da sequência de eventos testemunhados, prova que veio do conjunto de máquinas com maior poder de processamento conjunto. Enquanto a maioria do poder de processamento for controlada por nós que não estiverem cooperando para atacar a rede eles irão gerar a cadeia mais longa mais rápido que possíveis atacantes.

Essa solução funciona porque uma função hash é uma função de dispersão (uma pequena mudança no valor de entrada gera uma mudança em muitos bits do valor de saída) e compressão (o valor de saída tem sempre o mesmo tamanho, não importa o tamanho da mensagem que se está fazendo o hash), de forma que uma vez o hash de uma transação é adicionada à cadeia de blocos, é inviável fraudar essa transação.

A função SHA-256, por exemplo, gera um conjunto de 256 bits de saída para qualquer entrada. Considere o seguinte exemplo:

Valor: R$ 0,00

O valor hexadecimal da string acima, usando a codificação ASCII, é:

V    a    l    o    r    :         R    $         0    ,    0    0
0x56 0x61 0x6c 0x6f 0x72 0x3a 0x20 0x52 0x24 0x20 0x30 0x2c 0x30 0x30

Agora consideremos outra string:

Valor: R$ 0,01

cujo valor hexadecimal, por sua vez, é:

V    a    l    o    r    :         R    $         0    ,    0    1
0x56 0x61 0x6c 0x6f 0x72 0x3a 0x20 0x52 0x24 0x20 0x30 0x2c 0x30 0x31

As duas strings apresentarão uma mudança apenas no valor dos centavos, mais precisamente, em um único bit (o último):

Caractere:   0           1
Hexadecimal: 0x30        0x31
Binário:     0011_0000   0011_0001

A primeira string apresenta a seguinte hash (64 dígitos hexadecimais – 256 bits):

0x1fd38dcf4ad70e63498d6e43dfd17ae0c04a7f280bc98b7e4db3c57087bf2008

Já a segunda:

0xf32bff674c9ef83d1e5716cf6d7e4c13f33530f2b29dd484a4835308d29fdb98

Ao fazer uma análise dos valores binários dessas duas hashs, nota-se que foram alterados 140 bits da hash resultante com a modificação de apenas um bit do valor da entrada (fica a cargo do leitor a conferência).

As hashs são uma função de mão única. É razoavelmente fácil calcular a hash de uma mensagem, mas é inviável calcular a mensagem a partir da hash, ou outra mensagem que tenha a mesma hash (já que a hash sempre produz o mesmo número de bits, uma mensagem maior que isso vai gerar em algum ponto a mesma hash que uma outra mensagem), quando se considera uma função de hash moderna (como a função SHA256). A título de curiosidade, mesmo considerando o poder computacional utilizado por toda a rede Bitcoin (cerca de 20,5 quintilhões de hashs/segundo quando esse post foi escrito) levaria cerca de 500 trilhões de anos para produzir através de força bruta duas mensagens com a mesma hash (gerar uma colisão de hashs). Para uma comparação rápida, a idade do universo é estimada em 13,7 bilhões de anos, necessitando 40 vidas do universo para chegar a esse número.

Dessa forma, uma vez que a prova de trabalho é concluída (criar um bloco contendo 1: a hash do bloco anterior, 2: a hash de várias transações que fazem parte daquele bloco e 3: um número aleatório – de forma que a hash de tudo isso tenha os primeiros N bits em zero antes dos outros nós da rede), e propagada para os demais nós pode-se afirmar que as transações cujas hashs estão na cadeia são as lícitas.

Como todos os nós estão recebendo transações para validar de diferentes clientes assincronamente, no caso de dois nós calcularem o próximo bloco em tempos semelhantes, os outros nós irão aceitar a cadeia mais longa como a verdadeira, ou seja, o bloco que conseguir se propagar primeiro como sendo o próximo bloco para mais de metade da rede vai ser reconhecido como o bloco verdadeiro, e o outro nó deve abandonar o bloco calculado e começar novamente sua prova de trabalho.

Na rede do Bitcoin, o número de zeros exigidos no início do valor da hash da prova de trabalho é ajustado para que um novo bloco seja gerado a cada 10 minutos. O prêmio para quem consegue realizar a prova de trabalho hoje é de 12,5 Bitcoins, e cai pela metade a cada 210 mil blocos minerados (como é chamada a execução da prova de trabalho pelos nós da rede). Além disso, para que os nós incluam a transação em um bloco, é previsto que uma taxa possa ser paga (logo, as transações que pagam maiores taxas vão ser colocadas na fila antes para maximizar os ganhos dos mineradores).

Hoje, mesmo com a valorização do Bitcoin, ja é inviável economicamente fazer a mineração utilizando CPUs ou GPUs (o custo do hardware mais o custo de energia elétrica é maior do que o valor do prêmio) porque foram criados hardwares especializados para a sua mineração, que conseguem minerar mais rápido e a um custo menor, aumentando em muito a chance deles descobrir o próximo bloco.

A rede do Ethereum utiliza o mesmo conceito de blockchain que o Bitcoin, com algumas diferenças em como as hashs das transações que compõem um bloco são organizadas.

Espero que essas informações permitam uma discussão e análise mais embasada para o potencial das redes de Blockchain, assim como os seus problemas inerentes (como, por exemplo, o dispêndio energético, que hoje se aproxima ao consumo de um país como a Argentina na rede Bitcoin) já que todos os nós estão calculando a prova de trabalho das mesmas transações (ou de grande parte delas) ao mesmo tempo, e apenas um deles será o vencedor na corrida para a produção do próximo bloco.