A única forma de confirmar a inexistência de uma transação, é estar ciente de todas as transações [1]. No modelo baseado em banco central, este estava ciente de todas as transações e decidia qual tinha primazia.
[1] Este é um conceito central do Bitcoin: os clientes completos fazem download de *todo* o histórico de *todas* as transações já realizadas. A redundância massiva deste histórico, copiado em milhões de computadores mundo afora, é uma das garantias.
Este esquema permite inclusive que um participante receba um pagamento sem nunca ter conectado na rede. Quando (ou se) o novo dono da moeda ingressar na rede, obterá todo o histórico e localizará as transações que lhe dizem respeito.
Para obter o mesmo sem um intermediário confiável, as transações precisam ser anunciadas publicamente, e precisamos de um sistema em que os participantes concordem com um único histórico de transações ordenadas [1]. O recebedor precisa de uma prova que, no momento de cada transação, a maioria dos participantes concorda que ela foi a primeira a ser recebida.
[1] Garantir a ordem das transações é importante pois é como o sistema sabe quando um participante recebeu um pagamento, e se ainda está de posse das moedas digitais.
A solução que propomos começa com um servidor de carimbo de data/hora. Um servidor de carimbo funciona obtendo um hash de um bloco de itens [1] a ser carimbado, e divulgando amplamente este hash, talvez num jornal [2] ou num post da Usenet.
[1] Mais à frente, veremos que o bloco de itens é na verdade um bloco de transações. O "hash" é um código que representa o bloco inteiro, para alguns efeitos práticos.
[2] Tem aquele velho truque de fotografar ou deixar-se fotografar segurando um jornal do dia. Não é um "timestamp" perfeito mas fornece evidência de quando a fotografia foi feita. Mais eficiente é conseguir que o jornal emita uma nota ou artigo sobre determinado tema, caso em que a coleção do jornal assume o papel de intermediário confiável.
O carimbo prova que os dados obrigatoriamente existiam no momento da publicação, obviamente para calcular-se o hash.
[1] Vemos que neste caso o carimbo de data/hora realmente não usa a hora civil. O objetivo deste esquema é produzir uma linha do tempo imutável, não importando se o tempo civil decorrido entre dois blocos foi dez segundos ou dez anos.
Para implementar um serviço de carimbo de forma distribuída peer-to-peer, precisamos usar um sistema de prova de trabalho, similar ao HashCash [1] de Adam Back, em lugar do jornal ou post Usenet.
[1] HashCash não é moeda digital. É um sistema que emprega prova de trabalho para filtrar spam, consumindo um segundo de CPU por e-mail. Isto é um custo razoável para quem manda algumas dezenas de e-mails por dia, mas (em tese) é insuportável para quem manda milhões ou bilhões de spams.
A prova de trabalho envolve procurar por um bloco, cujo hash comece com um certo número de zeros [1]. Na média, o trabalho exigido para encontrar um hash assim aumenta exponencialmente com o número requerido de zeros.
[1] O valor do "hash" é imprevisível. Para obter um "hash" no valor desejado, o único jeito é tentar diferentes códigos até topar com um "hash" bom.
Já a verificação da validade do hash é rápida, sendo levada a cabo calculando-se o hash apenas uma vez.
Para nossa rede de carimbo, nós implementamos a prova de trabalho incrementando um número mágico [1] pertencente ao bloco, até que um dado número mágico faça o hash do bloco resultar com a qualidade exigida (começando com zeros).
[1] Um "número mágico" é um número que só tem significado especial no contexto onde ele é utilizado. Neste caso, o número mágico do bloco é aquele que vai permitir "fechar" o bloco. Cada bloco tem um número mágico diferente (a chance de coincidência é minúscula) e só se pode descobrí-lo por tentativa e erro.
A prova de trabalho também resolve o problema de determinar a representação na tomada de decisão por maioria. Se a maioria fosse baseada em "um endereço IP, um voto" ela seria facilmente subvertida por qualquer um que pudesse obter muitos endereços IP.
Prova de trabalho é essencialmente "uma CPU, um voto". A decisão majoritária é representada pela cadeia mais longa, que demanda o maior volume de trabalho investido nela [1]. Se uma maioria de poder de processamento é controlada pelos participantes honestos, a cadeia legítima crescerá mais rápido e ultrapassará todas as cadeias concorrentes.
[1] Como a busca pelo "número mágico" do bloco é um processo de tentativa e erro, ele é totalmente paralelizável. Se um atacante possuir um supercomputador equivalente a 1000 PCs, basta haver 1001 participantes honestos, cada um com seu PC doméstico, para formar maioria. Neste caso, não há vantagem no fato do poder de processamento estar concentrado.
Para modificar um bloco pretérito, um participante desonesto teria de refazer todo o trabalho sobre o bloco, bem como sobre todos os blocos sucessores, e então alcançar e ultrapassar os competidores honestos.
Para compensar a crescente velocidade dos computadores e o interesse variável dos participantes ao longo do tempo, a dificuldade da prova de trabalho é dinâmica, sendo determinada por uma média móvel cujo alvo é um certo número de blocos por hora. Se os blocos estão sendo gerados depressa demais, a dificuldade aumenta [1].
[1] A dificuldade do Bitcoin é atualizada aproximadamente a cada duas semanas, de modo que em média um bloco seja fechado a cada dez minutos. Conforme veremos, este ritmo regula tanto a confirmação das transações quanto a geração de novas moedas.
Na verdade, a atualização acontece após 2016 blocos gerados, o que dá duas semanas se o ritmo de geração for exatamente 10 minutos por bloco.
Cada participante trabalha no problema difícil de encontrar o hash de prova de trabalho para o bloco [2].
Quando um participante encontra o hash de prova de trabalho, ele difunde o bloco para os demais participantes.
Os outros participantes apenas aceitam o novo bloco, se todas as transações contidas nele são válidas, e não sejam encontráveis em outros blocos [3].
Os participantes expressam aceitação do novo bloco iniciando o trabalho num próximo bloco da cadeia, usando o hash do bloco aceito como o hash anterior.
[2] Hoje em dia a dificuldade de fechar o bloco é tão grande que apenas "pools" de mineração e participantes que possuem computadores especialmente construídos para a tarefa (ASICs) têm feito este trabalho. Fazer isso num computador doméstico seria perda de tempo.
Os participantes sempre consideram a cadeia mais longa como a correta, e trabalharão para estendê-la. Se dois participantes difundem diferentes versões de um novo bloco [1] simultaneamente, é imprevisível qual versão será recebida primeiro pelos demais.
[1] É perfeitamente possível que isto aconteça de forma "honesta". Dois participantes podem encontrar diferentes números mágicos e diferentes "hashes", ambos preenchendo o requisito de começar com vários zeros. Os parágrafos seguintes esclarecem como o conflito é resolvido.
Neste caso, eles começam a trabalhar imediatamente sobre o primeiro bloco que recebem, mas salvam as demais versões para o caso de uma delas passar a integrar a cadeia mais longa [1].
[1] O artigo não menciona o fato de que o comprimento total dos blocos (em transações), não apenas a contagem de blocos, é levada em conta nesta métrica. Isto evita que um atacante crie rapidamente uma cadeia longa composta de blocos minúsculos, mais fáceis de "fechar".
O conflito é resolvido quando a próxima prova de trabalho é resolvida e uma das possíveis cadeias torna-se mais longa. Os participantes que estavam trabalhando para alongar as outras versões, desistem e passam a trabalhar na nova cadeia mais longa.
A difusão de novas transações não precisa necessariamente atingir todos os participantes. Desde que muitos participantes sejam atingidos, as transações acabarão incluídas em algum bloco novo [1].
[1] Quando um candidato a bloco é desprezado, as transações que estavam nele e porventura não estejam também no bloco definitivo, voltam ao estado pendente e entram no próximo bloco.
A difusão de novos blocos também é tolerante a perdas. Se um participante não receber um bloco, ele terá de requisitá-lo quando receber um bloco subseqüente e descobrir que não possui um elo da cadeia.
Por convenção, a primeira transação de um bloco é uma transação especial que cria uma nova moeda digital, cujo dono é o criador do bloco [1]. Isto cria um incentivo para os participantes suportarem a rede, e proporciona um caminho para a distribuição inicial de novas moedas à circulação, já que não há autoridade central para cunhá-las.
[1] Este é o "pulo do gato" do Bitcoin: o trabalho despendido em autenticar transações é exatamente o que conta para "minerar" novas moedas. Isto refuta parcialmente o argumento que minerar Bitcoins é desperdício de recursos. (Já a energia elétrica consumida pelos bancos convencionais não gera nenhum subproduto útil. Não pude resistir à tentação de um argumento político besta...)
A adição contínua de um volume constante [1] de novas moedas é análoga à mineração do ouro, que despende recursos para colocar mais ouro em circulação [2]. No nosso caso, os recursos despendidos são poder de processamento (CPUs, equipamentos) e eletricidade.
[1] Lembrando que a dificuldade de fechar o bloco é regulada de forma que, em média, um novo bloco é encontrado a cada dez minutos.
[2] O Bitcoin especifica uma remuneração decrescente por bloco, de modo que o total de moedas cresce assintoticamente, nunca ultrapassando 21 milhões. Por outro lado, o ouro fica progressivamente mais difícil de encontrar e obviamente existe um volume total de ouro na crosta terrestre, mas ninguém sabe exatamente quanto.
O incentivo também pode ser financiado por taxas de transação. Se o valor de saída da transação for menor que o valor de entrada, a diferença é uma taxa de transação que é adicionada ao valor de incentivo do bloco que contém a transação.