June 17, 2020

Como obtener datos de un protocolo DeFi

Introducción

Siempre se habla de la transparencia de la blockchain, de que todo es trazable y todo el mundo puede ver lo que se escribió, pero ¿es sencillo acceder a esta información? ¿Como puedo obtener datos para hacer mis análisis de una forma sencilla?

En este post vamos a ver tres formas de hacerlo, usando como ejemplo el protocolo DeFi Aave, en el que vamos a obtener el histórico de depósitos hechos en la plataforma, usando tres métodos distintos:

  • The Graph: Un protocolo para construir aplicaciones descentralizadas usando GraphQL.
  • Alethio: Un api rest para obtener datos de la blockchain de una forma amigable.
  • Web3: Leyendo los eventos directamente en la blockchain usando la librería we3bjs

Cómo obtener estos datos

Para poder acceder a un determinado dato en la blockchain, la forma más sencilla es consultar los eventos, en una llamada a un smart contract, si se ejecuta una determinada acción, puede emitirse un evento, que puede ser escuchado en ese momento por clientes que estén escuchando por ese determinado evento, o en un futuro, accediendo al historial de los mismos, que queda grabado en la blockchain.

En este caso queremos ver el histórico de depósitos hechos en el protocolo Aave, por lo que miramos dentro de su código si existe un evento relacionado con esto.

En su documentación, vemos que si existe un evento para esto y contiene los siguientes datos:

Image for post

Pero si no queremos fiarnos de la documentación y verlo en el código, vamos a ver el contrato desplegado en mainnet y miramos en código en la parte:

Image for post
Image for post

El cual contiene este evento, si queremos ver en detalle el momento en el que se genera vemos que se hace una vez terminada la función de deposit, por lo tanto es lo que estamos buscando:

Image for post
Image for post

Consultando los datos

Una vez que tenemos claro que estamos buscando, vamos a obtener estos datos de las tres distintas formas.

The Graph

El equipo de Aave, tiene creado un subgraph que puede probarse en este playground, además en su documentación oficial, tienen un manual sobre como usarlo

A modo de ejemplo, queremos extraer el id del depósito, y la cantidad que se hizo en el mismo, para después hacer nuestros análisis, para ello utilizamos la query

{
deposits(first:1000, skip:0){
 id,
 amount
}
}

que nos devuelve los datos de los mismos

Image for post

Tendríamos que repetir esta query n veces, adelantando el parámetro skip de 1000 en 1000 para traer el siguiente bloque de datos.

Alethio

Ahora vamos a obtenerlo usando el api de Alethio, para ello usaremos el endpoint:

https://api.aleth.io/v1/log-entries?filter[loggedBy]=0x398eC7346DcD622eDc5ae82352F02bE94C62d119&filter[hasLogTopics.0]=0xc12c57b1c73a2c3a2ea4613e9476abb3d8d146857aab7329e24243fb59710c82

Donde consultamos los logs de la dirección del contrato de Aave, y filtramos los logs, con el hash de la función Deposit

El objeto devuelto por este endpoint nos indica el evento, con sus parámetros y el enlace a las siguientes páginas para traer un nuevo bloque de datos.

Image for post

Iteramos todos estos enlaces “next” aumentado la cantidad de eventos “Deposit” existentes.

web3Js

Como tercera opción leeremos los eventos directamente de la blockchain, para ello, haremos uso de la librería web3js y obtendremos todos los eventos de tipo “deposit” en el contrato de Aave, con un script como el siguiente:

const contract = new web3.eth.Contract(LendingPoolABI, LendingPoolAddress)
return contract.getPastEvents(‘Deposit’, {
  fromBlock: initBlock,
  toBlock: endBLock
}, function (error, events) { return events })

Una vez que hemos creado los tres métodos, vamos a ejecutarlos a la vez, para ver que tenemos el mismo número de depósitos y la información es correcta, desde tres fuentes distintas, para ello ejecutamos los tres métodos y escribimos por consola el número total de eventos:

console.log(‘Number of events with Alethio:’, (await getDepositsAlethio()).length)
console.log(‘Number of events with web3js:’, (await getEventsWeb3js()).length)
console.log(‘Number of events with The graph:’, (await getDepositsGQL()).length)

La salida nos muestra:

Number of events with Alethio: 31810
Number of events with web3js: 31809
Number of events with The graph: 31682

Ups…. tenemos una discrepancia, en el caso de Alethio y web3js, es solo de un evento, que se produjo entre ejecuciones, pero la diferencia con The graph es más grande.

Haciendo varias pruebas he comprobado que hay un cierto retraso desde que se genera un evento, hasta que se indexa en The graph, por lo que si se consulta este evento nada más generarse no se encuentra en The graph, pero unos minutos después si está, de ahí la discrepancia en en el número de eventos registrados.

De estas tres formas se pueden consultar los datos, creando tus propios datasets con los que poder construir modelos, y verificar que la información que muestran estos protocolos es verídica. ¿crees que tu banco te permitiría acceder al histórico de depósitos?