玩轉 Solana 一文掌握 Solana 核心概念

2024年,Solana異軍突起,TVL從年初的十億美元飆升至如今的近五十億美元,一躍成為第4大公鏈。

與Ethereum相比,Solana以更快的速度和更低廉的費用為用戶帶來了更為優越的體驗。其基於POH的共識機制和異步的交易執行模式為開發者提供了高吞吐量和低延遲的區塊鏈性能,成為各種去中心化應用的首選平臺。

BlockSec 特別策劃了 《玩轉 Solana》 系列文章,涵蓋 Solana 基本概念、查看和分析 Solana 交易實用指南以及編寫 Solana 智能合約教程等乾貨內容。

作為該系列的第1期,本文將深入介紹Solana網絡中的關鍵概念,包括其運行機制,帳戶模型和交易,為大家編寫出正確且高效的Solana合約打下基礎。

eBPF: Solana交易的執行基石

為了編寫和執行智能合約,區塊鏈往往需要一套程式語言和圖靈完備的計算環境。

熟悉Ethereum的朋友們應該知道,以太坊上的智能合約通常使用高級語言Solidity來編寫,而Solidity編譯產生的字節碼則運行在一個叫做以太坊虛擬機的環境中。

Solana並沒有選擇開發全新的虛擬環境和語言,而是充分利用了現有的優秀技術。原本用於拓展Linux內核功能的eBPF(extended Berkeley Packet Filter)虛擬機被Solana選中並作為底層的執行環境。

那麼,eBPF 相對於 EVM 有哪些優勢?

相較於只支持解釋執行的EVM,eBPF能夠以即時編譯(JIT)模式直接將字節碼轉換成處理器可以直接執行的機器指令,從而更高效地運行程序。

eBPF擁有一套高效的指令集和成熟的基礎設施。開發者只需要使用Rust語言即可編寫智能合約。LLVM編譯框架提供了一個eBPF的後端,利用它可以直接將這些Rust語言編寫的程序編譯成可運行在eBPF虛擬機上的字節碼。

Solana的帳戶模型

1. Solana帳戶結構

Solana上的數據以帳戶的形式存儲。如下圖所示,我們可將Solana中的所有數據視作一個龐大的鍵值對資料庫。資料庫的鍵是帳戶的地址,對於「錢包」帳戶(即由

Solana用戶通過公私鑰對直接控制的帳戶)而言,這個地址是使用Ed25519籤名系統生成的公鑰;而資料庫的值是該帳戶的具體信息,包含餘額和其它相關信息。

Solana使用名為AccountInfo的結構來描述一個帳戶,其組成如下圖所示。

Solana中的每個帳戶均包含四個欄位。這裡我們對其進行逐一解釋。

  • Data欄位 存儲了該帳戶有關的數據。如果該帳戶為一個程序(即智能合約),則它存儲的其實就是eBPF字節碼。否則,Data中信息格式一般由帳戶創建者自行定義。

  • Executable欄位 用於標識該帳戶是否為程序。需要注意的是,與以太坊不同,Solana中的程序是可以更新的。

  • Lamports欄位 記錄了該帳戶Solana代幣的餘額。Lamports實際上是SOL Token的最小單位(1 SOL = 10億Lamports)。

  • Owner欄位 指示了當前帳戶的擁有者。在Solana中,任何一個帳戶都有一個「Owner」。例如,所有「錢包」帳戶的擁有者都是System Program,這是Solana網絡上的一個特殊帳戶,負責帳戶創建等功能。帳戶擁有者是唯一能夠修改帳戶數據和扣除Lamports餘額的人(但任何人都可以增加Lamports,即向帳戶執行轉帳功能)。

2. 預定義的Solana帳戶

Solana擁有一套稱作 Native Programs 的預定義運行程序,它們被部署在固定的地址上。隨著Solana網絡的升級,這些預定義的程序也可能會被更新。我們可以將這些程序理解成Solana網絡下提供特定功能的API和庫函數。

在Native Programs中,開發者經常需要與之交互的一個程序是 System Program 。System Program為開發者提供了一些指令(Instructions),我們可以把每條指令理解成是一個獨立的方法。例如,開發者可使用CreateAccount指令來創建新的帳戶,或者使用Transfer指令將Lamports轉帳給其它帳戶。

另外一個常見的Native Programs是BPF Loader程序。它是所有其它程序帳戶的擁有者,其負責部署、更新和執行特定的程序。當一個「錢包」帳戶需要更新它部署過的程序時,實際上就是通過委託BPF Loader程序來完成的,畢竟只有程序的擁有者才有直接權限修改數據。

除了Native Programs,Solana還提供了一組被稱作 Sysvar 的帳戶。它們為Solana上的程序提供了與當前Solana網絡狀態相關的信息和全局變量,例如當前的時鐘,最近的區塊哈希等。

3. 帳戶租金

在Solana鏈上,每個帳戶需要保持一定數量的Lamports作為最低額度,這被稱為 租金 。與現實生活中的租金概念不同,Solana上的租金是可以收回的。為了確保帳戶在鏈上的數據是可用的,帳戶需要持有相應數量的Lamports。租金的數額與帳戶在鏈上存儲空間的大小相關。

任何試圖將帳戶餘額扣減至低於租金數額的交易都會失敗,除非這筆交易直接將帳戶的餘額扣減至零。這種操作表明該帳戶的租金已被收回,在交易執行結束時,Solana會通過垃圾回收清空相應帳戶的存儲空間。

? 在瀏覽器中查看「Solana帳戶」

為了帶領大家更好地理解相關概念,我們使用Solana提供的「Hello World」項目創建了一個程序帳戶,可以通過Solana的區塊鏈瀏覽器Solscan來查看 以下帳戶 ? 的相關信息。

CJWhxB4qEWBv9eGYUkTN881bNDMDkLbzH1FmdwqLLhoe

如上圖所示,我們首先可以看到,該帳戶已被Solana瀏覽器標明為「Program」。在創建該帳戶時從發送者的餘額裡扣除了一部分Lamports作為該帳戶的租金,故而我們可以看到其SOL Balance欄位不為空。

其次,由於我們創建的是一個程序,其Executable欄位為 Yes。這裡可能有一個難以理解的地方,那就是讀者也許會發現Data欄位存儲的是一個地址而非eBPF程序。我們在前面提到過,Solana允許更新程序,而它實際上是通過一種「代理」模式來實現的。由於Solana並不允許直接修改程序帳戶,所以它創建了一個數據帳戶用來存儲eBPF程序,而在程序帳戶的Data欄位只存儲數據帳戶的地址。每當需要更新程序時,就只需修改數據帳戶中的Data欄位。我們用Solscan查看Executable Data欄位的帳戶可以發現它被標記為「Program Executable Data Account」,其Data欄位存儲了實際的程序:

回到上一張圖片,我們可以發現在More info中Owner欄位為BPF Loader,這與我們在上一節中的描述是一致的。

在Overview中還有一個名為「Upgrade Authority」的欄位,它的含義是什麼呢?

正如我們前面提到的,「錢包」帳戶是通過委託BPF Loader來更新程序的,而在更新之前,BPF Loader需要驗證委託者是否擁有更新的權限。由於程序帳戶的Owner欄位已經是BPF Loader,其自身已經沒有空間來存儲該信息了,因此Solana選擇把這個信息存儲在數據帳戶的Data欄位中,這個信息實際上就是部署程序的錢包地址,也就是這裡的「Upgrade Authority」。下圖展示了程序帳戶與數據帳戶之間的關係,可以看到數據帳戶的Data欄位由錢包地址和eBPF代碼兩部分信息組成。

Solana的交易和指令

在Solana中,用戶同樣通過籤發交易(Transactions)來執行程序。其特別之處在於, Solana能夠並行執行這些交易 ,這也是其能夠提供閃電般交易速度的重要原因。接下來我們來看看Solana的交易是如何設計的。

一筆Solana交易由籤名和消息主體組成。一筆交易可包含多個籤名。交易的消息主體由四個部分組成,如下圖所示。

消息的 頭部信息 (Header)和 帳戶地址數組 (Compact array of account addresses)兩個欄位指定了交易涉及的所有帳戶以及帳戶在交易中的特徵:包括該帳戶是否提供了籤名以及執行過程中是否會被寫入。利用這些信息,Solana能夠驗證相應帳戶提供的籤名,並且能夠並行地執行那些不觸碰相同帳戶集合的交易。

最近的 區塊哈希 (Recent Blockhash)是交易的時間戳。Solana網絡會確保交易來自於最近的150個區塊,否則交易會被認為過期從而不被執行。

指令數組 (Compact array of Instructions)是交易中最重要的部分,包含了一條或多條指令。一條指令實際上是對某個程序提供的一段例程的調用。指令由三個欄位組成,如下圖所示:

第一個欄位Program ID Index指定了指令的接收者,即需要處理該指令的鏈上程序。它不直接存放一個32位元組的地址,而是將該地址放在消息主體中的帳戶地址數組中。該欄位使用一個字節的下標指明其在數組中的位置,實現了一種空間復用。

和第一個欄位類似,第二個欄位是由帳戶地址下標組成的數組(Compact array of account address indexes),它指明了處理該指令涉及到的所有帳戶。

最後一個欄位是一段字節數組,它是程序處理該指令需要的額外信息,可以把它理解成函數的參數。

需要注意的是,Solana會按照順序處理交易中的所有指令,並確保交易的執行是原子的。這意味著一筆交易中的指令要麼全部失敗,要麼全部成功執行,不會出現部分指令成功執行而部分失敗的情況。

? 在瀏覽器中查看「Solana交易」

我們使用另外一個Solana瀏覽器來查看 前面創建程序帳戶的交易? 。在Overview中能夠看到Solana交易的籤名、最近區塊哈希等信息:
3uKQ85Lpsnwb5D6CgUntoMyJX3tSaeGb4pjUoMaMyNVqQNPp5PRG1kJEEEk3YNdWLYEMZGmoJ5Rowgon8hZzwL9D

而在Account Input中則列出了當前交易涉及到的所有帳戶以及相關帳戶在交易中的特徵。我們可以看到除了發送者、程序帳戶等地址外,兩個Native Programs和Sysvar帳戶也被包含進去了。

由於該交易是一個簡單的程序創建交易,所以它只包含了兩條指令,第一條指令的接收者是 System Program ,負責創建程序帳戶;第二條指令的接受者則是 BPF Loader ,負責將實際部署的eBPF代碼寫入到數據帳戶中,並將其地址寫入到程序帳戶的Data欄位。

總結

Solana上的智能合約採用Rust語言開發,並在eBPF虛擬機上運行。它遵循帳戶模型,鏈上的帳戶需要維持租金才能保證數據的可用性。交易由一條或多條指令組成,明確定義了依賴的所有帳戶,從而使得交易能夠被並行處理,提高了吞吐量並降低了響應延遲。這些特點共同促進了Solana的快速發展,使其成為備受青睞的區塊鏈平臺之一。

  • Related Posts

    一場事先張揚的死亡:Jeffy假死背後的金錢和人性

    Jessy,比特鏈視界 幣圈Meme又出新敘事:死亡賽道。 …

    被幣安下架卻暴漲 羊駝幣莊家的極限操盤

    Jessy,比特鏈視界 按照常理,一個代幣被交易所下架,是一…

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    You Missed

    從 Meme 幣到 CSGO 皮膚:投機永不眠

    • By jakiro
    • 15 5 月, 2025
    • 0 views
    從 Meme 幣到 CSGO 皮膚:投機永不眠

    這一次以太坊散戶戰勝機構

    • By jakiro
    • 15 5 月, 2025
    • 1 views
    這一次以太坊散戶戰勝機構

    Bankless:重建以太坊的產品與貨幣循環機制

    • By jakiro
    • 15 5 月, 2025
    • 1 views
    Bankless:重建以太坊的產品與貨幣循環機制

    巴菲特的 9 條重要投資經驗

    • By jakiro
    • 15 5 月, 2025
    • 1 views
    巴菲特的 9 條重要投資經驗

    華爾街日報:巴菲特為何退休?下任接班人是誰?

    • By jakiro
    • 15 5 月, 2025
    • 2 views
    華爾街日報:巴菲特為何退休?下任接班人是誰?

    Fartcoin的屁聲響徹華爾街

    • By jakiro
    • 14 5 月, 2025
    • 1 views
    Fartcoin的屁聲響徹華爾街
    Home
    News
    School
    Search