Los oráculos de precios de Chainlink son smart contracts con funciones de vista pública (public view) que devuelven el precio de un activo particular denominado en USD.
Los nodos off-chain recopilan los precios de diversas fuentes, como los exchanges, y escriben los datos de los precios en el smart contract.
Aquí está el smart contract para obtener el precio de ETH / USD: https://etherscan.io/address/0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419/advanced#readContract
Cuando llamamos a la función latestAnswer() obtenemos el precio de Ether. Cuando consultamos decimals() obtenemos el número de decimales con los que se debe interpretar la respuesta.

Por lo tanto, el precio actual de Ether es de $2053.05552675 según el oráculo (cierto en el momento de escribir este artículo).
Si solo querías tener una idea de cómo funcionan los oráculos de Chainlink, puedes detenerte aquí: ¡eso es todo lo que es un oráculo de precios!
Lo que sigue son detalles de implementación importantes si planeas usarlos en un proyecto.
Usaremos ETH / USD como ejemplo continuo, pero Chainlink soporta los precios de muchos más activos.
No se recomienda usar latestAnswer() — usa latestRoundData() en su lugar
Esta función latestAnswer() no nos dice la última vez que se actualizó el precio. Si las actualizaciones de precios se retrasan, el smart contract podría tomar decisiones basadas en precios desactualizados.
En el recuadro verde a continuación, vemos el mismo precio que obtuvimos de latestAnswer() y en el recuadro azul vemos cuándo se actualizó por última vez como un Unix timestamp.

Es posible que los smart contracts deseen establecer un umbral de manera que utilicen un oráculo alternativo o suspendan decisiones críticas hasta que el campo updatedAt sea lo suficientemente reciente.
Agregación de Precios
Sería inseguro depender de un solo nodo o fuente de datos para obtener precios, por lo que los Price Feeds de Chainlink tienen varios nodos en una lista blanca (whitelisted) que suministran los precios.
A continuación se muestra una captura de pantalla de los proveedores del Price Feed de ETH / USD.
El rango de precios que suministran en un momento dado se puede observar en la pequeña variación del precio reportado. Ten en cuenta que la porción de los “centavos” del precio varía desde 26 centavos (fila superior) hasta 73 centavos (fila inferior).

transmit()
Los precios off-chain ingresan al ecosistema del smart contract a través de la función transmit. La función toma una lista de precios (ordenados) y una lista de firmas de los nodos. El precio reportado en el oráculo es la mediana de los precios. A continuación mostramos la línea de código relevante de Etherscan.

Arquitectura del Smart Contract
El lector puede haber notado que la función latestRoundData() no está en el mismo contrato que transmit(). Hay tres smart contracts en juego:
Transacción de actualización de precio
Durante una actualización de precio, las firmas y los precios de los nodos se agrupan (batched) y se envían a transmit() en el contrato aggregator. Luego, el contrato aggregator llama a la función validate en el contrato validator. Sujeto a las reglas allí establecidas, la actualización de precio podría ser rechazada. La traza de tenderly (tenderly trace) de dicha transacción se muestra en la captura de pantalla a continuación. Los códigos de llamada púrpuras muestran las llamadas cross-contract.

Visualización del precio

Mejorando la eficiencia de gas al leer oráculos de precios
Debido a que ver el precio implica una llamada cross-contract, se recomienda ahorrar 200 de gas “precalentando” (pre-warming) la llamada al aggregator utilizando una transacción de access list. Consulta un ejemplo del uso de una access list con un oráculo de precios de Chainlink en este repositorio.
Frecuencia de actualización de precios
No es práctico seguir enviando transacciones de actualización de estado a la blockchain cada minuto. Por lo tanto, Chainlink actualiza el precio bajo dos circunstancias:
- Cuando transcurre el tiempo de “heartbeat” (para ETH / USD es de una hora)
- Si el precio cambia en más del 0.5%
Estos parámetros están resaltados en una captura de pantalla del panel (dashboard) de ETH / USD de Chainlink a continuación.

Consideraciones de seguridad
Se ha escrito mucho sobre los problemas de seguridad en los smart contracts que surgen al usar incorrectamente los oráculos de Chainlink, por lo que no lo repetiremos aquí. Remitimos al lector a un artículo de Dacian que enumera esos posibles problemas.
Aprende más con RareSkills
Por favor, consulta nuestro bootcamp de Solidity para aprender el desarrollo de smart contracts a un nivel profundo.
Publicado originalmente el 11 de enero de 2024