Implementando um Blockchain Simples em Java
1. Visão geral
Neste tutorial, aprenderemos os conceitos básicos da tecnologia blockchain. Também implementaremos um aplicativo básico em Java que enfoca os conceitos.
Além disso, discutiremos alguns conceitos avançados e aplicações práticas desta tecnologia.
2. O que é Blockchain?
Então, vamos primeiro entender o que exatamente é blockchain ...
Bem, sua origem remonta awhitepaper published by Satoshi Nakamoto on Bitcoin, em 2008.
Blockchain is a decentralized ledger of information. Consiste em blocos de dados conectados através do uso de criptografia. Pertence a uma rede de nós conectados pela rede pública. Vamos entender isso melhor quando tentarmos construir um tutorial básico mais tarde.
Existem alguns atributos importantes que devemos entender, então vamos examiná-los:
-
À prova de violação: Em primeiro lugar,data as part of a block is tamper-proof. Cada bloco é referenciado por um resumo criptográfico, comumente conhecido como hash, tornando o bloco à prova de violações.
-
Descentralizado: oblockchain is completely decentralized inteiro na rede. Isso significa que não há nó principal e todos os nós da rede têm a mesma cópia.
-
Transparente: Todos os nós participantes da redevalidates and adds a new block to its chain through consensus com outros nós. Portanto, cada nó tem visibilidade completa dos dados.
3. Como o Blockchain funciona?
Agora, vamos entender como funciona o blockchain.
Ofundamental units of a blockchain are blocks. Um único bloco pode encapsular várias transações ou outros dados valiosos:
3.1. Minerando um bloco
Representamos um bloco por um valor de hash. Generating the hash value of a block is called “mining” o bloco. A mineração de um bloco é tipicamente dispendiosa em termos computacionais, pois serve como "prova de trabalho".
O hash de um bloco geralmente consiste nos seguintes dados:
-
Principalmente, o hash de um bloco consiste nas transações que ele encapsula
-
O hash também consiste no carimbo de data / hora da criação do bloco
-
Também inclui um nonce, um número arbitrário usado em criptografia
-
Finalmente, o hash do bloco atual também inclui o hash do bloco anterior
Múltiplosnodes in the network can compete to mine no bloco ao mesmo tempo. Além de gerar o hash, os nós também precisam verificar se as transações incluídas no bloco são legítimas. O primeiro a minerar um bloco vence a corrida!
3.2. Adicionando um bloco ao Blockchain
Embora a mineração de um bloco seja computacionalmente cara,verifying that a block is legitimate is relatively much easier. Todos os nós da rede participam na verificação de um bloco recém-extraído.
Portanto, umablock is added into the blockchain on the consensus dos nós recém-minerados.
Agora, existem vários protocolos de consenso disponíveis que podemos usar para verificação. Os nós da rede usam o mesmo protocolo para detectar ramificações maliciosas da cadeia. Portanto, uma ramificação maliciosa, mesmo que introduzida, será rejeitada em breve pela maioria dos nós.
4. Blockchain básico em Java
Agora temos contexto suficiente para começar a construir um aplicativo básico em Java.
Nossosexample here will illustrate the basic concepts simples que acabamos de ver. Um aplicativo de nível de produção envolve muitas considerações que estão além do escopo deste tutorial. Iremos, no entanto, tocar em alguns tópicos avançados mais tarde.
4.1. Implementando um bloco
Primeiro, precisamos definir um POJO simples que retenha os dados do nosso bloco:
public class Block {
private String hash;
private String previousHash;
private String data;
private long timeStamp;
private int nonce;
public Block(String data, String previousHash, long timeStamp) {
this.data = data;
this.previousHash = previousHash;
this.timeStamp = timeStamp;
this.hash = calculateBlockHash();
}
// standard getters and setters
}
Vamos entender o que empacotamos aqui:
-
Hash do bloco anterior, uma parte importante para construir a cadeia
-
Os dados reais, qualquer informação com valor, como um contrato
-
O registro de data e hora da criação deste bloco
-
Um nonce, que é um número arbitrário usado em criptografia
-
Por fim, o hash desse bloco, calculado com base em outros dados
4.2. Cálculo do hash
Agora, como calculamos o hash de um bloco? Nós usamos um métodocalculateBlockHash, mas ainda não vimos uma implementação. Antes de implementar este método, vale a pena gastar algum tempo para entender o que exatamente é um hash.
Um hash é uma saída de algo conhecido como função hash. Ahash function maps input data of arbitrary size to output data of fixed size. O hash é bastante sensível a qualquer alteração nos dados de entrada, por menores que sejam.
Além disso, é impossível obter os dados de entrada de volta apenas de seu hash. Essas propriedades tornam a função hash bastante útil na criptografia.
Então, vamos ver como podemos gerar o hash do nosso bloco em Java:
public String calculateBlockHash() {
String dataToHash = previousHash
+ Long.toString(timeStamp)
+ Integer.toString(nonce)
+ data;
MessageDigest digest = null;
byte[] bytes = null;
try {
digest = MessageDigest.getInstance("SHA-256");
bytes = digest.digest(dataToHash.getBytes(UTF_8));
} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
logger.log(Level.SEVERE, ex.getMessage());
}
StringBuffer buffer = new StringBuffer();
for (byte b : bytes) {
buffer.append(String.format("%02x", b));
}
return buffer.toString();
}
Muitas coisas acontecendo aqui, vamos entendê-las em detalhes:
-
Primeiro, concatenamos diferentes partes do bloco para gerar um hash a partir de
-
Então, obtemos uma instância da função hash SHA-256 deMessageDigest
-
Em seguida, geramos o valor de hash dos nossos dados de entrada, que é uma matriz de bytes
-
Finalmente, transformamos a matriz de bytes em uma sequência hexadecimal, um hash é normalmente representado como um número hexadecimal de 32 dígitos
4.3. Já minamos o bloco ainda?
Tudo parece simples e elegante até agora, exceto pelo fato de que ainda não exploramos o bloco. Então, o que exatamente envolve a mineração de um bloco, que capturou a imaginação dos desenvolvedores já há algum tempo!
Bem,mining a block means solving a computationally complex task para o bloco. Embora o cálculo do hash de um bloco seja um tanto trivial, encontrar o hash começando com cinco zeros não é. Ainda mais complicado seria encontrar um hash começando com dez zeros, e temos uma ideia geral.
Então, como exatamente podemos fazer isso? Honestamente, a solução é muito menos chique! É com força bruta que tentamos atingir esse objetivo. Fazemos uso do nonce aqui:
public String mineBlock(int prefix) {
String prefixString = new String(new char[prefix]).replace('\0', '0');
while (!hash.substring(0, prefix).equals(prefixString)) {
nonce++;
hash = calculateBlockHash();
}
return hash;
}
Vamos ver o que estamos tentando fazer aqui:
-
Começamos definindo o prefixo que desejamos encontrar
-
Em seguida, verificamos se encontramos a solução
-
Caso contrário, incrementamos o nonce e calculamos o hash em um loop
-
O loop continua até atingirmos o jackpot
Estamos começando com o valor padrão de nonce aqui e aumentando-o em um. Mas há maissophisticated strategies to start and increment a nonce em aplicativos do mundo real. Além disso, não estamos verificando nossos dados aqui, o que normalmente é uma parte importante.
4.4. Vamos executar o exemplo
Agora que definimos nosso bloco junto com suas funções, podemos usá-lo para criar um blockchain simples. Vamos armazenar isso em umArrayList:
List blockchain = new ArrayList<>();
int prefix = 4;
String prefixString = new String(new char[prefix]).replace('\0', '0');
Além disso, definimos um prefixo de quatro, o que efetivamente significa que queremos que nosso hash comece com quatro zeros.
Vamos ver como podemos adicionar um bloco aqui:
@Test
public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
Block newBlock = new Block(
"The is a New Block.",
blockchain.get(blockchain.size() - 1).getHash(),
new Date().getTime());
newBlock.mineBlock(prefix);
assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));
blockchain.add(newBlock);
}
4.5. Verificação de Blockchain
Como um nó pode validar que uma blockchain é válida? Embora isso possa ser bastante complicado, vamos pensar em uma versão simples:
@Test
public void givenBlockchain_whenValidated_thenSuccess() {
boolean flag = true;
for (int i = 0; i < blockchain.size(); i++) {
String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash();
flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())
&& previousHash.equals(blockchain.get(i).getPreviousHash())
&& blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);
if (!flag) break;
}
assertTrue(flag);
}
Então, aqui estamos fazendo três verificações específicas para cada bloco:
-
O hash armazenado do bloco atual é realmente o que ele calcula
-
O hash do bloco anterior armazenado no bloco atual é o hash do bloco anterior
-
O bloco atual foi extraído
5. Alguns conceitos avançados
Embora nosso exemplo básico traga os conceitos básicos de um blockchain, certamente não está completo. Para colocar essa tecnologia em uso prático, várias outras considerações precisam ser levadas em consideração.
Embora não seja possível detalhar todos eles, vejamos alguns dos mais importantes:
5.1. Verificação de transação
Calcular o hash de um bloco e encontrar o hash desejado é apenas uma parte da mineração. Um bloco consiste em dados, geralmente na forma de várias transações. Eles devem ser verificados antes de poderem fazer parte de um bloco e extraídos.
Uma implementação típica deblockchain sets a restriction on how much data can be part of a block. Ele tambémsets up rules on how a transaction can be verified. Vários nós na rede participam do processo de verificação.
5.2. Protocolo de Consenso Alternativo
Vimos que um algoritmo de consenso como "Prova de trabalho" é usado para extrair e validar um bloco. No entanto, este não é o único algoritmo de consenso disponível para uso.
Existemseveral other consensus algorithms to choose from, como Prova de aposta, Prova de autoridade e Prova de peso. Todos estes têm seus prós e contras. Qual deles usar depende do tipo de aplicativo que pretendemos criar.
5.3. Recompensa de mineração
Uma rede blockchain normalmente consiste em nós voluntários. Agora, por que alguém iria querer contribuir para esse processo complexo e mantê-lo legítimo e crescente?
Isso ocorre porquenodes are rewarded for verifying the transactions and mining a block. Essas recompensas geralmente estão na forma de moeda associada ao aplicativo. Mas um aplicativo pode decidir que a recompensa seja algo de valor.
5.4. Tipos de nós
Um blockchain depende completamente de sua rede para operar. Em teoria, a rede é completamente descentralizada e todos os nós são iguais. No entanto, na prática, uma rede consiste em vários tipos de nós.
Enquantoa full node has a complete list of transactions, a light node only has a partial list. Além disso, nem todos os nós participam da verificação e validação.
5.5. Comunicação segura
Uma das características da tecnologia blockchain é sua abertura e anonimato. Mas como isso fornece segurança para as transações realizadas? Isso ébased on cryptography and public key infrastructure.
O iniciador de uma transação usa sua chave privada para protegê-la e anexá-la à chave pública do destinatário. Os nós podem usar as chaves públicas dos participantes para verificar as transações.
6. Aplicações práticas do Blockchain
Portanto, o blockchain parece ser uma tecnologia interessante, mas também deve ser útil. Essa tecnologia já existe há algum tempo e - escusado será dizer - provou ser perturbadora em muitos domínios.
Sua aplicação em muitas outras áreas está sendo ativamente perseguida. Vamos entender os aplicativos mais populares:
-
Currency: este é de longe o uso mais antigo e mais conhecido de blockchain, graças ao sucesso do Bitcoin. Eles fornecem dinheiro seguro e sem atrito para pessoas em todo o mundo, sem nenhuma autoridade central ou intervenção do governo.
-
Identity: a identidade digital está se tornando rapidamente a norma no mundo atual. No entanto, isso é resolvido por problemas de segurança e adulteração. O Blockchain é inevitável ao revolucionar essa área com identidades completamente seguras e à prova de violações.
-
Healthcare: o setor de saúde está repleto de dados, a maioria gerenciados pelas autoridades centrais. Isso diminui a transparência, a segurança e a eficiência no tratamento desses dados. A tecnologia Blockchain pode fornecer um sistema sem terceiros para fornecer a confiança necessária.
-
Government: esta é talvez uma área que está bem aberta a interrupções pela tecnologia blockchain. O governo está tipicamente no centro de vários serviços aos cidadãos, muitas vezes carregados de ineficiências e corrupção. O Blockchain pode ajudar a estabelecer relações muito melhores entre governo e cidadão.
7. Ferramentas do comércio
Embora nossa implementação básica aqui seja útil para extrair os conceitos, não é prático desenvolver um produto em blockchain do zero. Felizmente, este espaço amadureceu agora e temos algumas ferramentas bastante úteis para começar.
Vejamos algumas das ferramentas populares para trabalhar neste espaço:
-
Solidity: a solidez éa statically-typed and object-oriented programming language projetada para escrever contratos inteligentes. Ele pode ser usado para escrever contratos inteligentes em várias plataformas de blockchain comoEthereum.
-
Remix IDE: Remix é um poderosoopen-source tool to write smart contracts no Solidity. Isso permite que o usuário escreva contratos inteligentes diretamente do navegador.
-
Truffle Suite: Truffle fornecea bunch of tools to get a developer up and started no desenvolvimento de aplicativos distribuídos. Isso inclui trufa, ganache e chuvisco.
-
Ethlint/Solium: Solium permite que os desenvolvedores garantam que seussmart contracts written on Solidity is free from style and security issues. Solium também ajuda a corrigir esses problemas.
-
Parity: A paridade ajuda emsetting up the development environment for smart contract no Etherium. Ele fornece uma maneira rápida e segura de interagir com o blockchain.
8. Conclusão
Para resumir, neste tutorial, analisamos os conceitos básicos da tecnologia blockchain. Entendemos como uma rede mina e adicionamos um novo bloco na blockchain. Além disso, implementamos os conceitos básicos em Java. Também discutimos alguns dos conceitos avançados relacionados a essa tecnologia.
Por fim, encerramos algumas aplicações práticas de blockchain e também as ferramentas disponíveis.
Como sempre, o código pode ser encontradoover on GitHub.