O que é o Blockchain

Neste post, vamos tratar dos aspectos técnicos do Blockchain: a tecnologia por trás do Bitcoin. Falaremos sobre criptografia, transações, blocos e mineração de criptomoedas.

Você já conhece o Bitcoin? É um minerador? Um investidor?

E se você perdeu o último post sobre o contexto histórico do Bitcoin, PARE AGORA e vai lá aprender tudo sobre o surgimento dessa criptomoeda…

Agora vamos nessa que o conteúdo tá :top:!

Vá Direto ao Assunto…

Blockchain

Utilizando conhecimentos já bem consolidados na computação, como chaves criptográficas e redes distribuídas, Satoshi criou uma nova tecnologia chamada blockchain. Em uma frase:

O blockchain é um livro-razão público de transações agrupadas em blocos, descentralizado e distribuído.

Nas próximas seções, vamos destrinchar os principais conceitos dessa frase. Começaramos definindo conceitos básicos — como livro-razão, transação e blocos — e então partiremos para chaves criptográficas, redes distribuídas e mineração.

Perceba que nenhum desses conceitos é novo. O que torna o blockchain inovador é a combinação deles, isto é, a verdadeira novidade está na maneira com que esses conceitos e tecnologias foram organizados e orquestrados.

Livro-razão

Na contabilidade, um livro-razão é o registro de movimentação dos lançamentos em uma conta ou subconta.

Em outras palavras, o livro-razão é o local onde são registrados todos os débitos, créditos e saldo resultantes de operações (ou transações) realizadas em todas as contas compreendidas nesse livro-razão.

Trazendo esse conceito para o mundo do blockchain, um public ledger (ou livro-razão) contém o histórico de todas as transações (débito ou crédito) ocorridas, bem como o saldo atual de todas as contas criadas dentro do blockchain.

Na prática, isso significa que, para cada transação feita, um novo registro é criado no blockchain e disponibilizado na rede.

Mas o que é uma transação?

Transação

Uma transação é uma unidade de trabalho que deve ser tratada pelo sistema como “um todo”, isto é, ou a transação ocorre por completo, ou ela deverá ser cancelada, de modo que o estado final do sistema após o cancelamento seja o mesmo do início da transação (como se a transação nunca tivesse existido).

Uma transação no blockchain contém 3 informações:

  1. Endereço de origem
  2. Quantidade de moedas a serem transferidas
  3. Endereço de destino

Com essas três informações é possível criar uma transação no blockchain.

Transações ocorrem entre wallets (ou carteiras digitais). Wallets são similares a contas bancárias. É por meio delas que você mantém o seu saldo e pode enviar ou receber moedas.

Sempre que uma transação é criada, ela é divulgada para todos os nós da rede. Isso possibilita o rastreamento do histórico de qualquer transação desde o momento de sua criação.

Blocos

Um bloco é um conjunto de transações validadas pela rede e assinadas digitalmente. Ele é composto por um header (cabeçalho com metadados) e as próprias transações contidas naquele bloco.

O header de um bloco contém as seguintes informações:

  • Versão: indica a versão do conjunto de regras do bloco.
  • Hash do header do último bloco: hash “duplo” — SHA256(SHA256()) — do header do último bloco da cadeia. Esse dado garante que nenhum bloco anterior possa ser alterado sem alterar também o header atual, conferindo imutabilidade ao blockchain.
  • Merkle Root Tree: a raíz da árvore Merkle gerada a partir do hash de todas as transações incluídas no bloco. Isso garante que nenhuma transação possa ser alterada sem que o header também seja alterado.
  • Timestamp: Era Unix ou Unix Epoch do momento em que o minerador começou a executar a verificação (hashing) do header do bloco.
  • nBits: é um inteiro sem sinal de 256 bits. Para que um bloco seja válido e, portanto, possa fazer parte da cadeia de blocos, o hash do header precisa ser menor ou igual a esse número (vamos entender melhor na Seção Mineração).
  • nonce: um número aleatório que os mineradores modificam na tentativa de encontrar o menor hash que satisfaz a condição imposta por nBits (também veremos na Seção Mineração). mineradores podem modificar em cada

Veja um exemplo de header:

1
2
3
4
5
6
7
8
9
10
02000000 ........................... Versão do bloco: 2

b6ff0b1b1680a2862a30ca44d346d9e8
910d334beb48ca0c0000000000000000 ... Hash do header do último bloco
9d10aa52ee949386ca9385695f04ede2
70dda20810decd12bc9b048aaab31471 ... Raíz da árvore Merkle

24d95a54 ........................... Era Unix: 1415239972
30c31b18 ........................... nBits: 0x1bc330 * 256**(0x18-3)
fe9f0864 ........................... nonce

Se você quiser ver os dados de um bloco real, clique neste link e ele te levará para o último bloco minerado até o momento em que escrevo este post.

Chaves Criptográficas

Chaves criptográficas são utilizadas para proporcionar algumas garantias durante o envio de informações por um canal potencialmente inseguro, como a Internet, onde terceiros podem ter acesso aos dados trafegados.

Duas dessas garantias são o sigilo e a autenticidade das informações, ambas primordiais para o funcionamento do blockchain.

Sigilo

O sigilo pode ser alcançado através do uso de criptografia assimétrica, onde o emissor codifica a mensagem a ser enviada de modo que apenas o destinatário consiga decodificá-la.

Em termos técnicos, esse mecanismo criptográfico utiliza um par de chaves: uma chave pública e uma chave privada.

Ao enviar uma mensagem, o emissor usa a chave pública do receptor para cifrar (ou embaralhar) os dados de modo que apenas alguém de posse da chave privada correspondente (o receptor) consiga decodificá-la e ter acesso ao seu conteúdo.

Qualquer pessoa que não tenha uma chave privada compatível com a que o emissor usou na mensagem não conseguirá extrair a informação codificada.

Autenticidade

A autenticidade está atrelada a duas questões:

  1. Integridade de origem: quem enviou a mensagem é realmente quem a mensagem diz que é?
  2. Integridade de conteúdo: a mensagem recebida é a mesma que foi enviada?

A primeira pergunta põe em dúvida o emissor da mensagem, ou seja, pessoas má intencionadas podem tentar se passar outras pessoas. Já a segunda, põe em dúvida o conteúdo da mensagem (já brincou de telefone sem-fio?).

Para nossa sorte, essas duas questões também podem ser tratadas com uma aplicação de chaves criptográficas conhecida como assinatura digital.

Assinatura Digital

Para assinar digitalmente uma mensagem, o emissor usa sua chave privada e a própria mensagem para calcular um hash.

Assim como uma impressão digital, que identifica cada um de nós de maneira única no planeta, um hash serve para identificar uma mensagem e/ou o emissor dela. Então, o emissor envia a mensagem (junto com o hash calculado) pela rede.

Ao receber a mensagem, o receptor pode verificar sua autenticidade usando o hash recebido e a chave pública do emissor.

Dependendo do algoritmo utilizado, as chaves podem ter diferentes tamanhos. Os termos “chave de 128 bits” ou “chave de 256 bits” são usados para expressar o tamanho da chave.

Assim, quanto maior a quantidade de bits utilizados na chave criptográfica, mais complexa será a quebra da mesma.

Por exemplo, se um algoritmo usa uma chave de 8 bits, existem apenas 256 possíveis chaves para decodificar essa informação, porque 2 elevado a 8 é igual a 256. Dessa forma, um terceiro pode facilmente gerar as 256 combinações possíveis e decodificar a mensagem.

No blockchain, somente a assinatura digital não é suficiente para provar a posse de informação. O conceito de chaves criptográficas resolve o problema de autenticação, mas ainda são necessários mecanismos de aprovar transações na rede (autorização).

Daí a necessidade de uma rede distribuída!

Redes Distribuídas

Existem basicamente três categorias de redes de computadores:

Tipos de redes

  • Centralizado: Todos os atores da rede se conectam a um elemento central (servidor), o qual é responsável por prover informações aos usuários clientes.

  • Descentralizado: Em um ambiente descentralizado, o serviço prestado é executado não por um participante, mas por uma rede de participantes em que nenhum controla nem pode “desligar” a rede.

  • Distribuído: é um tipo de rede que é dividida e compartilhada entre diferentes nós. Ela provê diferentes rotas para que a informação trafegue do nó A ao nó B. Com isso, mesmo com diversos nós desligados, a rede continua funcionando, com rotas alternativas interligando os nós ainda em execução.

O blockchain é um tipo de rede distribuída.

O benefício e necessidade de uma rede distribuída podem ser entendidos pelo experimento filosófico: “If a tree falls in the forest, and there’s nobody around to hear, does it make a sound?” (tradução: se uma árvore cai em uma floresta, e não há ninguém por perto para ouvir, a queda da árvore provocou algum barulho?).

Mas o que isso tem a ver com o blockchain?

Suponha que Maria assine uma transação em seu próprio computador dizendo que ela quer enviar moedas para João, mas ela efetivamente não realiza essa transação. Nesse caso, claramente, nenhum efeito foi causado na rede (“does it make a sound?”).

Entretanto, enviar a transação apenas para João não é suficiente, pois Maria poderia assinar outra transação enviando a mesma quantia à Joana. Se João e Joana aceitarem essa transação, Maria teria gasto as mesmas moedas duas vezes (double spending problemProblema do Gasto Duplo), o que é inaceitável em qualquer sistema de transferência de valores.

É nesse ponto que entra a ideia de um livro-razão global compartilhado!

Se Maria quiser transferir suas moedas para João, ela precisará, primeiro, publicar suas intenções no blockchain.

Dessa forma, os mineradores, que mantêm o blockchain em execução, irão incluir essa transação na cadeia apenas se Maria ainda não tiver usado essas moedas em uma transação anterior.

Se no futuro Maria tentar criar uma nova transação transferindo as mesmas moedas para Joana, essa transação jamais será aceita pois a transação que as transfere para João já foi publicada e validada pela rede.

A manutenção do poder computacional necessário para execução do blockchain gera um custo energético altíssimo.

Para isso, é necessário que haja o incentivo ao processamento das transações.

Em outras palavras: mineração! :pick: :pick: :pick:

Mineração: Processamento de Transações

A mineração é o processo pelo qual as transações são adicionadas no livro-razão. Além disso, também é a partir dela que novas moedas são geradas na rede.

A mineração foi intencionalmente estruturada para consumir muitos recursos computacionais. Isso foi feito para que o número de blocos “encontrados” pelos mineradores se mantenha constante.

Para um bloco ser considerado válido é necessário que o mesmo apresente uma “prova de trabalho” (Proof of Work). Essa prova é verificada por outros nós da rede toda vez que eles recebem um bloco.

O Bitcoin, por exemplo, utiliza a função de prova de trabalho Hashcash.

Proof Of Work

Proof of Work é um conjunto de dados extremamente difíceis de serem produzidos, pois sua geração requer bastante poder computacional e tempo, mas que, uma vez gerados, são de fácil verificação.

Uma prova de trabalho, por exemplo, pode ser um processo aleatório com baixa probabilidade de acerto. Dessa forma, será necessária uma enorme quantidade de tentativas e erros até que uma prova de trabalho válida seja encontrada.

No caso do Bitcoin, a função de prova de trabalho para a geração de novos blocos é o Hashcash. Assim, para um bloco ser aceito pelos nós da rede, os mineradores devem completar uma prova de trabalho em todos os dados do próprio bloco.

A baixa probabilidade desse processo torna a mineração imprevisível, ou seja, não é possível saber qual nó da rede gerará o próximo bloco.

Vamos ver um exemplo para você entender melhor:

Considere a string “Hello World!”. Nosso objetivo é encontrar uma variação dessa string cujo hash SHA-256 comece com “000”.

Para isso, tentaremos a seguinte solução. Vamos concatenar um inteiro à string e calcular o hash. A cada iteração, incrementaremos o inteiro e repetiremos o processo até encontrarmos uma variação da string que satisfaça a condição do “000”.

:bulb: Em criptografia, esse inteiro é chamado nonce — Number + Once — e representa um número arbitrário que só pode ser usado uma vez.

1
2
3
4
5
6
7
"Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
"Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
"Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
...
"Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
"Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
"Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9

Foram necessárias 4.251 tentativas para encontrar uma solução!

É claro que esse é um exemplo simples. Um processador moderno consegue fazer esse cálculo em questão de microssegundos. No caso do Bitcoin, por exemplo, o desafio é muito mais difícil de ser resolvido, mas a lógica de prova de trabalho é a mesma.

Conclusão

Ufa! Quanta coisa!

Nesse artigo, discutimos um pouco mais sobre o blockchain: essa nova tecnologia que tem atraído os olhos do mundo todo!

Aprendemos como funciona esse “projetinho” que começou com um “cara” desconhecido desenvolvendo em casa, mas que veio a se tornar a tecnologia da década!

E você, está desenvolvendo algum projeto? Quem sabe ele não se torna o próximo blockchain?! :wink:

Referências

Comentários desabilitados...