Si alguna vez has realizado una transacción en Ethereum (o en cualquier blockchain habilitada para contratos inteligentes), probablemente la hayas buscado en un explorador de bloques como etherscan.io y hayas visto esta gran cantidad de información:
Pestaña de Resumen de Transacciones
Y si intentaste mirar registros o rastreos (txs internos), es posible que hayas visto estas páginas confusas:
Pestaña de registros (ten la suerte de que estén bien decodificados como esto)
Pestaña de trazas (sí, parece un montón de tonterías)
Aprender a leer los detalles de una transacción en los exploradores de bloques será la base para todos sus análisis de datos y conocimientos de Ethereum, así que cubramos todas las piezas y cómo trabajar con ellas en SQL.
Solo voy a explicar cómo entender estos conceptos a un nivel alto; si quieres aprender a descifrarlos a mano, entonces necesitarás familiarizarte con cómo los datos están codificados (es lo mismo para transacciones/rastreos/logs) y cómo utilizar Funciones bytearray/hex de Dunepara ir entre diferentes tipos.
Al final de esta guía, podrás entender y navegar por las tablas de datos de cualquier contrato utilizando esta consulta de buscador de tablas de transacciones:
Enlace de consulta (Inserte cualquier hash de transacción, cadena y número de bloque)
Después de haber aprendido los conceptos en esta guía, también deberías aprender a usar miPanel de inicio rápido de EVMpara comenzar cualquier análisis de contrato.
·
30 de diciembre de 2022
Las transacciones son solo la punta del iceberg de los datos, todas las huellas y registros se invocan DESPUÉS de que los datos de entrada iniciales activan la función de nivel superior. Primero, etiquetemos todos los campos que verá en la página de transacción del explorador de bloques:
Estos son los mismos campos que verá cuando consulte "ethereum.transactions" en Dune. El elemento clave para aprender a identificar aquí es si el "to" es un contrato o no. Normalmente, los contratos estarán claramente etiquetados. Si es un contrato, debería haber "datos de entrada" que contengan una llamada de función.
De todos estos conceptos, el primero que hay que aprender bien es una EOA frente a una dirección de contrato. Los contratos son desplegados por las EOA y pueden ser llamados en el campo "to" de una transacción. Si haces clic en una dirección, los exploradores mostrarán en la parte superior izquierda si es un contrato o una cuenta. En dune puedes unirte a la tabla ethereum.creation_traces para comprobar si es un contrato. Ten en cuenta que solo las EOA pueden ser el firmante de la transacción "from".
Es importante aprender qué datos provienen directamente del onchain versus qué datos han sido agregados por el explorador/frontend. Todo en la cadena de bloques se representa como hex (a veces llamado binario o bytes), por lo que una llamada de intercambio de 1inch tendrá esta cadena de datos de entrada:
Los primeros 4 bytes (8 caracteres) son la “firma de función”, que es el hash keccakdel nombre de la función y los tipos de entrada. Etherscan tiene un botón "decodificar" para algunos contratos, lo que te da esta forma legible:
Como puedes ver, hay muchas variables empaquetadas juntas en esa larga cadena hexadecimal anterior. La forma en que están codificadas sigue la especificación de la interfaz binaria de la aplicación (ABI) de contratos inteligentes.
Los ABI son como documentación de API para contratos inteligentes (como las especificaciones de OpenAPI), puedes leer más sobre ellos en eldetalles técnicos aquí. La mayoría de los desarrolladores verificarán que su ABI coincida con el contrato y subirán el ABI para que todos los demás lo consulten al decodificarlo. Muchos contratos pueden estar relacionados con MEV/trading, donde el desarrollador quiere mantener las cosas como fuente cerrada y privada, por lo que no obtenemos ninguna decodificación de ellos.
En Dune, hemos decodificado tablasbasado en los ABI de contrato enviadosa una tabla de contratos (es decir, ethereum.contratos), las funciones y eventos se convierten en firmas de bytes (ethereum.firmas) que luego se comparan con trazas y registros para brindarle tablas decodificadas como uniswap_v2_ethereum.Pair_evt_Swap que almacena todos los intercambios para todos los contratos de pares creados por la fábrica de pares Uniswap v2. Puede filtrar los intercambios en un par específico mirando la tabla de direcciones de contrato para eventos.
En Dune, querrías consultar esta tabla para esta llamada de función oneinch_ethereum.AggregationRouterV6_call_swap. Verás que el nombre de esta tabla está en la parte superior de los resultados de la consulta en el buscardor de tablas al inicio de la guía.
Para las siguientes secciones sobre trazas y registros, utilizaremos la misma transacción de intercambio de agregador 1inch. Este es un buen ejemplo porque un enrutador intercambiará tokens en numerosos contratos DEX, por lo que obtendremos una buena diversidad de trazas y registros para investigar.
Hablemos a continuación sobre los registros de eventos. Los registros se pueden emitir en cualquier momento de una llamada de función. Los desarrolladores suelen emitir un registro al final de una función, después de que se completen todas las transferencias/lógica sin errores. Veamos el evento de intercambio uniswap v3 emitido desde la transacción anterior:
Verá que hay un tema0, tema1, tema2 y campo de datos. El tema0 es similar a la firma de la función, excepto que tiene 32 bytes en lugar de solo 4 bytes (todavía se ha generado el mismo hash). Los eventos pueden tener campos "indexados" para una filtración de datos más rápida, que pueden aparecer en el tema1, tema2 o tema3. Todos los demás campos se codifican juntos en el objeto "datos". Nuevamente, siguen las mismas reglas de codificación que las transacciones y trazas. El "28" es el índice del evento en todo el bloque. A veces puede ser útil unirse cuando se desea el primer intercambio o transferencia en una tx.
Para encontrar la lógica detrás de dónde y cómo se emitió este evento, tendré que sumergirme en el código de solidez. Haré clic en la dirección vinculada al evento, iré a la pestaña del contrato y buscaré "emitir intercambio" porque sé que todos los eventos tienen "emitir" justo antes de que sean invocados en el código.
Este es el contrato uniswapv3poolque está creado de fábrica para cada par.
Puedo ver que esto se emite en la línea 786 del contrato, como parte de la función 'swap'.
Ser capaz de naveGar funciones y linajes de eventos a través de contratos será una habilidad clave que necesitarás adquirir para comprender con precisión el linaje de los datos que estás consultando. No necesitas aprender solidity en profundidad para naveGar estos archivos, solo saber cómo entenderinterfaces de contratoy cuando se llaman funciones/eventos (función y emit son tus palabras clave).
Para un ejemplo detallado de rastreo del código de funciones y eventos,Echa un vistazo a este desglose de contratos y datos de Sudoswap.
Usando la consulta del localizador de tabla anterior, puedo ver que la tabla que debo consultar para este intercambio es uniswap_v3_ethereum.Pair_evt_Swap y que se emite después de que se llama a la función swap().
Los rastros pueden volverse rápidamente muy difíciles de navegar, debido a la forma en que las llamadas anidadas entre diferentes contratos se vuelven. Entendamos primero los tipos de rastros:
También necesitarás entender la columna/índice trace_address. Este es el patrón [0,1,1,1,1] que a menudo ves. Imagínalo como viñetas, donde la cantidad de números en el array indica la profundidad y el orden de las llamadas a la función.
A (null): la primera entrada de la transacción tiene un trace_address de []
CALLs B (0)
CALLs C (0,0)
CALLs D (1)
CALLs E (1,0) CALLs F (1,0,0)CALLs G (1,1)
CALLs H (2)
Como puede ver en nuestra captura de pantalla anterior de transacciones internas (trazas), etherscan no es un lugar amigable para ver trazas. Prefiero usar phalcon blocksec en su lugar, que desglosa la transacción de la siguiente manera:
Esto puede parecer abrumador, pero en realidad es una forma muy fácil de explorar todas las funciones, eventos y argumentos en el flujo de una transacción. Una vez que puedas entender esto, entonces puedes decir con seguridad que entiendes todos los datos en una transacción. Observa que mi consulta de búsqueda de tablaes una copia casi exacta de este diseño, ¡me inspiré en gran medida en ellos!
Tenga en cuenta que en Dune, decodificamos automáticamente tanto las llamadas de transacción como las trazas de la misma función para la misma tabla. Puede preguntarse si puede unir fácilmente eventos y trazas/transacciones en el orden agradable mostrado en phalcon. En Dune, puede unirse mediante el hash de transacción para vincular los datos en general, pero no puede unirse mediante ningún índice para recrear el orden exacto de las interacciones. Es una limitación desafortunada en este momento que requiere un indexador personalizado.
Si comprendes los conceptos que he presentado en esta guía, entonces estás listo para profundizar y escribir consultas más complejas. Navegar datos a través de transacciones utilizando diversas herramientas será una de las habilidades más importantes que necesitarás para destacarte en este campo.
Probablemente uso alrededor de 10 exploradores diferentes cada semana, y la cantidad de herramientas es 10 veces esa cantidad. Escribo una guía anual que cubre cómo evoluciona el conjunto de herramientas de datos y para qué debes usar cada herramienta:
Si alguna vez has realizado una transacción en Ethereum (o en cualquier blockchain habilitada para contratos inteligentes), probablemente la hayas buscado en un explorador de bloques como etherscan.io y hayas visto esta gran cantidad de información:
Pestaña de Resumen de Transacciones
Y si intentaste mirar registros o rastreos (txs internos), es posible que hayas visto estas páginas confusas:
Pestaña de registros (ten la suerte de que estén bien decodificados como esto)
Pestaña de trazas (sí, parece un montón de tonterías)
Aprender a leer los detalles de una transacción en los exploradores de bloques será la base para todos sus análisis de datos y conocimientos de Ethereum, así que cubramos todas las piezas y cómo trabajar con ellas en SQL.
Solo voy a explicar cómo entender estos conceptos a un nivel alto; si quieres aprender a descifrarlos a mano, entonces necesitarás familiarizarte con cómo los datos están codificados (es lo mismo para transacciones/rastreos/logs) y cómo utilizar Funciones bytearray/hex de Dunepara ir entre diferentes tipos.
Al final de esta guía, podrás entender y navegar por las tablas de datos de cualquier contrato utilizando esta consulta de buscador de tablas de transacciones:
Enlace de consulta (Inserte cualquier hash de transacción, cadena y número de bloque)
Después de haber aprendido los conceptos en esta guía, también deberías aprender a usar miPanel de inicio rápido de EVMpara comenzar cualquier análisis de contrato.
·
30 de diciembre de 2022
Las transacciones son solo la punta del iceberg de los datos, todas las huellas y registros se invocan DESPUÉS de que los datos de entrada iniciales activan la función de nivel superior. Primero, etiquetemos todos los campos que verá en la página de transacción del explorador de bloques:
Estos son los mismos campos que verá cuando consulte "ethereum.transactions" en Dune. El elemento clave para aprender a identificar aquí es si el "to" es un contrato o no. Normalmente, los contratos estarán claramente etiquetados. Si es un contrato, debería haber "datos de entrada" que contengan una llamada de función.
De todos estos conceptos, el primero que hay que aprender bien es una EOA frente a una dirección de contrato. Los contratos son desplegados por las EOA y pueden ser llamados en el campo "to" de una transacción. Si haces clic en una dirección, los exploradores mostrarán en la parte superior izquierda si es un contrato o una cuenta. En dune puedes unirte a la tabla ethereum.creation_traces para comprobar si es un contrato. Ten en cuenta que solo las EOA pueden ser el firmante de la transacción "from".
Es importante aprender qué datos provienen directamente del onchain versus qué datos han sido agregados por el explorador/frontend. Todo en la cadena de bloques se representa como hex (a veces llamado binario o bytes), por lo que una llamada de intercambio de 1inch tendrá esta cadena de datos de entrada:
Los primeros 4 bytes (8 caracteres) son la “firma de función”, que es el hash keccakdel nombre de la función y los tipos de entrada. Etherscan tiene un botón "decodificar" para algunos contratos, lo que te da esta forma legible:
Como puedes ver, hay muchas variables empaquetadas juntas en esa larga cadena hexadecimal anterior. La forma en que están codificadas sigue la especificación de la interfaz binaria de la aplicación (ABI) de contratos inteligentes.
Los ABI son como documentación de API para contratos inteligentes (como las especificaciones de OpenAPI), puedes leer más sobre ellos en eldetalles técnicos aquí. La mayoría de los desarrolladores verificarán que su ABI coincida con el contrato y subirán el ABI para que todos los demás lo consulten al decodificarlo. Muchos contratos pueden estar relacionados con MEV/trading, donde el desarrollador quiere mantener las cosas como fuente cerrada y privada, por lo que no obtenemos ninguna decodificación de ellos.
En Dune, hemos decodificado tablasbasado en los ABI de contrato enviadosa una tabla de contratos (es decir, ethereum.contratos), las funciones y eventos se convierten en firmas de bytes (ethereum.firmas) que luego se comparan con trazas y registros para brindarle tablas decodificadas como uniswap_v2_ethereum.Pair_evt_Swap que almacena todos los intercambios para todos los contratos de pares creados por la fábrica de pares Uniswap v2. Puede filtrar los intercambios en un par específico mirando la tabla de direcciones de contrato para eventos.
En Dune, querrías consultar esta tabla para esta llamada de función oneinch_ethereum.AggregationRouterV6_call_swap. Verás que el nombre de esta tabla está en la parte superior de los resultados de la consulta en el buscardor de tablas al inicio de la guía.
Para las siguientes secciones sobre trazas y registros, utilizaremos la misma transacción de intercambio de agregador 1inch. Este es un buen ejemplo porque un enrutador intercambiará tokens en numerosos contratos DEX, por lo que obtendremos una buena diversidad de trazas y registros para investigar.
Hablemos a continuación sobre los registros de eventos. Los registros se pueden emitir en cualquier momento de una llamada de función. Los desarrolladores suelen emitir un registro al final de una función, después de que se completen todas las transferencias/lógica sin errores. Veamos el evento de intercambio uniswap v3 emitido desde la transacción anterior:
Verá que hay un tema0, tema1, tema2 y campo de datos. El tema0 es similar a la firma de la función, excepto que tiene 32 bytes en lugar de solo 4 bytes (todavía se ha generado el mismo hash). Los eventos pueden tener campos "indexados" para una filtración de datos más rápida, que pueden aparecer en el tema1, tema2 o tema3. Todos los demás campos se codifican juntos en el objeto "datos". Nuevamente, siguen las mismas reglas de codificación que las transacciones y trazas. El "28" es el índice del evento en todo el bloque. A veces puede ser útil unirse cuando se desea el primer intercambio o transferencia en una tx.
Para encontrar la lógica detrás de dónde y cómo se emitió este evento, tendré que sumergirme en el código de solidez. Haré clic en la dirección vinculada al evento, iré a la pestaña del contrato y buscaré "emitir intercambio" porque sé que todos los eventos tienen "emitir" justo antes de que sean invocados en el código.
Este es el contrato uniswapv3poolque está creado de fábrica para cada par.
Puedo ver que esto se emite en la línea 786 del contrato, como parte de la función 'swap'.
Ser capaz de naveGar funciones y linajes de eventos a través de contratos será una habilidad clave que necesitarás adquirir para comprender con precisión el linaje de los datos que estás consultando. No necesitas aprender solidity en profundidad para naveGar estos archivos, solo saber cómo entenderinterfaces de contratoy cuando se llaman funciones/eventos (función y emit son tus palabras clave).
Para un ejemplo detallado de rastreo del código de funciones y eventos,Echa un vistazo a este desglose de contratos y datos de Sudoswap.
Usando la consulta del localizador de tabla anterior, puedo ver que la tabla que debo consultar para este intercambio es uniswap_v3_ethereum.Pair_evt_Swap y que se emite después de que se llama a la función swap().
Los rastros pueden volverse rápidamente muy difíciles de navegar, debido a la forma en que las llamadas anidadas entre diferentes contratos se vuelven. Entendamos primero los tipos de rastros:
También necesitarás entender la columna/índice trace_address. Este es el patrón [0,1,1,1,1] que a menudo ves. Imagínalo como viñetas, donde la cantidad de números en el array indica la profundidad y el orden de las llamadas a la función.
A (null): la primera entrada de la transacción tiene un trace_address de []
CALLs B (0)
CALLs C (0,0)
CALLs D (1)
CALLs E (1,0) CALLs F (1,0,0)CALLs G (1,1)
CALLs H (2)
Como puede ver en nuestra captura de pantalla anterior de transacciones internas (trazas), etherscan no es un lugar amigable para ver trazas. Prefiero usar phalcon blocksec en su lugar, que desglosa la transacción de la siguiente manera:
Esto puede parecer abrumador, pero en realidad es una forma muy fácil de explorar todas las funciones, eventos y argumentos en el flujo de una transacción. Una vez que puedas entender esto, entonces puedes decir con seguridad que entiendes todos los datos en una transacción. Observa que mi consulta de búsqueda de tablaes una copia casi exacta de este diseño, ¡me inspiré en gran medida en ellos!
Tenga en cuenta que en Dune, decodificamos automáticamente tanto las llamadas de transacción como las trazas de la misma función para la misma tabla. Puede preguntarse si puede unir fácilmente eventos y trazas/transacciones en el orden agradable mostrado en phalcon. En Dune, puede unirse mediante el hash de transacción para vincular los datos en general, pero no puede unirse mediante ningún índice para recrear el orden exacto de las interacciones. Es una limitación desafortunada en este momento que requiere un indexador personalizado.
Si comprendes los conceptos que he presentado en esta guía, entonces estás listo para profundizar y escribir consultas más complejas. Navegar datos a través de transacciones utilizando diversas herramientas será una de las habilidades más importantes que necesitarás para destacarte en este campo.
Probablemente uso alrededor de 10 exploradores diferentes cada semana, y la cantidad de herramientas es 10 veces esa cantidad. Escribo una guía anual que cubre cómo evoluciona el conjunto de herramientas de datos y para qué debes usar cada herramienta: