Fazendo e implantando um contrato Requester (solicitante) para solicitar dados do Airnode
foto por GuerrillaBuzz Crypto PR sobre Unsplash
Esta é a segunda parte do tutorial onde implantamos o Contrato Requester e solicitamos dados do Airnode. Confira a primeira parte aqui.
Na Parte I, integramos e implantamos com sucesso um Airnode por meio do ChainAPI. Agora vamos codificar um contrato requester simples para chamar e ler dados de nosso Airnode.
Antes de começar, certifique-se de configurar o Airnode Monorepo em seu sistema. Siga o Readme para instalar e construir todas as dependências e pacotes para poder acessar o Airnode CLI.
Clone o Airnode Monorepo.
$ git clone https://github.com/api3dao/airnode.git
.
Para instalar as dependências,
$ fio run bootstrap
Para construir todos os pacotes,
$ fio run build
Um Airnode é um oráculo primário que envia dados de API off-chain para seu contrato on-chain. Ele faz um pedido ao contrato on-chain de protocolo RRP (AirnodeRrpV0.sol) que adiciona a solicitação aos logs (registros) de eventos. O Airnode off-chain acessa os logs de eventos, obtém os dados da API e executa um retorno de chamada para o requester.
https://docs.api3.org/airnode/v0.8/grp-developers/
um requester é um contrato que aciona uma solicitação Airnode. Para isso, o requester precisa ser financiado e fazer a solicitação usando uma carteira de sponsor (financiador) compatível.
O Requester então chama o contrato de protocolo, que emite um evento blockchain com os parâmetros da solicitação. O Airnode escuta os eventos emitidos pelo contrato AirnodeRrpV0. Durante o próximo ciclo de execução, o Airnode obtém os parâmetros de solicitação do evento emitido.
Codificando Requester.sol
O Contrato Requester terá duas funções principais, makeRequest()
e fulfill()
. A função makeRequest()
chamará a funçãomakeFullRequest()
do contrato de protocolo AirnodeRrpV0.sol que adiciona a solicitação ao seu armazenamento. O alvo Airnode off-chain reúne a solicitação do armazenamento do AirnodeRrpV0.sole responde usando a função
fulfill()
do AirnodeRrpV0.sol.
//SPDX-License-Identifier: MIT
pragma solidity 0.8.9;
import "@api3/airnode-protocol/contracts/rrp/requesters/RrpRequesterV0.sol";
// Um solicitante que retornará o preço das ações da Tesla chamando o dxFeed airnode.
contract Requester is RrpRequesterV0 {
mapping(bytes32 => bool) public incomingFulfillments;
mapping(bytes32 => int256) public fulfilledData;
constructor(address _rrpAddress) RrpRequesterV0(_rrpAddress) {}
// A principal função makeRequest que acionará a solicitação Airnode.
function makeRequest(
address airnode,
bytes32 endpointId,
address sponsor,
address sponsorWallet,
bytes calldata parameters
) external {
bytes32 requestId = airnodeRrp.makeFullRequest(
airnode,
endpointId,
sponsor,
sponsorWallet,
address(this),
this.fulfill.selector,
parameters
);
incomingFulfillments[requestId] = true;
}
function fulfill(bytes32 requestId, bytes calldata data)
external
onlyAirnodeRrp
{
require(incomingFulfillments[requestId], "No such request made");
delete incomingFulfillments[requestId];
int256 decodedData = abi.decode(data, (int256));
fulfilledData[requestId] = decodedData;
}
}
Parâmetros de Request
A função makeRequest()
espera que os seguintes parâmetros façam uma solicitação válida.
-
airnode
(endereço) eendpointId
especificam o endpoint. -
sponsor
esponsorWallet
(endereços) especificam qual carteira será usada para atender à solicitação. -
Parameters
especificam a API e Parâmetros reservados (ver Especificações ABI do Airnode para saber como eles são codificados). Codificaremos os parâmetros off-chain usando a biblioteca@airnode-abi
.
Parâmetros de resposta
O retorno de chamada para o _Requester _contém dois parâmetros:
-
RequestId
: Adquirido inicialmente ao fazer o pedido e aqui passado como referência para identificar o pedido a que se destina a resposta. -
Data
: No caso de uma resposta bem-sucedida, estes são os dados solicitados que foram codificados e contêm um timestamp além de outros dados de resposta. Decodifique-o usando a funçãodecode()
do objetoabi
.
Compilando o Contrato
Para implantar o contrato Request, vamos usar Remix IDE. É um IDE online que permite desenvolver, implantar e administrar contratos inteligentes para Blockchains compatíveis com EVM.
Faça um contrato e cole no código Requester.sol.
Agora clique em compilar no lado direito do painel e compile o contrato inteligente.
Agora estamos prontos para implantar nosso Requester.
Implantando o Requester
Como vamos implantar o contrato na Testnet Mumbai da Polygon, certifique-se de ter MATIC suficiente em sua carteira para implantar o Requester e, em seguida, financiar a sponsorWallet
mais tarde. Você pode obter alguns na Faucet (torneira) da Mumbai.
Vá para deploy & run transactions e selecione Injected Provider — opção MetaMask em Environment. Conecte sua MetaMask. Verifique se você está na Testnet Mumbai.
O _rrpAddress
é o principal airnodeRrpAddress. Os contratos RRP já foram implantados na cadeia. Você pode verificar sua cadeia específica aqui.
Preencha o _rrpAddress
e clique em Deploy. Confirme a transação em sua MetaMask e aguarde a implantação do Contrato Requester.
Certifique-se de que você está na Testnet Mumbai da Polygon
Chamando o requester
Quando seu contrato for implantado, vá para deploy & run transactions e clique no menu suspenso do seu requester em Contratos implantados.
Agora selecione o dropdown makeRequest
para ver todos os parâmetros pelos quais precisa passar para fazer uma solicitação completa para o Airnode.
Aqui, você precisa passar seu airnode
(endereço Airnode), endpointID
, sponsor
(o próprio Requester), sponsorWallet
e parameters
para chamar a função makeRequest()
.
Podemos encontrar o airnode
no receipt.json
no diretório de saída obtido quando implantamos nosso Airnode.
O endpointID
pode ser encontrado no arquivo config.json
.
Precisamos derivar a sponsorWallet
através do comando CLI do Airnode que fará a chamada real. Também precisamos de financiar com algum MATIC para cobrir o custo do gás.
Depois de configurar a CLI do Airnode, instalar e construir todas as dependências e pacotes, execute o seguinte comando para derivar sua sponsorWallet
:
Linux:
npx @api3/airnode-admin derive-sponsor-wallet-address \
--airnode-xpub xpub6CUGRUo... \
--airnode-address 0xe1...dF05s \
--sponsor-address 0xF4...dDyu9
Windows:
npx @api3/airnode-admin derive-sponsor-wallet-address ^
--airnode-xpub xpub6CUGRUo... ^
--airnode-address 0xe1...dF05s ^
--sponsor-address 0xF4...dDyu9
Seu airnode-address
e airnode-xpub
(a chave pública estendida do Airnode) podem ser encontrados no mesmo receipt.json
. O endereço do financiador será o endereço do próprio contrato do Requester (aquele que você acabou de implantar).
Execute o comando para obter sua SponsorWallet
.
Financie a sponsorWallet com algum MATIC de teste.
Os parâmetros devem ser codificados em bytes32
antes de serem enviados. Vamos usar a biblioteca @airnode-abi
para codificar os parâmetros off-chain e depois enviá-los para o requester.
Você pode configurar clonando o repositório deste tutorial.
Execute o seguinte comando para obter seus parâmetros codificados:
node .\src\encodeParams.js
Agora você tem todos os parâmetros necessários para executar a função makeRequest
. Preencha todos os campos e clique em Transact.
Nota: O sponsor
aqui será o endereço do Contrato requester que você acabou de implantar.
Clique em transact, confirme a transação na MetaMask e aguarde a conclusão da transação.
Agora você pode ir para https://mumbai.polygonscan.com e verificar suasponsorWallet
para novas transações.
Você pode precisar esperar um pouco enquanto o Airnode chama a função fulfill()
em AirnodeRrpV0.sol que, por sua vez, chamará de volta o contrato requester em fulfillAddress
usando a função fulfillFunctionId
para entregar os dados.
Aqui, podemos ver a última transação Fulfill.
Agora volte no Remix e verifique requestId
abaixo da opção Logs para a última transação.
Você também pode encontrar seu requestId
abaixo da opção logs no Explorador de Blocos Mumbai da Polygon.
Copie seu requestId
e cole-o no método fulfilledData
para decodificar a resposta. Clique em call e você verá a resposta da API. Aqui, solicitamos o preço das ações da Tesla.
Agora você implantou com sucesso um Airnode e fez um Contrato requester para ler os dados dele. Você também pode consultar este repositório para todo o código que usei para este tutorial.
Obrigado pela leitura.
Alguma pergunta? Confira o Servidor de discord da API3 e tire suas dúvidas lá!
Este artigo foi escrito por Vansh Wassan e traduzido por Diogo Jorge. O artigo original pode ser encontrado aqui.
Latest comments (0)