Todo software é construído aplicando-se não apenas uma, mas sim um conjunto de conceitos e tecnologias. Nesse e em próximos artigos eu vou escrever um pouquinho sobre quais são os elementos necessários para a construção de uma criptomoeda baseada em blockchain, como a Decred ou o Bitcoin.
Pilha Tecnológica
A pilha tecnológica de um software lista tudo o que foi usado para sua construção. Ela é descrita como uma pilha porque para toda aplicação existem conceitos mais genéricos (elementos de baixo nível da pilha) e mais específicos (alto nível da pilha).
Quanto mais baixo na pilha, mais fundamental e maior a aplicabilidade de um item em outros softwares.
A pilha de uma criptomoeda como a Decred se parece com o seguinte:
Vamos analisar analisá-la de baixo pra cima.
1. Primitivas Criptográficas
O cripto de criptomoedas se refere ao uso de funções criptográficas para a implementação de diversas funcionalidades. Essas funções são muito estudadas dentro da área de segurança de informação e de matemática pura e aplicada, e são utilizadas em vários outros tipos de software, não apenas em moedas digitais.
As funções criptográficas mais importantes que podemos destacar são:
Funções de Hash
Uma função de hash converte uma informação crua arbitrária de entrada em um número de tamanho fixo. Esse mapeamento é feito de forma a se obter algumas propriedades:
- A informação de entrada pode ter qualquer tamanho;
- Deve ser computacionalmente difícil (“impossível em prática") deduzir a origem tendo apenas a saída;
- A saída deve se parecer aleatória (uma pequena alteração na entrada provoca grande alteração na saída);
Criptomoedas usam diferentes funções de hash para diferentes funcionalidades. Algumas das mais populares são a RIPEMD-160 (usada para confecção dos endereços do Bitcoin), SHA-256 (usado na PoW do Bitcoin) e a Blake 256 (usada na PoW da Decred).
Usar uma função criptográfica em um conjunto de dados se parece com o seguinte. Vou utilizar a função SHA-256 que é extremamente popular e usada em várias aplicações além de criptomoedas:
sha256("o rato roeu a roupa do rei de roma") = d6df13...ebab9f
sha256("o rato roeu a roupa do rei de romA") = 7a812f...bc6f2a
Note que a única diferença entre as duas frases de entrada foi a última letra do texto, mas a saída mudou substancialmente. É computacionalmente difícil (em outras palavras, é necessário um gasto muito grande com computadores) descobrir a frase de origem a partir do hash de saída.
Criptografia Assimétrica
Criptografia assimétrica diz respeito a codificar (“embaralhar”) uma informação de entrada utilizando-se de uma chave (chave pública) de tal forma que, para decodificar os dados e obter a informação original é necessário usar uma segunda chave (chave privada).
Fora das criptomoedas, a criptografia assimétrica é utilizada no protocolo HTTPS (o protocolo que garante o sigilo na transmissão de dados pela internet), em cadeias de certificação digital e em muitos outros protocolos onde é necessário garantir que uma informação só possa ser vista pelo dono de uma determinada chave privada.
No Bitcoin, a criptografia assimétrica é usada nas saídas de uma transação, para indicar que a pessoa que pode gastar uma certa quantidade de moedas é a aquela que possui a chave privada X
correspondente ao endereço (chave pública) Y
.
De forma um pouco mais concreta: digamos que Alice deseja criar uma transação para Bernardo, transferindo 1 BTC de sua carteira. Ela pede a Bernardo que gere um endereço (uma chave pública, vamos chamá-la de Pu
). Então ela publica uma transação em que transfere 1 BTC para qualquer um capaz de produzir uma assinatura correspondente a chave pública Pu
. Como apenas Bernardo detém a chave privada (Pv
) que pode gerar assinaturas para Pu
, apenas ele é capaz de movimentar esses fundos. Na prática, Alice acabou de transferir essas moedas para Bernardo ao publicar essa transação.
A matemática que garante o relacionamento entre Pu
e Pv
e sua inviolabilidade é alvo de muitos estudos minuciosos, já que qualquer vulnerabilidade permitiria a outras pessoas além daquela que possui Pv
a gastar os fundos, e automaticamente quebraria toda a confiança na criptomoeda.
Assinaturas Digitais
A assinatura digital é a operação “inversa” da criptografia assimétrica. Na criptografia, qualquer pessoa pode obter a chave pública de alguém e codificar uma mensagem qualquer de forma que apenas o portador da chave privada pode decodificá-la. Ou seja, a direção da operação é chave pública -> chave privada.
Já na assinatura digital, o portador da chave privada a utiliza para criar uma espécie de “impressão digital” de alguma informação: ele codifica essa informação de tal forma que a chave pública pode decodificá-la, provando que essa informação foi criada ou certificada pela chave privada. A direção da operação é chave privada -> chave pública.
Para diminuir o tamanho da assinatura, ela normalmente é feita sobre o hash da informação bruta, garantindo a integridade da informação (devido as propriedades do hash) e a autenticidade do autor (devido o uso da chave privada).
A assinatura digital é utilizada em criptomoedas nas entradas de transações. Partindo do exemplo anterior, quando Bernardo quiser gastar o 1 BTC recebido de Alice, ele deverá assinar a entrada da nova transação onde gasta suas moedas com a chave privada correspondente à chave pública que Alice incluiu na transação anterior.
Bitcoin e Decred utilizam algoritmos de curva elíptica para suas assinaturas digitais, que são mais compactos do que a criptografia RSA mais largamente utilizada em certificados HTTPS e na cadeira de certificados digitais basileira.
Pseudo-Aletoriedade
No caso da Decred, além dos vários elementos presentes no Bitcoin é utilizada uma primitiva chamada PRNG (pseudo-random number generator - gerador de números pseudo-aleatórios). Essa função é utilizada no subsistema de PoS, para selecionar os tickets com direito a voto a cada bloco.
Um PRNG tradicional é uma função que gera números aleatórios a partir de uma semente: um valor inicial que indica a sequência que o PRNG deve seguir. Ao contrário de um gerador de números aleatórios entrópico que gera números verdadeiramente imprevisíveis, um PRNG sempre gera os mesmos números para a mesma semente inicial.
Eles são muito utilizados para testes de software ou em jogos de computador, onde é necessário repetir a execução de um algoritmo que precisa de números aleatórios de forma consistente. Por exemplo, jogos de mundos procedurais como o Minecraft usam a semente para que você seja capaz de criar o mesmo mundo várias vezes.
Na Decred, um PRNG é utilizado para selecionar os tickets que devem votar a cada bloco. Note os seguinte:
- Todo bloco carrega um valor de 6 bytes chamado
FinalState
:
- Quando um novo bloco é carregado para a blockchain, o PRNG é inicializado usando o cabeçalho do bloco anterior como semente (o que inclui o
FinalState
) e os tickets ganhadores do sorteio e que tem direito a voto nesse novo bloco são selecionados:
- Dados os ganhadores desse bloco, o novo
FinalState
é calculado concatenando o hash (id da transação) dos tickets ganhadores…
- … junto com o estado do PRNG no bloco anterior:
Dessa forma, como PRNG é determinístico (no sentido de que, para um novo bloco ele só depende do anterior), quando um novo bloco é minerado, todos os nós da rede descobrem automaticamente e de forma independente o mesmo conjunto de tickets com direito a votação e as carteiras donas desses tickets emitem seus respectivos votos imediatamente.
Esse foi o primeiro artigo sobre a pilha tecnológica de criptomoedas. Para acompanhar os próximos lançamentos, assine meu feed RSS, minha newsletter, ou meu facebook.