WEB3DEV

Cover image for Implementando um oracle blockchain simples na Ethereum
Fatima Lima
Fatima Lima

Posted on

Implementando um oracle blockchain simples na Ethereum

A solução demonstrada neste artigo utiliza as seguintes tecnologias: Blockchain Ethereum, linguagem de programação Solidity para contratos inteligentes e Node.js com a biblioteca ethers para a implementação do serviço de backend.

Como exemplo, usarei a dApp para comprar ingressos para a conferência para demonstrar os benefícios que os oracles de blockchain podem trazer.

Contextualização

Os aplicativos descentralizados (dApps) que funcionam apenas dentro de uma blockchain são limitados na funcionalidade que eles podem fornecer. Os dApps que têm uma rica funcionalidade para seus usuários exigem muitos componentes que ficam fora da blockchain. Neste artigo, quero descrever um desses componentes - oracles (oráculos) de blockchain.

Devido ao design determinístico da Ethereum, os contratos inteligentes executados nela não podem ler os dados armazenados fora da rede da blockchain. Os oracles de blockchain permitem que os contratos inteligentes tenham acesso a sistemas externos à blockchain e se conectem a fontes de dados existentes.

Assim, basicamente, você pode conectar o dApp com sua API para obter as informações necessárias de seus serviços de backend.

Solução

A implementação mais simples do oracle de blockchain é uma alimentação de dados. Ela consiste em duas partes: contrato inteligente on-chain (na cadeia) e serviço off-chain (normalmente chamado de nó oracle).

O serviço off-chain empurra os dados para um contrato inteligente de oracle on-chain, de modo que qualquer outro contrato possa chamar este oracle para extrair os dados.

Vamos criar um diagrama para visualizar a solução:

Image description

Solução de oracle de blockchain

 

Implementação do Oracle on-chain

O primeiro componente da implementação on-chain é uma interface do contrato inteligente do oracle.

A interface permite que contratos inteligentes de dApps interajam com o oracle da blockchain.

Image description

TicketsFeed — interface do oracle da blockchain

 
O segundo componente das implementações on-chain é o contrato inteligente do oracle da blockchain. Este contrato inteligente deve implementar a interface definida.

Image description

TicketsFeed — contrato inteligente do oracle da blockchain

 
Além da interface, o contrato inteligente do oracle deve implementar uma lógica para restringir a capacidade de mudar seu estado. Uma das opções é permitir a execução da função setData somente pelo proprietário do contrato.

 
O OpenZeppelin fornece a implementação padrão de fato para isso com sua interface Ownable e o modificador onlyOwner.
 
O último componente da implementação on-chain é a própria dApp na forma do contrato inteligente.

Image description

Conference — o dApp que usa um oracle de blockchain

 
No exemplo apresentado, um endereço de oracle de blockchain é passado como um argumento no construtor. Chamando a interface com o endereço fornecido, podemos obter uma instância do oracle da blockchain que será usada para interagir com ele.
 
A função buyTicket chama a função getData do oracle para obter os dados necessários e construir a lógica de compra de bilhetes com base nesses dados.

 

Implementação do Oracle off-chain

A implementação do nó Oracle é bastante simples, ela chama a função setData para mover os dados para a blockchain.

Há algumas coisas que precisam ser destacadas.

Antes de mais nada, precisamos de um endereço do contrato inteligente do oracle da blockchain. Em segundo lugar, precisamos de uma ABI do oracle da blockchain que possa ser recuperada do arquivo compilado do oracle do contrato inteligente.

Além disso, o signatário aqui deve ser o mesmo que o usado para implantar o contrato inteligente TicketsFeed, pois verificamos se o chamador é o proprietário.

Image description

TicketsFeed — serviço de nó do oracle

 

Melhorias

A solução atual é simples, mas mesmo esta solução pode ser modificada para atender a alguns requisitos adicionais.

Possibilidade de atualização

Ao utilizar interfaces não estamos bloqueados com a implementação atual do oracle da blockchain. Uma nova versão com funcionalidades adicionais pode ser introduzida, com apenas uma nota, ela deve suportar as interfaces já definidas.

Portanto, a única coisa que os dApps devem fazer é apenas criar uma nova instância do oracle com um novo endereço (a função para fazer isso deve ser implementada com antecedência).

Image description

Conference — como instanciar novamente o oracle da blockchain

 
Segurança

Caso você precise dar suporte a vários operadores de nós e queira ter acesso mais granular e baseado em permissão, a interface Ownable pode ser facilmente alterada para AccessList.

Neste caso, pode ser especificada uma lista de endereços que pode invocar a função setData para atualizar o estado.

Image description

TicketsFeed — funcionalidade do AccessControl

 

Resumo

Os Oracles de blockchain desempenham um papel importante nas dApps. Eles ajudam a trazer muitas funcionalidades que de outra forma não estariam disponíveis.

A alimentação de dados é a implementação mais simples dos oracles, mas ao mesmo tempo, tem um grande benefício. As dApps podem recuperar as informações necessárias e responder a um usuário em uma transação.

Em cenários de uso mais avançados, você deverá utilizar diferentes implementações, como resposta a solicitações, onde contratos inteligentes podem solicitar dados arbitrários.

Todo o código pode ser encontrado AQUI.

Esse artigo foi escrito por Borys Semerenko e traduzido por Fátima Lima. O original pode ser lido aqui.

Top comments (0)