Oráculos en Solidity: requests por fuera de la Blockchain con Oraclize.

Federico Elgarte
4 min readMar 10, 2018

--

Un oráculo (μαντειον) es una respuesta que da una deidad por medio de sacerdotes. El oráculo puede ser verdadero o falso, los oráculos pueden ser principios o máximas de experiencias que se pueden trasmitir, o ser una respuesta para resolver un acontecimiento.

No voy a profundizar sobre la historia de la antigua Grecia (XD), pero entender el por qué de la terminología nos acerca a la idea que hay detrás.

Cuando programamos un contrato inteligente estamos destinados a que se desenvuelva en un ambiente cerrado sin poder obtener datos externos (no requests http) como lo haríamos con cualquier lenguaje de programación y una librería de networking de por medio.

Como expliqué en Números aleatorios en Solidity: mejores y peores prácticas un Oráculo nos proporciona un puente hacia un exterior lleno de información: datos del clima, resultados deportivos, números aleatorios, etc.
Es verdad que esta solución va contra la filosofía de la blockchain, en donde la transparencia y la descentralización son el alma fundamental, pero como la idea del artículo no es entrar en detalle sobre esta discusión, les comento que Oraclize incluye junto a la respuesta, un documento llamado “prueba de autenticidad”, que demuestra que los datos obtenidos de la fuente de datos original son genuinos y no fueron modificados.

Sigamos adelante con cuestiones técnicas que nos van a servir como punto de inicio para poder utilizar esta herramienta en nuestros desarrollos.

Fuentes de datos

Las fuentes de datos son los recursos que podemos consumir de manera nativa desde nuestro contrato. Entre la lista que nos proporciona Oraclize, podemos encontrar:

  • URL permite el acceso a cualquier página web o API
  • WolframAlpha permite el acceso al motor computacional de WolframAlpha
  • IPFS provee acceso a cualquier contenido guardado en InterPlanetary File System
  • Random proporciona bytes aleatorios provenientes de una aplicación segura.
  • Computation proporciona el resultado de un cálculo arbitrario.

Parseadores de respuesta

Dadas las fuentes de datos, podemos (y debemos) parsear dichas respuestas para luego darles un uso concreto. Dentro de los parseadores nativos encontramos:

  • JSON Parsing
  • XML Parser
  • HTML Parser
  • Binary Helper

Para un análisis más exhaustivo de dichos parseadores, pueden ingresar aquí.

Integración con Ethereum y ejemplo práctico.

La interacción entre Oraclize y un contrato inteligente de Ethereum es asincrónica. Cualquier solicitud de datos se compone de dos pasos:

  • En un caso cotidiano, una transacción que ejecuta un método de un contrato es emitida por un usuario. El método contiene una instrucción a Oraclize, quien está constantemente observando la blockchain para actuar en caso de una solicitud de este estilo.
  • En un segundo paso, Oraclize calculará un resultado, lo firmará y llevará a cabo una transacción acompañada del resultado. Dicha transacción llamará a la función __callback que debemos implementar en nuestro contrato como punto de comunicación y recepción de datos.

Ejemplo práctico

La forma más sencilla de entender la integración Ethereum-Oraclize es mostrando un ejemplo.

pragma solidity ^0.4.0;
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
contract BitcoinPrice is usingOraclize {

uint public BitcoinPriceUSD;
event newOraclizeQuery(string description);
event newBitcoinPrice(string price);
function BitcoinPrice() {
update();
}
function __callback(bytes32 myid, string result) {
if (msg.sender != oraclize_cbAddress()) throw;
newBitcoinPrice(result);
BitcoinPriceUSD = parseInt(result, 2);
// hacer algo con el precio del Bitcoin
}

function update() payable {
newOraclizeQuery("Oraclize query was sent, standing by for the answer..");
oraclize_query("URL", "json(https://api.coinmarketcap.com/v1/ticker/bitcoin/).0.price_usd");
}

}

Este contrato utiliza al oráculo para recuperar el valor en dólares del Bitcoin desde la api de coinmarketcap. El proceso de update() es llamado cada vez que se realiza una transacción (payable) al contrato. Asi mismo, dentro del código podemos identificar tres componentes importantes:

  • BitcoinPrice hereda de Oraclize
contract BitcoinPrice is usingOracliz
  • La función __callback recibe la respuesta y ejecuta nuestra lógica
function __callback(bytes32 myid, string result)
  • Usamos JSON Parsing para recuperar el atributo price_usd en el índice cero [0] del arreglo
json(https://api.coinmarketcap.com/v1/ticker/bitcoin/).0.price_usd)

Consideración importante

No todo lo que brilla es oro, y lamentablemente el uso de un oráculo nos significa un gasto de dinero.

Para facilitar el desarrollo, Oraclize no cobra al contrato ejecutante su primer solicitud de datos. Las solicitudes sucesivas requerirán un pago para cubrir el gasto de Oraclize y el tiempo necesario de la transacción de devolución de datos. Ambos se toman automáticamente del saldo del contrato. Si el contrato no tiene fondos suficientes, la solicitud no se realizará.
Pueden ver la tabla de precios desde aquí.

Conclusión

El uso de oráculos es una herramienta muy poderosa si nuestro contrato lo necesita, pero requiere un análisis exhaustivo en relación a los costos y tiempos de ejecución.
Invito a los interesados a dar una vuelta por la documentación oficial y probar TestQuery para depurar los posibles errores a la hora de parsear una respuesta.

--

--