歡迎來到《玩轉Solana》系列的第3期。在第1期文章中,我們學習了Solana區塊鏈的運作機制、帳戶模型和交易結構;在第2期文章中,我們學習如何使用Rust來編寫一個用於發布和展示文章的Solana程式並利用TypeScript腳本對其進行測試。
作為本系列的最後一期,本文將帶領大家使用Phalcon Explorer來分析一筆簡單的Solana交易。不過在此之前,先來看看Solana上的Token是如何實現的。
關於Tokens
Solana上的Token可以分為兩類:Native Token和其它Token。
Native Token其實就是Solana Token (SOL)。我們在之前的文章裡曾提到,Solana中的每個帳戶都擁有一個Lamports字段,Lamports實際上是SOL Token的最小單位(1 SOL = 10億Lamports),它記錄了當前帳戶Solana Token的餘額。
而對於其它Token,Solana使用了一個程式帳戶(Token Program)以及兩個資料帳戶(Mint Account和Token Account),來實現Token所需的所有功能。
Token Program
Token Program 結構示意圖
Token Program是由Solana Program Library(SPL)提供的程式帳戶,因此AccountInfo的Executable欄位顯示為True。
正如我們在第一篇文章中介紹的那樣,所有程式帳戶的擁有者都是BPF Loader,Token Program也不例外。此外,和System Program一樣,Token Program也被部署在Solana鏈上的一個固定位址。
作為一個程式帳戶,它實作了數個指令來提供不同的功能。例如,有些指令被用來建立Mint Account以初始化一種新的Token,或是建立Token Account用來記錄某一個位址持有的Token數量;而有些指令則提供了使用Token所需要的所有功能,例如增加Token數量的MintTo指令,或用於在一對位址之間轉移Token的Transfer指令。
需要注意,由於Token Program負責創建Mint Account和Token Account,它也是這兩個帳戶的擁有者。
Mint Account
Mint Account的結構和關係如下所示:Mint Account是一種資料帳戶,這表示其AccountInfo的Executable欄位為False。
在Solana上,每一種Token都和一個Mint Account對應。 Mint Account記錄了該種Token的總供應量,擁有Mint該Token權限的帳戶位址等資訊。
Token Account
Token Account用來記錄個體持有某種特定Token的數量。針對某一種Token,每個持有該Token的帳戶都擁有一個Token Account。如果某用戶擁有5種Token,那麼TA將擁有5個Token Account。
Token Account作為一種資料帳戶,其AccountInfo的Data部分由三個欄位組成:
-
Mint: 該Token Account對應的Mint Account的位址;
-
Owner: 有權將Token Account中Token轉出的帳戶,即該Token真正的「owner」;
-
Amount:當Token Account持有的目前Token數量。
-
Token Account 結構圖
需要強調的是,AccountInfo中的owner欄位和Data欄位中的owner是完全不同的。前者是Solana中每一個帳戶都擁有的一個字段,它指明了哪一個地址擁有直接修改當前帳戶資料的權限;後者則指明了該Token Account所記錄的Token實際上是屬於誰的,該字段本身是AccountInfo Data欄位的一部分。
將上述的內容串連起來,我們便能得到下面這張帳戶關係的示意圖。不管是System Program還是Token Program,它們在區塊鏈上都部署在唯一的地址,以庫的形式存在;一個錢包帳戶可能同時持有多個Token Account,它是這些Token Account真正的「owner」;同一類Token Account的Mint欄位指向了該種Token唯一的Mint Account,而該帳戶則記錄了Token的總供應量等資訊。
在Solscan查看Token帳戶變更狀況
我們可以使用Solscan來查看一筆交易中Token帳戶的變化情況:
https://solscan.io/tx/byRn8qtNAYSdvgaGCK4kmZV1m89b7uuFuy1cn96W6femp7WgwymLqJ2MP9hPbegqN9EPe7NvghWpqDFqoCDjKph#tokenBalanceChange
Address一欄列出了該交易涉及的所有Token Account;
Owner一欄則標註了該Token真正的“擁有者”,也就是Token Account Data字段中的owner;
Token一欄則對應了目前Token的Mint Account,我們可以點進第一行的$SON進一步查看:
可以看到,Profile Summary中的Owner Program指明了目前Mint Account的擁有者是Token Program,至此三類帳戶我們都在Solscan中進行了對應。
不過,Solscan這種展示方法可能會帶給人一些誤解。例如,上一張圖第一行增加的Balance到底屬於位址CHS9WajyFfuaAZRk2JC7hRJvPHXmG5fC94gtAPbnLjuY,還是Raydium Authority V4?這種展示方式無疑增加了理解的代價。
除此之外,讀者或許還會發現,Solscan中的Solana Token和其它Token在兩個板塊中分開展示。儘管這種分割方式在技術上是合理的,但如果能在展示時將它們統一視為Token放置在相同板塊下則更加容易理解。
Phalcon Explorer不僅解決了上述問題,還針對Solscan做了很多其它創新,接下來讓我們再使用Phalcon Explorer來看看同一筆交易。
? 建議打開鏈接,跟隨我們的步驟一起分析,這樣可以更好地了解交易細節,感受 Phalcon Explorer 的強大功能 ?
https://app.blocksec.com/explorer/tx/solana/byRn8qtNAYSdvgaGCK4kmZV1m89b7uuFuy1cn96W6femp7WgwymLqJ2MP9hPbegqN9EPe7NvghWpqDFqoCDjKph
使用Phalcon Explorer查看和分析交易
在Phalcon Explorer的正上方可以看到,當前交易被識別成了JITO的MEV交易,並且可以透過點擊交易簽名旁的Solana標識來一鍵跳到Solscan。
關於這筆交易的資訊被分成了四個板塊,分別是:Basic Info,Fund Flow,Balance Changes和Invocation Flow,你可以透過點擊右上角的圖示來切換到對應的部分。
Basic Info
Basic Info一欄的資訊相對簡單,它提供了一些關於當前交易的關鍵資訊。和交易簽名類似,你也可以點擊區塊號碼和簽名者地址跳到Solscan。
Fund Flow
Fund Flow一欄為分析者提供了交易執行時產生的資金流轉移和時序資訊。我們可以看到:
-
交易的發起者兼簽署者59vLEsmV5VCCGTxjHCoRiXkNgHDVcq7dGx98v9HCn2F首先向被標記為Raydium Authority V4的地址轉移了某種數量的Token;
-
接著Raydium Authority V4向簽署者59vLEsmV5VCCGTxjHCoRiXkNgHDVcq7dGx98v9HCn2F轉帳了約6.747的Wrapped SOL Token;
-
最後,簽署者也向Jito提供了0.000003的SOL Token作為Jito驗證者執行交易的小費。
下圖為Solscan中的資金流向圖。相較於Solscan,每一個地址在Phalcon Explorer中的資金流向圖唯一對應到一個節點,故而能更容易發現地址之間的資金流向關係,提高分析時的效率。
如果你想要對交易的資金流向進行更深入的分析也可以點擊右上角的棕色標識進入MetaSleush。
Balance Changes
Balance Changes一欄為我們清楚展示了不同帳戶在目前交易結束後所有Token的變化。
例如,交易的簽章者59vLEsmV5VCCGTxjHCoRiXkNgHDVcq7dGx98v9HCn2F就有三種Token發生了變化,分別是原生的SOL Token、名為61Hh8Udg7zruvG3BhyNiHF4UmULnC8reB9RBFtwi
在Balance Changes中出現的每一個Account Address都擁有一個或多個Token Account,透過點擊對應的地址能夠對其進行拷貝或跳到solscan上。
我們可以看到,Phalcon Explorer並沒有對SOL Token和其它Token作區分,故而能直接反映出某一帳戶所有Token的變化情況,並且能更加直觀地展示Token Account和其Owner之間的關係。
Invocation Flow
Invocation Flow記錄了交易的指令執行流程,其中的每一行都對應了Solana交易執行時的一條指令。
在這裡,我們將重點放在2和4這兩條涉及到Token轉移的指令。
第二條指令呼叫了Raydium的AMM的swapBaseIn來賣掉Token。展開該指令可以看到它由兩條CPI(Cross Program Invocation)指令組成,這兩條指令的作用是在Raydium Authority V4和交易簽署者之間進行Token轉移;第四條指令則是簽名者向Jito支付小費的過程。
如下圖所示,透過點擊指令後的Accounts標籤,我們可以查看指令涉及的所有帳戶。相較於Solscan,這種展示方式會更加簡潔,讓分析者將注意力放在交易中更關鍵的資訊上。
結論
在本文中我們首先介紹了Solana中Token的實現原理,隨後使用Solscan查看了一筆交易中Token Account的變化。最後,我們使用Phalcon Explorer對交易進行了進一步分析,並介紹了Phalcon Explorer功能上的創新和優化細節。