Março de 2018

Volume 33 – Número 3

Blockchain – Conceitos básicos do Blockchain

Por Jonathan Waldman | Março de 2018

Em 1999, a rede de compartilhamento de arquivos Napster facilitou o compartilhamento de arquivos de áudio (geralmente com conteúdo musical) em uma rede híbrida ponto a ponto (“híbrida” porque usava um servidor de diretório central). Essa rede de compartilhamento de arquivos fez mais do que simplesmente compartilhar arquivos de música: ela permitiu que todos os usuários tivessem cópias desses arquivos compartilhados, de modo que um único ativo digital resultasse em uma quantidade ilimitada de cópias perfeitas por toda uma rede global. Essa facilidade casual, que fez com que a tecnologia fosse levada a todos que tivessem um computador, pegou a respeitável Tower Records com tanta surpresa que ela foi forçada a fechar todas as suas 89 lojas físicas nos Estados Unidos até 2006.

Em 2008, ocorreu o colapso do subprime, durante o qual, antigas e poderosas instituições financeiras e agências de seguros dos Estados Unidos declararam falência ou chegaram muito próximo disso. Essas circunstâncias obrigaram o governo federal a intervir imediatamente para evitar um colapso no país e possivelmente no mundo. Esse importante evento deixou uma população desconfiada com os bancos centralizados e expôs o perigo de haver livros-razão financeiros fechados para escrutínio público. Em março de 2008, a violação de segurança dos dados do Heartland Payment Systems expôs mais de 130 milhões de números de cartão de crédito, muitos dos quais foram usados posteriormente para realizar compras fraudulentas.

Esses eventos ilustram os perigos de se viver em um mundo digital e conectado que depende de intermediários geradores de taxas de transação e deixa as pessoas vulneráveis a exploração digital, ganância e crimes. O desafio da academia passou a ser como criar uma infraestrutura digital acessível e sem intermediários, na qual um ativo digital pode ser transferido aberta e confiavelmente (em vez de ser copiado e compartilhado) de proprietário para proprietário, não tendo uma autoridade central corrompível ou falível, sendo seguro e confiável.

Entrar no blockchain do Bitcoin

Aparentemente em resposta ao contexto histórico no qual ocorreu, em 3 de janeiro de 2009, um novo tipo de infraestrutura explorou 50 moedas digitais e as registrou em um livro-razão público inviolável que replicou em uma rede ponto a ponto descentralizada de computadores conectados à internet. Essas 50 unidades de criptomoeda, chamadas de bitcoins, foram registradas como a gênese do bloqueio — o primeiro link do que viria a ser conhecido como blockchain do Bitcoin.

O mais extraordinário dessa criptomoeda impulsionada por blockchain é que ela não conta com nenhum tipo de autoridade ou governança certificadora (como um banco ou um governo) para validar cada transação. Além disso, ela retira o intermediário das transações, possibilitando a transferência da moeda digital internacionalmente usando uma rede global sem o envolvimento de um intermediário, como um agente ou uma agência. Devido à dependência na criptografia moderna, os dados do blockchain são invioláveis e pseudônimos. E como um determinado blockchain é replicado em cada nó que compõe sua rede ponto a ponto, não há um ponto único de falha, tornando a tecnologia acessível e confiável.

Desde o lançamento do Bitcoin, as tecnologias de blockchain continuam amadurecendo rapidamente. Os detalhes de implementação variam muito, tornando o estudo dos blockchains dinâmico, vasto e complexo. De fato, o termo “blockchain” não se aplica mais somente ao Bitcoin especificamente ou a criptomoedas em geral. Os blockchains estão sendo trabalhados e aperfeiçoados para trabalharem de modo mais rápido e inteligente. Na verdade, algumas tecnologias de blockchain permitem que scripts deem suporte a contratos inteligentes, permitindo que regras personalizadas sejam aplicadas a transações. Dessa forma, os blockchains se transformaram em um novo tipo de tecnologia de armazenamento programável e à prova de hackers, que é um dos motivos de profissionais de TI, empresas, instituições financeiras, entre outros, estarem clamando para aproveitar seu verdadeiro potencial.

Se você está trabalhando nas atividades paralelas do blockchain, é hora de recuperar o atraso. Neste artigo de introdução, não é possível abordar os detalhes mais específicos de nenhuma tecnologia de blockchain em especial — cada uma tem suas próprias regras, recursos e personalizações —, mas as ideias discutidas aqui vão ajudar a orientar você em relação aos principais fundamentos técnicos nos quais muitas das tecnologias modernas de blockchain se baseiam.

Como blockchains funcionam

O blockchain do Bitcoin é o primeiro exemplo prático da tecnologia de blockchain no mundo. E, por conta dessa distinção, o “blockchain” é frequentemente confundido como sinônimo de Bitcoin. Porém, as ofertas modernas de tecnologia de blockchain rastreiam outros ativos digitais que não sejam uma moeda digital, e esses blockchains trabalham de modo bem diferente do blockchain do Bitcoin. Além disso, o blockchain do Bitcoin popularizou a noção de que um blockchain é uma estrutura de dados que virtualiza um livro-razão de banco por meio do rastreio de créditos e débitos, oferecendo, ao mesmo tempo, uma solução criptográfica criativa que impede de modo eficiente o gasto duplo das unidades de criptomoeda. Por esse motivo, os termos “livro-razão digital” e “gasto duplo” ficaram associados blockchains de criptomoedas. Porém, esses termos se aplicam ampla e respectivamente ao rastreio de propriedade e reforço de uma transferência única de ativos digitais. Ao ver esses termos, não presuma que eles estão se referindo somente a tecnologias de blockchain orientadas a criptomoedas.

Na sua essência, um blockchain é uma estrutura de dados inviolável que rastreia algo de valor ou de interesse que passa de um proprietário a outro. Esse “algo” pode ser qualquer tipo de ativo digital, como uma moeda digital, um documento do Word ou o número de série de um tablet Microsoft Surface. Na verdade, qualquer item que possa ser associado a uma impressão digital única pode ser rastreado em um blockchain. Os blockchains resolveram o problema conhecido como “gasto duplo” ao requererem que a propriedade de um ativo digital fosse transferida em vez de copiada e compartilhada. Mas o que torna a tecnologia de blockchain interessante é que ela estabelece um protocolo, aplica as regras de transação e permite que os nós em sua rede distribuída de computadores autofiscalizem a operação inteira. E ela realiza esse feito notável sem a presença de um servidor central ou de uma autoridade certificadora de forma rápida e global (ou seja, internacionalmente). Isso promete animar aqueles que veem essa tecnologia como uma forma de eliminar o intermediário e reduzir ou eliminar as taxas de transação, tornando o comércio mais eficiente para empresas e consumidores.

Componentes principais do blockchain

A rede de blockchain do Bitcoin é pública — qualquer pessoa pode participar e em qualquer lugar do mundo. Além disso, novas ofertas de blockchain, como o blockchain hospedado pelo Microsoft Azure, podem ser configuradas como públicas, privadas ou permissionárias. Considera-se que os blockchains são descentralizados, mas esse termo precisa ser explicado: como Vitalik Buterin explica, (bit.ly/2tEUYyT), “blockchains descentralizados” significa que eles são “descentralizados politicamente (ninguém os controla) e arquitetonicamente (sem ponto central de falha na infraestrutura), mas eles são centralizados logicamente (há um estado comumente acordado, e o sistema se comporta como um computador único)”. A descentralização oferece tolerância a falhas, resistência a ataques e resistência à colusão (o significado deste último ficará claro quando eu falar sobre a prova de trabalho).

Compreender como construir um blockchain requer conhecimento de hashes criptográficos, criptografia de chave pública (PKC), cadeias binárias de hash (árvores de Merkel, em especial) e algoritmos de consenso. Vou analisar brevemente esses conceitos e depois vou mostrar que um blockchain é uma cadeia de hash que contém uma cadeia de hash de transações. Assim que você compreender esse conceito de cadeia de hash aninhada, entenderá o design fundamental da tecnologia do blockchain.

Hashes criptográficos Embora haja diversas variantes de algoritmos de hash criptográficos unidirecionais, uma escolha comum é alavancar o SHA-256 (bit.ly/29kkpft), uma função de hash unidirecional que aceita uma mensagem de até (264-1)/8 bytes e retorna um valor de hash de 32 bytes (64 caracteres hexadecimais) no intervalo decimal de 0 a 1,16 x 1077. Para pôr a magnitude desse número em perspectiva, uma gota de água tem cerca de 5 x 1012 átomos; estima-se que o universo observável tenha o intervalo de 1078 a 1082 átomos. O ajuste de qualquer caractere na mensagem e o recálculo do valor de hash de SHA-256 geram um valor de hash totalmente novo. (Para testar, visite onlinemd5.com e defina o tipo de soma de verificação do arquivo ou do texto como SHA-256.)

Dada a mesma entrada, o algoritmo SHA-256 sempre produz a mesma saída de comprimento fixo. Em relação às tecnologias de blockchain, a vantagem de usar os hashes criptográficos SHA-256 é que eles são tão exclusivos que servem como um tipo de impressão digital e também agem como uma soma de verificação. Além disso, as funções de hash unidirecionais não podem (como uma questão de prática) ser decodificadas. Considere o valor do SHA-256 para o meu nome: 8F12D83BA54AC0EA7687AD4AFDE5E258BBFF970AA8D60C6588381784C502CA8E. Com esse valor de hash, não há uma forma prática de usar um algoritmo para revertê-lo ao meu nome. (Uma técnica de hacking aproveita Rainbow Tables que listam valores de hash já calculados para cadeias de caracteres comuns, como “senha”, mas isso não é usar um algoritmo para reverter o hash. Para impedir essas proezas, costuma-se enfeitar a cadeia de caracteres de hash com uma cadeia de caracteres aleatória, conhecida como valor de “sal”.)

Se você não possui um gerador de SHA-256 à mão, leve em consideração a tabela da Figura 1, que mostra como cadeias de caracteres de vários comprimentos sempre produzem um valor de hash hexadecimal de 64 dígitos, e que uma pequena mudança em qualquer cadeia de caracteres produz um resultado completamente diferente.

Figura 1 Cadeia de caracteres de hash com vários comprimentos usando o algoritmo SHA-256

Cadeia de caracteres de entrada Valor do hash SHA-256
m 62C66A7A5DD70C3146618063C344E531E6D4B59E379808443CE962B3ABD63C5A
M 08F271887CE94707DA822D5263BAE19D5519CB3614E0DAEDC4C7CE5DAB7473F1
M1 2D214CA69B86C255BE416D42CCA977A59B34A7492873105522C35015FAB806F0
M2 0892A10ECE1F933EE98F5D554601B28F8437801D1AA1B77799E4035DDCB6950C
Março 9D95A2CF0D7180B5089691163B188A7203B0CDE179346B8CFAA8AB6C2C3E6414
1º de março de 2018 767328E7367048FA9DB37354CFA43DBB1691E8330DB54D54F52C1A444CA2E680
2 de março de 2018 CCF33BF1C08B74EDE6A7C15C56EEC16269D83967670032ACDA6EE395361B7595

Algumas vezes, um valor hash tem o hash duplicado, ou seja, é feito um novo hash do primeiro hash por meio de uma segunda rodada do algoritmo SHA-256. Se eu duplicar o hash na Figura 1, terei os resultados mostrados na Figura 2.

Figura 2 Hash duplicado dos valores da Figura 1

Cadeia de caracteres de entrada Duplicar o valor do hash SHA-256
m A5FCE7E78734EC317F83F9019C80FFAF2508689B06EFA02191495A7D21FECE9A
M 6F6DCF58526B0D29EE664A708A939B7CDAC124A6A8569FCACE46FEAD38868E2E
M1 6C5D08BE9FFBBABD24B5F19AFFE6590FD402D347A50B519A59D40E15DCC0A6CB
M2 B2307311CC5877D5A581EDC821F3BFD5F99EB4E3B1D1B4009D9545BCF07E2E1A
Março B5410E155022AE6EB22CA21FADEDE65F0F7296DE14CA1D7A720A4937BD23AA5D
1º de março de 2018 345DD725FEE80F8C5953A66C1495605E4ED01C4CE5AEF6C0A6D238999266A1A6
2 de março de 2018 3E85B3D910BA77F88ECD5E24D1396457C532C73B89C032DED9AD0CBB4D4D9794

Criptografia de chave pública Lembre-se de que uma das funções primordiais de um blockchain é rastrear a propriedade de um ativo digital. O ativo digital em questão pode não ter valor nenhum ou muitos milhões de dólares, de modo que o teste de propriedade deve garantir que o proprietário não possa ser logrado. Para realizar esse teste no domínio digital, os blockchains usam a PKC, o que permite ao proprietário assinar digitalmente seu ativo para provar sua propriedade e autorizar a transferência. Ao contrário da criptografia de chave simétrica, em que uma única chave privada (secreta) é usada para criptografar e depois descriptografar uma mensagem, a PKC usa a criptografia de chave assimétrica.

Como é fundamental para blockchains ter um algoritmo de validação preciso da propriedade do ativo digital, eles empregam uma estratégia de geração de par de chaves pública/privada de grande força que depende do Algoritmo de assinatura digital de curvas elípticas (ECDSA). O interessante do ECDSA é que ele cria chaves de comprimento mais curto, mas que são criptograficamente mais fortes do que as chaves de mesmo comprimento geradas pelo algoritmo usual: Autorização de assinatura digital (DSA). Sempre que necessário, os usuários acessam um aplicativo de software que usa o ECDSA para gerar o par de chaves criptográficas. O usuário deve ter um backup da chave privada, pois essa chave é necessária para transferir ou aproveitar o valor contido em um ativo digital que está armazenado em um blockchain. Caso tenha acesso apenas à chave privada de um par de chaves privada/pública, você pode regenerar a chave pública porque há uma relação matemática entre as duas. Contudo, a chave privada não pode ser gerada a partir da chave pública (o que significa que, se você fizer backup de uma única chave, deve ser a chave privada).

Essas chaves geralmente são usadas de duas maneiras. O primeiro caso de uso (veja a Figura 3) é quando você deseja que alguém lhe envie uma mensagem criptografada que só você pode abrir. Para isso, dê sua chave pública para a outra pessoa e peça que ela a use para criptografar o documento usando um software que aplique um algoritmo de criptografia e produza um texto cifrado: a versão criptografada de sua mensagem. Em seguida, ela envia a você apenas o texto cifrado. Como foi usada a sua chave pública para criptografar o documento, você deve usar a chave privada emparelhada corretamente para descriptografar a mensagem.

Usando a PKC quando você deseja que alguém envie um documento ou uma mensagem criptografada que somente você pode abrir
Figura 3 Usando a PKC quando você deseja que alguém envie um documento ou uma mensagem criptografada que somente você pode abrir

O segundo caso de uso (veja a Figura 4) é quando você deseja criptografar uma mensagem e demonstrar que ela foi realmente enviada por você. Para isso, use sua chave privada para criar um texto cifrado do seu documento. Depois, envie esse texto cifrado para outra pessoa. Ela usará sua chave pública para descriptografar a mensagem. Como somente sua chave pública pode descriptografar o documento, o destinatário pode presumir que o documento foi criptografado pela sua chave privada e, a menos que ela tenha sido usada indevidamente, o documento veio de você.

Usando a PKC quando você deseja enviar um documento ou uma mensagem criptografada a alguém para comprovar que foi realmente enviado por você
Figura 4 Usando a PKC quando você deseja enviar um documento ou uma mensagem criptografada a alguém para comprovar que foi realmente enviado por você

Um terceiro caso de uso emprega a PKC para provar a propriedade de um ativo digital por meio de um processo de assinatura digital. Neste caso de uso (veja a Figura 5), imagine que Bill criou um documento do Word com um documento juridicamente vinculativo que ele precisa enviar por e-mail para Susan. Susan quer ter certeza de que a cópia do documento que ela recebeu de Bill veio realmente dele e não foi adulterada no percurso. Primeiro, Bill cria um hash SHA-256 do documento do Word e registra o valor como H(W). Depois, ele usa sua chave privada para criptografar o hash do documento, resultando em Enc(H(W)). Ele envia o documento do Word (opcionalmente criptografado) e o valor Enc(H(W)) (essa é a assinatura digital de Bill para o documento W) para Susan.

Usando a PKC junto com um hash criptográfico para assinar digitalmente um documento ou uma mensagem
Figura 5 Usando a PKC junto com um hash criptográfico para assinar digitalmente um documento ou uma mensagem

Susan recalcula o valor H(W) da cópia do documento do Word recebida e usa a chave pública de Bill para descriptografar o valor Enc(H(W)) (veja a Figura 6). Se o hash calculado por Susan for igual ao valor H(W) descriptografado, ela pode concluir que Bill assinou o documento e que a cópia que ela recebeu é exatamente a mesma que ele assinou.

Usando a PKC junto com um hash criptográfico para verificar se um documento ou uma mensagem foi assinado pela parte esperada
Figura 6 Usando a PKC junto com um hash criptográfico para verificar se um documento ou uma mensagem foi assinado pela parte esperada

Ao usar hashing e PKC, um blockchain mantém um histórico de propriedade do ativo digital usando transações. Os objetos de dados de transação estão vinculados uns aos outros, formando uma estrutura de dados chamada de cadeia de hash. Isso funciona assim: cada registro de transação constitui a mensagem (m) que passa por hash usando a função (H), depois ela é assinada usando a chave privada (s) do proprietário. (Costuma-se usar “s”, de “segredo”, para representar a chave privada, de modo que não deve ser confundida com “p”, usada para a chave pública.) Isso produz uma assinatura (sig):

sig = signature(H(m), s)

Quando um ativo digital é transferido de um proprietário para outro, sua assinatura digital é examinada, verificada e assinada digitalmente pelo novo proprietário; em seguida, ela é registrada como um novo nó na cadeia de hash. Embora os detalhes da implementação variem bastante entre tecnologias e versões de blockchain, a ideia básica é a mesma para todos eles. Por exemplo, conforme mostrado na Figura 7, Bill é o proprietário de um ativo digital e usa sua chave privada para iniciar uma transferência desse ativo para Susan. O registro de transações de Susan usa a chave pública de Bill para verificar a assinatura dele. Depois disso, a chave pública de Susan é usada para assinar o ativo digital, tornando Susan a nova proprietária. Isso cria um novo registro de transação, um novo link na cadeia de hash da transação.

A cadeia de hash da transação usa assinaturas digitais para transferir a propriedade de um ativo digital; cada registro de transação mantém um vínculo regressivo criptográfico para a transação anterior da cadeia de hash
Figura 7 A cadeia de hash da transação usa assinaturas digitais para transferir a propriedade de um ativo digital; cada registro de transação mantém um vínculo regressivo criptográfico para a transação anterior da cadeia de hash

Essa cadeia de hash de transações é criptograficamente segura e inviolável. Qualquer alteração na Transação 0 (Transaction 0) faria com que a Assinatura 0 (Sig0) fosse alterada, e isso exigiria uma atualização do valor de hash armazenado na Transação 1 e de todas as transações subsequentes na cadeia de hash.

Os objetos de transação aqui são retratados com dados. Os dados contidos em cada transação variam para cada implementação de blockchain, por isso, devido ao nosso propósito aqui, desconsiderei os dados subjacentes, porque o principal ponto a ser entendido é que a cadeia de hash é uma cadeia de transações criptograficamente vinculada – vinculada pelo valor de hash do registro de transação anterior do proprietário. (Em blockchains de criptomoedas, cada objeto de transação contém uma lista de entradas e saídas de moeda digital, juntamente com metadados, como um carimbo de data/hora e uma taxa de transação opcional. Essas entradas e saídas da criptomoeda fornecem os detalhes de transação necessários para modelar um livro-razão com precisão.)

Árvores de Merkle Alguns blockchains agrupam transações usando outro tipo de cadeia de hash: a cadeia de hash binária, ou a árvore de Merkle. Uma árvore de Merkle completa é conhecida como uma estrutura de árvore binária, isso porque ela se ramifica duas vezes em cada nível, começando na raiz, conforme mostrado na Figura 8.

Uma árvore de Merkle é um tipo de árvore de hash binária que produz um hash da raiz de Merkle; essa estrutura de dados pode adicionar nós folha de modo eficiente e calcular uma nova raiz de Merkle sem precisar de um recálculo completo
Figura 8 Uma árvore de Merkle é um tipo de árvore de hash binária que produz um hash da raiz de Merkle; essa estrutura de dados pode adicionar nós folha de modo eficiente e calcular uma nova raiz de Merkle sem precisar de um recálculo completo

A parte trabalhosa ao configurar uma árvore de Merkle é criar uma série de nós folha calculando o hash SHA-256 para os dados contidos em cada objeto de transação (o blockchain do Bitcoin efetua hash duplo em cada nó de Merkle; o hash duplo pode ajudar a fortalecer o valor criptográfico no resultado do hash caso uma vulnerabilidade seja descoberta no algoritmo SHA-256). A árvore de Merkle requer um número par de nós folha — costuma-se duplicar o último nó folha caso comece com um número ímpar. Depois, cada par de nós folha passa junto por hash, produzindo um novo valor de hash. Na Figura 8, a Folha A (Leaf A) mostra o hash para a Transação A (Transaction A) como HA; a Folha B (Leaf B) mostra o hash para a Transação B (Transaction B) como HB e assim por diante. Esse padrão continua em cada nível da árvore até chegar ao nó raiz final. O valor de hash do nó raiz é a soma do hash criptográfico de todas as outras somas de hash na árvore. Qualquer alteração nos dados em qualquer um dos nós folha faz com que o valor recalculado de hash da raiz da árvore de Merkle seja alterado.

A estrutura binária da árvore de hash de Merkle oferece algumas vantagens. Por exemplo, ela facilita a atualização de dados dentro de uma transação e calcula um novo hash raiz de Merkle sem precisar criar toda a árvore de Merkle a partir do zero. Por exemplo, se a Transação E (Transaction E) muda (conforme destacado na Figura 8), você só precisa fazer o caminho de volta da árvore, de forma eficiente, até a raiz de Merkle, calculando novos hashes apenas uma vez para cada nível. Portanto, primeiro você calcula o novo hash da Folha (Leaf) HE; depois calcula HEF de HE e HF; depois calcula HEFGH de HEFe HGH; depois calcula um novo hash raiz de Merkle de HABCD e HEFGH. A atualização do hash da raiz de Merkle exigiu apenas quatro cálculos contra os 15 necessários para criar a árvore de Merkle a partir do zero!

Criando um blockchain

Para criar um blockchain (veja a Figura 9), o objeto de dados binário da cadeia de hash que contém transações deve, de alguma forma, estar comprometido a um armazenamento de dados inviolável que todos possam usar (lembre-se de que este é um blockchain público, e qualquer nó na rede pode lê-lo ou escrever para ele). A estrutura de árvore de Merkle contém transações e é inviolável, portanto, pareceria viável ela ser o blockchain. Mas existem vários problemas. Para que Bill possa enviar seu ativo digital para Susan, ele deve confiar no serviço ou no site da Web que atua como um agente que processará sua solicitação de transferência do ativo digital, além de também confiar no servidor que persistirá a estrutura hash. Sem um nó central para processar uma nova transação ou uma autoridade central para delegá-los para o processamento, qualquer nó poderia processar a transação pendente de Bill. Um nó não autorizado ou dominante com poder de processamento superior poderia permitir a ocorrência de transações inválidas ou fraudulentas, as quais poderiam se propagar para nós honestos. Para resolver isso, a rede poderia tentar atribuir um nó aleatoriamente para processar a transação de Bill, mas isso também centraliza o controle e requer a confiança de que o gerador de número aleatório está realmente aplicando a aleatoriedade. Para eliminar esse problema, os blockchains usam algoritmos de consenso, que são descritos a seguir.

O blockchain é composto por blocos que, por sua vez, incluem árvores hash de transação; os blocos do blockchain são vinculados de volta a blocos anteriores e são validados usando um algoritmo de prova de trabalho
Figura 9 O blockchain é composto por blocos que, pro sua vez, incluem árvores hash de transação; os blocos do blockchain são vinculados de volta a blocos anteriores e são validados usando um algoritmo de prova de trabalho

Algoritmos de consenso As tecnologias blockchain evitam o armazenamento de dados centralizado e problemas com autoridades certificadoras por meio do respeito a um protocolo que determina como os blocos são adicionados e mantidos. Para isso, eles aplicam um algoritmo de consenso de criação do blockchain. Existem diferentes tipos de algoritmos de consenso: aqui vou discutir como funciona o algoritmo de prova de trabalho (PoW).

A PoW baseia-se na ideia de que um nó na rede precisa provar suas intenções honestas incorrendo em um custo e utilizando o tempo necessário para resolver um problema de computação desafiador. Para induzir um nó a participar desse sistema e jogar de acordo com suas regras, a rede oferece um incentivo — muitas vezes dinheiro — ou seja, os operadores do nó são pagos ao adicionarem um bloco ao blockchain. Para ganhar esse dinheiro, os nós devem validar todas as transações (para garantir que elas cumprem as regras específicas do blockchain) e, depois, resolver um enigma criptográfico.

Anteriormente, mencionei que uma autoridade central poderia atribuir um nó aleatoriamente para processar um lote de novas transações. Essa abordagem exigiria um gerador central de números aleatórios, que poderia apresentar falhas, ser hackeado ou desabilitado. No entanto, ao apresentar aos nós um enigma difícil a ser resolvido, produz-se o efeito desejado: não é possível determinar antecipadamente qual nó resolverá o enigma primeiro, criando uma espécie de nó de loteria na rede. Não é necessária nenhuma autoridade central, e essa é uma das principais inovações das tecnologias de blockchain. Também mencionei que os blockchains são descentralizados e, portanto, oferecem “resistência à colusão”. Como a PoW leva tempo e custa dinheiro no poder computacional, é praticamente impossível que um único nó ou um grupo de nós conspirem na rede e obtenham uma vantagem na criação de blockchain em detrimento a outros nós pares. (Existe um risco de “ataque de 51 por cento”, que sugere que uma colusão pode ocorrer se um grupo de nós acabar tendo 51 por cento do poder computacional, mas o emprego de um algoritmo de consenso de PoW torna esse ataque inviável.)

Para construir um bloco de transações, um nó pega transações não processadas que estão armazenadas na rede e cria uma árvore de Merkle para calcular o hash da raiz de Merkle. Portanto, um bloco candidato contém uma lista de transações juntamente com um cabeçalho de bloco que inclui o valor de hash da raiz de Merkle, um carimbo de data/hora atual e um nível de dificuldade de PoW (e, às vezes, dados de cabeçalho adicionais). Assim, ele precisa resolver o enigma da PoW, o qual envolve o cálculo de um hash duplo de todo o valor de hash do bloco de 256 bits e, em seguida, encontrar um número de 32 bits, chamado nonce, que pode ser concatenado para que o hash do número resultante de 288 bits produza um resultado que tenha uma certa quantidade de zeros à esquerda. O nonce de 32 bits tem um intervalo de 0 a 232 (4.294.967.295), portanto, em vez de simplesmente tentar adivinhar o nonce, geralmente se começa com o nonce 0, gera-se o hash SHA-256 e determina-se se ele tem a quantidade esperada de zeros à esquerda (isto é, o hash resultante está abaixo do valor esperado); em caso negativo, o nó incrementa o valor do nonce e tenta novamente. Se o nó tentar todos os valores de nonce sem resolver o enigma, ele recalcula o valor de hash do bloco. Isso garante a produção de um valor de hash de bloco diferente, uma vez que um carimbo de data/hora no cabeçalho do bloco está incluído no cálculo do hash do bloco. A qualquer momento, um nó pode selecionar um lote diferente de transações pendentes para incluir no novo bloco (ou adicionar novas transações pendentes que possam ter surgido desde a última verificação), e isso altera o valor do hash da raiz de Merkle, que, juntamente com o carimbo de data/hora, muda o valor de hash do bloco recém-calculado. Cada vez que o hash do bloco é recalculado, o nó itera todos os mais de 4 bilhões de nonces novamente.

Com o tempo, algum nó da rede resolverá o enigma criptográfico. Quando isso acontecer, ele adicionará o novo bloco ao final da sua cópia do blockchain (cada nó mantém uma cópia do blockchain) e, em seguida, transmite o novo bloco para todos os outros nós na rede para que eles possam atualizar sua cópia do blockchain. Quando um nó transmite um novo bloco, outros nós não confiam simplesmente que o novo bloco seja válido, então fazem a comprovação validando o bloco. Para isso, um nó simplesmente verifica a solução do enigma da PoW calculando o hash SHA-256 do bloco concatenado com o valor do nonce e verifica se a resposta produz um hash que tenha a quantidade de zeros à esquerda especificada pelo valor de dificuldade da PoW do bloco.

A propósito, em alguns blockchains, o valor de dificuldade da PoW é continuamente ajustado pelo protocolo para que novos blocos sejam adicionados ao blockchain em um intervalo de tempo prescrito. Esse ajuste contínuo é necessário porque os nós estão constantemente aparecendo e desaparecendo da rede e, portanto, o poder computacional médio dos nós está sempre mudando. Lembre-se de que, na PoW, há um incentivo para adicionar blocos ao blockchain, de modo que os administradores de nó muitas vezes reforçam seu hardware para competir por um prêmio. No blockchain do Bitcoin, o valor de dificuldade é ajustado a cada 2016 blocos, de modo que os blocos continuem a ser adicionados a uma taxa média de 10 minutos por bloco.

Às vezes, ocorrem ramificações. Isso ocorre porque, em uma grande rede, a propagação de novos blocos leva tempo. É possível que, durante a propagação, outro nó resolva seu enigma da PoW, adicione um novo bloco à sua cópia do blockchain e transmita esse blockchain na rede. Os nós receptores sempre adicionarão um bloco válido à sua cópia do blockchain e, como cada bloco está criptograficamente ligado ao bloco anterior, dois novos blocos publicados por dois nós diferentes resultarão em uma ramificação ligada ao mesmo bloco no final da cadeia. Mas não tem problema. Com o tempo, os nós adicionarão novos blocos ao final do que o protocolo considera ser a “cadeia mais longa”. Por exemplo, em uma determinada ramificação, a cadeia mais longa pode ser definida como aquela com o carimbo de data/hora mais recente do bloco. Ao longo do tempo, uma única ramificação prevalecerá em comprimento, e os blocos de ramificações abandonadas (mais curtas) serão removidos, retornando suas transações para o conjunto de transações não processadas.

Conclusão

Neste artigo, mostrei como criar um blockchain público composto por blocos criptograficamente vinculados — cada um deles contém sua própria cadeia de hash de transações criptograficamente ligadas — em uma rede ponto a ponto descentralizada de nós. Eu cobri os fundamentos das tecnologias de blockchain, tentando não me concentrar em uma única implementação, mas em alguns dos recursos técnicos mais comuns que todos compartilham. Se quiser explorar ainda mais o assunto, sugiro escolher uma tecnologia de blockchain específica, como Bitcoin, Ethereum ou Ripple, e tentar dominar os detalhes de sua implementação específica. Se quiser testar blockchains por conta própria, veja as ofertas de blocos hospedados pelo Azure em bit.ly/2Gj2zaC.


Jonathan Waldman  é um profissional certificado pela Microsoft que tem trabalhado com tecnologias da Microsoft desde o princípio e é especializado em ergonomia de software. Waldman é membro da equipe técnica da Pluralsight e atualmente lidera projetos de desenvolvimento de software nos setores institucional e privado. Você pode entrar em contato com ele pelo email jonathan.waldman@live.com.

 Agradecemos aos seguintes especialistas técnicos da Microsoft pela revisão deste artigo: James McCaffrey


Discuta esse artigo no fórum do MSDN Magazine