イーサリアム(EVM)上のブロックエクスプローラーの読み方と、取引、トレース、ログの理解方法

上級Sep 13, 2024
Etherscanなどのエクスプローラーを読み込み、これら3つの主要なデータ構造をナビゲートしてデータを探し、クエリするために必要なテーブルを見つける方法を学びます。
イーサリアム(EVM)上のブロックエクスプローラーの読み方と、取引、トレース、ログの理解方法

トランザクションには何が含まれていますか?

もしEthereum(または他のスマートコントラクト対応ブロックチェーン)で取引をしたことがあるなら、おそらくetherscan.ioのようなブロックエクスプローラーで情報を調べたことがあるでしょう。

取引概要タブ

そして、ログやトレース(内部トランザクション)を見ようと試みた場合、これらの混乱するページが表示されるかもしれません。

ログタブ(これがきれいにデコードされているならラッキーです)

トレースタブ(うーん、それはただの無駄に見える)

ブロックエクスプローラーでトランザクションの詳細を読むことは、すべてのイーサリアムデータ解析と知識の基盤となります。したがって、すべての要素とそれらをSQLでどのように扱うかを網羅しましょう。

私はただこれらの概念を高いレベルで理解する方法について説明します。これらを手作業でデコードする方法を学びたい場合は、それに慣れる必要があります。データがエンコードされています(トランザクション/トレース/ログも同様)および使用方法Duneのbytearray/hex関数異なる種類の間を移動する。

このガイドの最後までに、このトランザクションテーブルファインダークエリを使用して、任意の契約のデータテーブルを理解し、ナビゲートすることができるようになります。

クエリリンク(トランザクションハッシュ、チェーン、およびブロック番号をプラグインしてください)

このガイドでの概念を学んだ後は、私の使用方法も学ぶべきです。EVMクイックスタートダッシュボード任意の契約分析を開始する

イーサリアムのプロトコルまたは製品を5分で分析する方法

アンドリュー・ホン

·

2022年12月30日

フルストーリーを読む

トランザクション

トランザクションはデータの氷山の先端に過ぎません。すべての痕跡やログは、最初の入力データがトップレベルの機能を開始した後に呼び出されます。まず、ブロックエクスプローラのトランザクションページで見ることができるすべてのフィールドにラベルを付けましょう。

Duneで「ethereum.transactions」をクエリすると表示されるフィールドは同じです。ここで識別するのが重要なのは、「to」がコントラクトかどうかです。通常、コントラクトは明確にラベル付けされます。コントラクトの場合、「関数呼び出し」を含む「入力データ」があるはずです。

取引リンク

これらの概念の中で、最初によく理解する必要があるのは、EOAと契約アドレスの違いです。契約はEOAによって展開され、トランザクションの「to」フィールドで呼び出すことができます。アドレスをクリックすると、エクスプローラーの左上に契約かアカウントかが表示されます。duneでは、ethereum.creation_tracesテーブルに参加して契約かどうかを確認できます。なお、トランザクションの「from」署名者になれるのはEOAのみです。

直接オンチェーンからのデータと、エクスプローラー/フロントエンドが追加したデータを区別することが重要です。ブロックチェーン内のすべては16進数(バイナリまたはバイトと呼ばれることもあります)で表されています。したがって、1inchのスワップコールにはこの入力データ文字列が含まれます。

例としてのトランザクション

最初の4バイト(8文字)は「関数シグネチャ(function signature)」であり、keccakハッシュ関数名と入力タイプのデコードの方法。Etherscanには、いくつかの契約に対して「デコード」ボタンがあり、これにより読みやすい形式が提供されます。

例のトランザクション

ご覧の通り、以前の長い16進数文字列には多くの変数が詰め込まれています。それらがエンコードされる方法は、スマートコントラクトのアプリケーションバイナリインターフェイス(ABI)仕様に従っています。

ABIはスマートコントラクトのAPIドキュメント(OpenAPI仕様のようなもの)です。詳細はこちらをご覧ください。ここに技術的詳細.ほとんどの開発者は、ABIがコントラクトと一致することを確認し、ABIをアップロードして、他の誰もがデコードで参照できるようにします。多くのコントラクトはMEV/取引に関連しており、開発者は物事をクローズドソースで非公開にしておきたいと考えているため、それらから解読を得ることはできません。

『デューン』では、テーブルを解読しました提出された契約ABIsに基づいてコントラクトテーブル(つまり、Ethereum.Contracts)では、関数とイベントがバイト署名(ethereum.signatures)に変換され、トレースやログと照合されて、uniswap_v2_ethereumなどのデコードされたテーブルが得られます。Pair_evt_Swapは、Uniswap v2ペアファクトリによって作成されたすべてのペア契約のすべてのスワップを格納します。特定のペアのスワップをフィルタリングするには、イベントのcontract_addressテーブルを確認します。

Duneでは、この関数呼び出しoneinch_ethereum.AggregationRouterV6_call_swapに対してこのテーブルをクエリしたいと思うでしょう。ガイドの始めにテーブルファインダーのクエリ結果の先頭にこのテーブル名が表示されます。

トレースとログの以下のセクションでは、私たちは次を使用します。同じ1inchアグリゲータースワップ取引. これは良い例です、なぜならルーターが多数のDEX契約間でトークンを交換するため、私たちは調査するためのトレースとログの多様性を得るからです。

ログ

次にイベントログについて話しましょう。ログは関数呼び出しの任意の時点で発行されることがあります。通常、開発者は、すべての送金/ロジックがエラーなく完了した後に、関数の最後にログを発行します。さて、先ほどの取引から発行されたuniswap v3スワップイベントを見てみましょう:

例のトランザクション

topic0、topic1、topic2、data フィールドがあることがわかります。topic0 は関数シグネチャと似ていますが、4 バイトではなく 32 バイトである点が異なります (同じ方法でハッシュされます)。イベントには、データのフィルタリングを高速化するための「インデックス付き」フィールドがあり、topic1、topic2、または topic3 に表示できます。他のすべてのフィールドは、"data" オブジェクトにまとめてエンコードされます。繰り返しになりますが、トランザクションやトレースと同じエンコード規則に従います。「28」は、ブロック全体のイベントのインデックスです。txで最初のスワップまたは転送が必要なときに参加すると便利な場合があります。

このイベントがどこでどのように発生したかのロジックを見つけるには、Solidityコードにダイブする必要があります。リンクされたアドレスをクリックして、契約タブに移動し、「emit swap」と検索します。すべてのイベントがコードで呼び出される直前に「emit」を持っていることを知っているので。

これは uniswapv3pool コントラクトですその工場は各ペアごとに作成されます。

このコントラクトの786行目で、'swap'機能の一部として発行されていることがわかります。

契約間を横断して機能やイベントの系譜をたどることができる能力は、問い合わせているデータの系譜を正確に理解するために身につける必要がある重要なスキルです。これらのファイルをナビゲートするためには、深くsolidityを学ぶ必要はありません。単に理解する方法を知っていれば十分です。契約インターフェースそして、関数/イベントが呼び出されたとき(function と emit があなたのキーワードです)。

関数やイベントのコードを徹底的に調査する具体的な例については、Sudoswapの契約とデータの詳細をチェックしてください.

以前のテーブルファインダークエリを使用すると、このスワップのクエリに使用するテーブルはuniswap_v3_ethereum.Pair_evt_Swapであることがわかります。これは、swap()関数が呼び出された後に発行されます。

トレース(イーサリアムトレース)

トレースは、さまざまな契約間のネストされた呼び出しのために非常に難しくなることがあります。まず、トレースの種類を理解しましょう。

  • CREATE: これは、新しいコントラクトが展開されたときに発生するトレースです。トランザクションの先頭で直接コントラクトを展開することができます。これはトランザクションデータに「to」アドレスがないことを意味します。また、関数呼び出し内でコントラクトを展開することもできます。したがって、コントラクトファクトリの存在があります。これに関しては、ethereum.creation_traces テーブルをご覧ください。
  • DELEGATECALL: これはトランザクションを見るときに「無視」リストに入れる必要があります。これは、ロジックを変更せずにリクエストを1つのサーバーから次のサーバーに転送することを想定しています。これはプロキシとストレージに関連しています。@bansaltushar014/deleGatecall-in-solidity-4138b121cbe">ここで詳細をチェックしてください。
  • CALL: これは最も一般的で汎用性のあるトレースです。コールは契約に関与せずにETHの価値を転送するだけであることもあります。また、任意の契約上の関数呼び出しであることもあります。
  • STATICCALL:これは状態を変更しない関数呼び出しであり、純粋に計算に使用されます。オラクル価格フィード、AMM価格計算、清算比率チェック、残高チェックなどはすべてstaticcallで行われます。Solidityでは一般的に、「view」または「pure」関数タイプとして表示されます。

trace_address列/インデックスも理解する必要があります。これはよく見る[0,1,1,1,1]のパターンです。これは、配列内の数字の数が関数呼び出しの深さと順序を示しているかのように想像してください。

A (null) - トランザクションの最初の入力のトレースアドレスは [] です

CALLs B (0)

CALLs C (0,0)

CALLs D (1)

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

コールH (2)

以前の内部トランザクション(トレース)のスクリーンショットからわかるように、etherscanはトレースを表示するのに適した場所ではありません。私は代わりにphalcon blocksecを使用することを好みます。

エクスプローラへのリンク

これは圧倒的に見えるかもしれませんが、実際にはトランザクションのフローでのすべての機能、イベント、および引数を簡単に調査する方法です。これを理解できるようになれば、トランザクションのすべてのデータを理解できると安全に言えます。私の テーブル ファインダー クエリこのレイアウトはほぼそのままコピーしたもので、彼らに大いにインスパイアされました!

Duneでは、同じ関数名のトランザクション呼び出しとトレースの両方を同じテーブルに自動的にデコードすることに注意してください。イベントとトレース/トランザクションを phalcon に示されている適切な順序で簡単に結合できるかどうか疑問に思われるかもしれません。Duneでは、トランザクションハッシュで結合してデータを結び付けることができますが、インデックスで結合してインタラクションの正確な順序を再現することはできません。現時点では、カスタム インデクサーを必要とするのは残念な制限です。

その先、暗い暗号の森の奥深くへ

このガイドで説明したコンセプトを理解しているなら、さらに深く掘り下げて複雑なクエリを書く準備ができています。複数の異なるツールを使用してトランザクション間のデータをナビゲートすることは、この領域で優れたスキルを発揮するために必要な最も重要なスキルの1つです。

おそらく私は毎週使用する異なるエクスプローラが10個あり、そのツールの数はその10倍です。私はデータツールのスタックがどのように進化しているか、そして各ツールをどのように使用するかについての年次ガイドを書いています。

ガイドリンク

免責事項:

  1. この記事は[暗号データバイト], すべての著作権は元の作者に帰属します [アンドリュー・ホン]. この転載に異議がある場合は、お問い合わせください。Gate Learnチームにお任せください。迅速に対応いたします。
  2. 免責事項:この記事で表明された見解や意見は、著者のものであり、投資アドバイスを構成するものではありません。
  3. 記事の他言語への翻訳は、Gate Learnチームによって行われます。特に明記されていない限り、翻訳された記事のコピー、配布、盗用は禁止されています。

イーサリアム(EVM)上のブロックエクスプローラーの読み方と、取引、トレース、ログの理解方法

上級Sep 13, 2024
Etherscanなどのエクスプローラーを読み込み、これら3つの主要なデータ構造をナビゲートしてデータを探し、クエリするために必要なテーブルを見つける方法を学びます。
イーサリアム(EVM)上のブロックエクスプローラーの読み方と、取引、トレース、ログの理解方法

トランザクションには何が含まれていますか?

もしEthereum(または他のスマートコントラクト対応ブロックチェーン)で取引をしたことがあるなら、おそらくetherscan.ioのようなブロックエクスプローラーで情報を調べたことがあるでしょう。

取引概要タブ

そして、ログやトレース(内部トランザクション)を見ようと試みた場合、これらの混乱するページが表示されるかもしれません。

ログタブ(これがきれいにデコードされているならラッキーです)

トレースタブ(うーん、それはただの無駄に見える)

ブロックエクスプローラーでトランザクションの詳細を読むことは、すべてのイーサリアムデータ解析と知識の基盤となります。したがって、すべての要素とそれらをSQLでどのように扱うかを網羅しましょう。

私はただこれらの概念を高いレベルで理解する方法について説明します。これらを手作業でデコードする方法を学びたい場合は、それに慣れる必要があります。データがエンコードされています(トランザクション/トレース/ログも同様)および使用方法Duneのbytearray/hex関数異なる種類の間を移動する。

このガイドの最後までに、このトランザクションテーブルファインダークエリを使用して、任意の契約のデータテーブルを理解し、ナビゲートすることができるようになります。

クエリリンク(トランザクションハッシュ、チェーン、およびブロック番号をプラグインしてください)

このガイドでの概念を学んだ後は、私の使用方法も学ぶべきです。EVMクイックスタートダッシュボード任意の契約分析を開始する

イーサリアムのプロトコルまたは製品を5分で分析する方法

アンドリュー・ホン

·

2022年12月30日

フルストーリーを読む

トランザクション

トランザクションはデータの氷山の先端に過ぎません。すべての痕跡やログは、最初の入力データがトップレベルの機能を開始した後に呼び出されます。まず、ブロックエクスプローラのトランザクションページで見ることができるすべてのフィールドにラベルを付けましょう。

Duneで「ethereum.transactions」をクエリすると表示されるフィールドは同じです。ここで識別するのが重要なのは、「to」がコントラクトかどうかです。通常、コントラクトは明確にラベル付けされます。コントラクトの場合、「関数呼び出し」を含む「入力データ」があるはずです。

取引リンク

これらの概念の中で、最初によく理解する必要があるのは、EOAと契約アドレスの違いです。契約はEOAによって展開され、トランザクションの「to」フィールドで呼び出すことができます。アドレスをクリックすると、エクスプローラーの左上に契約かアカウントかが表示されます。duneでは、ethereum.creation_tracesテーブルに参加して契約かどうかを確認できます。なお、トランザクションの「from」署名者になれるのはEOAのみです。

直接オンチェーンからのデータと、エクスプローラー/フロントエンドが追加したデータを区別することが重要です。ブロックチェーン内のすべては16進数(バイナリまたはバイトと呼ばれることもあります)で表されています。したがって、1inchのスワップコールにはこの入力データ文字列が含まれます。

例としてのトランザクション

最初の4バイト(8文字)は「関数シグネチャ(function signature)」であり、keccakハッシュ関数名と入力タイプのデコードの方法。Etherscanには、いくつかの契約に対して「デコード」ボタンがあり、これにより読みやすい形式が提供されます。

例のトランザクション

ご覧の通り、以前の長い16進数文字列には多くの変数が詰め込まれています。それらがエンコードされる方法は、スマートコントラクトのアプリケーションバイナリインターフェイス(ABI)仕様に従っています。

ABIはスマートコントラクトのAPIドキュメント(OpenAPI仕様のようなもの)です。詳細はこちらをご覧ください。ここに技術的詳細.ほとんどの開発者は、ABIがコントラクトと一致することを確認し、ABIをアップロードして、他の誰もがデコードで参照できるようにします。多くのコントラクトはMEV/取引に関連しており、開発者は物事をクローズドソースで非公開にしておきたいと考えているため、それらから解読を得ることはできません。

『デューン』では、テーブルを解読しました提出された契約ABIsに基づいてコントラクトテーブル(つまり、Ethereum.Contracts)では、関数とイベントがバイト署名(ethereum.signatures)に変換され、トレースやログと照合されて、uniswap_v2_ethereumなどのデコードされたテーブルが得られます。Pair_evt_Swapは、Uniswap v2ペアファクトリによって作成されたすべてのペア契約のすべてのスワップを格納します。特定のペアのスワップをフィルタリングするには、イベントのcontract_addressテーブルを確認します。

Duneでは、この関数呼び出しoneinch_ethereum.AggregationRouterV6_call_swapに対してこのテーブルをクエリしたいと思うでしょう。ガイドの始めにテーブルファインダーのクエリ結果の先頭にこのテーブル名が表示されます。

トレースとログの以下のセクションでは、私たちは次を使用します。同じ1inchアグリゲータースワップ取引. これは良い例です、なぜならルーターが多数のDEX契約間でトークンを交換するため、私たちは調査するためのトレースとログの多様性を得るからです。

ログ

次にイベントログについて話しましょう。ログは関数呼び出しの任意の時点で発行されることがあります。通常、開発者は、すべての送金/ロジックがエラーなく完了した後に、関数の最後にログを発行します。さて、先ほどの取引から発行されたuniswap v3スワップイベントを見てみましょう:

例のトランザクション

topic0、topic1、topic2、data フィールドがあることがわかります。topic0 は関数シグネチャと似ていますが、4 バイトではなく 32 バイトである点が異なります (同じ方法でハッシュされます)。イベントには、データのフィルタリングを高速化するための「インデックス付き」フィールドがあり、topic1、topic2、または topic3 に表示できます。他のすべてのフィールドは、"data" オブジェクトにまとめてエンコードされます。繰り返しになりますが、トランザクションやトレースと同じエンコード規則に従います。「28」は、ブロック全体のイベントのインデックスです。txで最初のスワップまたは転送が必要なときに参加すると便利な場合があります。

このイベントがどこでどのように発生したかのロジックを見つけるには、Solidityコードにダイブする必要があります。リンクされたアドレスをクリックして、契約タブに移動し、「emit swap」と検索します。すべてのイベントがコードで呼び出される直前に「emit」を持っていることを知っているので。

これは uniswapv3pool コントラクトですその工場は各ペアごとに作成されます。

このコントラクトの786行目で、'swap'機能の一部として発行されていることがわかります。

契約間を横断して機能やイベントの系譜をたどることができる能力は、問い合わせているデータの系譜を正確に理解するために身につける必要がある重要なスキルです。これらのファイルをナビゲートするためには、深くsolidityを学ぶ必要はありません。単に理解する方法を知っていれば十分です。契約インターフェースそして、関数/イベントが呼び出されたとき(function と emit があなたのキーワードです)。

関数やイベントのコードを徹底的に調査する具体的な例については、Sudoswapの契約とデータの詳細をチェックしてください.

以前のテーブルファインダークエリを使用すると、このスワップのクエリに使用するテーブルはuniswap_v3_ethereum.Pair_evt_Swapであることがわかります。これは、swap()関数が呼び出された後に発行されます。

トレース(イーサリアムトレース)

トレースは、さまざまな契約間のネストされた呼び出しのために非常に難しくなることがあります。まず、トレースの種類を理解しましょう。

  • CREATE: これは、新しいコントラクトが展開されたときに発生するトレースです。トランザクションの先頭で直接コントラクトを展開することができます。これはトランザクションデータに「to」アドレスがないことを意味します。また、関数呼び出し内でコントラクトを展開することもできます。したがって、コントラクトファクトリの存在があります。これに関しては、ethereum.creation_traces テーブルをご覧ください。
  • DELEGATECALL: これはトランザクションを見るときに「無視」リストに入れる必要があります。これは、ロジックを変更せずにリクエストを1つのサーバーから次のサーバーに転送することを想定しています。これはプロキシとストレージに関連しています。@bansaltushar014/deleGatecall-in-solidity-4138b121cbe">ここで詳細をチェックしてください。
  • CALL: これは最も一般的で汎用性のあるトレースです。コールは契約に関与せずにETHの価値を転送するだけであることもあります。また、任意の契約上の関数呼び出しであることもあります。
  • STATICCALL:これは状態を変更しない関数呼び出しであり、純粋に計算に使用されます。オラクル価格フィード、AMM価格計算、清算比率チェック、残高チェックなどはすべてstaticcallで行われます。Solidityでは一般的に、「view」または「pure」関数タイプとして表示されます。

trace_address列/インデックスも理解する必要があります。これはよく見る[0,1,1,1,1]のパターンです。これは、配列内の数字の数が関数呼び出しの深さと順序を示しているかのように想像してください。

A (null) - トランザクションの最初の入力のトレースアドレスは [] です

CALLs B (0)

CALLs C (0,0)

CALLs D (1)

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

コールH (2)

以前の内部トランザクション(トレース)のスクリーンショットからわかるように、etherscanはトレースを表示するのに適した場所ではありません。私は代わりにphalcon blocksecを使用することを好みます。

エクスプローラへのリンク

これは圧倒的に見えるかもしれませんが、実際にはトランザクションのフローでのすべての機能、イベント、および引数を簡単に調査する方法です。これを理解できるようになれば、トランザクションのすべてのデータを理解できると安全に言えます。私の テーブル ファインダー クエリこのレイアウトはほぼそのままコピーしたもので、彼らに大いにインスパイアされました!

Duneでは、同じ関数名のトランザクション呼び出しとトレースの両方を同じテーブルに自動的にデコードすることに注意してください。イベントとトレース/トランザクションを phalcon に示されている適切な順序で簡単に結合できるかどうか疑問に思われるかもしれません。Duneでは、トランザクションハッシュで結合してデータを結び付けることができますが、インデックスで結合してインタラクションの正確な順序を再現することはできません。現時点では、カスタム インデクサーを必要とするのは残念な制限です。

その先、暗い暗号の森の奥深くへ

このガイドで説明したコンセプトを理解しているなら、さらに深く掘り下げて複雑なクエリを書く準備ができています。複数の異なるツールを使用してトランザクション間のデータをナビゲートすることは、この領域で優れたスキルを発揮するために必要な最も重要なスキルの1つです。

おそらく私は毎週使用する異なるエクスプローラが10個あり、そのツールの数はその10倍です。私はデータツールのスタックがどのように進化しているか、そして各ツールをどのように使用するかについての年次ガイドを書いています。

ガイドリンク

免責事項:

  1. この記事は[暗号データバイト], すべての著作権は元の作者に帰属します [アンドリュー・ホン]. この転載に異議がある場合は、お問い合わせください。Gate Learnチームにお任せください。迅速に対応いたします。
  2. 免責事項:この記事で表明された見解や意見は、著者のものであり、投資アドバイスを構成するものではありません。
  3. 記事の他言語への翻訳は、Gate Learnチームによって行われます。特に明記されていない限り、翻訳された記事のコピー、配布、盗用は禁止されています。
今すぐ始める
登録して、
$100
のボーナスを獲得しよう!