Escrito por Wilson Marcos Ferreira Correa,
5 minutos de leitura
Hyperledger Besu: a rede BlockChain do Real Digital
Saiba como explorar o universo blockchain com o Hyperledger Besu, uma ferramenta flexível que chamou a atenção por ter sido escolhida para o projeto do piloto da moeda virutal do Bacen.
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.
Criando o ambiente de desenvolvimento para o Hyperledger Besu:
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.
Inicializando a rede:
Os pré-requisitos para inicializar esta rede são, Docker e Docker Compose, para Windows, requer WSL2.
- Acesse o diretório /local-network, e execute o comando ./run.sh para criar os containers e inicializar a rede pela primeira vez.
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:
- Json-RPC Node: Um nó padrão da rede Besu com API Json-RPC habilitada. Através deste nó será possível fazer interações com a rede, exemplo, fazer deploy e interagir com Smart Contracts.
- Json-RPC Websocket Node: Um nó padrão da rede blockchain com API Json-RPC com Websocket. Utilizado para operações de notificação pub/sub.
- Validators (1, 2 e 3): Considerando uma rede privada, são membros da rede com uma conta privada previamente aprovada, responsáveis por validar blocos e transações na rede.
- Ethsigner Proxy: Realiza assinatura de transações direcionadas ao Ethereum Client.
- Participante 1: Um membro padrão em uma rede privada, foi incluído apenas como exemplo para permitir visualização da sincronização de blocos ao executar transações.
Os restante dos containers são relacionados ao monitoramento da rede e interação com a rede.
- Web block explorer: Permite monitorar o estado da rede e funciona também como um playground para Smart Contracts integrado ao MetaMask.
- Sirato: Permite visualizar transações na rede, visualizar operações de deploy de Smart Contracts e recuperar endereços de Smart Contracts disponíveis na rede.
- Prometheus: O Besu possui um modelo robusto de métricas permitindo o uso de ferramentas de referência para observability como OpenTelemetry e Prometheus. Este container faz o papel de coletar métricas disponíveis na rede.
- Grafana: Dashboards com visualização de métricas coletadas.
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.
Utilizando Smart Contracts:
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:
- Conhecimento básico sobre Smart Contracts.
- Rede Besu inicializada localmente.
- Conhecimento básico de Nodejs, Truffle e Solidity.
- NPM e Yarn instalados.
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.