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:
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:
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:
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:
Una vez que tenemos claro que estamos buscando, vamos a obtener estos datos de las tres distintas formas.
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
Tendríamos que repetir esta query n veces, adelantando el parámetro skip de 1000 en 1000 para traer el siguiente bloque de datos.
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.
Iteramos todos estos enlaces “next” aumentado la cantidad de eventos “Deposit” existentes.
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?