Electrum
Estudando sobre criptomoedas e tecnologias relacionadas, me deparei com o problema do gasto energético imenso do Bitcoin e outras criptomoedas que usam Prova-de-Trabalho (Proof-of-Work; PoW) como algoritmo de consenso.
Para quem não está familiarizado com o termo algoritmo de consenso, ele é uma parte essencial de qualquer blockchain (ou de qualquer sistema descentralizado), que garante o acordo dos participantes sobre o que é válido e o que não é. Simplificando, é ele quem “determina a verdade” nesses sistemas.
Na tentativa de resolver esse problema de gasto energético, eu idealizei um algoritmo de consenso e uma criptomoeda para usá-lo.
Nada foi implementado ainda, nenhuma linha de código escrita. Estou escrevendo este artigo na tentativa de receber ajuda ou sugestões. Ainda há alguns pontos a serem definidos. Vou falar mais deles daqui a pouco. Depois de definir as questões pendentes, pretendo escrever um artigo científico explicando em detalhes o algoritmo de consenso e a criptomoeda.
O nome da criptomoeda será Electrum, que é uma liga metálica de ouro e prata, usada como uma das primeiras moedas da história. Já o algoritmo de consenso vai se chamar:
Proof-of-Something
Proof-of-Something é o nome que eu escolhi por não ter criatividade suficiente para pensar em outra coisa.
O algoritmo se baseia no produto entre a movimentação de moedas dentro da blockchain pela “idade” dessas moedas. Vou explicar melhor.
Dentro de uma blockchain, as vezes acontece de um participante discordar de outro sobre o estado atual da rede. Por exemplo: o participante A acha que o último bloco da rede contém 10 transações dentro dele. Já o participante B acha que o último bloco contém 9 transações.
Para decidir quem está “certo”, este algoritmo de consenso vai calcular uma pontuação para a versão do participante A e outra para a versão do participante B. Essa pontuação é calculada multiplicando a quantidade de moedas contidas em cada entrada de cada transação pela “idade” de cada moeda.
Caso não esteja familiarizado com o conceito de entradas e saídas em uma criptomoeda, sugiro que leia este artigo (apenas a parte “Como são moldadas as transações?”) antes de continuar.
Cálculo de pontuação
Aqui eu explico em detalhes como o algoritmo funciona, passo a passo.
Passos para calcular a pontuação de uma transação (Tx
):
Passo 1:
Pegar a primeira entrada de Tx
.
(Vou chamar essa entrada de In
)
Passo 2:
Pegar a saída que está sendo consumida em In
.
(Vou chamar essa saída de Out
)
Passo 3:
Calcular a pontuação de In
, usando a fórmula:
P = X * Y
P
é a pontuação deIn
.X
é a quantidade de moedas contidas emOut
.Y
é a idade deOut
.
Y
é calculado da seguinte forma:
Y = B1 - B0
B1
é o índice do bloco que contémTx
(ou seja, é quandoOut
foi consumida. A “morte” deOut
).B0
é o índice do bloco em queOut
foi criada (o “nascimento” deOut
).
Passo 4:
Repetir a partir do passo 1, calculando a pontuação das próxima entradas de Tx
.
Depois de calcular as pontuações de todas as entradas de Tx
, somar todos os resultados (os P
’s) para chegar à pontuação total de Tx
.
Exemplo do cálculo de pontuação
Neste exemplo, calculamos a pontuação de uma transação hipotética (Tx
).
Uma pessoa fez uma transação, Tx
, com as seguintes características:
Tx
está inserida no bloco100
Tx
possui 2 entradas:- A primeira entrada (
In_1
) consome uma saída (Out_1
) que foi criada no bloco90
e que carrega 5 Electrums. - A segunda entrada (
In_2
) consome uma saída (Out_2
) que foi criada no bloco55
e que carrega 3 Electrums.
- A primeira entrada (
Como já temos todas as informações de todas as entradas e saídas, já fizemos os passos 1 e 2. Agora, no passo 3, aplicamos a fórmula:
P = X * Y
Y = B1 - B0
P
é a pontuação deIn
.
X
é a quantidade de Electrums contidas emOut
.
Y
é a idade deOut
.
B1
é o índice do bloco que contémTx
(ou seja, é quandoOut
foi consumida. A “morte” deOut
).
B0
é o índice do bloco em queOut
foi criada (o “nascimento” deOut
).
Substituindo Y
na primeira fórmula, temos:
P = X * (B1 - B0)
É importante lembrar que a fórmula é aplicada a cada entrada (In_1
e In_2
) separadamente. Assim, vamos primeiro calcular a pontuação de In_1
. Substituindo os valores de cada variável de In_1
, temos:
P = 5 * (100 - 90)
P = 5 * 10
P = 50
Portanto, a pontuação de In_1
é de 50 pontos. Concluído o passo 3, passamos para o passo 4.
No passo 4, vamos apenas repetir o que já fizemos, mas desta vez com In_2
.
P = X * (B1 - B0)
Substituindo…
P = 3 * (100 - 55)
P = 3 * 45
P = 135
Portanto, a pontuação de In_2
é de 135 pontos.
Finalmente, para calcular a pontuação de Tx
, basta somar as pontuações calculadas. Assim, a pontuação de Tx
é de 185 pontos (50 + 135).
A criptomoeda
Segurança
O algoritmo Proof-of-Something vai eliminar a necessidade/possibilidade de mineração de moedas, mas isso não fará a Electrum menos segura.
Na rede Electrum, a segurança contra gastos duplos (ataques 51%) será baseada na movimentação de Electrums entre diferentes usuários. Assim, quanto mais pessoas utilizarem a moeda, mais segura ela se tornará.
Para que alguém consiga realizar um ataque 51% bem-sucedido, esta pessoa precisaria criar uma transação (ou transações) com uma pontuação maior que a soma das pontuações de todas as outras transações “honestas” sendo sobrescritas. Por isso, quanto mais transações de pessoas honestas/normais, mais difícil será alguém mal intencionado realizar um ataque à rede.
Taxas
Para desincentivar transações desnecessárias (ou até ataques, como descrito acima), é bom que exista uma taxa sobre as transações. Dessa forma, caso alguém tente realizar um ataque 51%, essa pessoa vai necessariamente perder o dinheiro gasto com a taxa, caso seu ataque seja bem-sucedido.
O valor da taxa será de 0,2% sobre o valor transferido.
Velocidade
Nas criptomoedas em geral, a velocidade em que os blocos são criados depende da “sorte” do minerador e de seu poder de processamento (chamado hashing power).
Porém, na Electrum, a velocidade em que os blocos serão criados será sempre constante, uma vez que não vai haver mineração. Esse tempo será de 240 segundos (quatro minutos). Isso significa que a cada 4 minutos um bloco vai ser criado, contendo as transações feitas nesse intervalo de tempo.
Distribuição de moedas
As moedas precisam ser distribuídas entre os usuários de uma forma justa. Por exemplo, no Bitcoin elas são distribuídas como recompensas aos mineradores, o que é justo e lógico.
Porém, na Electrum, não vai existir mineração. Por isso, é necessário criar um outro mecanismo de distribuição de moedas. Eu tenho uma “ideia”, mas ela é incompleta e não resolve o problema: As moedas poderão ser distribuídas para os usuários através de staking. Staking é o pagamento de juros para quem “segurar” suas moedas por bastante tempo. O problema é que esse sistema só funciona se os usuários já possuírem moedas (Electrums).
Essa é talvez a parte mais importante do artigo. Eu não tenho uma solução para o problema apresentado, por isso vim pedir ajuda, sugestões, ideias. Vou falar mais disso na seção Contribuir. Então, por favor, eu quero/preciso de ideias melhores que essa.
Criação de blocos
Normalmente, em uma blockchain, todo bloco aponta para o bloco imediatamente anterior, sempre mantendo a linearidade (ou seja, não podem haver dois blocos apontando para um mesmo antecessor). Dessa forma, a partir de um bloco, é possível descobrir todos os anteriores, uma vez que eles formam uma corrente de blocos (uma block chain).
Porém, na Electrum, será um pouco diferente. Existem duas diferenças principais:
Quem vai apontar para os blocos anteriores serão as transações, não os blocos. Todas as transações deverão apontar para o bloco imediatamente anterior a elas. Isso servirá para garantir a imutabilidade da blockchain. Se não fosse assim, qualquer pessoa poderia modificar toda a blockchain, sem nenhum impedimento. As transações apontam para blocos; os blocos contêm outras transações; se qualquer transação for alterada ou removida da blockchain, todas as transações seguintes à alterada se tornarão inválidas. Por isso, o Proof-of-Something sempre vai escolher a versão da blockchain que possui a maior pontuação.
Blocos não serão minerados, eles serão criados simultaneamente por todos os nodes. Como dito na seção Velocidade, blocos vão sempre ser criados em uma taxa constante. Dessa forma, não seria viável um node (o minerador, em outras blockchains) criar o bloco e propagá-lo pela rede. Caso fosse assim, deveria haver alguma forma de escolher este minerador, o que apenas complica o sistema. Ao invés disso, na Electrum, os nodes criarão blocos localmente, agrupando as últimas transações recebidas, quando for o momento para a criação do bloco (de 4 em 4 minutos). Para garantir o consenso, os nodes, após criarem um bloco, deverão verificar se todos possuem as mesmas transações e, caso algum node não tenha recebido uma transação, ele irá acrescentá-la à sua versão local da blockchain nesse momento.
Se algo não ficou claro, não deixe de perguntar ou comentar, que eu vou sempre tentar responder.
Contribuir
Como eu disse anteriormente, o objetivo principal deste artigo é encontrar pessoas interessadas em ajudar, seja com sugestões de implementações, seja de fato construindo o sistema comigo. Se você teve qualquer ideia, dúvida ou sugestão, POR FAVOR não deixe de comentá-la, independente do que for.
Os dois pontos principais que eu preciso de ajuda são:
- Como distribuir as moedas
- Quais tecnologias usar (linguagens, frameworks, bibliotecas…)
Lembrando que não são os únicos pontos, apenas os principais. Toda sugestão é bem-vinda.