成爲鏈上數據分析師之路:讀懂以太坊交易

發表於 2022-03-18 14:28 作者: 歐科雲鏈OKLink

鏈上數據分析的流程可以從數據出發來解讀行爲,再到意圖直至交易心理。其中,行爲可以是交易者的行爲,可以是合約的行爲,也可以是市場的行爲。對交易者意圖的判斷和長期的觀察可以得出其交易心理,從合約行爲可以更精准地了解合約創建者(項目方)的意圖,代碼不說謊。最後,對某些特定行爲和意圖的分析可以得出市場整體的心理狀態和心理預期。

而鏈上數據的核心就是交易數據,那么本文我們就從交易數據开始解讀,從淺入深,按照從整體到細節的順序,以以太坊的工作原理爲基线理解瀏覽器中的交易數據。

我們把交易數據中需要了解的概念按照從淺到深的順序分爲三級,大家可以根據自己的基礎有選擇地閱讀:

一級關鍵詞:普通交易|合約交易

二級關鍵詞:外部账戶|內部账戶|內部交易

三級關鍵詞:Transfer|Transaction|事件|日志

一、以太坊交易類型

首先,以太坊中的交易可以大致分爲兩種:外部地址交易(圖1)&合約交易(圖2)。


圖1:外部账戶地址交易概覽頁數據來源:

OKLink以太坊瀏覽器

交易哈希:0x62240a31b2ae135b942181aa33a8cae10cfa267903f64f95662e3b0c1a6acd91

普通地址交易是指僅涉及以太坊原生代幣(native token)Ether的轉移,不涉及合約的調用以及以太坊中其它token的交易。普通交易中的數據可以大概分爲四大塊:交易哈希、時間等歸於交易索引(index),提供定位交易的信息。交易金額具體是指Ether轉移的數量,交易的發送方(sender)和接收方(receiver)互爲本次交易中的交易對手。Gas費的消耗是本次交易發送方需要承擔的交易成本。

圖2:0x513d和Metamask Router合約交易概覽頁

數據來源:OKLink以太坊瀏覽器

交易哈希:0x3beae4df73a2a1d6dc5cc56b412ec2aead42aaea54fcd2e68103df4975e7da62

我們看到,涉及智能合約的瀏覽器交易概覽頁會多出三塊內容:

(1) 以太坊執行交易的內部過程(內部交易);

(2) 代幣轉账的結果(代幣轉账);

(3) 合約執行的入參(輸入數據)

相比普通交易,合約交易頁頂部還多了兩個標籤(藍色):內部交易和事件日志。

那么,什么是內部交易?爲什么普通地址之間的交易沒有內部交易的標籤?內部交易標籤內呈現的信息如何解讀?內部交易(Internal Transaction)和普通交易(Transaction)的區別在哪?

要回答上面前三個問題我們需要了解兩個概念:外部账戶&內部账戶

二、外部账戶&內部账戶

以太坊的地址(账戶)分爲外部账戶(即實體账戶)和內部账戶(即合約账戶)兩種。

用戶通過手中的私鑰訪問外部地址,而內部地址不能被當作錢包直接訪問,只能通過調用它們的函數使用。

外部账戶就是以太坊以外世界的實體(人)想訪問以太坊世界的代理,也是以太坊這個世界計算機的狀態發生改變最初始的源頭。我們知道以太坊狀態的改變由交易(普通交易)發起,如果交易對手爲一個智能合約,則交易中的輸入數據(input)就會作爲虛擬機執行合約時的入參觸發合約方法。合約方法被調用執行後可能還會觸發其它合約中的方法,如此形成一個鏈式反應,這些鏈式反應的中間過程即爲內部交易。如圖3:

現在,我們再來看一下瀏覽器中的普通地址交易(圖1),就明白爲什么沒有內部交易的標籤項了——因爲這是一個從外部账戶到外部账戶之間的轉账,發送方沒有在輸入數據中附加代碼,接收方也沒有可執行的合約方法。而圖2的合約交易由0x514d的外部账戶地址發起至0x881d的合約账戶,發起方0x514d通過輸入數據(input data)告訴合約0x881d所需調用的合約方法(function)以及方法所需傳入的參數。合約中的方法被調用後會繼續調用其他合約中的方法。比如,在第一條內部交易中Metamask的Router合約會繼續調用(call)接收方0x74de(Matic代幣的合約地址)中的方法……最終形成一個調用鏈條,這就是我們所說的內部交易。

圖4:0x513d和Metamask Router合約交易內部交易標籤頁

注:內部交易詳情頁記錄的交易只涉及原生代幣Ether的轉移。

需要注意的是,由於以太坊區塊鏈中只存儲以太坊虛擬機(EVM)處理交易後的狀態,並不存儲計算過程。所以,以上展示的內部交易信息並不存儲在區塊鏈中,而當中發生以太坊轉账(紅框)的結果則最終會更新在t+1的世界狀態中。其中一部分執行結果會體現在“代幣轉账”(Token Transfer)裏。圖5:Token Transfer部分

回過頭來,我們再來回顧一下外部账戶的概念。雖然外部账戶的行爲有時並不直接導致以太坊世界狀態的改變(外部账戶余額的變化或合約账戶狀態的變化),但追蹤這些變化的源頭一定來自外部账戶,而這時直接導致改變的原因就是合約方法的執行。

讀到這裏,大家在腦中可能已經積累了一些疑問:

  1. 我們經常會在一些描述中看到兩個詞:Transfer和Transaction,兩個詞都可以被翻譯爲轉账,那它們有何不同呢?

  2. 上面提到的0x881d合約如何知道被調用了哪個合約方法?

  3. 第三個標籤事件日志(Log)是什么?它的作用在哪裏?它們都會記錄在區塊鏈上嗎?

我們一個一個來回答~

三、交易和事件

1. Transfer和Transaction有何不同?

Transfer通常指代幣歸屬權的轉移,可以分爲原生代幣的轉账和其它標准代幣的轉账(如,ERC20、ERC721等);而Transaction是指交易的發起者,也就是from地址(外部账戶),向礦工提交的交易請求,如果被礦工成功納入到區塊中並完成共識,則該筆交易生效,否則會被告知交易失敗。

那發起者提交的交易到底包含哪些信息呢?這就需要我們了解一個交易是如何在鏈上發生的。

圖6:Transaction數據組成

我們重點解釋第三部分。這部分從程序執行邏輯上是交易發送者輸入以太坊虛擬機執行此交易的初始信息: 虛擬機操作對象(接收方 To)、從交易發送方轉移到操作對象的資產(Value),以及虛擬機運行時入參(input)。其中 To 爲空時,意味着虛擬機無可操作對象,此時虛擬機將利用 input 內容部署一個新合約。

2. 下面我們還是以上面的合約交易(圖2)爲例回答第二個問題:0x881d合約如何知道被調用了哪個合約方法?

這需要我們對入參進行解析。輸入數據去除0x後的前八位代表合約方法識別符(5f575529),後邊數據爲方法所需的參數。

其中,合約方法識別符爲合約方法經過SHA-3哈希算法後保留前八個字符得到的。因此,雖然我們不知道合約源碼,但是根據前八位的識別符,我們可以在其它已知方法源碼的記錄中匹配到該方法:

swap(string aggregatorId, address tokenFrom, uint256 amount, bytes data)。

由於智能合約中的方法經常會被復用其他合約中,因此同一個方法(識別符)可能對應多個合約。

圖7:輸入數據解析

3. 第三個標籤事件日志(Log)是什么?它的作用在哪裏?它們都會記錄在區塊鏈上嗎?

在一個合約源碼中,不僅會定義合約方法(function),還會定義事件event abc()和提交事件emit abc(),執行過提交的事件就會被記錄在日志中,最後日志會被記錄在一個調用合約的交易的receipt函數中。我們以SushiSwap的合約0x7f8F7Dd53D1F3ac1052565e3ff451D7fE666a311的源碼爲例,他們定義了Sync事件,還會提交該事件並記錄在日志中。

圖8:SushiSwap合約部分源碼

然而,在日志中存儲事件並不是爲了日後可以被智能合約訪問,**智能合約是不能監聽(listen)到日志中的數據的。**事實上,事件用於通知外面的用戶區塊鏈上發生的事情。例如,當你在以太坊地址上收到一筆代幣時,錢包的接口就會爲你推送一條到账提醒,這實際上是錢包的前段接口監聽到了鏈上發生的一個事件。由於事件提交事件的代碼在合約源碼中,它的執行也是以去中心化的方式進行,且最終被保存在區塊鏈上。因此,日志中的數據是可信的。另一個开發者使用事件的原因是日志是一種更便宜的存儲方式,日志中存儲數據的成本大約是8 gas/byte,而在合約變量中存儲數據的成本爲625 gas/byte。

圖9:0x513d和Metamask Router合約交易事件日志標籤頁

爲了描述事件,一條日志通常會包含幾個有索引(Indexed)的Topic,和沒有索引的Data。其中,Topic0爲通常包含發生事件名稱的籤名(keccak256哈希值),包括其參數的類型(uint256,字符串等)。還是以上面0x513d和Metamask Router合約交易爲例,紅字部分的日志中記錄了在執行SushiSwap合約時在日志中記錄的事件。

[Topic0]:0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1

就是將事件Sync (uint112 reserve0, uint112 reserve1)運行Keccak256算法得到的。另外,…1f0f和…d552是事件中的兩個參數。

我們調取了OKLink全節點一整年的事件日志(2021.3.15-2022.3.16),我們看到Transfer的事件是最多的,上面分析的Sync事件排名第三~

圖10:事件方法排名

四、小結

在本文中,我們從兩種交易類型的概覽入手,分析了外部账戶地址之間的交易數據和外部账戶地址觸發的合約方法執行過程。兩種交易都包含交易索引、對手方、交易金額和成本。合約交易中,合約方法的調用過程除了在發起方和接收方之間的一次會被區塊鏈記錄,其它合約內部的調用過程均不上鏈,只有執行的結果和提交事件會被記錄在區塊鏈中。

撰文:Mabrary

標題:成爲鏈上數據分析師之路:讀懂以太坊交易

地址:https://www.coinsdeep.com/article/576.html

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

你可能還喜歡
熱門資訊