Estimados, bienvenidos al primer post dentro de la categoría «Catador de herramientas«. El objetivo de esta sección es básicamente presentarles diferentes herramientas, con sus pro y sus contra, las cuales les servirán para poder trabajar con datos de una Blockchain. A este bloque/post, le seguirá otro donde aplicaremos de forma práctica la herramienta presentada. Sin mayor preámbulos, les presento a: 

ethereum-etl 

Blockchain ETL es la organización detrás de ethereum-etl. Fuente: Github

Ethereum-etl es una librería de Python la cual permite transformar de forma sencilla ciertos objetos de una Blockchain en un csv o directamente hacer un stream a una Base de Datos. La librería es super práctica ya que nos ahorra el arduo trabajo de tener que interactuar directamente con un nodo, parsear la respuesta y transformarla en un formato que luego pueda ser utilizado. Los objetos que permite consultar son: bloques, transacciones, logs, receipts y traces. Cabe destacar que inclusive tiene un nivel de abstracción adicional el cual nos permite, por ejemplo, poder consultar contratos, tokens y transferencia de tokens.

La librería es open source y fue creada por Evgeny Medvedev, co creador también de Nansen. Como su nombre lo indica, está pensada para ser utilizada en Ethereum, pero soporta cualquier red EVM compatible como podría ser Binance Smart Chain (BNB) o algún otro fork similar. 

Dentro de la organización de Github Blockchain ETL, podrán encontrar diferentes repositorios los cuales posee algunos derivados interesantes de esta herramienta:

  • Ethereum-etl-airflow: librería optimizada para generar una ingesta constante utilizando Airflow y depositando los datos en BigQuery. Posee, entre otras cosas, todos los DAGs disponibles para utilizar
  • Ethereum-etl-postgres: Permite setear una Base de Datos en PostgreSQL y hacer stream constante a ella. Además, incluye pasos para descargar de Google Cloud una BD con datos históricos de Ethereum pre cargados y evitar el sync de la BD entera.
  • Ethereum-etl-neo4j: Idem anterior pero a una BD Neo4j, que para los que no la conocen es una Base de Datos de grafos 

Además, dentro de la organización, encontrarán algunos repos interesantes para poder hacer lo mismo, pero en Bitcoin o Solana. Inclusive hay un repositorio llamado polygon-etl que es más parecido a un fork de ethereum-etl-airflow. También vi que hay cosas raras como tezos-etl, zilliqa-etl, iotex-etl y band-etl… curious elecciones para armar librerías. 

Comandos

Hay dos formas muy sencillas de trabajar con ethereum-etl. La primera es a través de la consola CLI utilizando los comandos directamente desde allí. Una forma sencilla y rápida de acceder a los beneficios de ethereum-etl. La segunda es directamente desde algún script de Python. Uno puede importar la misma función que uno utiliza en la consola y hacer todo el pipeline de datos en un solo script, incluyendo extracción. En cualquiera de los dos casos, será necesario utilizar un nodo como los que dimos de alta en el Bloque #2. Los comandos se dividen de la siguiente manera:

Export_blocks_and_transactions: exporta bloques y transacciones. Si no se aclara uno de los outputs este será obviado. Se debe especificar un start_block y un end-block para el cual se quiere consultar. El schema de ambos objetos puede ser encontrado aqui.

ethereumetl export_blocks_and_transactions --start-block 0 --end-block 500000 \
--provider-uri TU_NODO \
--blocks-output blocks.csv --transactions-output transactions.csv

Export_receipts_and_logs: exporta logs y receipts con su respectivo schema. Nuevamente puede ser obviado uno de los outputs. Previamente, se debe utilizar el comando 

ethereumetl extract_csv_column –input transactions.csv –column hash –output transaction_hashes.txt 

El cual hará la extracción de todos los hashes de las transacciones las cuales venimos consultando y luego extraerá receipts y logs de esos hashes únicamente. Luego, puede utilizarse el comando:

ethereumetl export_receipts_and_logs --transaction-hashes transaction_hashes.txt \
--provider-uri TU_NODO --receipts-output receipts.csv --logs-output logs.csv

Extract_token_transfers: exporta transferencia de tokens con este schema. Es necesario tener previamente el archivo de logs.csv el cual se especifica como –logs logs.csv. Si se fijan bien, no utiliza en nigún momento el nodo, lo que queire decir es que utiliza los logs de Transfer dentro del archivo logs.csv.  

ethereumetl extract_token_transfers --logs logs.csv --output token_transfers.csv

Export_contracts: exporta los contratos especificados en el file de receipts.csv con el siguiente schema.  

Nuevamente, debe primero utilizarse extract_csv_column para tomar los addresses de los contratos:

ethereumetl extract_csv_column --input receipts.csv --column contract_address --output contract_addresses.txt

Luego, puede ejecutarse:

ethereumetl export_contracts --contract-addresses contract_addresses.txt \
--provider-uri TU_NODO --output contracts.csv

Export_tokens: exporta los tokens especificados de export_contracts con el siguiente schema. En la documentación se recomienda hacer la exportación primero de contratos a json en vez de csv. Luego, utilizar el comando para filtrar los ERC-20 o ERC-721:

ethereumetl filter_items -i contracts.json -p "item['is_erc20'] or item['is_erc721']" | \
ethereumetl extract_field -f address -o token_addresses.txt

Y finalmente utilizar el comando para obtener los tokens con este schema:

ethereumetl export_tokens --token-addresses token_addresses.txt \
--provider-uri TU_NODO --output tokens.csv

Existen también algunos commandos utilices el cual no entraremos en detalle, pero pueden revisarlos en la documentación:

  • Get_block_range_for_date: devuelve el primer bloque y ultimo bloque entre fechas
  • Get_keccak_hash: Devuelve el keccak hash de un evento pasado por parametro  
  • Stream: comando que devuelve bloques, transacciones, logs y transferencia de tokens el cual puede ser directamente depositado en Postgres, GCS o Kafka 

No todo es color de rosas…

Si se pusieron a jugar ya un poco con la librería, van a notar que en líneas generales es una librería con buena performance, pero que se nos puede ir de las manos rápidamente. Si uno, por ejemplo, está descargando información de Ethereum y el rango de bloques es muy grande, va a obtener como resultado archivos csv inmanejables con varios GB de peso. 

Ahora… ¿Para qué vas a usar esta herramienta? Si uno está queriendo hacer un análisis de un contrato o un protocolo en particular, esta no es tu librería. Recuerden que para llegar a ciertos logs uno debe primero descargar las transacciones de un rango de bloques específico y luego los logs. En el medio se van a encontrar con un montón de información de transacciones que no nos interesan, que nos va a ocupar espacio y no hay forma de filtrar de antemano. 

Al momento de escribir este bloque/post, la librería tenía algunos problemas aún abiertos. Por ejemplo, si uno exporta los contratos, los flags de is_erc20 y is_erc721 no están funcionando correctamente. Un workaround en este caso, podría ser no filtrar la lista de contratos por este flag e intentar utilizar el comando export_tokens sobre todos los contratos. El resultado va a ser un listado de “tokens” donde no todos poseen symbol o name y esos podemos filtrarlos presuponiendo que no son ERC-20 o ERC-721. Los comandos serían:

Otro problema es que algunos comandos suelen fallar si no se aclaran batches pequeños por los cuales trabajar. El output del error no va a ser del todo claro, pero fácilmente solucionable aclarando –batch-size 20 en el comando. 

Conclusión

Ethereum-etl es una librería super interesante para empezar a dar los primeros pasos en análisis de datos en blockchain. Hará que tengamos que interactuar con datos primitivos, como bloques y transacciones, pero también nos dará la posibilidad de obtener información sobre contratos o tokens. A pesar de tener algunos problemas aún sin resolver, es una librería la cual está en constante crecimiento y se nota que la comunidad está activa. 

Puedo ver a un ingeniero de datos creando un pipeline de datos que decanta en una BD donde constantemente se agregan nueva info sin mucho esfuerzo, pero me cuesta ver a un científico de datos utilizando la librería para hacer un análisis puntual sin caer en la manipulación de un montón de datos no necesarios. Si estas queriendo analizar datos de bloques o armando un sistema en el cual necesitas todo el detalle posible de bloques, transacciones y logs, definitivamente esta es tu herramienta. 

Deja un comentario