Pular para o conteúdo principal

Aprenda Tópicos Fundamentais do Ethereum com SQL

SQL
Consulta
Transações
Iniciante
Paul Apivat
11 de maio de 2021
9 minutos de leitura

Muitos tutoriais do Ethereum são direcionados a desenvolvedores, mas há uma falta de recursos educacionais para analistas de dados ou para pessoas que desejam ver dados em cadeia sem executar um cliente ou um nó.

Este tutorial ajuda os leitores a entenderem os conceitos fundamentais do Ethereum, incluindo transações, blocos e gás, consultando dados em cadeia com a linguagem de consulta estruturada (SQL) por meio de uma interface fornecida pela Dune Analytics (opens in a new tab).

Dados em cadeia podem nos ajudar a compreender o Ethereum, a rede, e como uma economia para poder computacional. Eles devem servir como base para entender os desafios que o Ethereum enfrenta hoje (ou seja, o aumento dos preços do gás) e, mais importante, as discussões sobre soluções de escalabilidade.

Transações

A jornada de um usuário no Ethereum começa com a inicialização de uma conta controlada pelo usuário ou uma entidade com saldo de ETH. Existem dois tipos de conta: controlada pelo usuário ou um contrato inteligente (consulte ethereum.org).

Qualquer conta pode ser visualizada em um explorador de blocos como o Etherscan (opens in a new tab) ou o Blockscout (opens in a new tab). Os exploradores de blocos são um portal para os dados do Ethereum. Eles exibem, em tempo real, dados sobre blocos, transações, mineradores, contas e outras atividades em cadeia (veja aqui).

No entanto, um usuário pode querer consultar os dados diretamente para reconciliar as informações fornecidas por exploradores de blocos externos. O Dune Analytics (opens in a new tab) oferece essa capacidade a qualquer pessoa com algum conhecimento de SQL.

Para referência, a conta de contrato inteligente da Ethereum Foundation (EF) pode ser visualizada no Blockscout (opens in a new tab).

Uma coisa a se notar é que todas as contas, incluindo a da EF, têm um endereço público que pode ser usado para enviar e receber transações.

O saldo da conta no Etherscan compreende transações regulares e transações internas. Transações internas, apesar do nome, não são transações reais que mudam o estado da cadeia. São transferências de valor iniciadas pela execução de um contrato (fonte (opens in a new tab)). Como as transações internas não têm assinatura, elas não são incluídas na blockchain e não podem ser consultadas com o Dune Analytics.

Portanto, este tutorial se concentrará em transações regulares. Isso pode ser consultado da seguinte forma:

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
Exibir tudo

Isso resultará na mesma informação fornecida na página de transações do Etherscan. Para comparação, aqui estão as duas fontes:

Etherscan

Captura de tela da visualização do explorador de transações Etherscan

Página do contrato da EF no Blockscout. (opens in a new tab)

Dune Analytics

Captura de tela de um painel de consulta do Dune Analytics

Você pode encontrar o painel aqui (opens in a new tab). Clique na tabela para ver a consulta (veja também acima).

Analisando as Transações

Uma transação enviada inclui várias informações, incluindo (fonte):

  • Destinatário: O endereço de recebimento (consultado como "to")
  • Assinatura: Embora as chaves privadas de um remetente assinem uma transação, o que podemos consultar com SQL é o endereço público de um remetente ("from").
  • Valor: Esta é a quantidade de ETH transferida (veja a coluna ether).
  • Dados: São dados arbitrários que sofreram hash (consulte a coluna data)
  • gasLimit – a quantidade máxima de unidades de gás que podem ser consumidas pela transação. As unidades de gás representam etapas computacionais
  • maxPriorityFeePerGas - a quantidade máxima de gás a ser incluída como gorjeta para o minerador
  • maxFeePerGas - a quantidade máxima de gás que se está disposto a pagar pela transação (incluindo baseFeePerGas e maxPriorityFeePerGas)

Podemos consultar estas informações específicas para transações para o endereço público da 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
Exibir tudo

Blocos

Cada transação mudará o estado da máquina virtual ethereum (EVM) (fonte). As transações são transmitidas para a rede para serem verificadas e incluídas em um bloco. Cada transação está associada a um número de bloco. Para ver os dados, podemos consultar um número de bloco específico: 12396854 (o bloco mais recente entre as transações da Ethereum Foundation no momento da redação deste artigo, em 11/05/21).

Além disso, quando consultamos os dois blocos seguintes, podemos ver que cada bloco contém o hash do bloco anterior (ou seja, o hash pai), ilustrando como a blockchain é formada.

Cada bloco contém uma referência ao seu bloco pai. Isso é mostrado abaixo entre as colunas hash e parent_hash (fonte):

parent_hash

Aqui está a consulta (opens in a new tab) no 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
Exibir tudo

Podemos examinar um bloco consultando o tempo, o número do bloco, a dificuldade, o hash, o hash pai e o nonce.

A única coisa que esta consulta não cobre é a lista de transações, que requer uma consulta separada abaixo, e a raiz do estado. Um nó completo ou de arquivamento armazenará todas as transações e transições de estado, permitindo que os clientes consultem o estado da cadeia a qualquer momento. Como isso exige um grande espaço de armazenamento, podemos separar os dados da cadeia dos dados de estado:

  • Dados da cadeia (lista de blocos, transações)
  • Dados de estado (resultado da transição de estado de cada transação)

A raiz do estado se enquadra no último e são dados implícitos (não armazenados em cadeia), enquanto os dados da cadeia são explícitos e armazenados na própria cadeia (fonte (opens in a new tab)).

Neste tutorial, vamos nos concentrar nos dados em cadeia que podem ser consultados com SQL via Dune Analytics.

Conforme indicado acima, cada bloco contém uma lista de transações. Podemos consultar isso filtrando por um bloco específico. Vamos tentar o bloco mais recente, 12396854:

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

Aqui está a saída SQL no Dune:

Este único bloco adicionado à cadeia altera o estado da máquina virtual ethereum (EVM). Dezenas, às vezes centenas, de transações são verificadas de uma só vez. Neste caso específico, 222 transações foram incluídas.

Para ver quantas foram realmente bem-sucedidas, adicionaríamos outro filtro para contar as transações bem-sucedidas:

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 o bloco 12396854, de um total de 222 transações, 204 foram verificadas com sucesso:

As solicitações de transação ocorrem dezenas de vezes por segundo, mas os blocos são consolidados aproximadamente uma vez a cada 15 segundos (fonte).

Para ver que um bloco é produzido aproximadamente a cada 15 segundos, poderíamos pegar o número de segundos em um dia (86400) e dividi-lo por 15 para obter um número médio estimado de blocos por dia (~ 5760).

O gráfico de blocos do Ethereum produzidos por dia (2016 - presente) é:

O número médio de blocos produzidos diariamente durante este período é de aproximadamente 5.874:

As consultas são:

1# consulta para visualizar o número de blocos produzidos diariamente desde 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# número médio de blocos produzidos por dia
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
Exibir tudo

O número médio de blocos produzidos por dia desde 2016 é ligeiramente superior a esse número, em 5.874. Alternativamente, dividir 86400 segundos por uma média de 5874 blocos resulta em 14,7 segundos ou aproximadamente um bloco a cada 15 segundos.

Gás

Os blocos têm um tamanho limitado. O tamanho máximo do bloco é dinâmico e varia de acordo com a demanda da rede entre 12.500.000 e 25.000.000 unidades. São necessários limites para evitar que blocos de tamanho arbitrariamente grande sobrecarreguem os nós completos em termos de espaço em disco e requisitos de velocidade (fonte).

Uma forma de conceituar o limite de gás do bloco é pensar nele como a oferta de espaço de bloco disponível para transações em lote. O limite de gás do bloco pode ser consultado e visualizado de 2016 até os dias atuais:

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

Depois, há o gás real usado diariamente para pagar pela computação feita na cadeia Ethereum (ou seja, enviar transações, chamar um contrato inteligente, mintar um NFT). Esta é a demanda por espaço de bloco disponível no 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

Também podemos justapor estes dois gráficos para ver como a demanda e a oferta se alinham:

gas_demand_supply

Portanto, podemos entender os preços do gás como uma função da demanda por espaço de bloco do Ethereum, dada a oferta disponível.

Finalmente, podemos querer consultar os preços médios diários do gás para a cadeia Ethereum. No entanto, isso resultará em um tempo de consulta especialmente longo, por isso filtraremos nossa consulta para a quantidade média de gás paga por transação pela Ethereum Foundation.

Podemos ver os preços do gás pagos por todas as transações feitas para o endereço da Ethereum Foundation ao longo dos anos. Aqui está a 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

Resumo

Com este tutorial, entendemos os conceitos fundamentais do Ethereum e como a blockchain do Ethereum funciona, consultando e tendo uma noção dos dados em cadeia.

O painel que contém todo o código usado neste tutorial pode ser encontrado aqui (opens in a new tab).

Para mais usos de dados para explorar a web3, encontre-me no Twitter (opens in a new tab).

Última atualização da página: 26 de fevereiro de 2026

Este tutorial foi útil?