Cadeia Mais Longa
A versão da blockchain que os nós aceitam como válida
A cadeia mais longa é o que os nós Bitcoin aceitam como a versão válida da blockchain.
A regra da cadeia mais longa permite que todos os nós da rede concordem sobre como a blockchain se parece e, portanto, concordem sobre o mesmo histórico de transações.
Em outras palavras, isso significa que computadores agindo de forma independente em uma rede conseguem manter a mesma visão de um arquivo atualizado globalmente.
A cadeia de prova de trabalho é a solução para o problema de sincronização, e para saber qual é a visão globalmente compartilhada sem ter que confiar em ninguém.
Definição
O que é a cadeia mais longa?
A cadeia mais longa é a cadeia de blocos que exigiu mais esforço para ser construída.
Em resumo, para adicionar um novo bloco à blockchain, você precisa usar poder de processamento, o que significa que cada bloco na blockchain exige uma certa quantidade de energia para chegar lá.
Portanto, uma blockchain com mais blocos terá exigido mais energia para ser construída do que uma cadeia com menos blocos, e, como regra, os nós sempre adotam essa cadeia em vez de uma "mais curta".
Como resultado, os nós sempre adotam a cadeia que exigiu mais energia para ser construída, e é isso que queremos dizer quando nos referimos à "cadeia mais longa".
A decisão da maioria é representada pela cadeia mais longa, que tem o maior esforço de prova de trabalho investido nela.
Equívoco
A cadeia mais longa é a que tem mais blocos?
Você poderia pensar que a cadeia mais longa é simplesmente a que tem mais blocos, mas a cadeia que exigiu mais energia para ser construída não é necessariamente a que tem mais blocos.
Isso porque mudanças na dificuldade significam que alguns blocos exigem mais energia para serem minerados do que outros.
Por exemplo, dentro do mesmo período de dificuldade, cada novo bloco exige a mesma quantidade de esforço para ser minerado e, portanto, adiciona a mesma quantidade de "trabalho" à cadeia:
Porém, se a dificuldade aumenta (porque os blocos foram minerados mais rápido que 10 minutos em média), os blocos do novo período de dificuldade vão exigir mais esforço para serem minerados:
Agora, como os nós adotam a cadeia com mais trabalho, eles não adotariam uma cadeia com mais blocos se ela não exigisse tanto trabalho para ser construída.
Por exemplo, se você construir duas blockchains diferentes abrangendo vários períodos de dificuldade, os nós adotam a que tem mais "chainwork" cumulativo, e não simplesmente a que tem mais blocos:
Então, em resumo, a frase "cadeia mais longa" se refere à blockchain que exigiu mais energia para ser construída. Na maior parte das vezes é a cadeia com mais blocos, mas, para ser mais preciso, é a cadeia com mais trabalho.
Na primeira versão do Bitcoin, o Satoshi usava o número de blocos como métrica para determinar a cadeia mais longa, acreditando que essa seria a cadeia que exigiu mais trabalho. Porém, isso é vulnerável a manipulação, então foi depois alterado para usar o chainwork como métrica.
Chainwork
Como você calcula a cadeia mais longa?
A cadeia mais longa é medida por uma métrica chamada "chainwork".
[Chainwork] é o número total de hashes que se espera terem sido necessários para produzir a cadeia atual.
Para calcular o chainwork, você só precisa calcular quantos hashes você precisaria ter feito para minerar cada bloco da cadeia, e então somá-los.
Cálculo
O processo de mineração envolve fazer o hash de um cabeçalho de bloco.
Cada vez que você faz um hash, a função de hash cospe um número de 256 bits, que pode ser qualquer número de 0 até:
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff Para minerar esse bloco com sucesso na blockchain, esse resultado de hash precisa ser menor ou igual ao valor alvo daquela altura específica na cadeia. O alvo do primeiro bloco foi definido como:
0x00000000ffff0000000000000000000000000000000000000000000000000000 Então, para calcular quantos hashes você precisaria fazer (em média) para ficar abaixo desse valor, você divide o intervalo máximo de números pelo número que quer ficar abaixo.
intervalo = 2^256
abaixo = 0x00000000ffff0000000000000000000000000000000000000000000000000000 + 1
hashes = intervalo / abaixo
hashes = 0x0100010001 Isso significa que você precisaria fazer 0x0100010001 (4295032833) hashes em média para obter um resultado abaixo desse valor de alvo. Portanto, esse foi o chainwork real do primeiro bloco.
Então, para calcular o chainwork total de uma cadeia, você só calcula os hashes esperados de cada bloco e soma todos.
Você pode descobrir qual era o alvo de cada bloco olhando o campo bits no cabeçalho do bloco.
Hashes médios explicados
Digamos que você está gerando números aleatórios entre 1 e 100, e espera gerar aleatoriamente um número de 5 ou menos. Em média, quantos números você precisaria gerar antes de obter um abaixo do seu alvo?
100 / 5 = 20 Então, em média, você precisará gerar 20 números para obter um que seja menor que 5.
É exatamente o mesmo tipo de cálculo que acontece no Bitcoin, só que com números maiores (e geralmente calculados usando valores hexadecimais).
Exemplo
Para dar um exemplo rápido de como o chainwork é calculado, vamos calcular o chainwork até o quarto bloco da blockchain.
O alvo não se ajustou nos primeiros 2016 blocos, então o número médio de hashes necessário para minerar cada um desses 4 primeiros blocos será o mesmo:
Bloco 0
Alvo: 0x00000000ffff0000000000000000000000000000000000000000000000000000
Hashes médios: 2**256 / (Alvo + 1) = 4295032833
Bloco 1
Alvo: 0x00000000ffff0000000000000000000000000000000000000000000000000000
Hashes médios: 2**256 / (Alvo + 1) = 4295032833
Bloco 2
Alvo: 0x00000000ffff0000000000000000000000000000000000000000000000000000
Hashes médios: 2**256 / (Alvo + 1) = 4295032833
Bloco 3
Alvo: 0x00000000ffff0000000000000000000000000000000000000000000000000000
Hashes médios: 2**256 / (Alvo + 1) = 4295032833 O chainwork total será a soma do número médio de hashes para minerar cada um desses blocos:
Chainwork Total
= 4295032833 + 4295032833 + 4295032833 + 4295032833
= 17180131332
= 0x400040004 Podemos verificar que o nosso cálculo está correto usando o bitcoin-cli:
bitcoin-cli getblockhash 3
0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449
bitcoin-cli getblock 0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449
{
...
"chainwork": "0000000000000000000000000000000000000000000000000000000400040004",
...
} Propósito
Por que os nós adotam a cadeia mais longa?
Fazer com que os nós adotem a cadeia mais longa disponível permite que computadores em uma rede concordem sobre a mesma versão da blockchain.
Aqui estão duas situações em que isso se mostra útil:
1. Resolver discordâncias quando dois blocos são minerados ao mesmo tempo.
Como o bitcoin opera em uma rede, é possível que dois computadores independentes minerem um bloco ao mesmo tempo. Nessa situação, os nós da rede acabam em desacordo sobre qual desses dois blocos deve estar no topo da blockchain.
Porém, essa situação pode ser resolvida fazendo com que os nós adotem a cadeia mais longa de blocos. Isso porque o próximo bloco a ser minerado será construído sobre um desses dois blocos, criando uma nova cadeia mais longa que todos os nós da rede aceitarão de bom grado.
Então, mesmo que os nós possam estar em desacordo a qualquer momento (devido à imprevisibilidade da mineração e à velocidade de transmissão dos dados por uma rede), adotar a cadeia mais longa disponível faz com que os nós sempre acabem concordando sobre a mesma visão da blockchain.
2. Proteger blocos já minerados na blockchain.
O fato de os nós sempre adotarem a cadeia mais longa como a versão válida da blockchain significa que é muito difícil substituir blocos (e, portanto, transações) já na cadeia.
Se alguém quisesse substituir uma transação na blockchain, precisaria trabalhar para construir uma nova cadeia mais longa para substituir a atual.
No entanto, se a maioria dos mineradores trabalha continuamente para estender a mesma cadeia mais longa atual, um minerador individual não conseguirá competir para superar o esforço combinado de todos os outros mineradores.
Como resultado, o esforço combinado dos mineradores coordenando-se para estender a mesma cadeia protege os blocos e transações existentes de serem substituídos por um único minerador.
Pense nisso como um esforço cooperativo para fazer uma cadeia.
Perguntas Frequentes
Por que os mineradores escolhem construir na cadeia mais longa?
Porque um minerador pode reivindicar uma recompensa de bloco se conseguir minerar um bloco.
Porém, os bitcoins dessa recompensa de bloco só podem ser gastos se o bloco ficar 100 blocos de profundidade na cadeia mais longa. Portanto, essa recompensa de bloco incentiva os mineradores a sempre tentarem minerar novos blocos que se tornem parte da cadeia mais longa (sempre tentando construir sobre a mais longa atual).
Os mineradores reivindicam inicialmente a recompensa de bloco através da transação coinbase.
O que acontece com transações que não fazem parte da cadeia mais longa?
Uma transação dentro de um bloco que não faz parte da cadeia mais longa é inválida.
Se você tentar gastar as saídas de uma transação que não está na cadeia mais longa, os nós não aceitariam essa nova transação nem tentariam minerá-la em um bloco. Isso porque os nós só consideram a cadeia mais longa como o histórico válido de transações, e qualquer coisa fora dela não é uma transação válida.
Então, apenas as transações dentro da cadeia mais longa são consideradas parte do histórico válido de transações, e quaisquer transações fora dela efetivamente nunca aconteceram.
Recomendo que você espere uma transação chegar a 2 ou mais blocos de profundidade na blockchain antes de considerar os bitcoins como "seus". Há sempre uma chance de os blocos mais ao topo da blockchain mudarem devido a uma reorganização da cadeia, tornando inválidos blocos e transações que antes eram válidos.
Comandos
Como ver o chainwork de um nó?
Você pode descobrir os valores de chainwork por conta própria usando estes comandos do bitcoin-cli:
bitcoin-cli getblockchaininfo
Veja o chainwork total da cadeia mais longa atual.
$ bitcoin-cli getblockchaininfo
{
"chain": "main",
"blocks": 599501,
"headers": 599767,
"bestblockhash": "0000000000000000000cb6141c8076e24f3a1799eef37201634ef392197668f3",
"difficulty": 13008091666971.9,
...
"chainwork": "0000000000000000000000000000000000000000094b1874d991d4e1fc51005a",
...
} bitcoin-cli getblock [hash do bloco]
Veja o chainwork de qualquer bloco da cadeia.
$ bitcoin-cli getblock 00000000b8980ec1fe96bc1b4425788ddc88dd36699521a448ebca2020b38699
{
"hash": "00000000b8980ec1fe96bc1b4425788ddc88dd36699521a448ebca2020b38699",
...
"height": 12345,
...
"bits": "1d00ffff",
"difficulty": 1,
"chainwork": "0000000000000000000000000000000000000000000000000000303a303a303a",
...
} Resumo
Por que isso importa?
A adoção da cadeia mais longa de blocos permite que os nós de uma rede de computadores compartilhem uma visão globalmente aceita da blockchain. Além disso, o fato de exigir energia para adicionar novos blocos à cadeia torna muito difícil para qualquer indivíduo substituir blocos que já foram minerados na cadeia.
A "cadeia mais longa" geralmente se refere à cadeia com o maior número de blocos consecutivos, mas, tecnicamente, refere-se à cadeia que tem mais trabalho investido nela, com base em quão difícil foi minerar cada bloco.
Recursos
- O que significa o termo "cadeia mais longa"?
- chain.cpp — onde o chainwork é calculado no Bitcoin Core.