Como ler exploradores de blocos e entender transações, traços e registros no Ethereum (EVM)

Avançado9/13/2024, 10:17:49 PM
Aprenda a ler exploradores como Etherscan e a navegar dados através destas três estruturas de dados-chave, e como encontrar as tabelas de que precisará para consultar.

O que há numa transação?

Se já efetuou uma transação no Ethereum (ou em qualquer blockchain habilitada para contratos inteligentes), provavelmente a pesquisou num explorador de blocos como o etherscan.io e viu esta montanha de informações:

Separador de Visão Geral das Transações

E se você tentou olhar para os registros ou rastros (transações internas), você pode ter visto essas páginas confusas:

Separador de registos (tem sorte se estiverem bem decodificados como este)

Separador de rastreios (sim, parece um monte de disparates)

Aprender a ler os detalhes de uma transação em exploradores de blocos será a base para toda a sua análise de dados e conhecimento sobre Ethereum, por isso vamos abordar todas as partes e como trabalhar com elas em SQL.

Estou apenas a explicar como entender estes conceitos a um nível elevado; se quiser aprender a decifrá-los manualmente, então terá de familiarizar-se com comoos dados estão codificados(é o mesmo para transações/rastreios/registos) e como usarFunções bytearray/hex do Duneir entre diferentes tipos.

No final deste guia, você será capaz de entender e navegar pelas tabelas de dados de qualquer contrato usando esta consulta de localizador de tabela de transações:

Link de Consulta (Insira qualquer hash de tx, cadeia e número de bloco)

Depois de aprender os conceitos deste guia, você também deve aprender a usar o meu Painel de início rápido do EVMpara começar qualquer análise de contrato.

Como Analisar Qualquer Protocolo ou Produto Ethereum em Cinco Minutos

Andrew Hong

·

30 de dezembro de 2022

Ler história completa

Transações

As transações são apenas a ponta do iceberg de dados, todos os rastros e logs são invocados DEPOIS que os dados de entrada iniciais iniciam a função de nível superior. Vamos primeiro rotular todos os campos que você verá na página da transação do explorador de blocos:

Estes são os mesmos campos que você verá ao consultar 'ethereum.transactions' no Dune. O item chave para aprender a identificar aqui é se o 'para' é um contrato ou não. Normalmente, os contratos serão claramente rotulados. Se for um contrato, deve haver 'dados de entrada' que contenham uma chamada de função.

ligação da transação

De todos esses conceitos, o primeiro a aprender bem é um EOA versus um endereço de contrato. Contratos são implantados por EOAs e podem ser chamados no campo "para" de uma transação. Se você clicar em um endereço, os exploradores mostrarão no canto superior esquerdo se é um contrato ou uma conta. No dune, você pode se juntar à tabela ethereum.creation_traces para verificar se é um contrato. Observe que apenas EOAs podem ser o signatário "de" da tx.

É importante aprender de onde vêm os dados diretamente da cadeia em comparação com os dados que o explorador/frontend adicionou por cima. Tudo na blockchain é representado como hexadecimal (às vezes chamado de binário ou bytes), então uma chamada de troca 1inch terá esta sequência de dados de entrada:

transação de exemplo

Os primeiros 4 bytes (8 caracteres) são a “assinatura da função”, que é o hash keccakdo nome da função e dos tipos de entrada. O Etherscan tem um botão de “decodificar” agradável para alguns contratos, que lhe dá esta forma legível:

transação de exemplo

Como pode ver, existem muitas variáveis empacotadas juntas nessa única sequência hexadecimal longa de antes. A forma como estão codificadas segue a especificação da interface binária de aplicação (ABI) dos contratos inteligentes.

ABI's são como documentação de API para contratos inteligentes (como especificações OpenAPI), você pode ler mais sobre isso nodetalhes técnicos aqui. A maioria dos desenvolvedores verificará se sua ABI corresponde ao contrato e fará upload da ABI para que todos possam fazer referência na decodificação. Muitos contratos podem estar relacionados a MEV/negociação, onde o desenvolvedor deseja manter as coisas como código fechado e privado - portanto, não obtemos nenhuma decodificação deles.

Em Dune, decodificamos tabelasbaseado nos ABIs do contrato submetidopara uma tabela de contratos (ou seja, ethereum.contracts), funções e eventos são convertidos em assinaturas de bytes (ethereum.signatures) que são então correspondidos a traces e logs para fornecer tabelas decodificadas como uniswap_v2_ethereum.Pair_evt_Swap que armazena todas as trocas para todos os contratos de par criados pela fábrica de pares Uniswap v2. Você pode filtrar as trocas em um par específico olhando a tabela de endereços do contrato para eventos.

No Dune, você gostaria de consultar esta tabela para esta chamada de função oneinch_ethereum.AggregationRouterV6_call_swap. Você verá que o nome desta tabela está no topo dos resultados da consulta no localizador da tabela no início do guia.

Para as seguintes secções sobre traços e registos, vamos utilizar a mesma transação de troca do agregador 1inch. Este é um bom exemplo porque um roteador irá trocar tokens em vários contratos DEX, então teremos uma boa diversidade de rastreios e registos para investiGate.

Registos

Vamos falar sobre os registos de eventos a seguir. Os registos podem ser emitidos em qualquer ponto de uma chamada de função. Os desenvolvedores normalmente emitem um registo no final de uma função, depois de todas as transferências/lógica serem concluídas sem erros. Vamos dar uma olhada no evento de troca uniswap v3 emitido a partir da transação anterior:

transação de exemplo

Você verá que há um campo topic0, topic1, topic2 e data. topic0 é semelhante à assinatura da função, exceto que é de 32 bytes em vez de apenas 4 bytes (ainda hashed da mesma maneira). Os eventos podem ter campos "indexados" para uma filtragem de dados mais rápida, que podem aparecer no tópico1, tópico2 ou tópico3. Todos os outros campos são codificados juntos no objeto "data". Novamente, eles seguem as mesmas regras de codificação que transações e rastreamentos. O "28" é o índice do evento em todo o bloco. Às vezes, pode ser útil participar quando você quiser a primeira troca ou transferência em um tx.

Para encontrar a lógica por trás de onde e como esse evento foi emitido, vou precisar mergulhar no código solidity. Vou clicar no endereço vinculado do evento, ir para a guia do contrato e pesquisar por 'emit swap', porque sei que todos os eventos têm 'emit' logo antes de serem invocados no código.

Este é o contrato uniswapv3poolque é criado pela fábrica para cada par.

Eu posso ver que isso é emitido na linha 786 do contrato, como parte da função “swap”.

Ser capaz de naveGar por funções e eventos de linhagem através de contratos será uma habilidade fundamental que você precisará adquirir para entender com precisão a linhagem dos dados que está consultando. Você não precisa aprender o Solidity a fundo para naveGar nesses arquivos, apenas saber como entender.interfaces de contratoe quando as funções/eventos são chamados (função e emit são as suas palavras-chave).

Para um exemplo detalhado de investigação do código para funções e eventos,confira esta análise dos contratos e dados do Sudoswap.

Usando a consulta de localizador de tabela anterior, posso ver que a tabela que devo consultar para esta troca é uniswap_v3_ethereum.Pair_evt_Swap e que ela é emitida depois que a função swap() é chamada.

Traces (ethereum.traces)

Os rastros podem se tornar rapidamente muito difíceis de navegar, devido às chamadas aninhadas entre diferentes contratos. Vamos primeiro entender os tipos de rastros:

  • CRIAR: este é um rastro emitido quando um novo contrato é implantado. Você pode implantar um contrato diretamente no topo de uma transação, isso significa que não há um endereço "para" nos dados da transação. Você também pode implantar um contrato dentro de uma chamada de função, daí a existência de fábricas de contratos. Confira a tabela ethereum.creation_traces para uma visualização mais simples disso.
  • DELEGateCALL: isto vai para a tua lista de "ignorar" mental ao analisar uma transação. Pensa nisto como encaminhar um pedido de um servidor para o próximo sem alterar qualquer lógica. Isto está relacionado com proxies e armazenamento, podes @bansaltushar014/deleGatecall-in-solidity-4138b121cbe">check out more details here.
  • CHAMADA: esta é a trace mais comum e genérica. Uma chamada pode ser apenas uma transferência de valor ETH sem qualquer contrato envolvido. Também pode ser qualquer chamada de função em qualquer contrato.
  • STATICCALL: esta é uma chamada de função que NÃO modifica nenhum estado, e é puramente usada para cálculos. Coisas como feeds de preços oráculos, cálculos de preços AMM, verificações de taxa de liquidação, verificações de saldo, etc., tudo acontece em chamadas estáticas. Comumente visto em solidez como tipos de função "vista" ou "pura".

Também precisará de compreender a coluna/índice trace_address. Este é o padrão [0,1,1,1,1] que frequentemente vê. Imagine que são pontos de bala, onde o número de números no array indica a profundidade e a ordem das chamadas de função.

Um (nulo) - a primeira entrada da transação tem um trace_address de []

CALLs B (0)

CALLs C (0,0)

CONVITES D (1)

CALLs E (1,0)  CALLs F (1,0,0)CALLs G (1,1)

CHAMADAS H (2)

Como você pode ver na captura de tela de nossas transações internas anteriores, o etherscan não é um lugar amigável para visualizar traços. Prefiro usar o phalcon blocksec, que desenrola a transação assim:

Link para o Explorador

Isso pode parecer esmagador, mas na verdade é uma maneira super fácil de explorar todas as funções, eventos e argumentos no fluxo de uma transação. Uma vez que você consiga entender isso, então você pode dizer com segurança que entende todos os dados em uma transação. Note que meu consulta de localizador de tabelaé uma cópia quase exata deste layout, fui amplamente inspirado por eles!

Note que, no Dune, decodificamos automaticamente tanto as chamadas de transação como os rastreios do mesmo nome de função para a mesma tabela. Pode estar a perguntar-se se pode facilmente juntar eventos e rastreios/transações na ordem agradável mostrada no phalcon. No Dune, pode juntar-se ao hash da transação para geralmente associar os dados, mas não pode juntar-se a nenhum índice para recriar a ordem exata das interações. É uma limitação infeliz no momento que requer um indexador personalizado.

Avante, mais profundamente na floresta escura da criptografia

Se você entender os conceitos que apresentei neste guia, estará pronto para aprofundar-se e escrever consultas mais complexas. Navegar pelos dados em transações usando várias ferramentas diferentes será uma das habilidades mais importantes que você precisará para se destacar neste espaço.

Provavelmente, uso cerca de 10 exploradores diferentes todas as semanas, e o número de ferramentas é 10 vezes maior. Escrevo um guia anual que abrange a evolução da pilha de ferramentas de dados e para que você deve usar cada ferramenta:

Link do Guia

Disclaimer:

  1. Este artigo é reproduzido a partir de [cryptodatabytes], Todos os direitos autorais pertencem ao autor original [Andrew Hong]. Se houver objeções a esta reimpressão, contacte o Gate Learn equipe, e eles vão lidar com isso prontamente.
  2. Aviso de Responsabilidade: As visões e opiniões expressas neste artigo são exclusivamente do autor e não constituem qualquer conselho de investimento.
  3. As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. A menos que seja mencionado, copiar, distribuir ou plagiar os artigos traduzidos é proibido.

Como ler exploradores de blocos e entender transações, traços e registros no Ethereum (EVM)

Avançado9/13/2024, 10:17:49 PM
Aprenda a ler exploradores como Etherscan e a navegar dados através destas três estruturas de dados-chave, e como encontrar as tabelas de que precisará para consultar.

O que há numa transação?

Se já efetuou uma transação no Ethereum (ou em qualquer blockchain habilitada para contratos inteligentes), provavelmente a pesquisou num explorador de blocos como o etherscan.io e viu esta montanha de informações:

Separador de Visão Geral das Transações

E se você tentou olhar para os registros ou rastros (transações internas), você pode ter visto essas páginas confusas:

Separador de registos (tem sorte se estiverem bem decodificados como este)

Separador de rastreios (sim, parece um monte de disparates)

Aprender a ler os detalhes de uma transação em exploradores de blocos será a base para toda a sua análise de dados e conhecimento sobre Ethereum, por isso vamos abordar todas as partes e como trabalhar com elas em SQL.

Estou apenas a explicar como entender estes conceitos a um nível elevado; se quiser aprender a decifrá-los manualmente, então terá de familiarizar-se com comoos dados estão codificados(é o mesmo para transações/rastreios/registos) e como usarFunções bytearray/hex do Duneir entre diferentes tipos.

No final deste guia, você será capaz de entender e navegar pelas tabelas de dados de qualquer contrato usando esta consulta de localizador de tabela de transações:

Link de Consulta (Insira qualquer hash de tx, cadeia e número de bloco)

Depois de aprender os conceitos deste guia, você também deve aprender a usar o meu Painel de início rápido do EVMpara começar qualquer análise de contrato.

Como Analisar Qualquer Protocolo ou Produto Ethereum em Cinco Minutos

Andrew Hong

·

30 de dezembro de 2022

Ler história completa

Transações

As transações são apenas a ponta do iceberg de dados, todos os rastros e logs são invocados DEPOIS que os dados de entrada iniciais iniciam a função de nível superior. Vamos primeiro rotular todos os campos que você verá na página da transação do explorador de blocos:

Estes são os mesmos campos que você verá ao consultar 'ethereum.transactions' no Dune. O item chave para aprender a identificar aqui é se o 'para' é um contrato ou não. Normalmente, os contratos serão claramente rotulados. Se for um contrato, deve haver 'dados de entrada' que contenham uma chamada de função.

ligação da transação

De todos esses conceitos, o primeiro a aprender bem é um EOA versus um endereço de contrato. Contratos são implantados por EOAs e podem ser chamados no campo "para" de uma transação. Se você clicar em um endereço, os exploradores mostrarão no canto superior esquerdo se é um contrato ou uma conta. No dune, você pode se juntar à tabela ethereum.creation_traces para verificar se é um contrato. Observe que apenas EOAs podem ser o signatário "de" da tx.

É importante aprender de onde vêm os dados diretamente da cadeia em comparação com os dados que o explorador/frontend adicionou por cima. Tudo na blockchain é representado como hexadecimal (às vezes chamado de binário ou bytes), então uma chamada de troca 1inch terá esta sequência de dados de entrada:

transação de exemplo

Os primeiros 4 bytes (8 caracteres) são a “assinatura da função”, que é o hash keccakdo nome da função e dos tipos de entrada. O Etherscan tem um botão de “decodificar” agradável para alguns contratos, que lhe dá esta forma legível:

transação de exemplo

Como pode ver, existem muitas variáveis empacotadas juntas nessa única sequência hexadecimal longa de antes. A forma como estão codificadas segue a especificação da interface binária de aplicação (ABI) dos contratos inteligentes.

ABI's são como documentação de API para contratos inteligentes (como especificações OpenAPI), você pode ler mais sobre isso nodetalhes técnicos aqui. A maioria dos desenvolvedores verificará se sua ABI corresponde ao contrato e fará upload da ABI para que todos possam fazer referência na decodificação. Muitos contratos podem estar relacionados a MEV/negociação, onde o desenvolvedor deseja manter as coisas como código fechado e privado - portanto, não obtemos nenhuma decodificação deles.

Em Dune, decodificamos tabelasbaseado nos ABIs do contrato submetidopara uma tabela de contratos (ou seja, ethereum.contracts), funções e eventos são convertidos em assinaturas de bytes (ethereum.signatures) que são então correspondidos a traces e logs para fornecer tabelas decodificadas como uniswap_v2_ethereum.Pair_evt_Swap que armazena todas as trocas para todos os contratos de par criados pela fábrica de pares Uniswap v2. Você pode filtrar as trocas em um par específico olhando a tabela de endereços do contrato para eventos.

No Dune, você gostaria de consultar esta tabela para esta chamada de função oneinch_ethereum.AggregationRouterV6_call_swap. Você verá que o nome desta tabela está no topo dos resultados da consulta no localizador da tabela no início do guia.

Para as seguintes secções sobre traços e registos, vamos utilizar a mesma transação de troca do agregador 1inch. Este é um bom exemplo porque um roteador irá trocar tokens em vários contratos DEX, então teremos uma boa diversidade de rastreios e registos para investiGate.

Registos

Vamos falar sobre os registos de eventos a seguir. Os registos podem ser emitidos em qualquer ponto de uma chamada de função. Os desenvolvedores normalmente emitem um registo no final de uma função, depois de todas as transferências/lógica serem concluídas sem erros. Vamos dar uma olhada no evento de troca uniswap v3 emitido a partir da transação anterior:

transação de exemplo

Você verá que há um campo topic0, topic1, topic2 e data. topic0 é semelhante à assinatura da função, exceto que é de 32 bytes em vez de apenas 4 bytes (ainda hashed da mesma maneira). Os eventos podem ter campos "indexados" para uma filtragem de dados mais rápida, que podem aparecer no tópico1, tópico2 ou tópico3. Todos os outros campos são codificados juntos no objeto "data". Novamente, eles seguem as mesmas regras de codificação que transações e rastreamentos. O "28" é o índice do evento em todo o bloco. Às vezes, pode ser útil participar quando você quiser a primeira troca ou transferência em um tx.

Para encontrar a lógica por trás de onde e como esse evento foi emitido, vou precisar mergulhar no código solidity. Vou clicar no endereço vinculado do evento, ir para a guia do contrato e pesquisar por 'emit swap', porque sei que todos os eventos têm 'emit' logo antes de serem invocados no código.

Este é o contrato uniswapv3poolque é criado pela fábrica para cada par.

Eu posso ver que isso é emitido na linha 786 do contrato, como parte da função “swap”.

Ser capaz de naveGar por funções e eventos de linhagem através de contratos será uma habilidade fundamental que você precisará adquirir para entender com precisão a linhagem dos dados que está consultando. Você não precisa aprender o Solidity a fundo para naveGar nesses arquivos, apenas saber como entender.interfaces de contratoe quando as funções/eventos são chamados (função e emit são as suas palavras-chave).

Para um exemplo detalhado de investigação do código para funções e eventos,confira esta análise dos contratos e dados do Sudoswap.

Usando a consulta de localizador de tabela anterior, posso ver que a tabela que devo consultar para esta troca é uniswap_v3_ethereum.Pair_evt_Swap e que ela é emitida depois que a função swap() é chamada.

Traces (ethereum.traces)

Os rastros podem se tornar rapidamente muito difíceis de navegar, devido às chamadas aninhadas entre diferentes contratos. Vamos primeiro entender os tipos de rastros:

  • CRIAR: este é um rastro emitido quando um novo contrato é implantado. Você pode implantar um contrato diretamente no topo de uma transação, isso significa que não há um endereço "para" nos dados da transação. Você também pode implantar um contrato dentro de uma chamada de função, daí a existência de fábricas de contratos. Confira a tabela ethereum.creation_traces para uma visualização mais simples disso.
  • DELEGateCALL: isto vai para a tua lista de "ignorar" mental ao analisar uma transação. Pensa nisto como encaminhar um pedido de um servidor para o próximo sem alterar qualquer lógica. Isto está relacionado com proxies e armazenamento, podes @bansaltushar014/deleGatecall-in-solidity-4138b121cbe">check out more details here.
  • CHAMADA: esta é a trace mais comum e genérica. Uma chamada pode ser apenas uma transferência de valor ETH sem qualquer contrato envolvido. Também pode ser qualquer chamada de função em qualquer contrato.
  • STATICCALL: esta é uma chamada de função que NÃO modifica nenhum estado, e é puramente usada para cálculos. Coisas como feeds de preços oráculos, cálculos de preços AMM, verificações de taxa de liquidação, verificações de saldo, etc., tudo acontece em chamadas estáticas. Comumente visto em solidez como tipos de função "vista" ou "pura".

Também precisará de compreender a coluna/índice trace_address. Este é o padrão [0,1,1,1,1] que frequentemente vê. Imagine que são pontos de bala, onde o número de números no array indica a profundidade e a ordem das chamadas de função.

Um (nulo) - a primeira entrada da transação tem um trace_address de []

CALLs B (0)

CALLs C (0,0)

CONVITES D (1)

CALLs E (1,0)  CALLs F (1,0,0)CALLs G (1,1)

CHAMADAS H (2)

Como você pode ver na captura de tela de nossas transações internas anteriores, o etherscan não é um lugar amigável para visualizar traços. Prefiro usar o phalcon blocksec, que desenrola a transação assim:

Link para o Explorador

Isso pode parecer esmagador, mas na verdade é uma maneira super fácil de explorar todas as funções, eventos e argumentos no fluxo de uma transação. Uma vez que você consiga entender isso, então você pode dizer com segurança que entende todos os dados em uma transação. Note que meu consulta de localizador de tabelaé uma cópia quase exata deste layout, fui amplamente inspirado por eles!

Note que, no Dune, decodificamos automaticamente tanto as chamadas de transação como os rastreios do mesmo nome de função para a mesma tabela. Pode estar a perguntar-se se pode facilmente juntar eventos e rastreios/transações na ordem agradável mostrada no phalcon. No Dune, pode juntar-se ao hash da transação para geralmente associar os dados, mas não pode juntar-se a nenhum índice para recriar a ordem exata das interações. É uma limitação infeliz no momento que requer um indexador personalizado.

Avante, mais profundamente na floresta escura da criptografia

Se você entender os conceitos que apresentei neste guia, estará pronto para aprofundar-se e escrever consultas mais complexas. Navegar pelos dados em transações usando várias ferramentas diferentes será uma das habilidades mais importantes que você precisará para se destacar neste espaço.

Provavelmente, uso cerca de 10 exploradores diferentes todas as semanas, e o número de ferramentas é 10 vezes maior. Escrevo um guia anual que abrange a evolução da pilha de ferramentas de dados e para que você deve usar cada ferramenta:

Link do Guia

Disclaimer:

  1. Este artigo é reproduzido a partir de [cryptodatabytes], Todos os direitos autorais pertencem ao autor original [Andrew Hong]. Se houver objeções a esta reimpressão, contacte o Gate Learn equipe, e eles vão lidar com isso prontamente.
  2. Aviso de Responsabilidade: As visões e opiniões expressas neste artigo são exclusivamente do autor e não constituem qualquer conselho de investimento.
  3. As traduções do artigo para outros idiomas são feitas pela equipe Gate Learn. A menos que seja mencionado, copiar, distribuir ou plagiar os artigos traduzidos é proibido.
เริ่มตอนนี้
สมัครและรับรางวัล
$100