Artículo de Blog
Autor
Sydney Wiseman
Fecha de publicación
Hubble
Datos
Analítica
¿Sabías que Stellar Development Foundation brinda soporte a un conjunto de datos de análisis de código abierto y disponible públicamente? Hubble, el conjunto de datos BigQuery de SDF, ofrece un registro histórico completo de la blockchain de Stellar sin el dolor de cabeza de mantener una base de datos de historial completo. Al aprovechar BigQuery, Hubble simplifica las preguntas de análisis que anteriormente eran imposibles de resolver con las herramientas actuales. Este cambio de paradigma significa que Hubble es más adecuado para computación a gran escala y análisis de datos complejos en lugar de procesamiento de transacciones en tiempo real. El conjunto de datos proporciona a los desarrolladores y analistas una visión completa y confiable de la red de Stellar, empoderándolos para explorar, analizar y derivar conclusiones significativas de los ricos datos históricos.
Con Hubble, los usuarios tienen una nueva flexibilidad para consultar datos de la red de Stellar, sin la carga de almacenar los datos ellos mismos o acceder a los datos a través de una API. Esto abre un potencial ilimitado para análisis y aplicaciones históricas que anteriormente eran difíciles de implementar en Stellar.
En esta publicación de blog, daremos una visión general de Hubble, demostraremos cómo acceder al conjunto de datos y mostraremos ejemplos que aprovechan los datos históricos para análisis de blockchain. ¡Descubramos nuevos conocimientos al descubrir patrones ocultos en la red de Stellar!
Hubble está alojado en Google BigQuery, lo que permite a cualquier persona conectarse al conjunto de datos con un Proyecto de Google Cloud. Hubble almacena dos tipos de datos de Stellar: Datos Transaccionales y Estado del Ledger.
Este modelo de datos replica el modelo subyacente de la API Horizon para que acceder a los datos desde cualquiera de las fuentes sea simple. Aunque las estructuras de datos son las mismas, Hubble es el único lugar que almacena instantáneas de las tablas del Estado del Ledger para cada ledger histórico. Esta es una característica poderosa que da la capacidad de reproducir eventos y simular el estado del ledger en cualquier punto en el tiempo.
Hubble se mantiene actualizado a través de lotes intradía que se ejecutan cada 30 minutos. Aunque es posible ver transacciones recientes, es importante notar que Hubble no es adecuado para casos de uso en tiempo real porque no tiene los mismos objetivos de disponibilidad que Horizon.
Elegimos BigQuery debido a su tremenda escalabilidad y su papel como un centro centralizado para conjuntos de datos públicos de blockchain. BigQuery separa el almacenamiento de datos del cómputo, lo que permite escalar independientemente cualquiera de los componentes dependiendo de las necesidades. El conjunto de datos de Stellar se vuelve fácilmente accesible junto con otros protocolos populares, como Ethereum y Bitcoin, permitiendo análisis entre cadenas y estudios comparativos entre redes. Mientras que Stellar Development Foundation mantiene Hubble, todo el código es de código abierto para que otros puedan construir su propio almacén de datos.
Hay dos maneras de acceder al conjunto de datos Hubble:
crypto-stellar.crypto_stellar
, explorar las tablas, previsualizar los datos y ejecutar consultas SQL directamente dentro de la consola de BigQuery. crypto-stellar.crypto_stellar
usando las librerías de cliente de la API de BigQuery. Estas librerías te permiten integrar Hubble en aplicaciones, flujos de trabajo y tuberías de análisis.Al acceder a Hubble, es esencial entender la organización de las tablas para que puedas afinar tus consultas. Varias tablas son grandes, y prestar atención a los esquemas de particionamiento y agrupamiento de tablas ayudará a mejorar el rendimiento de las consultas y reducir costos. Para entender mejor el conjunto de datos, puedes consultar el esquema de información, que recupera metadatos sobre tablas, nombres de columnas y tipos de datos, o puedes referirte a nuestra documentación técnica, que cataloga los contenidos de las tablas y sus relaciones.
La mayoría de las tablas en Hubble están particionadas mensualmente por fecha de ejecución del lote
, que es el intervalo de 30 minutos de ledgers procesados y escritos al conjunto de datos. Esto permite a los usuarios filtrar resultados por fecha, lo que puede reducir significativamente los costos generales de consulta y el tiempo de ejecución. Por ejemplo, si estás interesado en rastrear todos los pagos por un activo acuñado en junio de 2022, puedes limitar las operaciones devueltas a aquellas donde fecha de ejecución del lote >= “2022-06-01”
, enfocándote en el subconjunto relevante de datos. Dado que las tablas están particionadas mensualmente, los usuarios no necesitan preocuparse por la precisión de la fecha: cualquier fecha dentro de un mes incurrirá en los mismos costos de procesamiento.
Sumergámonos en algunos ejemplos prácticos que demuestran el valor y potencial de utilizar un conjunto de datos de análisis. Hubble responde fácilmente preguntas que serían muy desafiantes de abordar con la API de Horizon o Stellar Core.
¿Podemos recuperar el historial transaccional completo para una cuenta Stellar específica?
-- Query returns all payments sent and received for a particular
-- account. Replace "YOUR_ACCOUNT_ADDRESS" with the desired
-- Stellar Wallet address, with appropriate begin and end dates.
select
op_source_account
, transaction_hash
, closed_at
, type
, `to`
, `from`
, asset_code
, asset_issuer
, asset_type
, amount
, source_asset_code
, source_asset_issuer
, source_asset_type
, source_amount
-- enriched_history_operations is a flattened table containing
-- data from ledgers, transactions and operations tables
from `crypto-stellar.crypto_stellar.enriched_history_operations`
where
(`to` = "YOUR_ACCOUNT_ADDRESS" or `from` = "YOUR_ACCOUNT_ADDRESS")
-- Filter for operation types related to payments (direct and path)
-- for more information on mappings, visit
-- https://pkg.go.dev/github.com/stellar/go/xdr#OperationType
and type in (1, 2, 13)
and closed_at >= "BEGIN_DATE"
and closed_at < "END_DATE"
-- Failed transactions should not be included
and successful is true
Esta consulta recuperará el historial completo de transacciones de pago donde la cuenta Stellar especificada es ya sea la cuenta de origen o destino para la transacción. Estos resultados pueden usarse para asistir con la declaración de impuestos, auditorías o para fines de cumplimiento. Aunque hacer esto en Horizon es posible, es doloroso y lento. Necesitarías acceso a una instancia de Horizon con historial que se remonte a la creación de la cuenta, y luego emitir muchas llamadas paginadas a la API para construir el conjunto de datos. ¡Con Hubble, estos datos se devuelven en una sola consulta!
¿Cuál es la frecuencia de la tarificación dinámica en la red de Stellar, y cuál es el costo promedio de transacción durante estos períodos?
-- Query returns the average fee charged and number
-- of ledgers in surge pricing by day. This can be used
-- to study network conditions and inform fee strategy.
with
surge_conditions as (
select
ledger_sequence
, batch_run_date
-- The minimum base fee for a transaction is 100 stroops.
-- If the fee charged exceeds operation count * base fee, then
-- the network was in a period of surge pricing. For more info:
-- https://developers.stellar.org/docs/encyclopedia/fees-surge-pricing-fee-strategies
, case
when (tx.operation_count + if(tx.fee_account is not null, 1, 0)) * 100 < fee_charged
then 1
else 0
end as surge_price_ind
, avg(fee_charged) as avg_fee_charged
from `crypto-stellar.crypto_stellar.history_transactions` as tx
where
tx.batch_run_date >= "2021-06-01"
and tx.batch_run_date < "2023-06-04"
group by
ledger_sequence
, batch_run_date
, surge_price_ind
)
select
date(batch_run_date) as close_date
, count(ledger_sequence) as total_ledgers
, sum(surge_price_ind) as surge_ledgers
-- Fees are reported in stroops. 1 XLM = 10,000,000 stroops
-- The below converts the fee charged to XLM.
, avg(avg_fee_charged) / 10000000 as avg_fee_charged
from surge_conditions
group by close_date
Usando Hubble, podemos perfilar las estadísticas de tarifas sobre una ventana de tiempo mucho mayor que Horizon. Horizon solo devuelve estadísticas de tarifas para los últimos 5 ledgers, y Hubble permite al usuario agregar datos sobre la historia completa: ¡46 millones de ledgers y contando! Perfilar los datos sobre una ventana más grande permite al usuario observar cualquier periodicidad de alta actividad en la red, optimizar estrategias de tarifas y predecir costos de transacciones futuras. Analizamos los últimos dos años de datos, y es obvio que las presentaciones de transacciones a la red están aumentando. Más del 60% de todos los ledgers cerrados entre marzo de 2023 y junio de 2023 experimentaron tarificación dinámica.
Este tipo de análisis puede ayudar a explicar por qué una aplicación experimenta una caída en el número de sus transacciones incluidas en un ledger. Si la tarifa máxima no se establece lo suficientemente alta, el costo promedio de transacción puede estar excluyéndolos de la inclusión en el conjunto de transacciones.
¿Podemos analizar la liquidez, adopción y distribución de un activo en la red de Stellar? Para este ejemplo, analicemos el activo nativo de Stellar, XLM.
Primero, midamos el suministro circulante del activo. El suministro circulante por sí solo no es una buena medida de la liquidez del activo, así que podríamos hacernos algunas preguntas adicionales. ¿Está el activo distribuido entre muchas cuentas o pocas? ¿Está el activo bloqueado en cuentas inactivas, o se mueve libremente entre cuentas?
-- Return only trust line balances for XLM.
-- The ledger tables save all trust lines, even
-- deleted ones, so filter out the deleted trust lines.
-- NOTE: XLM balances are stored in the accounts table.
-- Every other asset balance is stored in the trust_lines table.
with
filter_by_asset as (
select
account_id
, balance
, last_modified_ledger
, closed_at as last_modified_ts
from crypto-stellar.crypto_stellar.accounts_current
where
deleted is false
)
-- Calculating the circulating supply by summing all balances
, total_supply as (
select
sum(balance) as circulating_supply
, count(account_id) as total_trustlines
from filter_by_asset
)
-- Filter out the top ten accounts by balance
, top_ten_accounts as (
select
account_id
, balance
from filter_by_asset
order by balance desc
limit 10
)
, inactive_supply_365d as (
select sum(balance) as inactive_supply
from filter_by_asset
-- Each trust line contains a timestamp when it was last modified.
-- Changes in balance count as a modification.
where last_modified_ts <= timestamp_sub(current_timestamp, interval 365 day)
)
select
ttl_supply.total_trustlines
, ttl_supply.circulating_supply
, inactv_supply.inactive_supply
, (inactv_supply.inactive_supply / ttl_supply.circulating_supply) as pct_supply_inactive
, sum(top_acct.balance) as top_ten_account_supply
, sum(top_acct.balance) / ttl_supply.circulating_supply as pct_supply_top_ten
from total_supply as ttl_supply
join inactive_supply_365d as inactv_supply
on 1 = 1
join top_ten_accounts as top_acct
on 1 = 1
group by
ttl_supply.total_trustlines
, ttl_supply.circulating_supply
, inactv_supply.inactive_supply
, pct_supply_inactive
A primera vista, parece que XLM está hiper-concentrado entre los diez principales poseedores de activos. Sin embargo, esta métrica es engañosa porque incluye los 55B de XLM quemados en 2019. ¡El contexto es importante al evaluar el rendimiento de un activo!
XLM también es un activo popular para los AMMs. ¿Podemos rastrear el total de XLM bloqueado en todos los fondos de liquidez a lo largo del tiempo?
-- Find liquidity pools where XLM is one of the assets in the pool.
-- Deleted liquidity pools should not be included.
with
filter_amms_by_asset as (
select liquidity_pool_id
from `crypto-stellar.crypto_stellar.liquidity_pools_current`
where (asset_a_type = 'native' or asset_b_type = 'native')
and deleted is false
)
-- Multiple pools contain XLM. Calculate the average
-- XLM locked per pool, per day.
, calculate_tvl as (
select
lps.liquidity_pool_id
, concat(lps.asset_a_code, ':', lps.asset_b_code) as asset_pair
, date(hl.closed_at) as ledger_date
-- Asset positions are determined by the asset id.
-- Check both Asset A and Asset B for XLM.
, case when lps.asset_a_type = 'native' then avg(lps.asset_a_amount)
else avg(lps.asset_b_amount) end as usdc_amount
from `crypto-stellar.crypto_stellar.history_ledgers` as lps
join filter_amms_by_asset as amms
on lps.liquidity_pool_id = amms.liquidity_pool_id
join `crypto-stellar.crypto_stellar.history_ledgers` as hl
on lps.last_modified_ledger = hl.sequence
group by
lps.liquidity_pool_id
, asset_pair
, ledger_date
, lps.asset_a_type
)
select
ledger_date
, sum(usdc_amount) as total_usdc_locked
from calculate_tvl
group by ledger_date
Para responder este tipo de pregunta usando Horizon, tendrías que reproducir cada retiro y depósito del fondo de liquidez desde la creación del fondo y calcular la suma acumulativa manualmente. Ya que Hubble almacena instantáneas de todos los estados del ledger, simplemente puedes trazar los saldos a lo largo del tiempo.
A julio de 2023, actualmente hay ~45M XLM bloqueados en todos los fondos de liquidez en la red de Stellar. Al trazar el valor total bloqueado a lo largo del tiempo, es fácil observar cuándo se lanzaron los AMMs y entender cómo XLM impacta la liquidez en todos los fondos.
¡El soporte para Soroban llegará a Hubble! Hubble admitirá las actualizaciones de Testnet y Mainnet más adelante este año. Esto significa que los desarrolladores podrán monitorear el uso de contratos, identificar los contratos más invocados, diagnosticar puntos comunes de fallo y más.
Ya seas un analista, desarrollador o usuario empresarial, Hubble te tiene cubierto. No es solo otra fuente de datos; es un almacén de datos revolucionario que coloca a Stellar en la vanguardia de la analítica blockchain de primera línea. Al aprovechar el poder de BigQuery, los usuarios pueden hacer preguntas complejas e intensivas en datos o acceder al registro histórico completo de eventos sin la sobrecarga de ejecutar una instancia de Horizon. Con una interfaz fácil de usar y SDKs de Cloud bien soportados, tienes la flexibilidad de acceder a los datos de la red de Stellar como desees, con el beneficio de pagar solo por los costos de consulta. Las posibilidades para Hubble son infinitas: los analistas pueden responder preguntas ad hoc, los desarrolladores pueden extraer datos históricos crudos para reconciliación, los usuarios empresariales pueden conectar herramientas de visualización de datos para construir dashboards, o los científicos de datos pueden entrenar modelos de ML construyendo conjuntos de datos de entrenamiento robustos y completos.
Estamos emocionados por el potencial transformador que Hubble trae a Stellar. Pruébalo y ¡déjanos saber lo que descubres!
¿Preguntas, comentarios o solicitudes de características? Únete a nuestro canal de Discord de Desarrolladores de Stellar, #data-analytics.