Uma explicação dos cálculos do whitepaper do Bitcoin

Uma explicação dos cálculos do whitepaper do Bitcoin

By Melissa Eggersman - min. de leitura
Atualizado 04 junho 2020

O texto abaixo foi escrito por Daniel Maques (Desenvolvedor de software a mais de 7 anos atuo principalmente no back-end, conheço linguagens como C, C++, C#, JavaScript, Java, Solidity) a fim de explicar alguma questões que podem ser a princípio difíceis de entender para quem lê o whitepaper do Bitcoin escrito por Satoshi Nakamoto. Esse é um post para quem tem interesses mais técnicos a respeito desse assunto.

Os textos de Satoshi e do Daniel vem sempre designados para que fique claro ao leitor. Segue o conteúdo:

[Satoshi]

Nós consideramos o cenário em que um atacante tentando gerar uma corrente alternativa mais rápido do que a corrente honesta. Mesmo se isso for conseguido, ela não vai tornar o sistema aberto para mudanças arbitrárias, como criar valor do nada ou tomar o dinheiro que nunca pertenceu ao atacante. Nós não irão aceitar uma transação inválida como pagamento, e nós honestos nunca aceitarão um bloco contendo-as. Um atacante pode apenas tentar modificar uma de suas próprias transações para pegar de volta o dinheiro que ele gastou recentemente.

[Daniel]

O que ele quer dizer, é que a única forma de atacar a rede é alterar as suas próprias transações. Chegamos nessa mesma afirmativa tendo em mente que todas as transações são ⁶hasheadas, ou seja, quando uma das informações daquela transação mudar, a identificação (hash) dessa transação também é alterada e por sequencia o bloco no qual ela se encontra também é alterado.

Caso o mesmo tente transferir essa transação adulterada para os demais ‘nós’ da rede, estes nós irão rejeitar a transação e o bloco desse usuário, pois todos os usuários possuem todos os blocos, então ficará fácil de saber se uma transação foi adulterada.

A única forma de um atacante conseguir incluir sua transação alterada é vencendo a corrida da prova de trabalho para minerar o bloco atual que já teria sido adulterado anteriormente. Mas claro, só alterar o bloco e vencer o desafio não fazem uma transação se tornar válida, pois depois que cada bloco minerado ele é enviado a todos os nós da rede para que sejam devidamente auditados. Caso alguma transação esteja em desacordo com os registros anteriores, será realizada uma votação (onde 1 Voto = 1 CPU, como foi explicado no parágrafo Prova de Trabalho) levando em conta que para ter sucesso nessa jornada é de extrema importância ter 51% do poder de processamento, pois como foi dito “Se maior parte do poder de processamento é controlado por nós honestos, a corrente honesta irá crescer mais rapidamente e ultrapassar qualquer corrente competidora.”

[Satoshi]

A corrida entre a corrente honesta e a corrente do atacante pode ser caracterizada como uma ¹⁰Caminhada Aleatória Binomial. O evento de sucesso é a corrente honesta ser estendida por um bloco, aumentando sua liderança em +1, e o evento de falha é a corrente do atacante ser estendida por um bloco, reduzindo o atraso em -1.

¹¹Caminhada Aleatória é um processo matemático que ocorre ao longo de uma série de estados conectado em uma linha. Cada estado é numerado e começamos a partir do estado 0. Lançando uma moeda, no caso de cair o lado cara avançamos uma casa e no caso de cair coroa voltamos uma casa, ao longo de uma série de estados.

A probabilidade de um atacante alcançar de um determinado déficit é análoga ao problema da ¹²Ruina do Apostador. Suponha que um apostador com créditos ilimitados comece em déficit e jogue potencialmente um infinito número de vezes para tentar quebrar a banca. Nós vamos calcular a probabilidade de ele nunca conseguir isso, ou que um atacante simplesmente alcance a corrente ¹³honesta, como segue :

p = probabilidade de um nó honesto encontrar o próximo bloco q

q = probabilidade de um atacante encontrar o próximo bloco

qz = probabilidade algum dia o atacante alcançar estando z blocos atrás

 

[Daniel]

A equação de Satoshi é uma variação do modelo Ruína do Jogador, supondo que o apostador joga ao infinito, para chegar ao seu objetivo ou até perder todo seu dinheiro.
Equação:

Voltando a equação do Satoshi onde:

Quer dizer que se (if) P (probabilidade de um nó honesto encontrar o próximo bloco) for menor ou igual ao atacante, o atacante irá achar o próximo bloco antes dos nós honestos, representado como 1.

Agora se P (probabilidade de um nó honesto encontrar o próximo bloco) for maior que a do atacante, então temos que calcular as chances dele alcançar o bloco atual, estando (Número de Blocos) atrás, vamos fazer uma simulação, Imagine que o atacante esteja 2 blocos atras da corrente honesta (bloco atual), e a probabilidade de  p = 0,2 e Probabilidade de q = 0,1, então a equação para se calcular é, Qz = (q/p)ᶼsubstituindo na fórmula, ficará assim, Q2 = (0.1 / 0.2)².
Vamos calcular: Q2 = (0,5)²  =>  Q2 = 0,25.

Mas pense que a cada 10 minutos temos um bloco novo no sistema minerado, caso o Invasor esteja a 1 hora tentando, então teremos 60 minutos / 10 minutos = 6 blocos, jogando na fórmula e acrescentando os 6 blocos ficará assim, Q8 = (0,5)⁸.
Então Q8 = 0,00390625.

Nesse cálculo, podemos entender que se um atacante estiver competindo pra validar um bloco e não ganhar logo na largada, ele ficará para trás e quanto maior a diferença do bloco que ele está, para o atual, menor a probabilidade de ele chegar novamente a competição.

Você deve estar se perguntando, mas não é só ele tentar competir mais uma vez, a resposta é não, pois ou ele fizer isso, terá que aceitar que a transação dele foi confirmada, e ele quer fazer justamente o oposto, mas se ele não conseguir logo de primeira, terá que refazer a prova de trabalho de todos os blocos que foram criados, após ele alterar a transação. Ele então irá entrar no dilema, em usar o poder computacional para continuar validando os blocos inválidos a fim de alcançar o bloco atual, ou usar seu poder computacional para tentar competir novamente, mas aceitando que sua transação que ele queria burlar já foi concluída e confirmada, sem ter a chance de desfazer ou gastá-la duas vezes.

Aqui temos uma tabela com a ¹⁴probabilidade de um gasto duplo bem sucedido, em função do hashrate do atacante Q  e o número de confirmações N.

Logo após, Satoshi nós mostra um script para simular os cálculos,

Caro leitor, caso seja um Programador pule essa parte, pois vou dar uma pequena orientação sobre programação informando o número da linha e o que esta ocorrendo nela:

 

1 – Temos a função #Include <Math.h> está dizendo que ele quer que importe a biblioteca Math, que possuem fórmulas para cálculos matemáticos.

2- Aqui estamos criando um novo método para que seja executado, sempre que temos no início do método Double, quer dizer que o seu retorno vai ser em double, os números doubles são números finitos com casas decimais com até 10 casas de precisão., nessa linha temos na ordem [Tipo de retorno] [Nome do Método]([parâmetro de entrada tipo double],[Parâmetro de entrada do tipo int (Inteiros)]  representado por double AttackerSuccessProbability(double q, int z).

3-  O carácter ”{” é representado na linguagem C, como abertura do corpo de uma função e tudo que estiver posterior a ele será, claro que depois de abrir uma função temos que ter o caráter de fechamento, que é representado como “}”.

4 – Nesta linha estamos declarando uma nova variável, as variáveis são uma representação de tipo de dados na memória. após declarar o tipo da variável demos o nome de , que irá receber o numero 1.0  menos (-) o parâmetro de entrada Q, sendo representada por double p = 1.0 – q;

5- Vemos novamente uma declaração de uma variável double nomeada de ¹⁵lambda que representa o parâmetro de uma distribuição de ¹⁶poisson e irá receber o resultado do cálculo entre o parâmetro de entrada * (parâmetro de entrada / pela variável definida anteriormente como P), sendo representada por double lambda = z *(q / p);

6- Declaramos uma nova variável do tipo  double  com o nome de SUM  e definimos ela com o valor de 1.0double sum = 1.0; Representação double sum = 1.0;

7 – Nesta linha vemos duas variáveis do tipo inteiro, ou melhor, tipo int a única função delas é controlar os looping de dados, que veremos nas próximas linhas. Representação   int i,k;

8 – Nós se deparamos com nosso primeiro laço de repetição, conhecidos também como loop, existem muitos tipos de loop em programação, mas vamos nos atentar apenas ao FOR, FOR é utilizado sempre que queremos testar alguma condição, exemplo 1 + 1 = 2, caso seja quero que repita o processo. o parâmetro para o FOR são (inicialização ; até quando irá ser executado ; incremento ou decremento). onde a condição para que ele se repita é K menor ou igual a Z.  Representação   for (k= 0; k <= z;k++).

9- Abertura do corpo da função FOR.

10 – Agora declaramos uma variavel do tipo double com o nome poisson, ele será igual a ¹⁷exp, onde exp   é a função que calcula o valor exponencial de x, ela recebe como parâmetro a variável  -lambda, pois ela esta sendo passada como variável negativa.    Representação   double poisson = exp(-lambda);

11-  Vamos agora criar um novo loop, dentro de outro loop  sendo que o está recebendo  e não zero como no primeiro laço, sendo que a condição agora é menor ou igual a K. Representação   for (i = 1; i <= k; i++).

12- Vemos nesta linha a variável poisson declarada recentemente, sendo multiplicando por ela mesma, ou seja, na programação quando temos +=, -= e  *= , quer dizer que a variável antes do = esta fazendo o calculo com ela mesma, um exemplo é poisson *= , o mesmo poisson = poisson *. Continuandopoisson receberá o resultado de poisson *  lambda / pela variável de controle I poisson *= lambda / i;

13- Nesta pela última linha temos a variável SUM recebendo o cálculo de (sum – poisson *(1 – pow(resultado da divisão do parâmetro , outro parâmetro de entrada para essa função é parâmetro de entrada do método menos a variável de controle do primeiro loop K), a função POW  Esta função retorna o resultado de aumentar x para a potência y .                                   Representação    sum -= poisson * (1 – pow(q / p, z – k));

14- Fechamento do corpo do Primeiro FOR.

15 – Retorna a variável SUM carregada com o resultado dos cálculos, para o programa que chamar esta função, a AttackerSuccessProbability.

14- Fechamento do corpo principal.

Daniel Marques
Fonte: https://descentralizado.com.br/2018/01/01/whitepaper-bitcoin-calculos/

Guia do Bitcoin

Mantenha-se informado todos os dias sobre Bitcoin!
Telegram: https://telegram.me/guiadobitcoin
Facebook: https://www.facebook.com/guiadobitcoin/
Twitter: https://twitter.com/guiadobitcoin
Feed RSS: https://guiadobitcoin.com.br/feed/