如何閱讀以太坊(EVM)上的區塊瀏覽器並理解交易、跟踪和日誌

進階Sep 13, 2024
學習閱讀類似Etherscan和naviGate的資料,跨越這三個關鍵資料結構,以及如何找到您需要查詢的表格。
如何閱讀以太坊(EVM)上的區塊瀏覽器並理解交易、跟踪和日誌

交易中包含什麼?

如果您曾在Ethereum(或任何支持智能合約的區塊鏈)上進行交易,那麼您可能會在像etherscan.io這樣的區塊瀏覽器上查找並看到這堆信息:

交易概覽選項卡

而且,如果你嘗試查看日誌或跟踪(內部交易),你可能會看到這些令人困惑的頁面:

日誌選項卡(如果它們像這樣被很好地解碼,你很幸運)

痕跡標籤(是的,它看起來像一堆無意義的東西)

學習在區塊瀏覽器上閱讀交易的詳細資料將成為您所有以太坊數據分析和知識的基礎,因此讓我們涵蓋所有的組件以及如何在SQL中使用它們。

我只是在高層次上解釋如何理解這些概念;如果你想學會手工解碼這些內容,那麼你需要熟悉數據已編碼(對於交易/跟蹤/日誌,情況也是一樣的)以及如何使用Dune的bytearray/hex函数在不同類型之間轉換。

通過本指南的結尾,您將能夠理解並查閱使用此交易表查詢工具的任何合約的數據表。

查詢連結(插入任何交易哈希、鏈和區塊號)

在您學習了本指南中的概念之後,您還應該學習如何使用我的以太坊虛擬機(EVM)快速入門儀表板開始進行任何合約分析。

如何在五分鐘內分析任何以太坊協議或產品

Andrew Hong

·

2022年12月30日

閱讀完整故事

交易

交易只是數據冰山的一角,所有蹤跡和日誌都是在初始輸入數據啟動頂層函數之後調用的。讓我們首先標記您在區塊瀏覽器的交易頁面中會看到的所有字段:

這些是您在Dune查詢“ethereum.transactions”時看到的相同字段。在這裡要學會識別的關鍵項目是“to”是否是一個合約。通常,合約將清楚標記。如果是一個合約,應該有包含函數調用的“輸入數據”。

交易連結

在所有這些概念中,要好好學習的第一個是EOA與合約地址之間的區別。合約是由EOA部署的,可以在交易的“to”字段中調用。如果您點擊地址,探索者將在左上角顯示它是合約還是帳戶。在dune上,您可以加入以太坊.creation_traces表來檢查它是否是合約。請注意,只有EOA可以成為交易的“from”簽名者。

重要的是要了解來自區塊鏈直接的數據與探索器/前端添加的數據之間的區別。區塊鏈中的所有內容都表示為十六進制(有時被稱為二進制或字節),所以一個1inch交換調用將具有這個輸入數據字符串:

示例交易

前4個字節(8個字符)是“函數簽名”,即keccak 雜湊函數名稱和輸入類型。 Etherscan為一些合約提供了一個很好的“解碼”按鈕,讓您可以獲得這種可讀形式:

示例交易

正如您所看到的,先前那個長十六進位字符串中包含著許多變量。它們的編碼方式遵循智能合約的應用二進制接口(ABI)規範。

ABI 就像智能合約的 API 文件 (例如 OpenAPI 規範),您可以在這裡閱讀更多相關內容。技術細節在這裡.大多數開發者會驗證其ABI與合約匹配並上傳ABI供其他人參考解碼。許多合約可能與MEV/交易相關,開發者希望保持封閉源碼和私密性-因此我們無法從他們那裡獲得任何解碼。

在Dune中,我們解碼了表格基於提交的合約ABI將合約轉換為表格(即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類似於函數簽名,只不過它是32個字節,而不是只有4個字節(仍然以相同的方式進行哈希)。事件可以有“索引”字段,以加快數據篩選,這些字段可以出現在topic1、topic2或topic3中。所有其他字段都編碼在“data”對象中。同樣,它們遵循與交易和跟踪相同的編碼規則。這裡的“28”是整個區塊中該事件的索引。有時候,在想要在交易中找到第一個交換或轉帳時,這個索引是有用的。

要找出此事件是在哪裡和如何發出的邏輯,我需要深入研究 solidity 代碼。我會點擊事件的鏈接地址,進入合約標籤,並搜索“emit swap”,因為我知道所有事件在代碼中被調用之前都會有“emit”這個詞。

這是uniswapv3pool合約這是為每一對創建的工廠。

我可以看到這是在合約的第786行發出的,作為“swap”功能的一部分。

能夠導航功能和事件系譜跨合約將是您需要掌握的關鍵技能,以準確理解您正在查詢的數據系譜。您無需深入了解 solidity 就能導航這些文件,只需知道如何理解合約界面當函數/事件被調用時(function和emit是你的關鍵詞)。

關於深入研究函數和事件的代碼的詳細示例,查看Sudoswap合約和數據的詳細分析.

使用之前的表查詢器,我可以看到我應該查詢這個交換的表是uniswap_v3_ethereum.Pair_evt_Swap,它是在調用swap()函數之後發出的。

追蹤 (以太坊.追蹤)

跟踪很快就会变得非常难以导航,因为不同合约之间的嵌套调用。让我们首先了解跟踪的类型:

  • CREATE:當新合約部署時,會發出此跟踪。您可以直接在交易頂部部署合約,這意味著交易數據中沒有“to”地址。您也可以在函數調用中部署合約,因此存在合約工廠。在ethereum.creation_traces表中查看這些的簡單視圖。
  • DELEGateCALL:在查看交易時,將此視為您的心理“忽略”列表。將其視為在不更改任何邏輯的情況下將請求從一個伺服器轉發到下一個。這與代理和存儲有關,您可以@bansaltushar014/deleGatecall-in-solidity-4138b121cbe">在這裡查看更多詳情。
  • CALL: 這是最常見和通用的追踪。一個呼叫可能只是轉移以太幣價值,而不涉及任何合約。它也可以是對任何合約的任何函數呼叫。
  • STATICCALL:這是一個不修改任何狀態並純粹用於計算的函數調用。像是 Oracle 價格餵入、AMM 價格計算、清算比率檢查、餘額檢查等等都發生在 staticcall 中。在 Solidity 中通常被稱為“view”或“pure”函數類型。

您還需要瞭解trace_address列/索引。這是您經常看到的 [0,1,1,1,1] 模式。想像一下,這就像項目符號,陣列中的數字數表示函數調用的深度和順序。

一個(空)—交易的第一個輸入具有一個trace_address of []

CALLs B (0)

CALLs C (0,0)

CALLs D (1)

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

CALLs H (2)

從我們先前的內部交易(跡象)截圖可以看出,etherscan並不是一個友好的查看跡象的地方。我更喜歡使用phalcon blocksec,它可以像這樣解開交易:

連結至瀏覽器

這看起來可能有點壓倒性,但實際上這是一種非常簡單的探索交易流程中所有功能、事件和參數的方法。一旦你能理解這一點,你就可以安全地說你理解了交易中的所有數據。請注意我的查詢表搜尋器是这个布局的几乎完美复制,我在很大程度上受到了他们的启发!

请注意,在Dune上,我们会自动将相同函数名称的事务调用和跟踪解码到同一张表中。您可能想知道是否可以轻松地按照phalcon中显示的漂亮顺序连接事件和跟踪/事务。在Dune上,您可以通过事务哈希连接数据,但不能通过任何索引来重新创建交互的确切顺序。这是一个目前的不幸限制,需要自定义索引器。

更深入加密世界的黑暗森林

如果您理解了我在本指南中概述的概念,那麼您就準備好深入挖掘並撰寫更複雜的查詢了。使用多種不同工具在交易之間導航數據將是您在這個領域脫穎而出所需的最重要技能之一。

我每周可能會使用大約10種不同的探索者,而工具的數量是那個數量的10倍。我撰寫了一份年度指南,介紹了數據工具堆棧如何不斷演進,以及應該如何使用每個工具:

指南鏈接

免責聲明:

  1. 本文轉載自 [cryptodatabytes], 所有版權屬於原作者[Andrew Hong]. 如果對此轉載有異議,請聯繫Gate Learn團隊將會迅速處理。
  2. 責任聲明:本文所表達的觀點和意見僅代表作者個人觀點,並不構成任何投資建議。
  3. 文章的翻譯工作由Gate Learn團隊負責。未經許可,禁止複製、分發或剽竊翻譯後的文章。

如何閱讀以太坊(EVM)上的區塊瀏覽器並理解交易、跟踪和日誌

進階Sep 13, 2024
學習閱讀類似Etherscan和naviGate的資料,跨越這三個關鍵資料結構,以及如何找到您需要查詢的表格。
如何閱讀以太坊(EVM)上的區塊瀏覽器並理解交易、跟踪和日誌

交易中包含什麼?

如果您曾在Ethereum(或任何支持智能合約的區塊鏈)上進行交易,那麼您可能會在像etherscan.io這樣的區塊瀏覽器上查找並看到這堆信息:

交易概覽選項卡

而且,如果你嘗試查看日誌或跟踪(內部交易),你可能會看到這些令人困惑的頁面:

日誌選項卡(如果它們像這樣被很好地解碼,你很幸運)

痕跡標籤(是的,它看起來像一堆無意義的東西)

學習在區塊瀏覽器上閱讀交易的詳細資料將成為您所有以太坊數據分析和知識的基礎,因此讓我們涵蓋所有的組件以及如何在SQL中使用它們。

我只是在高層次上解釋如何理解這些概念;如果你想學會手工解碼這些內容,那麼你需要熟悉數據已編碼(對於交易/跟蹤/日誌,情況也是一樣的)以及如何使用Dune的bytearray/hex函数在不同類型之間轉換。

通過本指南的結尾,您將能夠理解並查閱使用此交易表查詢工具的任何合約的數據表。

查詢連結(插入任何交易哈希、鏈和區塊號)

在您學習了本指南中的概念之後,您還應該學習如何使用我的以太坊虛擬機(EVM)快速入門儀表板開始進行任何合約分析。

如何在五分鐘內分析任何以太坊協議或產品

Andrew Hong

·

2022年12月30日

閱讀完整故事

交易

交易只是數據冰山的一角,所有蹤跡和日誌都是在初始輸入數據啟動頂層函數之後調用的。讓我們首先標記您在區塊瀏覽器的交易頁面中會看到的所有字段:

這些是您在Dune查詢“ethereum.transactions”時看到的相同字段。在這裡要學會識別的關鍵項目是“to”是否是一個合約。通常,合約將清楚標記。如果是一個合約,應該有包含函數調用的“輸入數據”。

交易連結

在所有這些概念中,要好好學習的第一個是EOA與合約地址之間的區別。合約是由EOA部署的,可以在交易的“to”字段中調用。如果您點擊地址,探索者將在左上角顯示它是合約還是帳戶。在dune上,您可以加入以太坊.creation_traces表來檢查它是否是合約。請注意,只有EOA可以成為交易的“from”簽名者。

重要的是要了解來自區塊鏈直接的數據與探索器/前端添加的數據之間的區別。區塊鏈中的所有內容都表示為十六進制(有時被稱為二進制或字節),所以一個1inch交換調用將具有這個輸入數據字符串:

示例交易

前4個字節(8個字符)是“函數簽名”,即keccak 雜湊函數名稱和輸入類型。 Etherscan為一些合約提供了一個很好的“解碼”按鈕,讓您可以獲得這種可讀形式:

示例交易

正如您所看到的,先前那個長十六進位字符串中包含著許多變量。它們的編碼方式遵循智能合約的應用二進制接口(ABI)規範。

ABI 就像智能合約的 API 文件 (例如 OpenAPI 規範),您可以在這裡閱讀更多相關內容。技術細節在這裡.大多數開發者會驗證其ABI與合約匹配並上傳ABI供其他人參考解碼。許多合約可能與MEV/交易相關,開發者希望保持封閉源碼和私密性-因此我們無法從他們那裡獲得任何解碼。

在Dune中,我們解碼了表格基於提交的合約ABI將合約轉換為表格(即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類似於函數簽名,只不過它是32個字節,而不是只有4個字節(仍然以相同的方式進行哈希)。事件可以有“索引”字段,以加快數據篩選,這些字段可以出現在topic1、topic2或topic3中。所有其他字段都編碼在“data”對象中。同樣,它們遵循與交易和跟踪相同的編碼規則。這裡的“28”是整個區塊中該事件的索引。有時候,在想要在交易中找到第一個交換或轉帳時,這個索引是有用的。

要找出此事件是在哪裡和如何發出的邏輯,我需要深入研究 solidity 代碼。我會點擊事件的鏈接地址,進入合約標籤,並搜索“emit swap”,因為我知道所有事件在代碼中被調用之前都會有“emit”這個詞。

這是uniswapv3pool合約這是為每一對創建的工廠。

我可以看到這是在合約的第786行發出的,作為“swap”功能的一部分。

能夠導航功能和事件系譜跨合約將是您需要掌握的關鍵技能,以準確理解您正在查詢的數據系譜。您無需深入了解 solidity 就能導航這些文件,只需知道如何理解合約界面當函數/事件被調用時(function和emit是你的關鍵詞)。

關於深入研究函數和事件的代碼的詳細示例,查看Sudoswap合約和數據的詳細分析.

使用之前的表查詢器,我可以看到我應該查詢這個交換的表是uniswap_v3_ethereum.Pair_evt_Swap,它是在調用swap()函數之後發出的。

追蹤 (以太坊.追蹤)

跟踪很快就会变得非常难以导航,因为不同合约之间的嵌套调用。让我们首先了解跟踪的类型:

  • CREATE:當新合約部署時,會發出此跟踪。您可以直接在交易頂部部署合約,這意味著交易數據中沒有“to”地址。您也可以在函數調用中部署合約,因此存在合約工廠。在ethereum.creation_traces表中查看這些的簡單視圖。
  • DELEGateCALL:在查看交易時,將此視為您的心理“忽略”列表。將其視為在不更改任何邏輯的情況下將請求從一個伺服器轉發到下一個。這與代理和存儲有關,您可以@bansaltushar014/deleGatecall-in-solidity-4138b121cbe">在這裡查看更多詳情。
  • CALL: 這是最常見和通用的追踪。一個呼叫可能只是轉移以太幣價值,而不涉及任何合約。它也可以是對任何合約的任何函數呼叫。
  • STATICCALL:這是一個不修改任何狀態並純粹用於計算的函數調用。像是 Oracle 價格餵入、AMM 價格計算、清算比率檢查、餘額檢查等等都發生在 staticcall 中。在 Solidity 中通常被稱為“view”或“pure”函數類型。

您還需要瞭解trace_address列/索引。這是您經常看到的 [0,1,1,1,1] 模式。想像一下,這就像項目符號,陣列中的數字數表示函數調用的深度和順序。

一個(空)—交易的第一個輸入具有一個trace_address of []

CALLs B (0)

CALLs C (0,0)

CALLs D (1)

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

CALLs H (2)

從我們先前的內部交易(跡象)截圖可以看出,etherscan並不是一個友好的查看跡象的地方。我更喜歡使用phalcon blocksec,它可以像這樣解開交易:

連結至瀏覽器

這看起來可能有點壓倒性,但實際上這是一種非常簡單的探索交易流程中所有功能、事件和參數的方法。一旦你能理解這一點,你就可以安全地說你理解了交易中的所有數據。請注意我的查詢表搜尋器是这个布局的几乎完美复制,我在很大程度上受到了他们的启发!

请注意,在Dune上,我们会自动将相同函数名称的事务调用和跟踪解码到同一张表中。您可能想知道是否可以轻松地按照phalcon中显示的漂亮顺序连接事件和跟踪/事务。在Dune上,您可以通过事务哈希连接数据,但不能通过任何索引来重新创建交互的确切顺序。这是一个目前的不幸限制,需要自定义索引器。

更深入加密世界的黑暗森林

如果您理解了我在本指南中概述的概念,那麼您就準備好深入挖掘並撰寫更複雜的查詢了。使用多種不同工具在交易之間導航數據將是您在這個領域脫穎而出所需的最重要技能之一。

我每周可能會使用大約10種不同的探索者,而工具的數量是那個數量的10倍。我撰寫了一份年度指南,介紹了數據工具堆棧如何不斷演進,以及應該如何使用每個工具:

指南鏈接

免責聲明:

  1. 本文轉載自 [cryptodatabytes], 所有版權屬於原作者[Andrew Hong]. 如果對此轉載有異議,請聯繫Gate Learn團隊將會迅速處理。
  2. 責任聲明:本文所表達的觀點和意見僅代表作者個人觀點,並不構成任何投資建議。
  3. 文章的翻譯工作由Gate Learn團隊負責。未經許可,禁止複製、分發或剽竊翻譯後的文章。
即刻開始交易
註冊並交易即可獲得
$100
和價值
$5500
理財體驗金獎勵!