WEB3DEV

Cover image for Como chamar qualquer API de um contrato inteligente do Solidity, parte 2
Diogo Jorge
Diogo Jorge

Posted on

Como chamar qualquer API de um contrato inteligente do Solidity, parte 2

Fazendo e implantando um contrato Requester (solicitante) para solicitar dados do Airnode

Image description

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
Enter fullscreen mode Exit fullscreen mode

Para construir todos os pacotes,

$ fio run build
Enter fullscreen mode Exit fullscreen mode

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.

Image description

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;
    }
}
Enter fullscreen mode Exit fullscreen mode

Parâmetros de Request

A função makeRequest() espera que os seguintes parâmetros façam uma solicitação válida.

  • airnode (endereço) e endpointId especificam o endpoint.
  • sponsore sponsorWallet (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ção decode() do objeto abi.

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.

Image description

Agora clique em compilar no lado direito do painel e compile o contrato inteligente.

Image description

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.

Image description

O _rrpAddress é o principal airnodeRrpAddress. Os contratos RRP já foram implantados na cadeia. Você pode verificar sua cadeia específica aqui.

Preencha o _rrpAddresse clique em Deploy. Confirme a transação em sua MetaMask e aguarde a implantação do Contrato Requester.

Image description

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.

Image description

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.

Image description

O endpointID pode ser encontrado no arquivo config.json.

Image description

Precisamos derivar a sponsorWalletatravé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
Enter fullscreen mode Exit fullscreen mode

Windows:

npx @api3/airnode-admin derive-sponsor-wallet-address ^
 --airnode-xpub xpub6CUGRUo... ^
 --airnode-address 0xe1...dF05s ^
 --sponsor-address 0xF4...dDyu9
Enter fullscreen mode Exit fullscreen mode

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).

Image description

Execute o comando para obter sua SponsorWallet.

Image description

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
Enter fullscreen mode Exit fullscreen mode

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.

Image description

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.

Image description

Aqui, podemos ver a última transação Fulfill.

Agora volte no Remix e verifique requestIdabaixo da opção Logs para a última transação.

Image description

Você também pode encontrar seu requestId abaixo da opção logs no Explorador de Blocos Mumbai da Polygon.

Image description

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.

Image description

Image description

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)