Muito se fala de rede blockchain, Web3, criptomoedas, Metaverso, NFT e toda essa sopa de letrinhas que envolve esse ramo da computação (já posso chamar assim será?).
Para entender melhor o funcionamento de tudo isso, é interessante saber um pouco da sequência em que algumas coisas foram criadas e como isso aconteceu, assim fica mais fácil entender como chegamos até aqui e para onde podemos e devemos ir.
Bitcoin
Você já deve ter ouvido falar em Bitcoin, por isso é muito difícil introduzir essa “coisa” sem explicar muitos detalhes, pois foi sua criação que viabilizou tudo o que temos até aqui. Além disso, Bitcoin é muito “simples” em relação ao resto da Web3.
Inclusive, você deve ter percebido que chamei de “coisa”, pois até hoje há uma discussão sobre o que é Bitcoin. Se é moeda? Um ativo digital? Ou uma pirâmide?
Bom, vou tentar diminuir ao máximo meu viés aqui e explicar tecnicamente como foi construído, sei que pra quem estudou system design (arquitetura) é meio que um contra senso alguns pontos, como prova de trabalho PoW (Proof of Work), mas talvez esse assunto não caiba aqui com a profundidade que merece. No futuro, posso fazer outro artigo só sobre este tema.
Conceitos importantes
Antes de começarmos a falar sobre a estrutura da rede blockchain, vamos conhecer alguns conceitos que fazem parte da base da compreensão da própria rede, são eles: criptografia, hashes e assinatura digital.
Criptografia Assimétrica
No ramo da segurança é muito comum esse tipo de criptografia e em blockchains não é diferente. Vou explicar os conceitos, pois a implementação requer um conhecimento matemático (ou matemágico?) que não possuo e não interessa muito para o nosso entendimento.
Em criptografia assimétrica, usa-se um número aleatório muito grande para gerar outros dois números.
Com base nisso é possível fazer algumas coisas diferentes, mas a principal é:
- Usar o número A para embaralhar um número qualquer e só será possível desembaralhar usando o número B;
- O contrário também é possível, mas falaremos sobre isso mais adiante.
Em computação, é possível fazer operações matemáticas muito rapidamente e representar números de diversas formas. Podemos representar o número 156 em: binário (10011100), octal (234), hexadecimal (9C) e qualquer outra forma que quiser apresentá-lo e seja interessante para o nosso contexto.
Por uma questão prática, não representamos em binário e, por segurança, quanto maior esse número mais difícil de quebrar a criptografia. Portanto, os números são enormes e representados utilizando caracteres alfanuméricos, fazendo com que a representação tenha uma quantidade menor de caracteres, reduzindo o tamanho da string gerada:
Além de representar esses números de uma forma mais “humana”, também damos o nome de Chave Pública (A) e Chave Privada (B).
Sendo assim, é possível deixar A disponível para qualquer pessoa (por isso, chave pública), então embaralhar (criptografar) qualquer número (ou mensagem, pois podemos converter mensagens em números) e só quem mantém a chave privada guardada de forma segura consegue entender essa mensagem. Esse conceito é usado amplamente na web e devs em geral estão acostumados com ele.
Abaixo estão dois exemplos de como esse conceito funciona na prática:
Antes de prosseguirmos com a rede blockchain, precisaremos entender outro conceito: hashes.
Hashes
Outro tipo de algoritmo amplamente utilizado em geral na computação, muitos estão familiarizados, mas vou fazer uma explicação breve.
Um algoritmo de hash gera um número com um tamanho fixo com base em uma entrada de qualquer tamanho, é um algoritmo determinístico, pois ele sempre vai gerar a mesma saída se a entrada não mudar. Assim como descrevi na explicação anterior, esse número pode ser representado por um código alfanumérico.
Algoritmos de hash são utilizados para “armazenamento / integridade” seguro de senhas, mapas (a estrutura de dados), assinaturas digitais, entre outros.
Repare no tamanho do resultado do algoritmo MD5 independentemente do tamanho da entrada:
Assinatura digital
Se unirmos os dois conceitos acima, criptografia assimétrica e hashes, chegaremos à assinatura digital.
Vou fazer uma analogia: imagine que o Rei Theoden precisa informar os Rohirrim que o mago branco Saruman não é mais um aliado (os Rohirrim são os súditos de Theoden pra quem não manja de Senhor dos Anéis):
- Em tempos de paz, o rei compartilha sua chave pública para líderes regionais espalhados pelo reino;
- Ao montar a mensagem a ser enviada, o rei passa a mensagem por um algoritmo de hash, gerando o hash da mensagem;
- Então, ele criptografa o hash usando sua chave privada, pega o resultado e anexa à mensagem;
- Ao receber a mensagem, os líderes cavaleiros, espalhados pelo reino, leem a mensagem e não sabem se ela é verdadeira, a mensagem pode ter sido criada por Sauron;
- Então esses líderes, descriptografam a assinatura que chegou junto com a mensagem, fazem um hash da mensagem que chegou e comparam as duas. Desta forma, atestam que a mensagem veio do Rei Theoden e é verdadeira.
Estrutura Blockchain
Entendendo os três conceitos, criptografia assimétrica, hash e assinatura digital, temos a base para entender como uma rede blockchain funciona.
O que o tal Satoshi Nakamoto (ou seja lá quantas pessoas e quais são, afinal é um codinome) pensou foi algo do tipo:
“E se eu usasse assinatura digital para que as pessoas pudessem atestar que estão transferindo saldos de uma moeda entre si e um sistema colocasse essas operações numa sequência definida formando um bloco de transações, em seguida aplicasse um hash nesse bloco, assim quando um bloco chegar no seu tamanho máximo, posso usar o hash do bloco anterior no próximo, fazendo uma corrente de blocos?”
Esse pensamento (que obviamente extraí diretamente da cabeça de Satoshi Nakamoto), mostra como o encadeamento de blocos usando hash do bloco anterior transforma a blockchain em um castelo de cartas, pois se algo for alterado no passado, impacta diretamente no futuro.
Mas isso ainda não explica como isso se transformou em uma rede (a rede blockchain), porém vamos por partes:
Blockchain Distribuído
Para construir um sistema descentralizado, que não ocorra gasto duplo, foi criado o conceito de nonce. Até agora, vimos que o código hash de um bloco é composto de um hash do conteúdo do bloco (transações) + hash do bloco anterior, se adicionarmos um número aleatório para gerar um novo hash, cada número vai gerar um hash diferente:
Quando temos dois ou mais computadores (nós) em uma rede blockchain, as transações são submetidas para a rede através de um protocolo P2P (Peer-to-Peer), que são transações assinadas pela pessoa dona da chave privada, assim atestando que ela está enviando fundos.
Essas transações são acumuladas por cada nó até atingir um tamanho máximo do bloco, nesse momento o bloco para de receber novas transações e começa o processo chamado de mineração (tão famoso).
Nele, cada nó validador gera um nonce (um número aleatório arbitrário) e na sequência o hash do bloco. Todos os nós estão procurando um hash específico, portanto esse processo é feito continuamente até encontrar o nonce ou até outro nó encontrar primeiro. Quando um nó encontra o nonce, ele faz algumas coisas:
- Adiciona uma unidade de bitcoin (no caso do bitcoin) na própria chave pública;
- Avisa os outros nós qual o nonce correto;
- Recomeça o processo de receber transações.
Dessa forma, os outros nós, que perderam a batalha para descobrir o nonce desse bloco, verificam que o nonce é verdadeiro, acatam o fechamento do bloco e seguem para o próximo.
Mas o que é um nonce verdadeiro?
Simplificando, é um hash que comece com uma determinada quantidade de zeros (000), confira na imagem:
Quanto mais zeros à esquerda, mais difícil é de ser encontrado esse número, os zeros à esquerda na verdade representam um número pequeno. É como se você jogasse um dado de 20 lados e tivesse que acertar 5 ou menos.
Quanto menor o número a ser encontrado, mais demorado, portanto foi possível criar um mecanismo para fazer com que os blocos sejam minerados há uma frequência quase fixa: 10 minutos. A dificuldade desse nonce varia de acordo com o tempo que demorou pra minerar o último bloco.
Mas e se houver um nó malicioso na rede e não reconhecer um gasto, ou “fingir” que não viu um gasto duplo?
Mecanismo de Consenso
Esse mecanismo do nonce, junto com o fato de que os nós validadores gastaram muito dinheiro no passado para manter a rede íntegra, garantem que não haverá gasto duplo. Na imagem é possível ilustrar essa situação:
A imagem acima ilustra que num cenário coeso somente um nó consegue acertar o nonce por vez, nesse caso todos utilizam o mesmo “algoritmo de consenso” (o tal do mecanismo do nonce), mas se um ou até dois nós quiserem quebrar o consenso e “fingir” que não viram um gasto duplo (tipo eu tenho 10 bitcoins e vou enviar 20 bitcoins para duas pessoas diferentes)?
Essa imagem representa um cenário onde os nós 1,2 e 3 possuem o algoritmo de consenso explicado acima, baseado no nonce; e os nós 4 e 5, a partir do bloco 1 resolveram aceitar “transferências maliciosas” e ignorar o nonce dos outros nós. Dessa forma, formou-se um fork da rede, no conjunto à esquerda (nós 1,2 e 3), os nós vencedores foram em sequência 3, 2, 2, 1; já no conjunto da direita (nós 4 e 5), os nós vencedores foram em sequência 3, 5, 5, 4.
Outra forma de representar o desenho acima seria esse:
Nessa ilustração fica mais claro o fork acontecendo, a “derivação” na sequência de blocos. Os motivos pelos quais os nós validadores não fariam o que foi ilustrado é porque gastaram muito dinheiro minerando o passado e, ao fazer isso, causa uma queda no preço do bitcoin (o que os nós validadores não querem).
Eu costumo ilustrar com uma situação que a maioria de nós vivenciou quando era criança: quando você estava na porta da escola indagando colegas “se você não entrar, eu não entro”.
Afirmações sobre rede blockchain
Após tudo que aprendemos até aqui sobre rede blockchain, temos algumas afirmações para fazer parte da nossa base de conhecimento e nos instigar a aprender mais:
- Uma unidade de criptomoeda não é um conjunto de bytes (arquivo txt, png, etc) que você guarda no seu computador ou smartphone, é possível alguém copiar e colar. Ele é, na verdade, um saldo que existe numa rede descentralizada;
- Para poder usar sua criptomoeda é necessário assinar a transação usando sua chave privada, por isso que ela é privada e só você deve saber qual ela é. Por isso, devs que trabalham com criptomoedas devem entender os mecanismos de segurança para manter as chaves privadas seguras. Se pesquisar um pouco sobre isso, vai acabar encontrando alguns termos interessantes sobre essa área (MPC, enclave computacional, HSM);
- O processo de consenso do bitcoin (chamado de proof of work) é uma “loteria probabilística”, onde há muito gasto de energia para achar um “número mágico” e com isso chegar num consenso. Atualmente, há outros mecanismos de consenso que funcionam tão bem quanto PoW, vale pesquisar: Proof of Stake, Proof of Resource, Proof of Authority e Federated Byzantine Agreement;
- Usando a lógica das blockchains é possível não só manter um saldo de uma criptomoeda, como também armazenar outros dados (criptografados ou não) e até fazer processamentos na própria rede. É aí que aparecem os smart contracts e consequentemente o que se chama de Web3, afinal se é possível fazer processamento e armazenamento de dados numa rede descentralizada, muda-se o paradigma da web tradicional (Web2);
- Por conta desse último ponto surgiram as DAOs (Decentralized Autonomous Organizations), que se utilizam de blockchains para construir e gerir negócios sem fazer deploy do software numa infraestrutura tradicional, mas usa uma rede de blockchain para fazer o deploy.
Conclusões
Entender o processo de criptografia assimétrica, hash e assinatura digital são básicos para qualquer dev que quer se aventurar nessa área, se entender bem os três pilares o raciocínio lógico vai te fazer automaticamente entender várias outras coisas e te instigar a procurar mais a respeito.
Além disso, é importante perceber que os dados estão distribuídos em nós numa rede onde não há um coordenador, ou seja, há um processo de consenso para que não haja divergência dos dados.
Quer ficar por dentro dos assuntos mais quentes da tecnologia? Então assine nossa newsletter:
E você, aprendeu algo que não sabia sobre criptomoedas? Gostaria de mais conteúdos técnicos relacionados à Web3? Um podcast talvez? Então comente qual assunto gostaria de saber mais!