Aprende temas fundamentales de Ethereum con SQL
Muchos tutoriales de Ethereum estan dirigidos a desarrolladores, pero hacen falta recursos educativos para analistas de datos o para personas que quieren ver datos on-chain 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 on-chain con el lenguaje de consulta estructurada (SQL) a través de una interfaz proporcionada por Dune Analytics(opens in a new tab).
Los datos on-chain pueden ayudarnos a entender Ethereum, la red y como una económia para el poder compuacional y debería de servir como una base para entender los cambios a los que se enferenta Ethereum a dia de hoy (p.e. el aumento de los costos de gas) y, más importante, discuciones sobre soluciones de escalabilidad.
Transacciones
El viaje de un usuario en Ethereum comienza con la inicialización de una cuenta controlada por el usuario o de una entidad con un saldo ETH. Hay dos tipos de cuentas - las controladas por los usuarios o un contrato inteligente (ver ethereum.org).
Cualquier cuenta puede ser vista 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 on-chain. (Ver here).
De todos modos, un usuario puede 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 Fundación Ethereum (FE) puede consultarse en Etherscan(opens in a new tab).
Una cosa a tener en cuenta es que todas las cuentas, incluidas las FE's, 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. Son transferencias de valor iniciadas al ejecutar un contrato (source(opens in a new tab)). Dado que las transacciones internas no tienen firma, no están incluidas 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 (2SELECT3 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_gwei11FROM ethereum."transactions"12WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'13ORDER BY block_time DESC14)15SELECT16 hash,17 block_number,18 block_time,19 "from",20 "to",21 ether,22 (gas_used * gas_price_gwei) / 1e9 AS txn_fee23FROM temp_tableMostrar todo
Esto generará la misma información que se proporciona en la página de transacciones de Etherscan. A modo de comparación, aquí están las dos fuentes:
Etherscan
Página de contratos de EF's en Etherscan.(opens in a new tab)
Dune Analytics
Puedes encontrar el panel aquí(opens in a new tab). Haz click en la tabla para ver el comando (también ver arriba).
Rompiendo transacciones
Una transacción enviada incluye varias piezas de información incluyendo (fuente):
- Receptor: La dirección receptora (identificada como "to")
- Firma: Mientras 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 troceada (ver la columna
data
) - LímiteDeGas: 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á para la transacción (inclusiva de baseFeePerGas y maxPriorityFeePerGas)
Podemos consultas esass piezas específicas de información para transacciones a la dirección pública de la Fundación Ethereum:
1SELECT2 "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_pct10FROM ethereum."transactions"11WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'12ORDER BY block_time DESCMostrar 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 en específico: 12396854 (el bloque más reciente de las transacciones realizadas por la Fundación Ethereum al momento de escribir este artículo, 11/5/21).
Además, cuando consultamos los dos siguientes bloques,podemos ver que cada bloque contiene el hash del anterior (ej: hash padre), ilustrando cómo la cadena de bloques es formada.
Cada bloque contiene una referencia a su bloque padre. Esto es mostrado abajo entre las columnas de hash
y parent_hash
(fuente):
Esta es la consulta(opens in a new tab) en Dune Analytics:
1SELECT2 time,3 number,4 hash,5 parent_hash,6 nonce7FROM ethereum."blocks"8WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 123968569LIMIT 10Mostrar todo
Podemos examinar un bloque al consultar el tiempo, número de bloque, dificultad, hash, hash padre y el nonce.
Lo único no cubierto por esta consulta es la lista de transacción, que requiere una consulta por separado abajo y el estado raíz. Un nodo completo o archivado almacenará todas las transacciones y estado de transiciones, permitiendo a los clientes consultar el estado de la cadena en cualquier momento. Porque esto requiere un espacio amplio, poremos 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)
El estado de raíz falla en esto último y es información implícita (no almacenada en la cadena), mientras la información de la cadena es explícita y almacenada 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 al filtrar por un bloque en específico. Probaremos el bloque más reciente, 12396854:
1SELECT * FROM ethereum."transactions"2WHERE block_number = 123968543ORDER BY block_time DESC`
Aquí está el resultado de la consulta en Dune:
Al este único bloque ser agregado a la cadena, cambia el estado de la máquina virtual de Ethereum (EVM). A veces docenas o centenares de transacciones son verificadas a la vez. En este caso en específico, 222 transacciones se incluyeron.
Para ver cuántas fueron exitosas, poremos agregar otro filtro al contador de transacciones exitosas:
1WITH temp_table AS (2 SELECT * FROM ethereum."transactions"3 WHERE block_number = 12396854 AND success = true4 ORDER BY block_time DESC5)6SELECT7 COUNT(success) AS num_successful_txn8FROM 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 hay un bloque producido aproximadamente cada 15 segundos, podemos tomar el número de segundos en un día (86400) dividido entre 15 para obtener un promedio estimado del número de bloques por día (~ 5760).
El cuadro para los 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 Sql son:
1# query to visualize number of blocks produced daily since 201623SELECT4 DATE_TRUNC('day', time) AS dt,5 COUNT(*) AS block_count6FROM ethereum."blocks"7GROUP BY dt8OFFSET 1910# average number of blocks produced per day1112WITH temp_table AS (13SELECT14 DATE_TRUNC('day', time) AS dt,15 COUNT(*) AS block_count16FROM ethereum."blocks"17GROUP BY dt18OFFSET 119)20SELECT21 AVG(block_count) AS avg_block_count22FROM temp_tableMostrar todo
El número promedio de bloques producidos por día desde 2016 es ligeramente superior que el número en 5,874. Alternativamente, dividiendo 86400 secundos por 5874 bloques promedio resulta en 14.7 segundos o aproximadamente un bloque cada 15 segundos.
Gas
Los bloques están delimitados 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 requeridos para prevenir arbitrariamente los tamaños largos de bloques, lo que estresa a 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 bloques disponible en las transacciones grupales. El límite de gas de los bloques puede ser consultado y visualizado desde 2016 hasta el presente:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_limit) AS avg_block_gas_limit4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1
Entonces ahí está el gas actual utilizado a diario para pagar por la computación realizada en la cadena de Ethereum (ej: enviando transacciones, llamando un contrato inteligente, minteando un NFT). Esta es la demanda para el espacio de bloques disponibles en Ethereum:
1SELECT2 DATE_TRUNC('day', time) AS dt,3 AVG(gas_used) AS avg_block_gas_used4FROM ethereum."blocks"5GROUP BY dt6OFFSET 1
También podemos yuxtaponer estos dos gráficos juntos para ver cómo la demanda y el suministro se alínean:
Por lo tanto, podemos comprender el precio de gas como una función de demanda para el espacio de bloques de Ethereum, de acuerdo al suministro disponible.
Finalmente, puede que queramos consultar el promedio diario del precio de 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 Fundación Ethereum.
Podemos ver los precios de gas pagados por todas las transacciones hechas a la dirección de la Fundación Ethereum a lo largo de los años. Aquí está la consulta:
1SELECT2 block_time,3 gas_price / 1e9 AS gas_price_gwei,4 value / 1e18 AS eth_sent5FROM ethereum."transactions"6WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'7ORDER BY block_time DESC
Resumen
Con este tutorial, compremdemos los conceptos fundamentales de Ethereum y cómo funciona el blockchain de Ethereum consultando y obteniendo una idea de datos on-chain.
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éntrame en Twitter(opens in a new tab).
Última edición: , 21 de febrero de 2024