El contrato Solidity llama al oráculo ChainLink [tutorial]

En este tutorial, aprenderemos cómo buscar en Chainlink Market para encontrar un oráculo Chainlink (Oracle) que satisfaga las necesidades, y cómo escribir un contrato inteligente de Solidity para lograr la función de acceder a datos externos de blockchain (como precios de divisas) a través del oráculo.

Utilice su propio desarrollo de aplicaciones Ethernet Square de aprendizaje de idiomas familiar : Java | Php | Python | .Net / C # | golang | Node.JS | Flutter / Dart

Debido a la naturaleza del ecosistema blockchain, es imposible acceder directamente a datos fuera de la cadena de contratos inteligentes en la cadena. Sin embargo, Chainlink proporciona una plataforma para los oráculos de blockchain, que actúan como un puente entre los datos dentro y fuera de la cadena. El oráculo permite que los contratos inteligentes obtengan datos desde fuera de la cadena de bloques.

Cada nodo de Oracle se puede configurar para realizar varias tareas, según los adaptadores que admita. Algunos de estos adaptadores incluyen implementaciones de HTTP GET, HTTP POST, JSON Parse, Multiply, etc.

1. Introducción al oráculo Chainlink

Supongamos que queremos crear un contrato inteligente que responderá de manera diferente según el precio de Ethereum USD en CoinGecko. Sabemos que no hay forma de que los contratos inteligentes llamen a API HTTP externas, pero los nodos de Oracle sí pueden.

A través del procesamiento del ciclo de solicitud-respuesta, el contrato inteligente puede solicitar datos del nodo de Oracle, que está configurado para realizar solicitudes HTTP GET e implementar una función de devolución de llamada para que Oracle ejecute la respuesta:
Inserte la descripción de la imagen aquí

No podemos simplemente usar cualquier oráculo, porque cada oráculo está configurado para realizar tareas específicas, dependiendo de los adaptadores que admita. Para encontrar un oráculo de alta calidad que cumpla con los requisitos, debemos utilizar un servicio de lista como Chainlink Market .

2. Utilice Chainlink Market para buscar oráculos que satisfagan sus necesidades

El servicio de lista de oráculo de Chainlink nos ayuda a encontrar el oráculo que cumple con los requisitos. Las API populares suelen tener implementaciones de Oracle preconfiguradas para ciertas solicitudes de endpoint, lo que facilitará nuestro desarrollo. Escriba "CoinGecko" en la barra de búsqueda de la página de inicio de Chainlink Market y podemos confirmar si algún oráculo ha implementado el punto final CoinGecko requerido:

Inserte la descripción de la imagen aquí

Como se muestra en la imagen de arriba, ¡obtuvimos algunos resultados!

La sección "Nodos" enumera los nodos de Oracle que coinciden con la cadena de búsqueda. Esto puede significar que admiten trabajos que recuperan datos de la API de CoinGecko. De los tres nodos disponibles, Omniscience-Ropsten ha sido verificado (marcado con un círculo), lo que demuestra su credibilidad. Además, tiene el mayor número de trabajos en ejecución (trabajos).

Desplazándose hacia abajo, podemos ver ETH-USD CoinGecko bajo el título de Trabajos. Esto parece perfecto porque parece describir con precisión los datos que queremos recuperar y usar nodos verificados. Haga clic en el enlace para ver más información sobre el trabajo:

Inserte la descripción de la imagen aquí

La figura anterior muestra los detalles del nodo de Oracle. A la izquierda (en el rectángulo rojo) está la dirección en cadena de Oracle. Si desea utilizar este oráculo, debe escribir la dirección. En el lado derecho de la pantalla hay tres pestañas: adaptador, fuente de datos y trabajo. Haga clic en Trabajos y desplácese hasta encontrar ETH-USD CoinGecko. Haga clic en el enlace para mostrar la página de información del trabajo:

Inserte la descripción de la imagen aquí

La figura anterior muestra la página de información del trabajo, donde puede ver la información detallada del trabajo en el momento de la solicitud. La identificación del trabajo y el costo de ejecutar este trabajo están resaltados (también deben tenerse en cuenta). En el lado derecho de la página está la "Lista de tareas". Esta es una lista de operaciones que realiza el trabajo cuando se llama.
Cada tarea utiliza un adaptador compatible para crear cadenas de tareas una por una. Repitamos cada tarea en la lista para averiguar
cómo el trabajo obtiene los datos requeridos:

2.1 solicitud HTTP GET

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuelas. Se recomienda guardar la imagen y subirla directamente (img-XEhjkfHd-1595382259128) (contract-oracle / http-get.png)]

La primera tarea es llamar a la API de CoinGecko usando HTTP GET. Podemos confirmar desde la URL en los parámetros que realizó la solicitud CoinGecko correcta.
Esto devolverá el resultado de la respuesta JSON.

2.2 Análisis de respuesta JSON

Inserte la descripción de la imagen aquí

Dado que la tarea 1 devuelve JSON, la siguiente tarea debe analizarlo para acceder a los datos de destino que necesitamos. La Tarea 2 usa el adaptador JSON Parse para atravesar el objeto JSON devuelto a través de la ruta proporcionada. Por ejemplo, los datos de destino en la ruta de la tarea 2 estarán en la siguiente estructura JSON:

{ 
  “ market_data”:
    { 
      “ current_price”:
        { 
          “ usd”:“ PRICE_HERE” 
        } 
    } 
}

2.3 Cálculo de multiplicaciones

Inserte la descripción de la imagen aquí

Obtuvimos el precio del resultado JSON, pero aún no se ha procesado. Dado que Solidity no puede manejar decimales, la tarea 3 multiplica el precio por 100,000,000 para asegurarse de que se pueda representar como un número entero.

2.4 ETH Int256

Inserte la descripción de la imagen aquí

Luego, la tarea 4 convierte el resultado en un int256 codificado.

2.5 transacción ETH

Inserte la descripción de la imagen aquí

Finalmente, la Tarea 5 crea una transacción Ethereum para enviar el resultado al contrato original.

3. Escribe un contrato para llamar al oráculo.

Ahora, escriba un contrato solicitando servicios de Oracle. Chainlink proporciona una plantilla de contrato ChainlinkClient, ampliaremos sobre esta base:

pragma solidity 0.6.0;

import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/ChainlinkClient.sol";
import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/vendor/Ownable.sol";

contract ExampleOracleClient is ChainlinkClient, Ownable {
  	address constant private ORACLE = 0x83dA1beEb89Ffaf56d0B7C50aFB0A66Fb4DF8cB1;
	string constant private JOB_ID = "93547cb3c6784ec08a366be6211caa24";
	uint256 constant private ORACLE_PAYMENT = 1 * LINK / 10;

	uint256 public currentPrice;

	event RequestEthereumPriceFulfilled(
		bytes32 indexed requestId,
		uint256 indexed price
	);

	constructor() public Ownable() {
		setPublicChainlinkToken();
	}

	function requestEthereumPrice() public onlyOwner {
		Chainlink.Request memory req = buildChainlinkRequest(stringToBytes32(JOB_ID), address(this), this.fulfillEthereumPrice.selector);
		sendChainlinkRequestTo(ORACLE, req, ORACLE_PAYMENT);
	}

	function fulfillEthereumPrice(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId) {
		emit RequestEthereumPriceFulfilled(_requestId, _price);
		currentPrice = _price;
	}

	function withdrawLink() public onlyOwner {
		LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());
		require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer");
	}

	function stringToBytes32(string memory source) private pure returns (bytes32 result) {
		bytes memory tempEmptyStringTest = bytes(source);
		if (tempEmptyStringTest.length == 0) {
	  		return 0x0;
		}

		assembly { // solhint-disable-line no-inline-assembly
			result := mload(add(source, 32))
		}
	}
}	

El contrato ExampleOracleClient anterior utiliza el oráculo para solicitar el último precio en USD de Ethereum de CoinGecko. Expliquemos línea por línea:

  • Línea 7: la dirección del oráculo que se encuentra en la página de detalles del nodo
  • Líneas 8 y 9: ID de trabajo y precio encontrados anteriormente
  • Línea 11: currentPrice es un campo poblado por el oráculo que ejecuta la solicitud.
  • Línea 19: setPublicChainlinkToken () es una función proporcionada en el contrato ChainlinkClient para establecer la dirección del token LINK en la red actual.
  • Líneas 22-25: requestEthereumPrice () usa la dirección de Oracle, la identificación del trabajo, el precio y la función de devolución de llamada para construir una solicitud Chainlink. Luego llame a sendChainlinkRequestTo (), que usa otra función proporcionada por el contrato principal ChainlinkClient para solicitar datos.
  • Línea 27: la función de devolución de llamada utilizada por Oracle para completar la solicitud
  • Línea 32: La función que permite al propietario extraer tokens LINK del contrato.
  • Línea 37: implementación de la función auxiliar utilizada para construir la solicitud

Intente pegar este contrato en Remix IDE e impleméntelo en la red de prueba de Ropsten. Después de la implementación, envíe algún Ropsten LINK a su dirección ( Ropsten LINK Faucet se puede encontrar aquí ). Cuando la transacción se complete con éxito, haga clic en el requestEthereumPricebotón de método. Después de esperar un rato, haga clic en el botón CurrentPrice y debería ver el precio:

Inserte la descripción de la imagen aquí

4. Conclusión

Los oráculos de Chainlink son herramientas poderosas que pueden lograr la interoperabilidad entre el mundo externo y la cadena de bloques. Los servicios de listas como Chainlink Market son un servicio de directorio útil para encontrar los oráculos que mejor se adapten a sus necesidades.

En este ejemplo de tutorial, hemos encontrado un trabajo de Oracle que satisface las necesidades y el trabajo se ha configurado para solicitar datos del servicio de destino.
Oracle también admite operaciones que aceptan URL de solicitud GET como parámetros y obtienen datos de ellas. Esto significa que puede usar el oráculo Chainlink para recuperar datos de cualquier API externa.


Enlace original: use ChainLink para acceder a datos externos en la cadena de bloques - Huizhi.com

Supongo que te gusta

Origin blog.csdn.net/shebao3333/article/details/107505277
Recomendado
Clasificación