Uma Merkle Tree é um método de estruturação de dados que permite que um grande conjunto de informações seja verificado quanto à precisão de forma extremamente rápida e eficiente. Cada árvore Merkle resulta em uma única sequência de dados, conhecida como raiz Merkle. Com a raiz Merkle, além de alguns outros dados, qualquer computador pode validar com eficiência todas as outras entradas na árvore Merkle. Na tecnologia blockchain, essas entradas são números de identificação de transação.
Se você está envolvido no mundo do blockchain, já deve ter se deparado com a frase “árvore merkle” antes. Embora as árvores Merkle não sejam um conceito amplamente compreendido, elas também não são terrivelmente complicadas. Esta postagem explicará as árvores Merkle em inglês simples e ajudará você a entender como elas tornam a tecnologia blockchain possível.
A história de Merkle Trees começa em 1979 com um cara chamado Ralph Merkle. Enquanto cursava pós-graduação na Universidade de Stanford, Merkle escreveu um artigo acadêmico chamado “A Certified Digital Signature”. Neste ensaio, Merkle descreveu um método para criar assinaturas digitais e estabeleceu um método novo e extremamente eficiente para criar provas criptográficas. Em outras palavras, ele projetou um processo de verificação de dados que permitiria aos computadores fazer seu trabalho muito, muito mais rápido do que nunca.
Merkle chamou sua ideia de “Assinaturas de Árvore” ou “Autenticação de Árvore”. Hoje em dia, essa ideia é mais conhecida como Merkle Tree, em homenagem ao inventor.
Não é exagero dizer que Merkle Trees revolucionou o mundo da criptografia e, por extensão, a forma como funcionam os protocolos de computador criptografados. Na verdade, as Merkle Trees são mencionadas repetidamente no ensaio de Satoshi Nakamoto de 2008 que apresentou o Bitcoin ao mundo. Eles são amplamente usados no protocolo Bitcoin.
Então, o que exatamente é uma árvore Merkle? Vamos descobrir.
Primeiro, é importante entender o conceito de função hash criptográfica. Dito de forma simples, as funções hash são funções matemáticas irreversíveis que recebem uma entrada de qualquer comprimento – de um caracter ao texto de um conjunto inteiro de enciclopédias – e produzem uma saída aleatória de comprimento fixo. Como a saída parece aleatória e tem comprimento fixo, um invasor não tem pistas sobre qual entrada criou uma saída específica. As funções hash também são determinísticas, portanto a mesma entrada sempre produzirá a mesma saída. Por último, as funções hash são irreversíveis, portanto não há absolutamente nenhuma maneira de determinar uma entrada apenas com base no conhecimento da saída.
Todas essas propriedades permitem que funções hash criem impressões digitais eletrônicas de uma entrada específica. Usando funções hash, as redes blockchain criam um hash criptográfico – uma impressão digital eletrônica – de cada transação. O hash criptográfico de uma transação é simplesmente chamado de ID da transação. Para quase todos os protocolos blockchain, cada ID de transação é uma sequência alfanumérica de dados de 64 caracteres (256 bits).
Quando você considera que os blockchains são normalmente compostos de centenas de milhares de blocos, com cada bloco contendo até vários milhares de transações, você pode imaginar a rapidez com que a verificação das transações pode se tornar computacionalmente difícil. Como tal, é ideal utilizar o mínimo de dados possível ao processar e verificar transações. Isso minimiza os tempos de processamento da CPU e ao mesmo tempo garante o mais alto nível de segurança.
Bem, é exatamente isso que Merkle Trees faz. Simplificando, as Merkle Trees pegam um grande número de IDs de transação, estruturam-nos de uma maneira específica e usam funções hash criptográficas para derivar uma única string alfanumérica de 64 caracteres que atua como uma impressão digital eletrônica para todo o corpo de dados. .
Essa sequência de dados, chamada Raiz Merkle, é extremamente importante porque permite que qualquer computador verifique rapidamente se uma transação específica ocorreu em um bloco específico da maneira mais eficiente possível.
A única string de 256 bits que uma Árvore Merkle produz é chamada de Raiz Merkle. Cada bloco em uma blockchain possui exatamente um. E, como acabamos de mencionar, o Merkle Root é um dado crucial porque permite que os computadores verifiquem as informações com incrível velocidade e eficiência.
Vamos mergulhar um pouco mais fundo. Como é produzida uma raiz de Merkle? O primeiro passo é organizar todas as entradas de dados que, neste caso, são IDs de transação. As árvores Merkle, por design, sempre agrupam todas as entradas em pares. Se houver um número ímpar de entradas, a última entrada será copiada e emparelhada consigo mesma. Isso vale para todos os IDs de transação escritos em um bloco de blockchain.
Por exemplo, suponhamos que um único bloco contenha um total de 512 transações. A Merkle Tree começaria agrupando esses 512 IDs de transações em 256 pares. Então, esses 256 pares de IDs de transação passariam por um processo matemático – a função de hash ou algoritmo de hash, como às vezes é chamado – e teríamos 256 novos hashes criptográficos de 64 caracteres.
O mesmo processo ocorre novamente. Esses 256 novos hashes seriam emparelhados e transformados em 128 hashes. O processo é repetido, cortando o número de hashes pela metade de cada vez, até que reste apenas um único hash. Esse único hash é nosso Merkle Root.
Para deixar esse conceito claro, vejamos um exemplo muito simples de árvore Merkle. Imagine que foram realizadas 8 transações em um determinado bloco. Na realidade, os IDs de transação têm 64 caracteres, mas para simplificar, vamos fingir que eles têm apenas 8 caracteres. Para tornar as coisas ainda mais fáceis, vamos usar apenas números (e ignorar completamente as letras).
Portanto, neste exemplo, nossos oito IDs de transações serão:
Agora, vamos supor que o método para fazer hash de IDs de transação seja pegar o primeiro, terceiro, quinto e sétimo dígitos de cada um dos dois IDs que estão sendo combinados e, em seguida, simplesmente juntar esses números para formar um novo código de 8 dígitos.
É claro que, na realidade, a matemática por trás dos algoritmos de hash é muito mais complicada do que isso. Mas para esta demonstração simples, este sistema elementar será suficiente.
Esta é a aparência da nossa Merkle Tree:
Observe que o número de códigos é reduzido pela metade a cada degrau na Árvore Merkle. Começamos com 8 IDs de transação e, após apenas 3 etapas, terminamos com um único código – o Merkle Root. Neste exemplo, nosso Merkle Root é o código na caixa inferior: 12345678.
O principal benefício das Merkle Trees é que elas permitem a verificação extremamente rápida dos dados. Se quisermos validar um único ID de transação, não precisaremos verificar novamente cada transação no bloco. Em vez disso, precisaríamos apenas verificar aquele “ramo” específico de nossa árvore Merkle.
Suponhamos que queremos validar um ID de transação em nosso exemplo atual. Bob diz que pagou a Alice uma certa quantia em Bitcoin e nos diz que o ID da transação é 88888888. Ele também nos envia 3 hashes: 77777777, 55556666 e 11223344. Essas são todas as informações que precisam ser enviadas ou recebidas para verificar o pagamento de Bob a Alice.
Esses três hashes, juntamente com o ID da transação em questão e o Merkle Root deste bloco específico, são os únicos dados necessários para verificar o pagamento de Bob a Alice. São muito menos dados do que seriam necessários para verificar toda a árvore Merkle. Como resultado, o processo de verificação é muito mais rápido e eficiente para todos.
Veja como funciona. Já temos o Merkle Root do bloco, então Bob não precisa nos enviar isso. Ele nos envia seu ID de transação e os 3 hashes adicionais listados acima. Ele também envia algumas informações sobre a ordem e o posicionamento dos hashes. Agora, tudo o que precisamos fazer é executar o algoritmo de hash no conjunto de dados fornecido por Bob.
Começamos fazendo hash do primeiro código 77777777 com o ID da transação 88888888, que nos dá o resultado 77778888. Bob não nos enviou esse código, mas não precisou porque estamos usando o mesmo algoritmo de hash que ele. Portanto, recebemos exatamente os mesmos resultados.
Em seguida, pegamos o segundo código que Bob nos enviou, 55556666, e o misturamos com o novo código 77778888 que acabamos de derivar. Isto, é claro, produz o número 55667788.
Por fim, fazemos o hash do terceiro código que Bob nos deu, 11223344, com o outro código novo que recebemos, 55667788, e terminamos com a raiz Merkle correta: 12345678.
Observe que precisamos apenas de 3 códigos de Bob e só tivemos que executar o algoritmo de hash três vezes para ver se a transação de Bob é válida. Isso significa que nosso computador fez menos da metade do trabalho que seria necessário para verificar toda a árvore Merkle. O diagrama Merkle Tree original tem 15 números e o algoritmo de hash precisa ser executado 7 vezes. Mas mais da metade dessa árvore não é necessária para verificar a transação de Bob!
Este procedimento é suficiente para verificar se Bob, de fato, pagou a Alice aquela certa quantia em Bitcoin porque derivamos números que, quando combinados com os outros códigos que Bob nos enviou, produziram a mesma Raiz Merkle que já sabíamos ser verdadeira para este bloco específico.
Bob não pode falsificar uma transação porque isso exigiria encontrar um ID de transação falso e um conjunto adicional de códigos falsos que, quando passados pela função de hash, produziriam a verdadeira Raiz Merkle. As chances de isso acontecer são tão astronomicamente pequenas que podemos dizer com segurança que é impossível.
Neste exemplo simples, a economia de poder computacional pode não parecer substancial. No entanto, quando você considera que os blocos em um blockchain podem conter vários milhares de transações, é fácil ver como as Merkle Trees aumentam a eficiência de forma tão dramática.
Resumindo, esse é o principal benefício de uma árvore Merkle. Ele permite que os computadores verifiquem as informações de forma extremamente eficiente e com muito menos dados do que seria necessário sem a Merkle Tree.
Merkle Trees também são o conceito fundamental na solução da Plataforma Komodo para o problema de escalabilidade do blockchain. A solução de escalonamento da Komodo permite interoperabilidade completa de blockchain e permitirá que a Komodo processe transações mais rapidamente do que qualquer outro serviço de processamento de pagamentos no planeta. Atualmente, a nova tecnologia de escalonamento da Komodo processa mais de 20.000 transações por segundo em um ambiente de teste.
Uma Merkle Tree é um método de estruturação de dados que permite que um grande conjunto de informações seja verificado quanto à precisão de forma extremamente rápida e eficiente. Cada árvore Merkle resulta em uma única sequência de dados, conhecida como raiz Merkle. Com a raiz Merkle, além de alguns outros dados, qualquer computador pode validar com eficiência todas as outras entradas na árvore Merkle. Na tecnologia blockchain, essas entradas são números de identificação de transação.
Se você está envolvido no mundo do blockchain, já deve ter se deparado com a frase “árvore merkle” antes. Embora as árvores Merkle não sejam um conceito amplamente compreendido, elas também não são terrivelmente complicadas. Esta postagem explicará as árvores Merkle em inglês simples e ajudará você a entender como elas tornam a tecnologia blockchain possível.
A história de Merkle Trees começa em 1979 com um cara chamado Ralph Merkle. Enquanto cursava pós-graduação na Universidade de Stanford, Merkle escreveu um artigo acadêmico chamado “A Certified Digital Signature”. Neste ensaio, Merkle descreveu um método para criar assinaturas digitais e estabeleceu um método novo e extremamente eficiente para criar provas criptográficas. Em outras palavras, ele projetou um processo de verificação de dados que permitiria aos computadores fazer seu trabalho muito, muito mais rápido do que nunca.
Merkle chamou sua ideia de “Assinaturas de Árvore” ou “Autenticação de Árvore”. Hoje em dia, essa ideia é mais conhecida como Merkle Tree, em homenagem ao inventor.
Não é exagero dizer que Merkle Trees revolucionou o mundo da criptografia e, por extensão, a forma como funcionam os protocolos de computador criptografados. Na verdade, as Merkle Trees são mencionadas repetidamente no ensaio de Satoshi Nakamoto de 2008 que apresentou o Bitcoin ao mundo. Eles são amplamente usados no protocolo Bitcoin.
Então, o que exatamente é uma árvore Merkle? Vamos descobrir.
Primeiro, é importante entender o conceito de função hash criptográfica. Dito de forma simples, as funções hash são funções matemáticas irreversíveis que recebem uma entrada de qualquer comprimento – de um caracter ao texto de um conjunto inteiro de enciclopédias – e produzem uma saída aleatória de comprimento fixo. Como a saída parece aleatória e tem comprimento fixo, um invasor não tem pistas sobre qual entrada criou uma saída específica. As funções hash também são determinísticas, portanto a mesma entrada sempre produzirá a mesma saída. Por último, as funções hash são irreversíveis, portanto não há absolutamente nenhuma maneira de determinar uma entrada apenas com base no conhecimento da saída.
Todas essas propriedades permitem que funções hash criem impressões digitais eletrônicas de uma entrada específica. Usando funções hash, as redes blockchain criam um hash criptográfico – uma impressão digital eletrônica – de cada transação. O hash criptográfico de uma transação é simplesmente chamado de ID da transação. Para quase todos os protocolos blockchain, cada ID de transação é uma sequência alfanumérica de dados de 64 caracteres (256 bits).
Quando você considera que os blockchains são normalmente compostos de centenas de milhares de blocos, com cada bloco contendo até vários milhares de transações, você pode imaginar a rapidez com que a verificação das transações pode se tornar computacionalmente difícil. Como tal, é ideal utilizar o mínimo de dados possível ao processar e verificar transações. Isso minimiza os tempos de processamento da CPU e ao mesmo tempo garante o mais alto nível de segurança.
Bem, é exatamente isso que Merkle Trees faz. Simplificando, as Merkle Trees pegam um grande número de IDs de transação, estruturam-nos de uma maneira específica e usam funções hash criptográficas para derivar uma única string alfanumérica de 64 caracteres que atua como uma impressão digital eletrônica para todo o corpo de dados. .
Essa sequência de dados, chamada Raiz Merkle, é extremamente importante porque permite que qualquer computador verifique rapidamente se uma transação específica ocorreu em um bloco específico da maneira mais eficiente possível.
A única string de 256 bits que uma Árvore Merkle produz é chamada de Raiz Merkle. Cada bloco em uma blockchain possui exatamente um. E, como acabamos de mencionar, o Merkle Root é um dado crucial porque permite que os computadores verifiquem as informações com incrível velocidade e eficiência.
Vamos mergulhar um pouco mais fundo. Como é produzida uma raiz de Merkle? O primeiro passo é organizar todas as entradas de dados que, neste caso, são IDs de transação. As árvores Merkle, por design, sempre agrupam todas as entradas em pares. Se houver um número ímpar de entradas, a última entrada será copiada e emparelhada consigo mesma. Isso vale para todos os IDs de transação escritos em um bloco de blockchain.
Por exemplo, suponhamos que um único bloco contenha um total de 512 transações. A Merkle Tree começaria agrupando esses 512 IDs de transações em 256 pares. Então, esses 256 pares de IDs de transação passariam por um processo matemático – a função de hash ou algoritmo de hash, como às vezes é chamado – e teríamos 256 novos hashes criptográficos de 64 caracteres.
O mesmo processo ocorre novamente. Esses 256 novos hashes seriam emparelhados e transformados em 128 hashes. O processo é repetido, cortando o número de hashes pela metade de cada vez, até que reste apenas um único hash. Esse único hash é nosso Merkle Root.
Para deixar esse conceito claro, vejamos um exemplo muito simples de árvore Merkle. Imagine que foram realizadas 8 transações em um determinado bloco. Na realidade, os IDs de transação têm 64 caracteres, mas para simplificar, vamos fingir que eles têm apenas 8 caracteres. Para tornar as coisas ainda mais fáceis, vamos usar apenas números (e ignorar completamente as letras).
Portanto, neste exemplo, nossos oito IDs de transações serão:
Agora, vamos supor que o método para fazer hash de IDs de transação seja pegar o primeiro, terceiro, quinto e sétimo dígitos de cada um dos dois IDs que estão sendo combinados e, em seguida, simplesmente juntar esses números para formar um novo código de 8 dígitos.
É claro que, na realidade, a matemática por trás dos algoritmos de hash é muito mais complicada do que isso. Mas para esta demonstração simples, este sistema elementar será suficiente.
Esta é a aparência da nossa Merkle Tree:
Observe que o número de códigos é reduzido pela metade a cada degrau na Árvore Merkle. Começamos com 8 IDs de transação e, após apenas 3 etapas, terminamos com um único código – o Merkle Root. Neste exemplo, nosso Merkle Root é o código na caixa inferior: 12345678.
O principal benefício das Merkle Trees é que elas permitem a verificação extremamente rápida dos dados. Se quisermos validar um único ID de transação, não precisaremos verificar novamente cada transação no bloco. Em vez disso, precisaríamos apenas verificar aquele “ramo” específico de nossa árvore Merkle.
Suponhamos que queremos validar um ID de transação em nosso exemplo atual. Bob diz que pagou a Alice uma certa quantia em Bitcoin e nos diz que o ID da transação é 88888888. Ele também nos envia 3 hashes: 77777777, 55556666 e 11223344. Essas são todas as informações que precisam ser enviadas ou recebidas para verificar o pagamento de Bob a Alice.
Esses três hashes, juntamente com o ID da transação em questão e o Merkle Root deste bloco específico, são os únicos dados necessários para verificar o pagamento de Bob a Alice. São muito menos dados do que seriam necessários para verificar toda a árvore Merkle. Como resultado, o processo de verificação é muito mais rápido e eficiente para todos.
Veja como funciona. Já temos o Merkle Root do bloco, então Bob não precisa nos enviar isso. Ele nos envia seu ID de transação e os 3 hashes adicionais listados acima. Ele também envia algumas informações sobre a ordem e o posicionamento dos hashes. Agora, tudo o que precisamos fazer é executar o algoritmo de hash no conjunto de dados fornecido por Bob.
Começamos fazendo hash do primeiro código 77777777 com o ID da transação 88888888, que nos dá o resultado 77778888. Bob não nos enviou esse código, mas não precisou porque estamos usando o mesmo algoritmo de hash que ele. Portanto, recebemos exatamente os mesmos resultados.
Em seguida, pegamos o segundo código que Bob nos enviou, 55556666, e o misturamos com o novo código 77778888 que acabamos de derivar. Isto, é claro, produz o número 55667788.
Por fim, fazemos o hash do terceiro código que Bob nos deu, 11223344, com o outro código novo que recebemos, 55667788, e terminamos com a raiz Merkle correta: 12345678.
Observe que precisamos apenas de 3 códigos de Bob e só tivemos que executar o algoritmo de hash três vezes para ver se a transação de Bob é válida. Isso significa que nosso computador fez menos da metade do trabalho que seria necessário para verificar toda a árvore Merkle. O diagrama Merkle Tree original tem 15 números e o algoritmo de hash precisa ser executado 7 vezes. Mas mais da metade dessa árvore não é necessária para verificar a transação de Bob!
Este procedimento é suficiente para verificar se Bob, de fato, pagou a Alice aquela certa quantia em Bitcoin porque derivamos números que, quando combinados com os outros códigos que Bob nos enviou, produziram a mesma Raiz Merkle que já sabíamos ser verdadeira para este bloco específico.
Bob não pode falsificar uma transação porque isso exigiria encontrar um ID de transação falso e um conjunto adicional de códigos falsos que, quando passados pela função de hash, produziriam a verdadeira Raiz Merkle. As chances de isso acontecer são tão astronomicamente pequenas que podemos dizer com segurança que é impossível.
Neste exemplo simples, a economia de poder computacional pode não parecer substancial. No entanto, quando você considera que os blocos em um blockchain podem conter vários milhares de transações, é fácil ver como as Merkle Trees aumentam a eficiência de forma tão dramática.
Resumindo, esse é o principal benefício de uma árvore Merkle. Ele permite que os computadores verifiquem as informações de forma extremamente eficiente e com muito menos dados do que seria necessário sem a Merkle Tree.
Merkle Trees também são o conceito fundamental na solução da Plataforma Komodo para o problema de escalabilidade do blockchain. A solução de escalonamento da Komodo permite interoperabilidade completa de blockchain e permitirá que a Komodo processe transações mais rapidamente do que qualquer outro serviço de processamento de pagamentos no planeta. Atualmente, a nova tecnologia de escalonamento da Komodo processa mais de 20.000 transações por segundo em um ambiente de teste.