5 minutos de leitura
Provavelmente, você já ouviu falar de Hyperledger e Ethereum no universo Blockchain. Hyperledger é um projeto open source iniciado pela Linux Foundation em 2015 para criação de protocolos e ferramentas blockchain. O resultado dessa iniciativa foi um conjunto de outros projetos, dos quais um dos mais conhecidos é o Hyperledger Fabric, voltado para redes permissionadas e para aplicações corporativas.
Em 2019 o Hyperledger Besu veio também com o propósito de atender a demandas de aplicações corporativas, incluindo a flexibilidade da também conhecida rede Ethereum. O Hyperledger Besu pode ser aplicado tanto em redes públicas como privadas. Além disso, é um client Ethereum permitindo, por exemplo, o uso de Smart Contracts. Esse projeto ganhou destaque quando o Banco Central do Brasil escolheu essa ferramenta para implementar a rede do Real Digital, ou Drex.
Vamos abordar neste post como ter um ambiente de desenvolvimento para o Hyperledger Besu e uma prova de conceito com Smart Contracts.
A documentação do Hyperledger Besu oferece um conjunto de tutorias para criação de cada nó de uma rede e também utilitários para ter um ambiente de desenvolvimento simplificado. O Quorum Developer Quickstart é um tutorial voltado para criação de redes privadas para ambientes de desenvolvimento. Neste tutorial, será demonstrado como criar uma rede com seus nós principais utilizando docker compose e alguns componentes externos para monitoramento da rede, como: Nodes Explorer, Sirato, Prometheus, Grafana, dentre outros.
Disponibilizamos neste repositório no Github uma rede de desenvolvimento criada com algumas alterações para reduzir o uso de memória em ambiente local e com uma prova de conceito utilizando Smart Contracts.
Os pré-requisitos para inicializar esta rede são, Docker e Docker Compose, para Windows, requer WSL2.
a) comando ./stop.sh vai parar os containers inicializados.
b) comando ./resume.sh vai inicializar os containers novamente.
c) comando ./remove.sh vai parar e remover os containers.
Os seguintes componentes da rede deverão ser criados:
Os restante dos containers são relacionados ao monitoramento da rede e interação com a rede.
Uma lista de endpoints deverá ser apresentada no console após a criação da rede, exemplo, um nó padrão com JSON-RPC, o Sirato e o Grafana.
A representação da rede criada deverá ser conforme a representada na imagem abaixo. As transações Ethereum serão interceptadas pelo Ethsigner proxy, as transações nos nós membros serão validadas pelo validators e os containers de observability receberão métricas e algumas aplicações externas, podendo fazer consultas na rede.
No diretório /smart-contracts-poc será possível encontrar exemplos de interações com a rede através de Smart Contracts. Os pré-requisitos para rodar este exemplo são:
Esta prova de conceito visa representar o backend de uma aplicação corporativa interagindo com uma rede blockchain, fazendo apenas consultas ou realizando transações, alterando o estado da rede.
Execute o comando $ ./run.sh para realizar a compilação dos SmartContracts, realizar os testes e executar o deploy dos contratos na rede local. Após executar o deploy de cada contrato, um bloco similar à imagem abaixo deverá ser exibido com informações como: o hash da transação e o endereço do SmartContract utilizado para realizar chamadas a este contrato.
Acesse o Sirato para consultar as transações. Também é possível recuperar o endereço do contrato, se necessário.
Pelo Grafana será possível acompanhar as métricas de propagação de blocos e outras métricas sobre os nós da rede.
Execute o comando $ yarn dev para inicializar o backend de nossa web api de teste. Ao aparecer a mensagem “Node Endpoints working :)” no console, será possível iniciar os testes.
Execute o comando abaixo para fazer uma consulta de dados no contrato RDContract:
curl –location –request GET ‘http://localhost:3030/rd’ –header ‘Content-Type: application/json’ –data-raw ”
O comando abaixo deverá fazer alterações no mesmo contrato, requer transação e altera o estado da rede:
curl –location –request POST ‘http://localhost:3030/rd’ –header ‘Content-Type: application/json’ –data-raw ‘{ “operation”: “buy”,”amounth”: “5”}’
O comando abaixo também realiza alteração no contrato e altera o estado da rede:
curl –location –request POST ‘http://localhost:3030/rd’ –header ‘Content-Type: application/json’ –data-raw ‘{ “operation”: “sell”,”amounth”: “5”}’
As chamadas se dão a qualquer nó membro da rede (não validadores) com Json-RPC habilitado, no nosso caso o container rpcnode. A interação com os smart contracts requer o endereço do contrato e o endereço do nó RPC. Foram utilizadas a libraries truffle/contract e truffle/hdwallet-provider no Nodejs para abstrair o protocolo Json-RPC e a comunicação com o contrato. Mais detalhes da implementação no arquivo RDContratctRepository.js.
Estas transações também podem ser monitoradas pelo Sirato:
Importante: Esta prova de conceito envolve o uso de chaves privadas em transações que, para fins de exemplo em ambiente de desenvolvimento, estão em arquivos de configuração. Porém, em ambiente controlado, deverão estar em locais seguros como vaults.
Este post foi criado para ajudar o desenvolvedor a explorar o universo blockchain com o Besu, uma ferramenta flexível que chamou a atenção por atender aos mais diversos tipos de segmentos. Explore o repositório Github deste post, estamos abertos a qualquer sugestão para melhorar este material e criar novas soulções a respeito.