Ataque de 51%
Reescrever a blockchain construindo uma cadeia mais longa
Um ataque de 51% se refere ao ato de construir intencionalmente uma nova cadeia mais longa de blocos para substituir blocos já na blockchain. Isso permite substituir transações que já foram mineradas na blockchain.
Esse tipo de ataque é mais fácil de realizar quando você tem a maioria do poder de mineração, e é por isso que é chamado de "ataque da maioria" ou "ataque de 51%".
Método
Como funciona um ataque de 51%?
Os nós sempre aceitam a cadeia conhecida mais longa de blocos como a versão válida da blockchain. Então, se você quer "desfazer" uma transação da blockchain, basta construir uma nova cadeia de blocos mais longa sem aquela transação nela.
Quando os nós recebem essa nova cadeia mais longa de blocos, eles fazem uma reorganização da cadeia para desativar os blocos da antiga cadeia mais longa e ativar os blocos da nova cadeia mais longa que você construiu.
Assim, ao construir uma nova cadeia mais longa para substituir uma existente, você efetivamente reescreve a blockchain e cria um novo histórico de transações que todo nó da rede vai adotar. Como resultado, você reverteu transações que antes pensávamos serem parte permanente da blockchain.
Mas realizar um ataque de 51% com sucesso não é fácil.
Você iria querer incluir uma transação substituta na nova cadeia para enviar os bitcoins a um novo destino (ex.: ao seu endereço, e não ao vendedor do carro). Caso contrário, a transação original poderia ser re-minerada na nova cadeia.
Prevenção
O que impede um ataque de 51%?
Todo minerador é incentivado a construir sobre a cadeia mais longa atual de blocos. Então, se o poder de mineração combinado de todos os outros mineradores da rede for maior que o seu, fica incrivelmente difícil superar os outros mineradores para construir uma cadeia mais longa e substituir a existente.
Mas, claro, se você conseguir adquirir mais poder de mineração do que todos os outros mineradores combinados, então você tem a capacidade de ultrapassar a cadeia mais longa atual e construir uma nova cadeia mais longa para todos os outros adotarem.
Então, para ajudar a impedir que isso aconteça, queremos tornar difícil que um único minerador adquira a maioria do poder de mineração. Isso é alcançado permitindo que qualquer pessoa no mundo minere e oferecendo uma recompensa de bloco como incentivo para construir na cadeia conhecida mais longa.
Como resultado, os mineradores concentram sua energia em construir a mesma cadeia, tornando difícil (ou ao menos muito caro) que qualquer indivíduo tente reescrever os blocos da blockchain.
Enquanto a maioria do poder de CPU for controlada por nós que não estão cooperando para atacar a rede, eles gerarão a cadeia mais longa e superarão os atacantes.
Praticidade
Quão difícil é realizar um ataque de 51%?
A parte mais complicada de realizar um ataque de 51% seria conseguir, em primeiro lugar, todo o hardware necessário para realizar o ataque, pois isso seria incrivelmente caro.
Porém, se você conseguisse adquirir a maioria do poder de mineração, seria só uma questão de tempo até construir uma nova cadeia mais longa.
Dito isso, é preciso mais trabalho para substituir um número maior de blocos do que apenas alguns. Então, quanto mais fundo uma transação chega na blockchain, mais tempo e energia são necessários para revertê-la.
Mas, de novo, isso supõe que você consiga o hardware para atingir 51% ou mais do poder de mineração e superar todos os outros mineradores.
Mesmo assim, você ainda pode tentar realizar esse tipo de ataque com menos de 50% do poder de mineração, mas as probabilidades estão muito contra você…
Probabilidade
Você consegue reescrever a blockchain com menos de 50% do poder?
É possível reescrever a blockchain sem a maioria do poder de mineração, mas você vai precisar de sorte.
A mineração é imprevisível, então, mesmo com pouco poder de mineração, nada impede você de ter sorte e minerar os próximos 2 blocos seguidos. É improvável, mas não impossível. A probabilidade depende de quanto poder de mineração você tem em relação a todos os outros.
Claro, quanto mais fundo uma transação está na blockchain, mais sorte você vai precisar para minerar X blocos seguidos. Se ninguém tem a maioria do poder de mineração, fica exponencialmente mais difícil substituir uma transação quanto mais fundo ela chega na blockchain.
Então, a menos que você tenha uma proporção significativa do poder de mineração total da rede bitcoin, suas chances de substituir uma transação minerada são pequenas, e essas chances diminuem rapidamente conforme a transação avança na cadeia.
Aqui está uma tabela com as suas probabilidades exatas:
| Blocos | 50%+ de controle | 40% de controle | 30% de controle | 20% de controle | 10% de controle |
|---|---|---|---|---|---|
| 1 | 100% | 73,6% | 44,6% | 20,4% | 5,1% |
| 2 | 100% | 66,4% | 32,5% | 10,3% | 1,3% |
| 3 | 100% | 60,3% | 23,9% | 5,3% | 0,4% |
| 4 | 100% | 55,0% | 17,7% | 2,7% | 0,1% |
| 5 | 100% | 50,4% | 13,2% | 1,4% | 0,02% |
| 6 | 100% | 46,2% | 9,9% | 0,7% | 0,006% |
| 7 | 100% | 42,5% | 7,4% | 0,4% | 0,001% |
| 8 | 100% | 39,1% | 5,6% | 0,2% | 0,0004% |
| 9 | 100% | 36,0% | 4,2% | 0,1% | 0,0001% |
| 10 | 100% | 33,2% | 3,1% | 0,06% | 0,00003% |
Os números da tabela acima supõem que você tenta substituir blocos construindo uma cadeia alternativa um bloco mais longa que a cadeia mais longa atual.
Equação
A probabilidade de conseguir reescrever blocos na blockchain é uma função de quanto poder de mineração você tem e quantos blocos você quer tentar substituir.
Aqui está a equação do Whitepaper do Bitcoin (Seção 11):
De qualquer forma, é assim que essa equação fica em código Ruby:
# p = probabilidade de um nó honesto encontrar o próximo bloco
# q = probabilidade de o atacante encontrar o próximo bloco
# z = número de blocos a recuperar
def attacker_success_probability(q, z)
p = 1 - q
lambda = z * (q / p) # número esperado de ocorrências na distribuição de Poisson
sum = 1.0
for k in 0..z
poisson = Math.exp(-lambda) # exp() eleva e (logaritmo natural) a um número
for i in 1..k
poisson *= lambda / i
puts poisson
end
sum -= poisson * (1 - (q/p)**(z-k) )
end
return sum
end
# Exemplo
puts attacker_success_probability(0.4, 5) #=> 0.5506251290702077 A equação acima calcula a probabilidade de alcançar a cadeia mais longa (estando um número específico de blocos atrás). Se você quer substituir blocos na cadeia, precisa ir um bloco mais longe.
Gráfico
Perguntas Frequentes
Alguém já realizou um ataque de 51% no Bitcoin com sucesso?
Não, ainda não.
Alguns mineradores chegaram perto de 50% ou mais do poder total de mineração ao longo da história do Bitcoin, mas ninguém realizou de fato um ataque de 51% bem-sucedido.
O caso mais famoso foi o da GHash.io, que em 2014 chegou perto de 50% do poder de mineração, acendendo um alerta na comunidade. Desde então, o poder de mineração se distribuiu entre vários pools, e hoje nenhum deles isolado chega perto desse limite. O paralelo abaixo mostra essa evolução da descentralização da mineração:
github.com/in3rsha/bitcoin-mining-distribution
mempool.space/mining
Mesmo que um minerador passe de 50% do poder de mineração, isso não significa necessariamente que vá realizar um ataque; significa só que ele pode. Aliás, com tanto poder, provavelmente é mais lucrativo continuar minerando blocos e coletando recompensas de bloco do que reverter uma única transação (e afundar o valor do bitcoin por causa do seu ataque).
Quanto poder de hash eu preciso para um ataque de 51%?
Você pode usar o valor de alvo atual para estimar quanto poder de hash precisaria para obter o controle da maioria.
O alvo sobe e desce conforme a rapidez com que todos os mineradores da rede conseguem minerar novos blocos. Podemos, portanto, usá-lo para descobrir quão rápido precisamos fazer hash para superar a velocidade atual da rede.
1. Obtenha o alvo atual
Primeiro, podemos obter o alvo atual olhando o campo "bits" dentro do cabeçalho do bloco minerado mais recentemente.
$ bitcoin-cli getblockcount
953548
$ bitcoin-cli getblockhash 953548
0000000000000000000109034ee4e258865d51a6a37f9de255a9534f04dab40b
$ bitcoin-cli getblockheader 0000000000000000000109034ee4e258865d51a6a37f9de255a9534f04dab40b | grep bits
"bits": "1702068f", Agora, esse valor de "bits" é apenas o alvo em formato compacto. Então, convertendo de bits para alvo, temos:
0x00000000000000000002068f0000000000000000000000000000000000000000
Bits do Alvo
E esse é o número abaixo do qual todos os mineradores precisam obter um hash de bloco para minerar um bloco.
2. Calcule o número médio de hashes necessários para minerar o próximo bloco
Podemos calcular quantos hashes precisaríamos realizar (em média) para ficar abaixo desse valor de alvo dividindo a faixa de todos os resultados de hash possíveis pelo alvo:
hashes = (2**256) / 0x00000000000000000002068f0000000000000000000000000000000000000000
hashes = 596817820688841040723968 Isso nos diz que precisamos fazer 596817820688841040723968 hashes em média para minerar o próximo bloco.
Ou, em outras palavras, esse é aproximadamente o número combinado de hashes que todos os mineradores da rede estão realizando a cada 10 minutos.
Veja a explicação do cálculo do chainwork para mais informações sobre como obtemos esse "número esperado de hashes".
3. Converta para hashes por segundo
De qualquer forma, usando esse número podemos calcular os hashes por segundo da rede:
hashes por segundo = 596817820688841040723968 / 600 # há 600 segundos em 10 minutos
hashes por segundo = 994696367814735036416 Então, a taxa de hash combinada atual de todos os mineradores da rede bitcoin é de 994696367814735036416 hashes/seg.
Convertendo isso para TH/s (terahashes por segundo), temos:
terahashes por segundo = 994696367814735036416 / 10**12
terahashes por segundo = 994696367 Portanto, para adquirir 50% de controle sobre a mineração de blocos, precisaríamos construir uma fazenda de mineração capaz de realizar mais de 994.696.367 TH/s.
Recursos
- Hashrate Distribution Chart — Gráfico de pizza útil mostrando a distribuição de mineração do bitcoin. O Mining Centralization Index chart também é interessante.
- Coin Dance - Latest Blocks — Outro site mostrando um gráfico de pizza da distribuição atual de mineração do bitcoin. Quanto mais distribuída, melhor.