Skip to content

Instantly share code, notes, and snippets.

@bordalix
Created February 15, 2021 07:40
Show Gist options
  • Save bordalix/02803724e07801fef09f8a3feff91b5e to your computer and use it in GitHub Desktop.
Save bordalix/02803724e07801fef09f8a3feff91b5e to your computer and use it in GitHub Desktop.
Vou tentar explicar como funciona o Bitcoin.
Desejem-me sorte.
Segue thread.
Primeiro, os bitcoins em si não existem, tens de deixar de pensar em notas e moedas, isso só complica.
O que existe sim é uma folha de cálculo com o registo de todas as passagens de bitcoins entre pessoas: A Ana passou 3 bitcoins ao Bruno, o Bruno passou 2 bitcoins à Carla, etc.
Quantos bitcoins tem o Bruno? Se recebeu 3 da Ana, e passou 2 à Carla, tem 1. Até aqui está fácil, não?
De onde vêm os bitcoins da Ana é algo que veremos mais à frente. Prossigamos.
Esta folha de cálculo é partilhada por centenas de milhares de pessoas, e tem quase 700.000 páginas. Cada página tem registado, por linha, uma transmissão de bitcoins de uma pessoa para outra.
Mas há um problema, o número de linhas não é infinito. Aliás, quem partilha o ficheiro tem por regra não aceitar páginas com mais de 1 MB (regra #1). Por isso, hoje, o ficheiro tem à volta de 310 GB (no início não havia muita gente e as páginas não estavam cheias).
Não sendo infinito, há então que decidir quais as transacções que devem ficar escritas na próxima página, pois pode não haver lugar para todas.
Mas num sistema que se quer descentralizado, quem é que toma decisões?
A solução é tirar à sorte, escolher um dos participantes e dar-lhe esse poder para a próxima página.
Mas agora temos outro problema, como tirar à sorte num grupo de desconhecidos que não confiam propriamente uns nos outros?
É aqui que entra o conceito do Proof of Work ("PoW"), que por acaso foi inventado antes do Bitcoin, com o objectivo de combater o spam.
A ideia é simples. Existe um algoritmo, chamado SHA256, que o que faz é, dado um número, sai do outro lado outro número, mas com 256 bits.
A questão é que este número que sai é extremamente imprevisível. Se eu quiser que saia o 42, eu não faço ideia que número é que eu tenho de meter. E esta imprevisibilidade é o que nos vai ajudar a tirar à sorte.
Imagina que eu pedia-te que me dissesses um número que, passado ao SHA256, o resultado terminasse em 5. Tu não sabias, mas ias experimentar números aleatórios, certo? Ao fim de meia-dúzia de tentativas descobrias um, e dizias-me.
Eu pegava no teu número, passava-o pelo SHA256 e comprovava que o resultado de facto terminava em 5. Bom trabalho.
Mas e se eu te pedisse um número cujo resultado terminasse em 5555? Muito mais difícil, pois claro, irias precisar, em média, de milhares de tentativas com números aleatórios até descobrir um que terminasse em 5555.
Provavelmente mandavas-me bugiar.
Mas e se eu te oferecesse 200.000 euros por esse número? Pois, começavas a correr para tentar descobrir o raio do número. Eu não te levo a mal, por 200.000 euros eu faria o mesmo.
A imprevisibilidade do SHA256 pode então ser usada como fonte de aleatoriedade para o nosso "tirar à sorte": Damos um problema mais ou menos complexo (número de 5s por exemplo) e o primeiro que responder, ganha. Encontrar o número é uma sorte, pode até ser à primeira tentativa.
Agora vamos usar esta nova ferramenta para tirar à sorte o nosso vencedor. Mais, vamos obrigar a usar o número da página anterior (que acaba por ser aleatório) na busca do novo número. Isto faz com que, quando se descobre uma nova página, todos tenham de começar de novo.
Isso faz também com que haja uma relação entra as várias páginas, a página actual está relacionada com o número da página anterior, (consecutivamente) criando assim uma cadeia (chain), que vai até à página inicial.
Adicionalmente, o número que resulta da "soma" de todas as linhas dessa página também tem que entrar. Assim, se alguém alterar alguma das linhas, os números mudam todos. Isto vai ser importante mais à frente quando estivermos a falar de segurança.
E de onde vêm os 200.000 euros?
É que esse é o prémio pago ao "felizardo" que ganhar a próxima página da nossa folha de cálculo, 6.25 bitcoins. A primeira linha de uma página é especial, pois diz que fulano é dono de 6.25 bitcoins que não vieram de ninguém. É assim que nascem os bitcoins.
Nem sempre foi 6.25, começou por ser 50, mas a cada 210.000 páginas é reduzido a meio, no que se chama de "halvening". Acontece, mais ou menos, de 4 em 4 anos. Há de haver uma altura em que não será possível dividir mais, lá para 2140.
A soma destes prémios todos dá 21 milhões.
Mas como assim, 210.000 páginas são 4 anos?
As páginas querem-se espaçadas no tempo por 10 minutos. Como isto depende da quantidade de pessoas que estão à procura do número terminado em 5s, o protocolo ajusta-se: mais gente, mais 5s, menos gente, menos 5s. Objectivo: 10 minutos
Repara que, dada a imprevisibilidade do SHA256, um número pode ser descoberto segundos depois, ou demorar mais de meia-hora. É a média entre eles que se pretende que seja 10 minutos, não é possível tê-los todos de 10 em 10 minutos.
A cada 2016 páginas (+/- 2 semanas) o protocolo faz um ajustamento da dificuldade. Se as páginas demoraram menos de 10 minutos entre elas (em média), há que aumentar a dificuldade (aumentar o número de 5s) e vice-versa.
Sempre que alguém diz que descobriu um número (uma página nova), o resto da malta vai verificar: 1) se o número de facto cumpre todos os requisitos, e 2) que todas as transacções são válidas, por exemplo, se a Ana tinha de facto 3 bitcoins para dar ao Bruno (regra #2).
Para isso, a proveniência desses bitcoins tem de ser seguida (consultando as páginas anteriores) até se chegar à sua origem (a primeira linha de uma página algures no tempo).
Estando tudo válido, a malta aceita a página, e começa tudo de novo. O blockchain aceitou mais um bloco.
Uma página tem à volta de 3.000 linhas, ou como sabemos agora, transacções. Ora, 3.000 a dividir por 600 segundos dá 5 transacções por segundo, o que é uma miséria.
Uma solução é aumentar o tamanho máximo de cada página (ex: 32 MB). Mas isso trás um problema: A folha de cálculo vai ficar demasiado grande, o que irá impedir pessoas com menos largura de banda e capacidade de disco de participar.
E nós não queremos isso, queremos permitir que o maior número de pessoas possível participe nisto, pelo que aumentar o tamanho das páginas não é solução.
Como então atingir uma escala global?
Como um bolo de bolacha, às camadas.
Existem várias camadas que podemos colocar por cima, mas vou falar-vos apenas de uma, o Lightning Network. Estas soluções são chamadas de Bitcoin layer 2 solutions (para quem quiser ir ao Google saber mais sobre o assunto).
Funciona assim:
Imagina que eu e tu colocamos 1 bitcoin cada um num pote. Depois, trocamos papéis, assinados pelos dois, que dizem que, desse pote, somos donos de 1 bitcoin cada um. Nada de anormal aqui.
Agora, se me quiseres dar 0.1 bitcoins, podemos trocar novos papéis, que dizem que eu sou dono de 1.1 e tu de 0.9 dos bitcoins que estão no pote.
Podemos fazer isto as vezes que quisermos, o tempo que quisermos, pois sabemos que quando um de nós decidir acabar com o pote, os papéis que valem são os últimos.
Mais, se tu quiseres passar 0.2 bitcoins à Ana, mas não tens um pot partilhado com ela, podes passá-los por mim, pois eu até tenho.
Passas-me 0.2 (eu fico com mais 0.2 do nosso pote) e eu passo-os à Ana (eu fico com menos 0.2 do pote que tenho com a Ana). Eu fico na mesma.
Mas quem diz a Ana, diz a Zélia. Desde que haja gente com mais que um pote partilhado, é muito provável que haja um "caminho" até à Zélia. Ou seja, gente a trocar papéis de ti até à Zélia. De A a Z.
As únicas coisas que precisam de ficar registadas na folha de cálculo (blockchain) são as transacções que criam e destroem os potes (channels). Como os potes não têm data de validade, podem até nunca ser destruídos.
Desta forma, é possível ter milhares de transacções por segundo (a troca de papéis), pois é um sistema descentralizado, em que uma parte da rede até pode cair, mas há sempre outro caminho, um pouco como funciona a Internet. Tudo isto sem tocar na blockchain.
E porquê é que o Bitcoin gasta tanta energia?
Por segurança.
Para percebermos isto, comecemos por explicar o tipo de ataque possível ao Bitcoin, o chamado double spend.
Eu compro-te um livro, e para isso pago-te 0.0001 bitcoins. Tu só consideras que está pago no momento que vires essa transação numa página da folha de cálculo. Nessa altura, envias-me o livro.
Mas eu, malandro como sou, depois de receber o livro vou à folha de cálculo e removo a linha onde eu te passava os meus bitcoins. Pumba, fiquei com o livro e com os bitcoins, para poder gastá-los noutro sítio qualquer (double spend).
Mas espera, ainda te lembras que todas as linhas entravam para o cálculo do SHA256, certo? Ao eliminar uma linha, a minha página ficou inválida (o número deixou de terminar em não sei quantos 5s). Por isso, tenho de calcular isso tudo outra vez.
Mas tenho de me apressar, pois a malta já está à procura do número da próxima página. E eles são muitos. Tantos que a soma da energia despendida pelos seus computadores é equivalente à energia gasta pela Argentina (ou 2.5x da energia gasta por Portugal).
Pois, assim eu não vou lá. Quando eu descobrir um novo número que valide a página que eu alterei (para te roubar), já o resto da malta descobriu mais 100 ou 200 páginas à minha frente.
E há uma regra que diz que, se alguém apresentar uma folha de cálculo com mais "trabalho feito" (mais páginas válidas), então essa folha passa a ser considerada a folha de cálculo verdadeira (regra #3).
Assim sendo, eu nunca vou conseguir inserir a minha alteração na folha de cálculo, impendindo-me de te roubar e tornando o sistema seguro para todos.
Repara, a Argentina, se quisesse subverter o blockchain, teria de desligar tudo e canalizar toda essa energia para o Proof of Work. E mesmo assim não é seguro que conseguisse fazê-lo.
É isto que torna o Bitcoin censorship resistant.
Em resumo, o Bitcoin funciona com 3 regras:
1) blocos com menos de 1 MB, para que todos e qualquer um possam participar no processo de criação e validação de blocos;
2) apenas blocos válidos e com ligação ao bloco anterior são aceites;
3) a blockchain com mais PoW ganha.
Para alterar qualquer uma destas regras, e subverter o sistema, alguém teria de convencer 51% dos participantes a mudá-las. Mas com cada vez mais gente a minerar Bitcoin, é cada mais difícil, para não dizer impossível.
Ao longo desta thread deverás ter tido várias dúvidas do género: Como é que o Bruno não consegue colocar uma transacção falsa, assinada pela Ana, a dar-lhe todos os seus bitcoins? Ou, como impedir a falsificação dos papeis do lightning network?
Isso consegue-se via criptografia, um ramo da matemática que permite fazer coisas muito giras, como encriptação de dados, assinaturas digitais, smart contracts, etc.
Obviamente não vou falar sobre isso aqui, pois esta thread já vai longa.
Espero ter ajudado.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment