Aula 129: Oráculos e Dados Externos
No campo do blockchain e dos contratos inteligentes, o termo "oráculo" refere-se a um serviço que fornece dados externos à blockchain. Como os contratos inteligentes não podem acessar dados fora do seu próprio ambiente de blockchain, os oráculos atuam como intermediários, permitindo que os contratos interajam com dados do mundo real. Esta aula explorará o que são os oráculos, como funcionam e fornecerá exemplos de código utilizando oráculos em Solidity.
O que são Oráculos?
Os oráculos atuam como pontes entre a blockchain e o mundo externo. Eles podem fornecer diferentes tipos de dados, como feeds de preços, dados meteorológicos e muito mais. Essas informações podem ser cruciais para certos contratos inteligentes que precisam ser executados com base em condições externas.
Tipos de Oráculos
- Oráculos de Software: Esses oráculos buscam dados de fontes online ou bancos de dados.
- Oráculos de Hardware: Esses são dispositivos físicos que geram dados e os enviam para a blockchain.
- Oráculos de Consenso: Esses agregam dados de várias fontes para alcançar um consenso sobre as informações fornecidas.
Por que usar Oráculos?
- Acesso a Dados do Mundo Real: Contratos inteligentes podem utilizar dados fora da blockchain.
- Execução Automatizada: Os contratos podem ser executados com base em eventos do mundo real.
- Aumento da Confiança: Fontes de dados confiáveis podem aumentar a credibilidade das transações.
Como Funcionam os Oráculos
Os oráculos operam fora da cadeia e enviam dados para a blockchain. Os seguintes passos ilustram um fluxo típico ao utilizar um oráculo:
- Solicitar Dados: Um contrato inteligente envia uma solicitação de dados ao oráculo.
- Buscar Dados: O oráculo recupera os dados necessários de uma fonte externa.
- Enviar Dados: O oráculo envia os dados recuperados de volta para o contrato inteligente na blockchain.
Exemplo: Usando um Oráculo Simples
Neste exemplo, criaremos um oráculo simples que busca um preço para um token, demonstrando como conectar um contrato inteligente a uma fonte de dados externa usando um oráculo fictício.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract OraculoDePreco {
// O preço do token (em wei)
uint256 public precoToken;
// Evento para registrar atualizações de preço
event PrecoAtualizado(uint256 novoPreco);
// Função para atualizar manualmente o preço do token
function atualizarPreco(uint256 _novoPreco) external {
precoToken = _novoPreco;
emit PrecoAtualizado(_novoPreco);
}
// Função para recuperar o preço mais recente do token
function obterPrecoToken() external view returns (uint256) {
return precoToken;
}
}
Explicação do Exemplo
- Declaração do Contrato: Declaramos um contrato
OraculoDePreco
que armazenará o preço do token. - Variável de Estado:
precoToken
armazena o preço atual do token. - Declaração de Evento: O evento
PrecoAtualizado
nos permite rastrear quando o preço muda. - Função para Atualizar Preço: A função
atualizarPreco
permite que um serviço externo (ou usuário) atualize o preço do token. Em um oráculo de produção, essa função idealmente seria chamada automaticamente pelo oráculo quando ele obtivesse o preço mais recente. - Função para Recuperar Preço: A função
obterPrecoToken
permite que os usuários busquem o preço atual.
Interagindo com o Oráculo de Preço
Na prática, os oráculos são frequentemente implementados usando um serviço que puxa automaticamente dados do mundo externo. Por exemplo, você pode utilizar a rede de oráculos descentralizada da Chainlink, que permite que você solicite feeds de dados de forma confiável.
Exemplo: Integrando Oráculo da Chainlink
Aqui está uma integração de exemplo usando o feed de preços da Chainlink, que é uma solução de oráculo popular:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract OraculoDePrecoChainlink {
AggregatorV3Interface internal feedDePreco;
/**
* Rede: Kovan
* Agregador: ETH/USD
* Endereço: 0x9326BFA02ADD2366b30bacB125260Af641031331
*/
constructor() {
feedDePreco = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);
}
/**
* Retorna o preço mais recente
*/
function obterPrecoMaisRecente() public view returns (int) {
(
,
int preco,
,
,
) = feedDePreco.latestRoundData();
return preco;
}
}
Explicação do Exemplo da Chainlink
- Importar Interface da Chainlink: Importamos a
AggregatorV3Interface
fornecida pela Chainlink. - Construtor: Definimos o contrato para apontar para um endereço específico de feed de preços para ETH/USD na rede de teste Kovan.
- Buscando o Preço Mais Recente: A função
obterPrecoMaisRecente
busca o preço mais recente usando o oráculo da Chainlink.
Conclusão
Os oráculos desempenham um papel fundamental em tornar os contratos inteligentes úteis ao fornecer acesso a dados externos. Compreender como implementar oráculos de forma eficaz permite que os desenvolvedores construam aplicações descentralizadas (dApps) sofisticadas que podem interagir com informações do mundo real. Na prática, aproveitar soluções de oráculo estabelecidas, como a Chainlink, pode agilizar significativamente a integração de dados externos em seus contratos inteligentes.