Ir al contenido principal

Aprenda temas fundamentales de Ethereum con SQL

SQLConsultasTransacciones
Principiante
Paul Apivat
paulapivat.com(opens in a new tab)
11 de mayo de 2021
9 minuto leído minute read

Muchos tutoriales de Ethereum están dirigidos a desarrolladores, pero hacen falta recursos educativos para analistas de datos o para personas que quieren ver datos en cadena sin tener que ejecutar un cliente o nodo.

Este tutorial ayuda a los lectores a entender los conceptos fundamentals de Ethereum, incluyendo transacciones, bloques y gas consultando datos en la cadena con SQL a través de una interfaz proporcionada por Dune Analytics(opens in a new tab).

Los datos en cadena pueden ayudarnos a entender Ethereum, la red y como una economía para el poder computacional, y deberían servir como una base para entender los cambios a los que se enferenta Ethereum hoy en día (p. ej., el aumento de los costos de gas) y, lo que resulta más importante, discusiones en torno a las soluciones de escalabilidad.

Transacciones

El recorrido de un usuario en Ethereum comienza con la inicialización de una cuenta controlada por el usuario o de una entidad con un saldo de ETH. Hay dos tipos de cuentas: las controladas por los usuarios o un contrato inteligente (ver ethereum.org).

Cualquier cuenta puede verse en un explorador de bloques como Etherscan(opens in a new tab). Los exploradores de bloques son un portal a los datos de Ethereum. Muestran en tiempo real datos en bloques, transacciones, mineros, cuentas y otra actividad en la cadena (ver aquí).

De todos modos, un usuario podría desear consultar los datos directamente para conciliar la información brindada por los exploradores de bloques externos. Dune Analytics(opens in a new tab) proporciona esta capacidad a cualquier persona con algún conocimiento de SQL.

Para referencia, la cuenta de contrato inteligente para la Ethereum Foundation (EF) puede consultarse en Etherscan(opens in a new tab).

Una cosa a tener en cuenta es que todas las cuentas, incluidas las de la FE, tienen una dirección pública que se puede utilizar para enviar y recibir transacciones.

El saldo de la cuenta en Etherscan comprende transacciones regulares y transacciones internas. Las transacciones internas, a pesar de su nombre, no son transacciones reales que cambian el estado de la cadena. Por el contrario, son transferencias de valor iniciadas al ejecutar un contrato (fuente(opens in a new tab)). Dado que las transacciones internas no tienen firma, no se incluyen en la cadena de bloques y no se pueden consultar con Dune Analytics.

Por lo tanto, este tutorial se centrará en las transacciones regulares. Esto puede ser consultado como tal:

1WITH temp_table AS (
2SELECT
3 hash,
4 block_number,
5 block_time,
6 "from",
7 "to",
8 value / 1e18 AS ether,
9 gas_used,
10 gas_price / 1e9 AS gas_price_gwei
11FROM ethereum."transactions"
12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
13ORDER BY block_time DESC
14)
15SELECT
16 hash,
17 block_number,
18 block_time,
19 "from",
20 "to",
21 ether,
22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee
23FROM temp_table
Mostrar todo

Esto generará la misma información que se proporciona en la página de transacciones de Etherscan. A modo de comparación, estas son las dos fuentes:

Etherscan

Página de contrato de la EF en Etherscan.(opens in a new tab)

Dune Analytics

Puede encontrar el panel aquí(opens in a new tab). Haga clic en la tabla para ver la consulta (también ver arriba).

Desglose de transacciones

Una transacción enviada incluye varios tipos de datos, incluyendo (fuente):

  • Receptor: La dirección receptora (se consulta como "to")
  • Firma: Mientras que las claves privadas del emisor firman una transacción, lo que podemos consultar con SQL es la dirección pública del emisor ("from").
  • Valor: Esta es la cantidad de ETH transferida (ver la columna ether).
  • Datos: Esta es la información arbitraria que ha sido hasheada (ver la columna data).
  • gasLimit: Cantidad máxima de unidades de gas que puede consumir la transacción. Las unidades de gas representan pasos computacionales.
  • maxPriorityFeePerGas: La cantidad máxima de gas que se incluirá como recompensa para el minero.
  • maxFeePerGas: La cantidad máxima de gas que se pagará por la transacción (incluye el baseFeePerGas y el maxPriorityFeePerGas).

Podemos consultar estos datos específicos para transacciones a la dirección pública de la Ethereum Foundation:

1SELECT
2 "to",
3 "from",
4 value / 1e18 AS ether,
5 data,
6 gas_limit,
7 gas_price / 1e9 AS gas_price_gwei,
8 gas_used,
9 ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct
10FROM ethereum."transactions"
11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
12ORDER BY block_time DESC
Mostrar todo

Bloques

Cada transacción cambiará el estado de la máquina virtual de Ethereum (EVM) (fuente). Las transacciones son transmitidas a la red para ser verificadas e incluidas en un bloque. Cada transacción es asociada con un número de bloque. Para ver la información, podemos consultar un número de bloque específico: 12396854 (el bloque más reciente entre las transacciones de la Ethereum Foundation al momento de escribir este artículo, 5/11/21).

Además, cuando consultamos los dos siguientes bloques, podemos ver que cada bloque contiene el hash del anterior (hash principal o parent hash), lo que ilustra cómo se forma la cadena de bloques.

Cada bloque contiene una referencia a su bloque principal o parent. Esto se ve a continuación entre las columnas hash y parent_hash (fuente):

parent_hash

Esta es la consulta(opens in a new tab) en Dune Analytics:

1SELECT
2 time,
3 number,
4 hash,
5 parent_hash,
6 nonce
7FROM ethereum."blocks"
8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856
9LIMIT 10
Mostrar todo

Podemos examinar un bloque consultando el momento, el número de bloque, la dificultad, el hash, el parent hash y el nonce.

Lo único no cubierto por esta consulta es la lista de transacción, que requiere una consulta por separado abajo y la raíz de estado. Un nodo completo o archivado almacenará todas las transacciones y transiciones de estado, permitiendo a los clientes consultar el estado de la cadena en cualquier momento. Como esto requiere gran espacio de almacenamiento, podemos separar la información de la cadena de la información del estado:

  • Información de la cadena (listado de bloques, transacciones)
  • Información de estado (resultado del estado de transición de cada transacción)

La raíz de estado entra en el segundo grupo y es información implícita (no almacenada en la cadena), mientras que la información de la cadena es explícita y se almacena en la propia cadena (fuente(opens in a new tab)).

Para este tutorial, nos enfocaremos en la información en la cadena que puede ser consultada con SQL a través de Dune Analytics.

Como se mencionó anteriormente, cada bloque contiene un listado de transacciones, que podemos consultar filtrando por bloque específico. Probaremos el bloque más reciente, 12396854:

1SELECT * FROM ethereum."transactions"
2WHERE block_number = 12396854
3ORDER BY block_time DESC`

Aquí está el resultado de la consulta de SQL en Dune:

La adición de este único bloque a la cadena cambia el estado de la máquina virtual de Ethereum (EVM). Centenares de transacciones, a veces decenas, son verificadas a la vez. En este caso específico, se incluyeron 222 transacciones.

Para ver cuántas fueron exitosas, agregaríamos otro filtro para contar transacciones exitosas:

1WITH temp_table AS (
2 SELECT * FROM ethereum."transactions"
3 WHERE block_number = 12396854 AND success = true
4 ORDER BY block_time DESC
5)
6SELECT
7 COUNT(success) AS num_successful_txn
8FROM temp_table

Para el bloque 12396854, de un total de 222 transacciones, 204 fueron verificadas con éxito:

Las solicitudes de transacciones ocurren docenas de veces por segundo, pero los bloques son consignados aproximadamente una vez cada 15 segundos (fuente).

Para ver que se produce un bloque aproximadamente cada 15 segundos, podemos tomar el número de segundos en un día (86.400) dividido por 15 para obtener un promedio estimado del número de bloques por día (~ 5760).

El cuadro de bloques de Ethereum producidos por día (2016 - presente) es:

El número promedio de bloques producidos a diario durante este periodo es ~5,874:

Las consultas son:

1# query to visualize number of blocks produced daily since 2016
2
3SELECT
4 DATE_TRUNC('day', time) AS dt,
5 COUNT(*) AS block_count
6FROM ethereum."blocks"
7GROUP BY dt
8OFFSET 1
9
10# average number of blocks produced per day
11
12WITH temp_table AS (
13SELECT
14 DATE_TRUNC('day', time) AS dt,
15 COUNT(*) AS block_count
16FROM ethereum."blocks"
17GROUP BY dt
18OFFSET 1
19)
20SELECT
21 AVG(block_count) AS avg_block_count
22FROM temp_table
Mostrar todo

El número promedio de bloques producidos por día desde 2016 es ligeramente superior: 5874. Alternativamente, dividir 86.400 segundos por 5874 bloques promedio da como resultado 14,7 segundos o aproximadamente un bloque cada 15 segundos.

Gas

Los bloques están limitados en tamaño. El tamaño máximo de bloque es dinámico y varía de acuerdo a la demanda de la red entre 12.500.000 y 25.000.000 unidades. Los límites son necesarios para prevenir arbitrariamente los tamaños grandes de bloques, que ponen presión en los nodos completos en términos de espacio en disco y requisitos de velocidad (fuente).

Una manera de conceptualizar el límite de gas de un bloque es pensar en esto como el suministro de espacio de bloque disponible en el que se agrupan las transacciones. El límite de gas de los bloques puede ser consultado y visualizado desde 2016 hasta el presente:

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_limit) AS avg_block_gas_limit
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

Luego está el gas real utilizado a diario para pagar por la computación realizada en la cadena de Ethereum (ej: enviar transacciones, llamar a un contrato inteligente, mintear un NFT). Esta es la demanda para el espacio de bloques disponible en Ethereum:

1SELECT
2 DATE_TRUNC('day', time) AS dt,
3 AVG(gas_used) AS avg_block_gas_used
4FROM ethereum."blocks"
5GROUP BY dt
6OFFSET 1

También podemos yuxtaponer estos dos gráficos para ver cómo la demanda y el suministro se alínean:

gas_demand_supply

Así, podemos comprender los precios del gas como una función de la demanda de espacio de bloques de Ethereum dado un suministro disponible.

Finalmente, puede que querramos consultar el promedio diario del precio del gas para la cadena de Ethereum; sin embargo, hacerlo puede resultar en un tiempo especialmente largo de consulta, por lo que filtraremos nuestra consulta a la cantidad promedio de gas pagado por transacción por la Ethereum Foundation.

Podemos ver los precios de gas pagados por todas las transacciones hechas a la dirección de la Ethereum Foundation a lo largo de los años. Esta es la consulta:

1SELECT
2 block_time,
3 gas_price / 1e9 AS gas_price_gwei,
4 value / 1e18 AS eth_sent
5FROM ethereum."transactions"
6WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
7ORDER BY block_time DESC

Resumen

Con este tutorial, podemos entender conceptos fundamentales de Ethereum y cómo funciona la cadena de bloques de Ethereum consultando y obteniendo una idea de datos en cadena.

El panel que contiene todo el código utilizado en este tutorial se puede encontrar aquí(opens in a new tab).

Para más usos de datos para explorar web3 encuéntreme en Twitter(opens in a new tab).

Última edición: @pettinarip(opens in a new tab), 4 de diciembre de 2023

¿Le ha resultado útil este tutorial?