Solana 開發系列1 —— 理解Solana

來源:登鏈社區

這是一個系列文章介紹Solana 開發。

Solana 是一個高效能的區塊鏈平台,透過獨特的共識機制和帳戶模型實現高吞吐量和低延。

作為系列文章第一篇,這篇文章主要介紹Solana 開發前需要了解的一些知識:

  1. Solana 誕生背景

  2. Solana 是如何出塊(共識運作)

  3. Solana 核心概念:帳戶模型、PDA、交易及費用、集群等。

Solana 誕生背景

Solana 於2017 年由Anatoly Yakovenko 創立。 Anatoly 選擇名為Solana 的名字,以致敬他們在工作於高通期間住和衝浪了三年的聖地亞哥北部的一個小海灘城鎮Solana Beach。

在創立Solana 之前,Anatoly 在高通、Mesosphere 和Dropbox 工作過多年,在高效能網路和分散式系統領域有著豐富經驗。

他認識到區塊鏈在可擴展性方面的瓶頸限制了其大規模應用的潛力。受到分散式系統中時間同步技術的啟發,他提出了Proof of History (PoH) 的概念。用於在不信任彼此的電腦之間進行時間同步。

我們開看看Solana 如何應用PoH 實現驗證者之間的高效同步的。

Solana 共識- 如何出塊

註:Solana 共識演算法文件有些過時,這部分的內容是參考深入Solana 共識加上我理解。

Solana 是一條權益證明(PoS)區塊鏈,共識演算法遵循兩階段:1. 選出驗證者出塊2. 其他驗證者對區塊進行投票,累積了足夠多投票之後,區塊被最終確認。

選出驗證者

在Solana 的協議中,有兩個重要時間間隔相關的字:Epoch 與時隙(slot):

  • 時隙(slot): 驗證者產生區塊的時間單位。每個時隙可以產生一個區塊,每個時隙持續400 毫秒。

  • Epoch: 在每個Epoch 開始時,Solana 網路會根據質押權重和先前的區塊隨機選出一個驗證者(稱為領導者Leader)序列, 這個領導者序列負責在該Epoch 內出塊,領導者序列在此期間保持固定,每個領導者可以連續處理4 個Slot(即出4 個區塊),每個Epoch大約持續兩天(包含432,000 個Slot)。直到下一個Epoch 重新產生領導者Leader。

上圖中,每個有顏色的區塊表示一個區塊,不同的顏色表示不同的驗證出的區塊。

隨機選舉這裡不細說(主要是不懂),在每個Epoch 開始時,驗證者就會知道在哪些slot 需要他來出塊。

但是這裡有兩個問題要解決:

  1. 驗證者怎麼知道該輪到自己出塊了?如果只依靠網路通信,由上一個驗證者告訴下一個驗證者,很可能由於網路延遲(或上一個驗證者斷線了)錯過寶貴的出塊時間,畢竟出塊時間只有0.4 秒。

  2. 如何在一個區塊裡面,塞入盡可能多的交易。如果類似以太坊一個交易一個交易接著執行,這麼短的時間裡,是放不了很多交易的。

Solana 最重要的創新- POH , 主要就是用來解決這兩個問題的。

出塊

Solana 為了實現高效能,引入了平行處理交易, 把交易的排序和執行分成了兩個階段,這樣執行階段就可以並行處理了。

其他驗證者在驗證交易時,也是按照相同的排序序列來執行驗證,為了讓交易排序序列可以被驗證, Solana 使用 POH 歷史證明哈希鏈的方式來確定交易的順序。

PoH 透過建立一系列加密雜湊(SHA256 演算法),每次雜湊計算都需要使用前一個雜湊值,這樣就可以確保下一個雜湊總是在上一個雜湊之後發生,因此POH 雜湊鏈結合介意數據就可以確定交易次序。

只需要在計算哈希時,加入交易資料作為輸入的一部分,就可以確定交易的序列。而且這個序列是可並行可驗證和不可篡改的。

目前的領導驗證者會不停從RPC伺服器和其他的驗證者那裡接收交易,做了初步的驗證(如驗證交易簽章和帳戶餘額)之後,就會加入的POH 雜湊鏈的計算當中排序,即給每筆交易打上一個全域、可驗證的時間順序標籤,然後再對交易進行並行執行。

在Solana 中,整個交易處理流程被分割成多個相互銜接的階段(交易驗證階段、POH 排序階段、執行階段、廣播階段),形成一個管線(pipeline)。不同階段之間可以並行、重疊地處理不同批次的交易,就不同CPU 核或GPU 在同時處理某一批交易的驗證核另一批交易的執行(稱為banking)。

交易的執行也是並行的,交易執行基於帳戶的讀寫依賴來安排並行度,將交易按照依賴分組,並行的放進不同線程/CPU 核心/GPU 任務中執行。

若兩筆交易操作的帳戶完全不同或都是唯讀,理論上可以同時執行;如果有寫入衝突,則必須依序執行,避免資料不一致。

現在我們明白了Solana 出塊的過程,這個如上的方式,Solana 在單一Slot(約400ms)內能夠處理大量交易。

POH – 同步時鐘

還有一個問題,驗證者怎麼知道該輪到自己出塊了?

每次雜湊操作都是需要最小時間,且每次雜湊計算都需要使用前一個雜湊值。這確保了無法進行並行化。因此PoH 哈希鏈,可以作為時間流逝的證明。

在Solana 中,每個區塊(的PoH 哈希鏈)必須包含12,500 個哈希。目前Slot 的領導者負責產生這些PoH 鏈(區塊)。

實際上,沒有驗證者都在後台自己計算著PoH 鏈(沒有交易資料的空Hash 鏈),如果前一個領導者(或多個前領導者)未發布區塊(或當前領導者未收到) ,只要經過Slot 要求的哈希數量,當前領導者就可以按時生成區塊。

如下圖Slot3 離線,Slot4 的驗證者為slot3 填入PoH 序列。

驗證和投票區塊

區塊的驗證過程包括驗證區塊元資料和重新計算PoH 哈希,會驗證並重播來自區塊的所有交易,並更新帳本。

驗證通過後,透過投票表示驗證者對一個區塊的承諾,驗證者持有的委託權益(幣)越多,投票的權重就越大。

通常,驗證者會選擇最重的鏈出區塊和投票,如果出現了前一個領導者的區塊未能到達當前領導者, 則可能會出現分叉的情況:

在分叉的情況下,驗證者會為每個子樹計算總的按股份加權投票,並選擇投票最多的。如果一個區塊獲得至少三分之二的持權加權投票,則該區塊被確認。

Solana 核心概念

Solana 帳戶

在Solana 上開發時, 與以太坊感受最大不同,是帳戶模型不一樣。

Solana 的帳戶和Linux 的文件很類似,一切皆是帳戶,它是一個儲存單元,它們有多種形式:

  • 使用者帳戶:由一個私鑰控制的帳戶,通常由錢包軟體為使用者產生。

  • 程式帳戶:用於儲存可執行字節碼(智慧合約代碼)的帳戶。

  • 資料帳戶:儲存狀態資訊的帳戶,例如使用者持有的特定代幣數量。

  • 原生程式帳戶:這些是執行網路各種核心功能的特殊預部署程式帳戶。包括系統程式、投票程式和BPF 載入器。

Solana 的中程序帳戶(即智慧合約),是無狀態的,是唯讀的,不儲存任何資料/狀態。數據是儲存在獨立的數據帳戶下。

當你呼叫Solana 合約的函數時,需要我們把使用的資料帳戶傳給函數。很容易讓沒有相互依賴的交易並發執行。

如果你了解EVM 的話,會知道狀態資料也都是保存在合約中,以一個計數器為例,在EVM 合約中,計數器的值保存在合約帳戶中,在Solana 中,必須建立兩個帳戶:一個是程式帳戶,用來儲存程式的程式碼,一個帳戶用來儲存計數器的值。

租金是Solana 減少狀態臃腫一種方式,要求帳戶保持最低餘額以保持活躍。租金可確保網路最終收回未使用或資金不足的帳戶。如果帳戶維持相當於兩年租金的最低餘額,就可以免租金。

Solana 的帳戶的設計,除了並發執行的好處外,還可以帶來程式的可重用性, 在以太坊上有大量相同的ERC20 的程式碼。

Solana 則不同,在創建新代幣時,無需重新部署智能合約。相反,只需要建立一個新帳戶,稱為鑄幣帳戶,該帳戶定義代幣數量、名稱、誰可以鑄造更多代幣等。

程式衍生位址(PDA:Program Derived Addresses)

用來保存程式資料的帳戶,就是PDA,

普通的使用者帳戶,有公鑰/地址,他們對應ed25519 橢圓曲線上的一個點,私鑰用於簽名以證明修改帳戶的權限(authority)。

程式派生位址(PDA)是使用bump (即使輸出偏離曲線的值)在曲線外產生的帳戶。 PDA 需要三個主要部分:父程式ID、一組種子和跳值。種子是一個字串數組,通常在程式中最設定一個狀態變數相關的特定種子,以建立類似哈希表的資料結構。來產生對應的PDA 。

推導出該PDA 的程序,是其owner,只有該程序可以修改PDA 的資料。

交易

我們發送到Solana 網路中的一筆交易包括四個部分:

  • 一個或多個指令(instructions)

  • 一個要讀取或寫入的帳戶數組(account_keys)

  • 一個或多個簽名(signatures)

  • 最近的區塊哈希(recent_blockhash)

一個指令是Solana 上最小的執行邏輯。指令指定了執行程序、涉及的所有帳戶和操作資料。指令呼叫程式更新狀態(例如,呼叫代幣程式將代幣從你的帳戶轉移到另一個帳戶),程式解釋指令中的數據,並對指定帳戶進行操作。

指令類似以太坊智能合約上的函數呼叫。

交易中多個指令的執行是原子性的,所有指令要麼一起成功,要麼一起失敗。

Solana 使用最近的區塊哈希,來指示交易的有效性,但我們想要進行交易時,將從集群中提取最近的blockhash 來創建有效的交易。交易在最近的blockhash 後後的150 個區塊內有效。如果超過了改時間,需要重新發起交易。

Solana 中沒有以太坊中的交易的Nonce 的概念。

Solana 交易費用與以太坊的Gas 機制有很大的不同,交易費用與交易中包含的簽名數量相關(lamports_per_signature),基礎手續費目前設定為每個簽名0.000005 SOL(5k lamports),這是一次性的費用,以便獲得使用網路資源的權利,無論實際使用多少資源來執行交易(或交易是否執行),都需要預先支付給網路。 50% 的費用支付給產生區塊的驗證節點,剩餘的50% 則被銷毀。

如果想提高其交易的優先順序【可選的費用】,它可以設定一個”計算單元價格”。這個價格與計算單元限制結合使用,用來決定交易的優先費用。

預設的計算單元限制為每個指令20 萬CU, 如果計算量比較大,可以設定最大為140 萬Cu。 Solana 交易會預先要求指定數量的計算單元(CUs),如果超出這個數量,交易將會失敗。

另外,Solana 交易還會收交易包大小的限制,Solana 網路遵循最大傳輸單元(MTU) 大小為1280 位元組,這與IPv6 MTU 大小約束一致,以確保透過UDP 傳輸叢集資訊的快速和可靠性。在計算必要的標頭(IPv6 的40 位元組和8 位元組的片段頭)後,1232 位元組仍然可用於封包, 簽章和訊息的組合不能超過此限制。

Solana 集群

Solana 群集 ( cluster ) 是一組驗證者共同處理交易並維護自己的帳本資料(ledger)。 Solana有幾個不同的集群,每個集群都有特定的用途:

集群對應以太坊不同的網路。

  • 本機(Localhost):位於預設連接埠8899的本機開發叢集。 Solana命令列介面(CLI)配備了一個內建的測試驗證者,可以根據個人開發者的需求進行定制,而無需任何空投或也不會遇到速率限制

  • 開發網路(Devnet):用於在Solana 上進行測試和實驗的無價值沙盒環境

  • 測試網路(Testnet):Solana核心貢獻者試驗新更新和功能的測試場所,以便在它們到達主網之前進行測試。它也用作開發人員進行效能測試的測試環境

  • 主網測試版(Mainnet Beta):即時、無許可的集群,發生真實世界的交易。這是用戶、開發者、代幣持有者和驗證者每天互動使用的「真實」Solana

每個集群都獨立運行,完全不知道其他集群的存在。發送到錯誤集群的交易將被拒絕,以確保每個運行環境的完整性。

總結

本文介紹了Solana 的核心概念,包括其帳戶模型、出塊機制、交易記費用結構。

要理解這些基礎知識,接下來我們就要開始上手Solana 開發應用程式了。

參考文章

  • Solana 是如何工作的- 工作原理

  • 深入Solana 共識- 從分叉到最終確定性

Total
0
Shares
Related Posts