Visão geral
Merkletree é amplamente utilizado na tecnologia Bitcoin. Este artigo tem como objetivo implementar um Merkletree simples através do código e calcular a árvore de Merkle.
A Merkle Tree é uma estrutura de dados que verifica qualquer tipo de dados armazenados, processados e transmitidos entre computadores.
Atualmente, o principal objetivo da árvore Merkle é garantir que os blocos de dados recebidos da rede de pares não sejam danificados e inalterados e verificar se outras redes de pares não mentem para enviar blocos de dados falsos.
Exemplo de aplicação da árvore de merkle
Bitcoin
Gita
O dínamo de Mazon
Gassandra
Aplicações no Bitcoin
Cada bloco no Bitcoin contém uma assinatura de coleção de todas as transações. Esta assinatura é implementada usando a árvore Merkle. A árvore Merkle é usada para o Bitcoin resumir todas as transações no bloco, gerar uma impressão digital digital geral de todo o conjunto de transações e fornecer um processo muito eficaz para verificar se a transação está incluída no bloco.
Um uso muito importante das árvores de merkle é verificar se o bloco contém uma transação especificada. As árvores de Merkle são construídas por pares de nós recursivamente hashing de nós até que haja apenas um hash.
Implementação do código da árvore Merkle
O nó da árvore de hash é chamado de raiz Merkle. A árvore Merkle pode verificar se algum elemento de dados está incluído na árvore usando a complexidade do tempo de log2 (n):
teste de pacote; importar java.security.Messagedigest; importar java.util.ArrayList; importar java.util.list; public class Merkletrees {// Lista de transações <String> txList; // Merkle root string root; / * * root = ""; } /*** Execute merkle_tree e defina root. */ public void Merkle_tree () {list <string> textxList = new ArrayList <String> (); for (int i = 0; i <this.txlist.size (); i ++) {texlist.add (this.txlist.get (i)); } List <string> newtxList = getNewtxList (TEMPTXLIST); while (newtxList.size ()! = 1) {newtxList = getNewtxList (newtxlist); } this.root = newtxList.get (0); } /*** Retorne a lista de hash do nó. * @param temptxlist * @return */ Lista privada <String> getNewtxList (list <string> textxList) {list <string> newtxList = new ArrayList <string> (); int index = 0; while (índice <temptxlist.size ()) {// String esquerda esquerda esquerda = temptxlist.get (index); índice ++; // string direita Right = ""; if (index! = te temptxlist.size ()) {right = temptxlist.get (index); } // SHA2 Valor hexadecimal string shA2hexValue = getSha2HexValue (esquerda + direita); newtxList.add (sha2hexvalue); índice ++; } retornar newtxList; } / ** * Retornar String Hex * @param str * @return * / public String getSha2HexValue (String str) {byte [] cipher_byte; tente {Messagedigest md = Messagedigest.getInstance ("sha-256"); md.update (str.getBytes ()); cipher_byte = md.digest (); StringBuilder sb = new StringBuilder (2 * cipher_byte.length); para (byte b: cipher_byte) {sb.append (string.format ("%02x", b & 0xff)); } return sb.toString (); } catch (Exceção e) {e.printStackTrace (); } retornar ""; } / ** * Obtenha raiz * @return * / public String getRoot () {return this.root; }}Preparação de dados
Colocamos os dados da transação na lista:
List <String> temptxlist = new ArrayList <String> (); texlist.add ("a"); tesptxlist.add ("b"); texlist.add ("c"); texlist.add ("d"); temptxlist.add ("e");Processo de implementação
Prepare dados de transação para calcular o valor de hash de cada dados e formar gradualmente os nós esquerdo e direito da árvore para executar o loop para saber que apenas um dados é deixado no final
Lista privada <String> getNewtxList (list <string> temptxlist) {list <string> newtxList = new ArrayList <String> (); int index = 0; while (índice <temptxlist.size ()) {// String esquerda esquerda esquerda = temptxlist.get (index); índice ++; // string direita Right = ""; if (index! = te temptxlist.size ()) {right = temptxlist.get (index); } // SHA2 Valor hexadecimal string shA2hexValue = getSha2HexValue (esquerda + direita); newtxList.add (sha2hexvalue); índice ++; }teste
teste do pacote; importar java.util.ArrayList; importar java.util.list; public class App {public static void main (string [] args) {list <string> te temptxList = new ArrayList <String> (); temptxlist.add ("A"); temptxlist.add ("b"); temptxlist.add ("c"); temptxlist.add ("d"); tentptxlist.add ("e"); Merkletrees Merkletrees = New Merkletrees (TEMPTXLIST); merkletrees.merkle_tree (); System.out.println ("root:" + merkletrees.getRoot ()); }}Resultados da execução
Este artigo implementa um Merkletree simples da forma de uma árvore binária simples e calcula a Treeroot, mas, de fato, Merkletree não é conservador e a árvore binária também pode ser árvores multi-espigas.
90% deste artigo é baseado na tradução, endereço original
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.