paint-brush
Cómo solicitar datos de una API REST a un contrato inteligente de Soliditypor@api3
38,920 lecturas
38,920 lecturas

Cómo solicitar datos de una API REST a un contrato inteligente de Solidity

por API36m2022/09/08
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coins Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Cómo solicitar datos de una API REST a un contrato inteligente de Solidity
API3 HackerNoon profile picture


por Vansh Wassan, ingeniero de integraciones y relaciones con desarrolladores @ API3

Twitter: @WassanVansh Github: vanshwassan

Parte I: implementar un Airnode en una API REST


Como todos sabemos, no es posible mediante un contrato inteligente acceder directamente a las API externas fuera de una cadena de bloques. Interactuar con datos fuera de la cadena mientras se trabaja con contratos inteligentes es un problema real para muchas dApps.


La cadena de bloques de Ethereum fue diseñada para ser completamente determinista mientras que Internet no lo era. Llamar a una API directamente suena fácil, pero en una cadena de bloques, requeriría que todos los nodos llamaran al mismo punto final al mismo tiempo y esperaran obtener los mismos datos para llegar a un consenso. Además, el concepto central de una cadena de bloques es su seguridad, que se deriva de una red descentralizada de validadores independientes que limitan deliberadamente su conexión con el mundo exterior.


Sin embargo, con API3 , puede tener oráculos propios operados directamente por los proveedores de API, llamados nodos de aire que proporciona datos a cualquier dApp en cadena *. * Como resultado, puede hacer que cualquier API REST sea fácilmente accesible para un contrato inteligente.


Saluda a ChainAPI

API de cadena es una plataforma que le permite integrar e implementar Airnode de código abierto con sus herramientas de implementación e integración paso a paso.


Para comenzar, vaya a ChainAPI API de cadena e inicie sesión conectando su MetaMask.

Se le pedirá que confirme y firme la transacción a través de su extensión MetaMask.


Asegúrese de estar usando una nueva billetera MetaMask con un mnemotécnico nuevo. Su mnemotécnico se utilizará más tarde para implementar el Airnode. Debe mantenerlo extremadamente seguro, ya que servirá como la "clave privada" de su Airnode implementado.


Cada vez que vuelvas a ChainAPI te volverás a conectar, usando MetaMask, para identificarte firmando un mensaje para la misma cuenta.


Complete el proceso de registro y asigne un nombre a su espacio de trabajo.


Workspaces le brinda una manera de invitar a otros usuarios a ayudar o colaborar con integraciones e implementaciones. Esto facilita la gestión de sus Airnode como equipo o la subcontratación del proceso mientras mantiene el control sobre sus integraciones e implementaciones.

Para cambiar su nombre en el futuro, haga clic en el nombre en la parte superior izquierda del tablero


Dentro de ChainAPI, podrá crear y administrar sus integraciones o implementaciones de Airnode navegando a los paneles "Integraciones" o "Implementar" en el panel de navegación de la izquierda.


Integrando tu Airnode

Para este tutorial, voy a usar API REST pública de dxFeed puntos finales para recuperar datos de existencias.


Para comenzar, seleccione la opción "Integrar API" en la parte superior derecha del tablero.


Ingrese los detalles sobre la API que está integrando.

Debe ingresar la URL base de su API junto con todos los puntos finales que desea integrar. Como es una API pública, no tiene esquemas de seguridad.



Ahora puede comenzar agregando todos sus puntos finales.


Aquí, la API REST de dxFeed tiene un punto final GET /events.json con algunos parámetros de consulta. Puede agregar todos los parámetros que requiere su API.


Ahora necesita agregar todos los parámetros y definir a dónde van (consulta/encabezado/ruta/cookie). Aquí, todos los parámetros son parámetros de consulta y el usuario debe definirlos.


He fixed el parámetro de format porque quiero que devuelva la respuesta en json .

Parámetros reservados defina qué parte de la respuesta se seleccionará y codificará antes del cumplimiento. Puede ser definido por el solicitante, pero también podemos codificarlo en la configuración de Airnode.

Después de agregar todos los puntos finales requeridos, ahora puede presionar finalizar y prepararse para implementar su Airnode.


Desplegando su Airnode

Para implementar el Airnode, vaya a la sección de implementación en el menú. Asigne un nombre a su implementación y seleccione la integración que desea usar con ella.


Seleccione su proveedor de nube donde desea que se implemente su Airnode.


Ahora seleccione las cadenas para su implementación. También puede seleccionar varias redes y proveedores si lo desea en varias cadenas.


Aquí, vamos a tener nuestro Airnode en Polygon Mumbai Testnet.

Revise su configuración por última vez. Si todo parece correcto, haga clic en siguiente.


Descarga todos los archivos de configuración de Airnode y extráelos.

Así es como debería verse el directorio de configuración de Airnode:

config contiene config.json y secrets.env .


  • El archivo config.json se usa durante la implementación/reimplementación de un Airnode para configurar su comportamiento y proporcionar asignaciones de operaciones API.

  • El archivo secrets.env contiene valores para config.json que deben mantenerse en secreto.


El directorio de salida tendrá el recibo.json que se generará después de implementar con éxito el Airnode.


El archivo aws.env contiene las credenciales de AWS para las implementaciones dirigidas a AWS.


Como estamos utilizando AWS como nuestro proveedor de la nube, debemos agregar nuestras claves de acceso de AWS IAM con la política de acceso de administrador. Puedes referirte a esto video si no está seguro de cómo obtenerlos.


El README.md contiene todos los pasos para implementar el airnode proporcionado en un formato de descuento.


Abra aws.env y agregue su AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY que acaba de crear.

Abra config/secrets.env y agregue su billetera mnemotécnica. Asegúrese de mantenerlo extremadamente seguro, ya que servirá como la "clave privada" de su Airnode implementado. A partir de la frase mnemotécnica, Airnode puede asignar direcciones de billetera tanto a la instancia de Airnode como a sus usuarios.

También debe agregar la URL de su proveedor de Blockchain. Aquí, vamos a utilizar Alchemy para obtener una URL de proveedor de red de prueba de Polygon Mumbai gratuita. Puede usar cualquier proveedor de blockchain que admita su red
También puede configurar su * Pasarela Http *cartas credenciales. Es un servicio opcional que permite a los usuarios autenticados realizar solicitudes HTTP a su instancia de Airnode implementada para realizar pruebas. ChainAPI ya ha generado estas claves para usted, pero puede cambiarlas si lo desea.

Un paso final antes de implementar su Airnode es configurar Autorizadores en el archivo config.json .


Cuando un Airnode recibe una solicitud, puede usar contratos de autorización en cadena para verificar si se justifica una respuesta. Esto permite que Airnode implemente una amplia variedad de políticas y autorice el acceso del solicitante al contrato a su API subyacente.


Para el alcance de este tutorial, podemos configurar la matriz del autorizador vacía en config.json para que cualquier contrato del solicitante pueda acceder al Airnode.


Ahora está listo para implementar su Airnode. Asegúrese de tener Docker instalado en su sistema.


Copie y pegue los siguientes comandos en su terminal en el directorio raíz de su paquete de implementación.


ventanas

 docker run -it --rm ^ --env-file aws.env ^ -v "%cd%/config:/app/config" ^ -v "%cd%/output:/app/output" ^ api3/airnode-deployer:0.7.3 deploy


OSX

 docker run -it --rm \ --env-file aws.env \ -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) \ -v "$(pwd)/config:/app/config" \ -v "$(pwd)/output:/app/output" \ api3/airnode-deployer:0.7.3 deploy


linux

 docker run -it --rm \ --env-file aws.env \ -e USER_ID=$(id -u) -e GROUP_ID=$(id -g) \ -v "$(pwd)/config:/app/config" \ -v "$(pwd)/output:/app/output" \ api3/airnode-deployer:0.7.3 deploy

Su Airnode ya está desplegado. Puede comprobar su estado en la sección de implementación.


Echa un vistazo a Github Repo para esta guía aquí .


Parte II: Cómo codificar un contrato de Solicitante para llamar y leer los datos del Airnode.


En la Parte I, integramos e implementamos con éxito un Airnode a través de ChainAPI. Ahora codificaremos un contrato de solicitante simple para llamar y leer datos de nuestro Airnode.

Antes de comenzar, asegúrese de configurar el Airnode Monorepo en su sistema. Siga el Léame para instalar y compilar todas las dependencias y paquetes para poder acceder a la CLI de Airnode.


Clona el Airnode Monorepo.

 $ git clone https://github.com/api3dao/airnode.git .


Para instalar las dependencias,

 $ yarn run bootstrap


Para construir todos los paquetes,

 $ yarn run build




Un Airnode es un oráculo propio que envía datos API fuera de la cadena a su contrato en la cadena. Hace una solicitud a la cadena contrato protocolo RRP ( AirnodeRrpV0.sol ) que agrega la solicitud a los registros de eventos. El Airnode fuera de la cadena luego accede a los registros de eventos, obtiene los datos de la API y realiza una devolución de llamada al solicitante.

https://docs.api3.org/airnode/v0.8/grp-developers/


<https://docs.api3.org/airnode/v0.8/grp-developers/ ](https://docs.api3.org/airnode/v0.8/grp-developers/)


A * Solicitante *es un contrato que desencadena una solicitud de Airnode. Para hacerlo, el solicitante debe estar patrocinado y realizar la solicitud utilizando una billetera de patrocinador que coincida.

El Solicitante luego llama al contrato de protocolo, que emite un evento de cadena de bloques con los parámetros de solicitud. Airnode escucha los eventos emitidos por el contrato AirnodeRrpV0 . Durante el siguiente ciclo de ejecución, Airnode obtiene los parámetros de solicitud del evento emitido.


Un Airnode es un oráculo propio que envía datos API fuera de la cadena a su contrato en la cadena. Hace una solicitud a la cadena contrato protocolo RRP ( AirnodeRrpV0.sol ) que añade el

Solicitante de codificación.sol

El Contrato del Solicitante tendrá dos funciones principales, makeRequest() y fulfill() .


La función makeRequest() llamará a la función makeFullRequest() del AirnodeRrpV0.sol contrato de protocolo que añade la solicitud a su almacenamiento. El objetivo fuera de la cadena nodo de aire recopila la solicitud del almacenamiento de AirnodeRrpV0.sol y responde utilizando la función fulFill() de AirnodeRrpV0.sol.

Parámetros de solicitud

La función makeRequest() espera los siguientes parámetros para realizar una solicitud válida.

  • airnode (dirección) y endpointId especifican el punto final.
  • sponsor y sponsorWallet (direcciones) especifican qué billetera se utilizará para cumplir con la solicitud.
  • Los parameters especifican la API y Parámetros reservados (ver Especificaciones de Airnode ABI para saber cómo se codifican) Codificaremos los parámetros fuera de la cadena usando la biblioteca @airnode-abi .

Parámetros de respuesta

La devolución de llamada al Solicitante contiene dos parámetros:

  • requestId : Primero se adquiere al realizar la solicitud y se pasa aquí como referencia para identificar la solicitud a la que se destina la respuesta.
  • data : En caso de una respuesta exitosa, estos son los datos solicitados que han sido codificados y contienen un marca de tiempo además de otros datos de respuesta. Decodificarlo usando la función decode() del objeto abi .

Compilar el contrato

Para desplegar el Contrato Solicitante, vamos a utilizar Remezclar IDE . Es un IDE en línea que permite desarrollar, implementar y administrar contratos inteligentes para cadenas de bloques compatibles con EVM.


Haz un contrato y pégalo en el Solicitante.sol código.

Ahora presione compilar en el lado derecho del tablero y compile el contrato inteligente.

Ahora estamos listos para implementar nuestro Solicitante.

Despliegue del Solicitante

Como vamos a implementar el contrato en Polygon Mumbai Testnet, asegúrese de tener suficiente MATIC en su billetera para implementar el Solicitante y luego financiar el sponsorWallet más tarde. Puedes conseguir algo de la Grifo de Bombay .


Diríjase a Implementar y ejecutar Transacciones y seleccione Proveedor inyectado: opción MetaMask en Entorno. Conecta tu MetaMask. Asegúrate de estar en Mumbai Testnet.

El _rrpAddress es el airnodeRrpAddress principal. Los contratos RRP ya se han implementado en la cadena. Puedes consultar por tu cadena específica aquí .


Complete la _rrpAddress y haga clic en Implementar. Confirme la transacción en su MetaMask y espere a que implemente el contrato del solicitante.


Asegúrese de estar en Polygon Mumbai Testnet

Llamando al Solicitante

Tan pronto como se implemente su contrato, diríjase a Implementar y ejecutar transacciones y haga clic en el menú desplegable para su Solicitante en Contratos implementados.


Ahora seleccione el menú desplegable makeRequest para ver todos los parámetros que necesita pasar para realizar una solicitud completa al Airnode.


Aquí, debe pasar su airnode (dirección de Airnode), endpointID , sponsor (el propio Solicitante), sponsorWallet y parameters para llamar a la función makerequest() .


Podemos encontrar el airnode en el receipt.json en el directorio de salida que obtuvimos cuando implementamos nuestro Airnode.


El endpointID se puede encontrar en el archivo config.json .


Necesitamos derivar el sponsorWallet a través del comando Airnode CLI que realizará la llamada real. También necesitamos financiarlo con algo de MATIC para cubrir el costo del gas.


Una vez que haya configurado la CLI de Airnode e instalado y creado todas las dependencias y paquetes, ejecute el siguiente comando para derivar su sponsorWallet :

Linux:

 npx @api3/airnode-admin derive-sponsor-wallet-address \ --airnode-xpub xpub6CUGRUo... \ --airnode-address 0xe1...dF05s \ --sponsor-address 0xF4...dDyu9

Ventanas:

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


Su airnode-address airnode y airnode-xpub (la clave pública extendida de Airnode ) se pueden encontrar en el mismo receipt.json. La sponsor-address será la dirección del propio contrato del Solicitante (el que acaba de implementar).


Ejecute el comando para obtener su sponsorWallet .


Financie el sponsorWallet con alguna prueba MATIC.


Los parámetros deben codificarse en bytes32 antes de enviarlo. Vamos a utilizar la @airnode-abi para codificar los parámetros fuera de la cadena y luego enviarlos al Solicitante.


Puedes ir y clonar el repositorio de este tutorial y configurarlo.


Ejecute el siguiente comando para obtener sus parameters codificados:

 node .\src\encodeParams.js


Ahora tiene todos los parámetros que necesita para ejecutar la función makeRequest . Rellene todos los campos y haga clic en Transact.


Nota: El sponsor aquí será la dirección del contrato de solicitante que acaba de implementar.

Haga clic en realizar la transacción, confirme la transacción en MetaMask y espere a que se complete la transacción.

Ahora puedes dirigirte a https://mumbai.polygonscan.com y verifique su sponsorWallet para ver si hay nuevas transacciones.


Es posible que deba esperar un momento mientras Airnode llama a la función de fulfill() en AirnodeRrpV0.sol que, a su vez, devolverá la llamada al contrato del solicitante en la dirección de fulfillAddress utilizando la función fulfillFunctionId para entregar data .


Aquí podemos ver nuestra última transacción Fulfill .


Ahora regrese a Remix y requestId en los registros para la última transacción.

También puede encontrar su requestId de solicitud en los registros en Polygon Mumbai Block Explorer.

Copie su requestId de solicitud y péguelo en el método de datos fulfilledData para decodificar la respuesta. Haga clic en llamar y le mostrará su respuesta API.


Aquí, solicitamos el precio de las acciones de Tesla.

Ahora implementó con éxito un Airnode e hizo un contrato de solicitante para obtener datos de él. También puede referirse a este repositorio por todo el código que he usado para este tutorial.


¿Alguna pregunta? Verificar Servidor de discordia de API3 ¡y deja tus consultas en el canal de soporte para desarrolladores!