Solana 執行層概述

進階9/10/2024, 2:08:23 PM
本文介紹了 Solana 區塊鏈的運營機制,該平台以其高性能和低延遲著稱。報告探討了 Solana 設計和運營的復雜性,包括其交易生命週期、共識機制,以及如 SVM Rollups 和 ZK 壓縮等關鍵特性。

前言

“我們比世界上任何人都更了解小型、高速、低成本的優勢,現在我們將這些概念應用於區塊鏈。” — Greg Fitzgerald,Solana 聯合創始人

Solana 是一個以高性能、低延遲而聞名的區塊鏈平台,具有速度、效率和用戶體驗方面的特點。它有獨特的集成架構,能夠在全球去中心化的網路中處理每秒數千筆交易。區塊時間爲 400 毫秒,交易費用僅爲幾美分,它在速度和成本效益上均表現出色。本文將深入探討 Solana 的設計和操作復雜性,分析其關鍵機制和網路拓撲結構,這些因素共同促成了其強大的能力。

Solana 採用了一體化的區塊鏈開發方法,充分利用了創始團隊在構建分布式系統方面的多年經驗。Solana 的核心原則之一是軟件不應成爲硬件的障礙。這意味着軟件應充分利用其運行的硬件,並與其共同擴展。作爲一個統一的生態系統,所有構建在這一區塊鏈上的應用程序都繼承了可組合性,使它們能夠無縫互動和相互構建。這種架構還確保了直觀的用戶體驗,無需橋接、單獨的鏈 ID 或流動性碎片化。

Solana 正在快速發展,最近的進展包括 SVM Rollups 和 ZK 壓縮,這些都是重要的擴展解決方案。雖然這些項目未來可能會影響我們對 Solana 的認知,但目前它們仍處於非常早期的開發或採用階段,因此在本報告中不予涵蓋。

交易生命週期

在本報告中,我們主要通過典型交易的生命週期來理解 Solana。爲了構建一個基本的 Solana 交易理解模型,我們可以將流程概述如下:

  • 用戶發起交易,所有交易都被發送到當前的主區塊生產者(即領導者)。領導者將這些交易匯總成一個區塊,執行它們,從而更新其本地狀態。
  • 這個交易區塊隨後會在網路中傳播,供其他驗證者執行和確認。

本報告的後續部分將擴展此模型,並深入探討這一過程的更多細節,從用戶這一關鍵參與者開始。

請記住

對 Solana 核心協議的重大更改需要經過正式透明的過程,即提交 Solana 改進文檔(SIMD),並接受社區成員和核心工程團隊的公開批評。SIMD 會由網路進行投票表決。

六大階段介紹

我們將在本報告中引用上述的六階段圖示,因爲它爲我們理解Solana核心元素之間的關係提供了一個一致的框架。

前面的章節根據這六個階段進行了安排。最後的章節——Gossip、Archive、Economics和Jito——則涵蓋了所有未盡之處。需要注意的是,有些章節會跨越多個階段,而有些階段會出現在多個章節中。

這種重疊是不可避免的,因爲六大階段框架有其局限性。實際上,Solana是一個復雜的分布式系統,具有許多相互依賴的元素。

用戶

“Solana有潛力成爲加密領域如同蘋果公司那樣的項目”——Solana聯合創始人Raj Gokal

用戶的旅程通常始於設置和資助錢包應用程序。Solana上有多個流行的錢包應用程序,既有本地移動應用,也有瀏覽器擴展。

錢包通過加密生成用戶的密鑰對,包括公鑰和私鑰。公鑰作爲帳戶的唯一標識符,所有網路參與者都能知道。用戶在Solana上的帳戶可以被視爲一個數據結構,保存與其在Solana區塊鏈上的互動相關的信息和狀態。因此,公鑰類似於文件名:公鑰唯一標識Solana區塊鏈上的帳戶,就像文件名唯一標識文件系統中的文件一樣。Solana上的公鑰以32字節的Base58編碼字符串表示。

FDKJvWcJNe6wecbgDYDFPCfgs14aJnVsUfWQRYWLn4Tn

私鑰,也稱爲祕密密鑰,可以看作是訪問和修改帳戶的密碼或訪問密鑰。使用私鑰進行籤名是區塊鏈處理授權的方式。知道私鑰意味着對帳戶擁有絕對的控制權。Solana的私鑰也是32字節長。密鑰對是由公鑰(前半部分)和私鑰(後半部分)組成的64字節組合。示例:

3j15jr41S9KmdfughusutvvqBjAeEDbU5sDQp8EbwQ3Hify2pfM1hiEsuFFAVq8bwGywnZpswrbDzPENbBZbd5nj

[63,107,47,255,141,135,58,142,191,245,78,18,90,162,107,197,8,33,211,15,228,235,250,30,185,122,105,23,147,115,115,86,8,155,67,155,110,51,117,0,19,150,143,217,132,205,122,91,167,61,6,246,107,39,51,110,185,81,13,81,16,182,30,71]

私鑰也可以從助記詞種子短語中派生,通常爲12個或24個單詞。這種格式常用於錢包,方便備份和恢復。多個密鑰可以從一個種子短語中確定性地派生出來。

Solana採用Ed25519,這是一種廣泛使用的橢圓曲線數字籤名算法,用於其公鑰加密需求。Ed25519因其密鑰大小小、籤名大小小、計算速度快以及對許多常見攻擊的免疫性而受到青睞。每個Solana錢包地址代表Ed25519橢圓曲線上的一個點。

用戶用私鑰籤署交易。該籤名包含在交易數據中,其他參與者可以使用發送者的公鑰進行驗證。此過程確保交易未被篡改並得到相應私鑰所有者的授權。籤名還充當交易的唯一標識符。

Solana 交易

發送交易是改變 Solana 狀態的唯一方法。任何寫入操作都是通過事務執行的,並且事務是原子性的——要麼事務嘗試執行的所有操作都發生,要麼事務失敗。交易,更正式地稱爲“交易消息”,包含四個部分:標頭、帳戶地址列表、最近的區塊哈希和指令。

  • 標頭:標頭包含對帳戶地址列表的引用,指示哪些帳戶必須籤署交易。
  • 帳戶地址列表: 該列表包括在交易過程中將被讀取或寫入的所有帳戶。爲每個交易構建這樣的列表是Solana獨有的要求,開發人員可能會面臨挑戰。然而,事先了解交易將與哪些狀態交互,能夠實現許多其他區塊鏈無法做到的優化。
  • 最近的區塊哈希: 這個字段用於防止重復和過時的交易。最近的區塊哈希在150個區塊後過期(大約1分鍾)。默認情況下,RPC每2秒嘗試轉發交易,直到交易被最終確定或最近的區塊哈希過期,此時交易將被丟棄。
  • 指令: 這些構成了交易的核心部分。每個指令代表一個特定的操作(例如,轉帳、鑄幣、銷毀、創建帳戶、關閉帳戶)。每個指令指定要執行的程序、所需的帳戶以及執行該指令所需的數據。

交易中的指令數量首先受到其大小的限制,最大可達1,232字節。此外,還有對可引用的帳戶數量的限制。最後,交易的復雜性也受到計算單位(CUs)的限制。計算單位量化了處理交易所需的計算資源。

請記住
SOL的最小單位稱爲“lamport”,等於SOL的十億分之一,類似於比特幣中的satoshi。lamport以計算機科學家和數學家Leslie Lamport的名字命名,他的研究奠定了現代分布式系統的許多理論基礎。

執行交易的SOL費用分爲兩部分 - 基礎費用和優先費用。基礎費用是每個籤名固定爲5000 lamports,不論交易的復雜性如何——通常,每個交易有一個籤名。

優先費用在技術上是可選的,但在區塊空間需求高峯期變得必要。這些費用以微lamports(lamport的百萬分之一)計算每個計算單位。它們的目的是作爲價格信號,使交易在經濟上更具吸引力,以便驗證節點將其包含在區塊中。

總費用 = 優先費用 + 基礎費用

優先費用 = 計算單位價格(微lamports)x 計算單位限制

目前,所有交易相關費用的50%被銷毀,永久從流通中移除,而剩餘的50%歸區塊生產者所有。即將引入的新變化(SIMD 96)將允許100%的優先費用歸區塊生產者,基礎費用保持不變。

發送交易

用戶將錢包連接到應用程序,這樣應用程序就可以讀取用戶的公鑰。私鑰則保持加密,並在與應用程序分離的安全環境中得到保護。

應用程序根據用戶的操作構建交易消息參數。例如,如果用戶想要交換兩個代幣,他們需要指定要購買的代幣數量、要出售的對應代幣,以及可接受的交易滑點。

交易消息準備好後,它會被發送到錢包進行用戶私鑰籤名。此時,用戶會彈出確認交易的窗口。該窗口可能會包含交易結果的模擬。一旦籤名完成,交易消息和籤名將返回給應用程序,應用程序可以將交易轉發給其選擇的 RPC 提供商,無論是其自有的還是使用錢包提供商的服務。

RPC(遠程過程調用)提供商充當應用程序與構建區塊的驗證者之間的中介。他們是一個重要服務,使應用程序能夠提交或模擬籤名交易,並高效地檢索鏈上數據。希望與網路交互的應用程序通過 JSON-RPC 或 WebSocket 端點進行(參閱文檔)。

請記住
在 Solana 上,“失敗交易”這一術語可能會引起誤解並造成相當大的混亂。這些交易會產生費用,並且由運行時根據籤署者的意圖成功執行。它們之所以“失敗”,是由於交易本身的邏輯要求這樣做。超過 80% 的“失敗”交易來自錯誤代碼 0x1771,即超出滑點金額的代碼(數據)。值得注意的是,這些交易中有 95% 是由僅佔活躍 Solana 地址的 0.1% 提交的,主要是自動化的機器人,試圖利用時間敏感的價格套利機會。

Gulf Stream

“Solana 的目標字面上是讓交易的速度與新聞傳播的速度一樣快——就像光速通過光纖一樣。我們的競爭對手是 NASDAQ 和紐約證券交易所。”—— Anatoly Yakovenko,Solana 聯合創始人

RPC(遠程過程調用)指的是 RPC 節點。這些節點可以被視爲與網路交互和讀取數據的網關。它們運行與完整驗證者相同的軟件,但設置不同,使其能夠準確地模擬交易並保持對當前狀態的最新視圖。截至目前,Solana 網路上已有超過 4,000 個 RPC 節點。

與完整驗證者節點不同,RPC 節點在網路中沒有持有任何權益。沒有權益,它們就無法進行投票或構建區塊。這一設置與大多數其他區塊鏈不同,因爲在那些區塊鏈中,驗證者和 RPC 節點通常是相同的。由於 RPC 節點不接收質押獎勵,因此運行 RPC 節點的經濟模式與驗證者不同,許多 RPC 節點作爲開發者運行 Solana 應用程序的付費服務存在。

Solana 的獨特之處在於它從一開始就設計爲不使用內存池(mempool)。與傳統區塊鏈通過八卦(Gossip)協議隨機和廣泛傳播交易不同,Solana 將所有交易轉發到一個預定的主要驗證者(即領導者)處,該驗證者在每個時隙中負責處理這些交易。

重點提示
Solana 運營着四個集羣:Localnet、Testnet、Devnet 和 Mainnet-Beta。當人們提到 Solana 或 Solana 網路時,他們幾乎總是指 Mainnet-Beta。Mainnet-Beta 是唯一一個代幣具有實際價值的集羣,而其他集羣僅用於測試目的。

一旦 RPC 接收到要包含在區塊中的交易消息,它必須轉發給領導者(leader)。在每個 epoch(大約每兩天)之前,會生成一個領導者計劃。即將到來的紀元被劃分爲若幹個時隙,每個時隙固定爲 400 毫秒,並爲每個時隙選擇一個領導者。擁有更多權益的驗證者將更頻繁地被選擇爲每個紀元的領導者。在每個時隙中,交易消息被轉發給領導者,領導者有機會生成一個區塊。當輪到某個驗證者時,他們會切換到“領導者模式”,開始積極處理交易並向網路廣播區塊。

權益加權服務質量(SWQoS)

在 2024 年初,Solana 引入了一種新的機制,旨在防止垃圾信息和增強女巫抵抗能力,這一機制被稱爲“權益加權服務質量”(SWQoS)。該系統使領導者能夠優先處理通過其他已質押驗證者代理的交易消息。在這種機制下,持有更高權益的驗證者獲得相應更高的能力,將交易消息數據包傳送給領導者。這種方法有效地緩解了來自未質押節點的女巫攻擊。

在這一模型下,驗證者還可以與 RPC 節點達成協議,將其按權益加權的容量租賃給 RPC 節點。作爲回報,RPC 節點獲得了更大的帶寬,從而提高了在區塊中交易的包含率。值得注意的是,領導者的 80% 能力(2000 個連接)被保留用於 SWQoS,剩餘的 20%(500 個連接)則用於來自未質押節點的交易消息。這種分配策略類似於高速公路上的優先車道,駕駛者可通過支付通行費來避開交通擁堵。

SWQoS 對 Solana 生態系統產生了影響,通過提高將交易轉發給領導者的要求並減少垃圾信息攻擊的有效性。此變化鼓勵高流量應用程序進行縱向整合。通過運行自己的驗證者節點或訪問已質押的連接,應用程序可以確保對領導者的優先訪問,從而提升其交易處理能力。

QUIC 說明

在 2022 年底,Solana 採用了 QUIC 網路協議來管理交易消息的傳輸。這一轉變是由於網路中由於機器人刷鏈上 NFT 發行導致的幹擾。QUIC 使得快速、異步的通信成爲可能。

QUIC 最初由 Google 於 2012 年開發,旨在結合兩者的優勢。它提供類似於 UDP 的快速異步通信,同時具備 TCP 的安全會話和先進的流量控制策略。這使得可以對單個流量源設置限制,從而使網路能夠集中處理真實的交易。QUIC 還引入了獨立流的概念,因此如果某一交易丟失,不會阻塞其他交易。簡而言之,QUIC 可以被視爲試圖結合 TCP 和 UDP 的最佳特性。

請注意

權益加權是 Solana 系統中的一個反復出現的原則,涵蓋了投票獎勵、渦輪樹、領導者調度、Gulf Stream 和 Gossip 網路。持有更多權益的驗證者在網路中獲得更高的信任和優先級角色。

區塊構建

“我們認爲 SVM(Solana 虛擬機)在當前虛擬機技術中是最好的。” — Andre Cronje,Fantom Foundation

許多區塊鏈網路在廣播之前先構建完整的區塊,這種方法稱爲離散區塊構建。與此不同,Solana 採用的是連續區塊構建,即在分配的時間槽內動態地組裝和流式傳輸區塊,從而顯著降低延遲。

每個時間槽持續 400 毫秒,每個領導者被分配四個連續的時間槽(1.6 秒),然後輪換到下一個領導者。爲了獲得接受,一個區塊中的所有交易必須有效且可被其他節點重現。

在承擔領導者角色的前兩個時間槽,驗證者會停止交易轉發,以準備即將到來的工作負載。在此期間,入站流量激增,達到每秒超過十億字節,因爲整個網路將數據包發送到即將到來的領導者。

在接收後,交易消息進入交易處理單元(TPU),這是驗證者的核心邏輯,負責區塊生產。在這裏,交易處理過程開始於獲取階段(Fetch Stage),在該階段交易通過 QUIC 接收。隨後,交易進入籤名驗證階段(SigVerify Stage),進行嚴格的驗證檢查。在此階段,驗證者會驗證籤名的有效性、檢查籤名數量是否正確,並排除重復的交易

銀行階段

銀行階段可以描述爲區塊構建階段。它是 TPU 的最重要階段,得名於“銀行”。銀行實際上是某一特定區塊的狀態。對於每個區塊,Solana 有一個銀行,用於訪問該區塊的狀態。當一個區塊在足夠多的驗證者投票後變得最終確定時,他們會將銀行中的帳戶更新寫入磁盤,使其成爲永久性的。鏈的最終狀態是所有已確認交易的結果。這個狀態總是可以從區塊鏈歷史中確定性地重建。

交易以並行方式處理,並打包成分類帳“條目”,每個條目包含 64 個不衝突的交易。Solana 上的並行交易處理變得簡單,因爲每筆交易必須包含將要讀取和寫入的所有帳戶的完整列表。這個設計選擇雖然增加了開發者的負擔,但允許驗證者通過輕鬆選擇僅包含不衝突交易的條目來避免競爭條件。如果兩個交易嘗試寫入同一帳戶(兩個寫操作),或者一個交易嘗試讀取而另一個交易寫入同一帳戶(讀取 + 寫入),這些交易就會發生衝突。因此,衝突的交易會分配到不同的條目中並按順序執行,而不衝突的交易則會並行執行。

有六個線程並行處理交易,其中四個專門處理普通交易,兩個專門處理投票交易,後者對於 Solana 的共識機制至關重要。所有的並行處理都是通過多個 CPU 核心實現的;驗證者沒有 GPU 要求(參閱文檔)。

一旦交易被分組爲條目,它們就準備由 Solana 虛擬機(SVM)執行。交易所需的帳戶被鎖定;進行檢查以確認交易是最新的但尚未處理。帳戶被加載,交易邏輯被執行,帳戶狀態被更新。條目的哈希將被發送到歷史證明服務進行記錄(更多內容將在下一部分討論)。如果記錄過程成功,所有更改將提交到銀行中,並解除第一步中對每個帳戶施加的鎖定。執行由 SVM 完成,SVM 是使用 Solana 的 rBPF 分支構建的虛擬機,rBPF 是一個用於 JIT 編譯和 eBPF 程序虛擬機的庫。值得注意的是,Solana 不規定驗證者如何選擇在區塊內排序交易。這種靈活性是一個關鍵點,我們將在本報告的經濟學 + Jito 部分進一步探討。

請注意

術語 SVM 可能會引起歧義,因爲它可能指代“Solana 虛擬機”或“Sealevel 虛擬機”。這兩個術語描述的是相同的概念,其中 Sealevel 是 Solana 的運行時環境的名稱。盡管最近有努力精確定義其使用範圍,但 SVM 這個術語仍然未得到嚴格使用。

客戶端

Solana 網路由數千個獨立操作的節點組成,這些節點協作維護一個統一的帳本。每個節點都是運行相同開源軟件的高性能機器,這些軟件被稱爲“客戶端”。

Solana 最初推出了一個單一的驗證節點客戶端軟件——最初是 Solana Labs 客戶端,現在稱爲 Agave 客戶端——使用 Rust 編寫。擴展客戶端的多樣性一直是優先事項,並且這一目標將隨着 Firedancer 客戶端的推出而真正實現。Firedancer 是對原始客戶端的全面重寫,使用 C 語言構建。由高頻交易公司 Jump 的經驗豐富團隊開發,其致力於成爲任何區塊鏈上性能最優的驗證客戶端。

歷史證明

“我喝了兩杯咖啡和一杯啤酒,一直熬到凌晨 4 點。我突然有了一個靈光一現的時刻,這個謎題類似於工作量證明,使用相同的 SHA-256 抗預映像哈希函數……我知道我掌握了時間的流向。” — Anatoly Yakovenko,Solana 聯合創始人

歷史證明(PoH)是 Solana 的祕密武器,像每個驗證節點上的特殊時鍾一樣,促進了網路的同步。PoH 爲事件的順序和時間的流逝建立了一個可靠的真實來源。最關鍵的是,它確保遵循領導者計劃。盡管名稱類似,但歷史證明並不是像工作量證明這樣的共識算法。

節點之間的通信開銷通常會隨着網路的擴展而增加,協調變得越來越復雜。Solana 通過用 PoH 本地計算替代節點間的通信來緩解這一問題。這意味着驗證者可以通過一次投票來提交一個區塊。消息中的受信時間戳確保驗證者無法相互幹擾並提前開始生成區塊。

PoH 基於哈希算法的獨特屬性,具體來說是 SHA256

  • 確定性:相同的輸入總是會產生相同的哈希值。
  • 固定大小:無論輸入大小如何,輸出哈希值總是 256 位。
  • 高效:非常迅速地計算任何給定輸入的哈希值。
  • 抗預映像性:從哈希輸出中找到原始輸入在計算上不可行。
  • 雪崩效應:輸入的微小變化(甚至一個比特)會導致哈希值顯著不同,這種屬性被稱爲雪崩效應。
  • 抗碰撞性:找到兩個不同的輸入生成相同的哈希值幾乎不可能。

在每個驗證客戶端中,一個專用的“歷史證明服務”不斷運行 SHA256 哈希算法,創建哈希鏈。每個哈希的輸入是前一個哈希的輸出。這條鏈充當可驗證延遲函數,因爲哈希工作必須按順序完成,未來哈希的結果不能提前知道。如果 PoH 服務創建了一個包含一千個哈希的鏈,我們知道在計算每個哈希時時間已經過去——這可以被看作是“微型工作量證明”。然而,其他驗證者可以並行驗證這千個哈希的正確性,速度遠快於它們生成的速度,因爲每個哈希的輸入和輸出已被廣播到網路中。因此,PoH 難以生成但易於驗證。

不同 CPU 上計算 SHA-256 的性能範圍出奇地窄,最快的機器之間的差異很小。盡管在優化這一功能上投入了大量時間和精力,但一個常見的上限已經被達到,這主要是由於比特幣對其的依賴。

在領導者的時間槽中,PoH 服務將接收來自銀行階段的新處理條目。當前的 PoH 哈希與條目中所有交易的哈希結合生成下一個 PoH 哈希。這作爲時間戳,將條目插入哈希鏈中,證明交易處理的順序。這個過程不僅確認了時間的流逝,還作爲交易的加密記錄。

在一個區塊中,有 800,000 個哈希。PoH 流還包括“滴答”,這些是空的條目,表示領導者的存活性和時間的流逝,時間約爲幾分之一秒。每 6.25 毫秒發生一次滴答,每個區塊包含 64 次滴答,總區塊時間爲 400 毫秒。

即使在不是領導者的時候,驗證者也會不斷運行 PoH 時鍾,因爲它在節點之間的同步過程中發揮着關鍵作用。

請記住

PoH 的關鍵好處是確保即使在區塊生產者離線——即所謂的“失職”狀態下——也必須遵循正確的領導者計劃。PoH 防止惡意驗證者在未輪到他們之前生成區塊。

帳戶模型

“在 SVM 中分離代碼和狀態是最好的設計決策。嵌入式系統開發人員有福了,他們虔誠地將這個概念灌輸到我的大腦中。” ——Solana 聯合創始人阿納托利·雅科文科 (Anatoly Yakovenko)

在 Solana 驗證者中,全局狀態保存在稱爲 AccountsDB 的帳戶數據庫中。該數據庫負責在內存和磁盤上存儲所有帳戶。帳戶索引中的主要數據結構是哈希圖,這使得 AccountsDB 本質上是一個巨大的key-value存貯庫。這裏,key是帳戶地址,value是帳戶數據。

隨着時間的推移,Solana 帳戶的數量已激增至數億。如此大的數字部分是因爲,正如 Solana 開發人員喜歡說的那樣,“Solana 上的一切都是一個帳戶!”

Solana 帳戶

帳戶是一個持久存儲數據的容器,類似於計算機上的文件。帳戶有多種形式:

  • 用戶帳戶:這些帳戶具有私鑰,通常由錢包軟件爲用戶生成。
  • 數據帳戶:這些帳戶存儲狀態信息,例如用戶持有的特定代幣數量。
  • 程序帳戶:這些帳戶較大,包含可執行的字節碼,類似於 Windows 上的 .exe 文件或 Mac 上的 .app 文件。
  • 本地程序帳戶:這些是特殊的預部署程序帳戶,執行網路的各種核心功能。例如,Vote Program 和 BPF Loader。

所有帳戶都有以下字段:

程序

Solana 的程序帳戶僅包含可執行邏輯。這意味着當程序運行時,它會改變其他帳戶的狀態,但自身不會發生變化。代碼和狀態的分離使 Solana 與其他區塊鏈不同,並支持其許多優化。開發者主要使用 Rust 編寫這些程序,Rust 是一種因注重以安全性和性能而聞名的通用編程語言。此外,還有多種 TypeScript 和 Python 的 SDK 可用於創建應用程序前端並實現與網路的程序化交互。

許多常見功能由本地程序提供開箱即用的服務。例如,Solana 不要求開發者部署代碼來創建代幣。相反,指令被發送到預部署的本地程序,該程序將設置一個帳戶來存儲代幣的元數據,從而有效地創建了一個新的代幣。

租金

租金是一種機制,旨在激勵用戶關閉帳戶,減少狀態膨脹。要創建一個新帳戶,帳戶必須持有一定數量的 SOL,稱爲“免租金”金額。這可以看作是爲了保持帳戶在驗證者內存中活躍而產生的存儲成本。如果帳戶數據的大小增加,最低餘額的租金要求也會相應增加。當帳戶不再需要時,可以關閉帳戶,租金將返還給帳戶所有者。

例如,如果用戶持有一個以美元計價的穩定幣,這個狀態會存儲在一個代幣帳戶中。目前,代幣帳戶的免租金金額爲 0.002 SOL。如果用戶將其全部穩定幣餘額轉移給朋友,該代幣帳戶可以關閉,用戶將會收回 0.002 SOL。程序通常會自動爲用戶處理帳戶的關閉。還有幾個應用程序可以幫助用戶清理舊的、未使用的帳戶,並回收存儲在這些帳戶中的少量 SOL。

所有權

盡管讀取帳戶數據通常是允許的,但 Solana 的所有權模型通過限制誰可以修改(寫入)帳戶的數據來增強安全性。這個概念對於在 Solana 區塊鏈上執行規則和權限至關重要。每個帳戶都有一個程序“所有者”。帳戶的所有者負責管理該帳戶,確保只有授權的程序可以更改帳戶的數據。一個顯著的例外是 Lamports(SOL 的最小單位)的轉移——增加帳戶的 Lamports 餘額通常是允許的,無論所有權如何。

狀態存儲

Solana 程序作爲只讀可執行文件,必須使用“程序派生地址”(PDAs)來存儲狀態。PDA 是與程序關聯並由程序而非特定用戶擁有的特殊類型帳戶。雖然普通 Solana 用戶地址是從 Ed25519 密鑰對的公鑰派生的,但 PDA 沒有私鑰。相反,它們的公鑰是從一組參數(通常是關鍵字或其他帳戶地址)和擁有程序的程序 ID(地址)組合中派生出來的。

PDA 地址存在於“曲線外”,意味着它們不像普通地址那樣在 Ed25519 曲線上。只有擁有 PDA 的程序才能以編程方式生成籤名,確保它是唯一可以修改 PDA 狀態的程序。


上圖:Solana 代幣帳戶是程序派生地址(PDA)的具體實例。它們用於存儲代幣,並且“離線”存在。關聯代幣帳戶(ATA)程序確保每個錢包對每種代幣類型只有一個關聯代幣帳戶,提供了管理代幣帳戶的標準化方式。

渦輪(Turbine)

“Solana 最有趣的部分不是並行化、SVM 或 Toly 的推文,而是你可能沒聽說過的東西:Turbine。” — Mert Mumtaz, Helius

在銀行階段,交易被組織成條目並發送到歷史證明流(Proof of History,PoH)進行時間戳標記。區塊的銀行被更新,條目現在準備進入下一個階段——渦輪(Turbine)。

渦輪是領導者將其區塊傳播到網路其他部分的過程。受到 BitTorrent 的啓發,它被設計爲快速而高效,可減少通信開銷,最小化領導者需要發送的數據量。

渦輪通過一種叫做“切片”(shredding)的過程,將交易數據拆分成“切片”(shreds)。切片是小的數據包,最大爲 1280 字節,類似於視頻流中的單獨幀。重新組合這些切片後,驗證者可以重放整個區塊。這些切片通過互聯網在驗證者之間使用 UDP 發送,並利用糾刪編碼處理數據包丟失或惡意丟包。糾刪編碼是一種基於多項式的錯誤檢測和修正方案,確保數據完整性。即使某些切片丟失,區塊仍然可以被重建。

切片被分組爲稱爲前向糾錯(FEC)批次的集合。默認情況下,這些批次由 64 個切片組成(32 個數據切片 + 32 個恢復切片)。數據恢復在每個 FEC 批次內進行,這意味着批次中最多可以丟失或損壞一半的數據包,所有數據仍然可以恢復。每個 64 切片的批次經過 Merkle 化,根由領導者籤名,並鏈式連接到前一個批次。這個過程確保切片可以從網路中任何擁有它們的節點安全獲取,因爲 Merkle 根鏈提供了可驗證的真實性和完整性路徑。

領導者最初向一個根節點廣播,該節點將切片傳播到所有其他驗證者節點。這個根節點會隨着每個切片的變化而變化。驗證者被組織成層級,形成“渦輪樹”。持有較多權益的驗證者通常位於樹的頂部,而權益較少的則位於底部。

樹通常跨越兩到三跳,具體取決於活躍驗證者的數量。爲了視覺簡化,上面展示了一個 3 跳的示例,但 Solana 當前的實際擴展值設置爲 200。出於安全原因,樹的順序會爲每個新的切片批次進行旋轉。

這種系統的主要目標是減輕領導者和根節點的出站數據壓力。通過利用傳輸和重傳系統,負載在領導者和重傳節點之間分配,減少了對單個節點的壓力。

共識

“一些聰明的人告訴我,在 Solana 中有一個認真聰明的開發者社區……我希望這個社區能有機會蓬勃發展。” — Vitalik Buterin, Ethereum 共同創始人

一旦驗證者通過渦輪從領導者那裏接收到新區塊,它必須驗證每個條目中的所有交易。這包括重放整個區塊、並行驗證 PoH 哈希、按照 PoH 規定的順序重建交易,以及更新本地銀行。

這個過程由交易驗證單元(Transaction Validation Unit,TVU)處理,它類似於領導者的交易處理單元(Transaction Processing Unit,TPU),作爲處理切片和區塊驗證的核心邏輯。與 TPU 類似,TVU 的流程被分爲幾個階段,從切片獲取階段開始,接收通過渦輪傳輸的切片。在隨後的切片驗證領導者籤名階段,切片經過多次一致性檢查,最重要的是驗證領導者的籤名,以確保接收到的切片來源於領導者。

在“重傳階段”(Retransmit Stage),驗證者根據其在渦輪樹(Turbine tree)中的位置,將數據片段轉發給適當的下遊驗證者。在“重放階段”(Replay Stage),驗證者精確地重建每個事務,並以正確的順序進行,同時更新其本地的銀行狀態。

重放階段類似於TPU中的銀行階段(banking stage);這是最重要的階段,可以更直接地描述爲區塊驗證階段。重放是一個單線程的過程循環,協調許多關鍵操作,包括投票、重置PoH時鍾以及切換銀行。


上圖:重放階段負責將驗證者切換到領導者模式並開始區塊生產。原始圖像來源:Justin Starry, Anza

共識

爲了實現共識,Solana 使用了 Tower BFT(TBFT),這是一個自定義實現的實際拜佔庭容錯(PBFT)算法,PBFT 是大多數區塊鏈用來達成鏈狀態一致的算法。像所有區塊鏈一樣,Solana 假設網路中存在惡意節點,因此系統必須承受不僅僅是節點故障,還要抵御一定程度的攻擊。

Tower BFT 與其他鏈的不同之處在於利用了由歷史證明(Proof of History,PoH)提供的同步時鍾。傳統的 PBFT 需要多輪通信來達成交易順序的共識,而 Solana 節點利用預先建立的事件順序,大大減少了消息開銷。

投票

爲了參與共識並獲得獎勵,驗證者需要對他們認爲有效(即沒有雙花或不正確籤名等問題)的區塊進行投票,並將這些區塊視爲規範性區塊。驗證者爲這些投票支付交易費用,這些費用由領導者處理並與常規用戶交易一起包含在區塊中。這就是爲什麼 Solana 的交易通常分爲投票交易和非投票交易。當驗證者提交正確且成功的投票時,他們會獲得信用。這一機制激勵驗證者投票支持他們認爲最有可能被包含的分叉,即“最重”的分叉。

‍分叉

Solana 的部分部分使其速度如此之快,即網路在生成下一個區塊之前並不會等待所有驗證者對新生成的區塊達成一致。因此,兩個不同的區塊連結到同一個父區塊,從而產生分叉,這並不罕見。

Solana 驗證者必須對這些分叉進行投票,並使用共識算法來確定採用哪個分叉。當存在競爭的分叉時,最終只有一個分叉會被網路確認,而其他分叉中的區塊則會被棄用。

每個時隙都有一個預定的領導者,只有該領導者的區塊會被接受;一個時隙不能有兩個提議的區塊。因此,潛在的分叉數量被限制在一個“有/沒有”跳躍列表中,這些分叉可以在領導者輪換時出現。一旦驗證者選擇了一個分叉,它會被承諾於這個分叉,直到鎖定時間過期,這意味着它必須在最小期限內堅持其選擇。

Solana 的“跳過率”——即一個區塊未生成的時隙百分比——在 2% 到 10% 之間,分叉是導致這些跳過時隙的主要原因。其他可能導致跳過時隙的原因包括新紀元的開始、領導者離線或生成無效區塊。

請記住

Solana 上交易的狀態根據其在共識過程中的當前階段而有所不同:

  • 處理(Processed):交易已被包含在區塊中。
  • 確認(Confirmed):交易所在的區塊已被三分之二的絕大多數投票確認。
  • 最終確認(Finalized):超過 31 個區塊已建立在交易區塊之上。

截至目前,Solana 的歷史上從未出現過(樂觀地)確認的區塊沒有最終確認的情況。

對於每個區塊,Solana 使用一個銀行來訪問該區塊的狀態。當一個銀行被最終確認時,該銀行及其前置帳戶更新會被刷新到磁盤上。此外,任何來自早期銀行但不是最終確認銀行的前置的帳戶更新會被修剪。這一過程使 Solana 能夠有效地維護多個潛在的狀態。

八卦網路與歸檔

“一條區塊鏈需要巧妙地結合密碼學、分布式系統、操作系統和編程語言。Solana 的超級能力就是願意逃離每個學科中最有趣的問題。” — Greg Fitzgerald, Solana 共同創始人

八卦網路

八卦網路可以被視爲 Solana 網路的控制平面。與處理交易流的數據平面不同,控制平面傳播關於區塊鏈狀態的關鍵元數據,如聯系信息、帳本高度和投票信息。如果沒有八卦網路,驗證者和 RPC 將不知道哪些地址和端口可以用於跨各種服務的通信。新節點也依賴八卦來加入網路。

Solana 的八卦協議使用非正式的對等通信,採用基於修改過的 PlumTree 算法的樹廣播方法。這種方法在不依賴任何中央來源的情況下高效傳播信息。

八卦操作有點像一個獨立的系統,與大多數其他驗證者組件相對獨立。驗證者和 RPC 每 0.1 秒通過 UDP 使用八卦共享籤名數據對象,確保信息在網路中的可用性。所有八卦消息必須小於或等於 1280 字節的最大傳輸單元(MTU),在代碼庫中稱爲“數據包結構”(packet struct)。

八卦記錄是節點之間共享的實際數據對象。大約有 10 種不同類型的記錄,每種記錄都有不同的用途。八卦記錄是經籤名的、版本化的,並有時間戳的,以確保完整性和時效性。

八卦消息有四種類型:

  • 推送(Push):最常見的消息,與一部分“推送對等體”共享信息。
  • 拉取與拉取響應(Pull & Pull Response):定期檢查遺漏的消息,拉取響應會發送回節點沒有的信息。
  • 修剪(Prune):允許節點選擇性地減少維護的連接數量。
  • Ping 和 Pong:節點的健康檢查——如果發送了 ping,則期望收到 pong,表示對等節點仍然活躍。

八卦數據存儲在集羣復制數據存儲(CrdsTable)中。這個數據結構可能會變得非常大,需要定期修剪。

歸檔

Solana 在區塊鏈領域的獨特之處在於不需要完整的歷史記錄來確定帳戶的當前狀態。Solana 的帳戶模型確保了在任何給定時隙的狀態都是已知的,使得驗證者可以存儲每個帳戶的當前狀態,而無需處理所有歷史區塊。RPC 和驗證者在設計上不會保留完整的歷史帳本。相反,他們通常只存儲 1 或 2 個紀元(2-4 天)的交易數據,這足以驗證鏈的末端狀態。

歸檔目前由“倉庫節點”管理,這些節點由專業 RPC 服務提供商、Solana 基金會及其他希望確保交易歷史可用的生態系統參與者運營。倉庫節點通常維護以下一個或兩個內容:

  1. 帳本歸檔:上傳原始帳本和適合從頭開始重播的 AccountsDB 快照。
  2. Google Bigtable 實例:存儲從創世區塊開始的區塊數據,並以適合 RPC 請求的格式提供。

經濟學與 Jito

“人們逐漸認識到,Solana 是今天唯一能夠支持主流消費應用的區塊鏈。” — Ted Livingston, 創始人

Solana 採用通貨膨脹機制來分發質押獎勵,每個紀元生成新的 SOL 代幣。這一過程導致非質押者在網路中的份額相對於質押者減少,從而使財富從非質押者轉移到質押者。通貨膨脹從 2021 年初開始,初始年率爲 8%,每年減少 15%,直到穩定在長期的 1.5%。

任何 SOL 代幣持有者都可以通過將代幣質押給一個或多個驗證者來獲得獎勵並幫助保護網路。將代幣分配給驗證者稱爲委托。委托代幣給驗證者表示對該驗證者的信任,但並不會賦予驗證者對代幣的所有權或控制權。所有質押、解質押和委托操作都在下一個新紀元的開始時執行。

投票獎勵

當驗證者提交投票時,如果投票準確且成功,他們會獲得信用。投票交易費用爲 0.000005 SOL,並免除優先費用。投票費用大約爲每個驗證者每天 1 SOL,使其成爲運行驗證者的主要運營成本。在一個紀元內,驗證者通過投票積累信用,這些信用可以在紀元結束時兌換成通貨膨脹獎勵的一部分。

表現最佳的驗證者能夠成功投票大約 90% 的時隙。請注意,無區塊的時隙百分比(跳過時隙率)從 2% 到超過 10% 不等,這些時隙無法進行投票。平均而言,驗證者在大約 80% 的時隙上成功投票,在一個 432,000 時隙的紀元中,獲得 345,600 個信用。

總通貨膨脹獎勵池首先根據紀元內獲得的信用進行分配。驗證者在總信用中的份額(其信用除以所有驗證者信用之和)決定了他們的相應獎勵。這一獎勵進一步根據質押量進行加權。

因此,擁有總質押 1% 的驗證者如果獲得平均數量的信用,其通貨膨脹獎勵應該大約爲總獎勵的 1%。如果他們的信用高於或低於平均水平,其獎勵將相應波動。

投票表現差異是驗證者提供的回報(以年化收益率APY衡量)變化的一個原因。另一個因素是驗證者收取的佣金率,這是指向他們驗證者的總通貨膨脹獎勵的百分比。此外,驗證者離線或與區塊鏈不同步(稱爲失職)也會顯著影響回報。

區塊獎勵

被指定爲特定區塊的領導者的驗證者將獲得額外的區塊獎勵。這些獎勵包括該區塊內所有交易的基礎費用和優先費用的 50%,其餘費用則被銷毀。只有生成區塊的驗證者才能獲得這些獎勵。與每個紀元分發的質押獎勵不同,區塊獎勵在區塊生成時會立即記入驗證者的身分帳戶。

流動性質押

流動性質押已成爲原生質押的熱門替代方案。參與者將SOL質押到一個質押池中,並獲得一種稱爲流動性質押代幣(LST)或流動性質押衍生品(LSD)的代幣。這些LST代幣代表了用戶質押SOL的份額。盡管質押者仍在獲得質押獎勵,這些代幣可以進行交易、用於各種應用程序,或轉移給他人。該系統的主要優勢在於顯著提高了資本效率。

LST的價格 = (質押池中的總SOL * SOL的價格)/ 鑄造的總LST數量

與傳統的原生質押不同,隨着時間的推移,質押者會直接增加更多的SOL。而在流動性質押中,獎勵被重新投資到池中,從而提高LST的公允價值。只要存在機制可以用LST贖回底層質押的SOL,套利交易者將確保代幣價格保持合理。

Jito

截至撰寫本文時,超過80%的Solana質押量(來源)使用了Jito客戶端驗證軟件。該客戶端是原Agave客戶端的一個分支,引入了一種協議外的區塊空間拍賣,爲驗證者提供額外的經濟激勵。這個額外的激勵是Jito客戶端在驗證者中廣泛採用的主要因素。

當領導者使用Jito驗證客戶端時,他們的交易會首先被定向到Jito-Relayer。這個開源軟件充當交易代理路由器。其他網路節點並不知道Jito-Relayer的存在,因爲它們只是將交易發送到領導者通過八卦網路公布的地址和端口配置,即他們的入口套接字(ingress_socket),假設這是領導者的。

中繼節點在將所有交易轉發給領導者之前,會將其保存200毫秒。這一“速度緩衝”機制延遲了交易消息的傳遞,提供了一個簡短的拍賣窗口。200毫秒後,無論拍賣結果如何,中繼節點會樂觀地釋放這些交易。

區塊空間拍賣通過Jito區塊引擎在鏈外進行,允許搜索者和應用程序提交一組原子執行的交易,稱爲“交易捆綁包”。這些捆綁包通常包含時間敏感的交易,如套利或清算。Jito對所有小費收取5%的費用,最低小費爲10,000 lamports。小費完全在協議外操作,與協議內的優先費和基本費分開。此前,Jito運行了一個規範的協議外內存池服務,但該服務現已被棄用。

聲明:

  1. 本文轉載自[helius],著作權歸屬原作者[Lostin],如對轉載有異議,請聯系Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得復制、傳播或抄襲經翻譯文章。

Solana 執行層概述

進階9/10/2024, 2:08:23 PM
本文介紹了 Solana 區塊鏈的運營機制,該平台以其高性能和低延遲著稱。報告探討了 Solana 設計和運營的復雜性,包括其交易生命週期、共識機制,以及如 SVM Rollups 和 ZK 壓縮等關鍵特性。

前言

“我們比世界上任何人都更了解小型、高速、低成本的優勢,現在我們將這些概念應用於區塊鏈。” — Greg Fitzgerald,Solana 聯合創始人

Solana 是一個以高性能、低延遲而聞名的區塊鏈平台,具有速度、效率和用戶體驗方面的特點。它有獨特的集成架構,能夠在全球去中心化的網路中處理每秒數千筆交易。區塊時間爲 400 毫秒,交易費用僅爲幾美分,它在速度和成本效益上均表現出色。本文將深入探討 Solana 的設計和操作復雜性,分析其關鍵機制和網路拓撲結構,這些因素共同促成了其強大的能力。

Solana 採用了一體化的區塊鏈開發方法,充分利用了創始團隊在構建分布式系統方面的多年經驗。Solana 的核心原則之一是軟件不應成爲硬件的障礙。這意味着軟件應充分利用其運行的硬件,並與其共同擴展。作爲一個統一的生態系統,所有構建在這一區塊鏈上的應用程序都繼承了可組合性,使它們能夠無縫互動和相互構建。這種架構還確保了直觀的用戶體驗,無需橋接、單獨的鏈 ID 或流動性碎片化。

Solana 正在快速發展,最近的進展包括 SVM Rollups 和 ZK 壓縮,這些都是重要的擴展解決方案。雖然這些項目未來可能會影響我們對 Solana 的認知,但目前它們仍處於非常早期的開發或採用階段,因此在本報告中不予涵蓋。

交易生命週期

在本報告中,我們主要通過典型交易的生命週期來理解 Solana。爲了構建一個基本的 Solana 交易理解模型,我們可以將流程概述如下:

  • 用戶發起交易,所有交易都被發送到當前的主區塊生產者(即領導者)。領導者將這些交易匯總成一個區塊,執行它們,從而更新其本地狀態。
  • 這個交易區塊隨後會在網路中傳播,供其他驗證者執行和確認。

本報告的後續部分將擴展此模型,並深入探討這一過程的更多細節,從用戶這一關鍵參與者開始。

請記住

對 Solana 核心協議的重大更改需要經過正式透明的過程,即提交 Solana 改進文檔(SIMD),並接受社區成員和核心工程團隊的公開批評。SIMD 會由網路進行投票表決。

六大階段介紹

我們將在本報告中引用上述的六階段圖示,因爲它爲我們理解Solana核心元素之間的關係提供了一個一致的框架。

前面的章節根據這六個階段進行了安排。最後的章節——Gossip、Archive、Economics和Jito——則涵蓋了所有未盡之處。需要注意的是,有些章節會跨越多個階段,而有些階段會出現在多個章節中。

這種重疊是不可避免的,因爲六大階段框架有其局限性。實際上,Solana是一個復雜的分布式系統,具有許多相互依賴的元素。

用戶

“Solana有潛力成爲加密領域如同蘋果公司那樣的項目”——Solana聯合創始人Raj Gokal

用戶的旅程通常始於設置和資助錢包應用程序。Solana上有多個流行的錢包應用程序,既有本地移動應用,也有瀏覽器擴展。

錢包通過加密生成用戶的密鑰對,包括公鑰和私鑰。公鑰作爲帳戶的唯一標識符,所有網路參與者都能知道。用戶在Solana上的帳戶可以被視爲一個數據結構,保存與其在Solana區塊鏈上的互動相關的信息和狀態。因此,公鑰類似於文件名:公鑰唯一標識Solana區塊鏈上的帳戶,就像文件名唯一標識文件系統中的文件一樣。Solana上的公鑰以32字節的Base58編碼字符串表示。

FDKJvWcJNe6wecbgDYDFPCfgs14aJnVsUfWQRYWLn4Tn

私鑰,也稱爲祕密密鑰,可以看作是訪問和修改帳戶的密碼或訪問密鑰。使用私鑰進行籤名是區塊鏈處理授權的方式。知道私鑰意味着對帳戶擁有絕對的控制權。Solana的私鑰也是32字節長。密鑰對是由公鑰(前半部分)和私鑰(後半部分)組成的64字節組合。示例:

3j15jr41S9KmdfughusutvvqBjAeEDbU5sDQp8EbwQ3Hify2pfM1hiEsuFFAVq8bwGywnZpswrbDzPENbBZbd5nj

[63,107,47,255,141,135,58,142,191,245,78,18,90,162,107,197,8,33,211,15,228,235,250,30,185,122,105,23,147,115,115,86,8,155,67,155,110,51,117,0,19,150,143,217,132,205,122,91,167,61,6,246,107,39,51,110,185,81,13,81,16,182,30,71]

私鑰也可以從助記詞種子短語中派生,通常爲12個或24個單詞。這種格式常用於錢包,方便備份和恢復。多個密鑰可以從一個種子短語中確定性地派生出來。

Solana採用Ed25519,這是一種廣泛使用的橢圓曲線數字籤名算法,用於其公鑰加密需求。Ed25519因其密鑰大小小、籤名大小小、計算速度快以及對許多常見攻擊的免疫性而受到青睞。每個Solana錢包地址代表Ed25519橢圓曲線上的一個點。

用戶用私鑰籤署交易。該籤名包含在交易數據中,其他參與者可以使用發送者的公鑰進行驗證。此過程確保交易未被篡改並得到相應私鑰所有者的授權。籤名還充當交易的唯一標識符。

Solana 交易

發送交易是改變 Solana 狀態的唯一方法。任何寫入操作都是通過事務執行的,並且事務是原子性的——要麼事務嘗試執行的所有操作都發生,要麼事務失敗。交易,更正式地稱爲“交易消息”,包含四個部分:標頭、帳戶地址列表、最近的區塊哈希和指令。

  • 標頭:標頭包含對帳戶地址列表的引用,指示哪些帳戶必須籤署交易。
  • 帳戶地址列表: 該列表包括在交易過程中將被讀取或寫入的所有帳戶。爲每個交易構建這樣的列表是Solana獨有的要求,開發人員可能會面臨挑戰。然而,事先了解交易將與哪些狀態交互,能夠實現許多其他區塊鏈無法做到的優化。
  • 最近的區塊哈希: 這個字段用於防止重復和過時的交易。最近的區塊哈希在150個區塊後過期(大約1分鍾)。默認情況下,RPC每2秒嘗試轉發交易,直到交易被最終確定或最近的區塊哈希過期,此時交易將被丟棄。
  • 指令: 這些構成了交易的核心部分。每個指令代表一個特定的操作(例如,轉帳、鑄幣、銷毀、創建帳戶、關閉帳戶)。每個指令指定要執行的程序、所需的帳戶以及執行該指令所需的數據。

交易中的指令數量首先受到其大小的限制,最大可達1,232字節。此外,還有對可引用的帳戶數量的限制。最後,交易的復雜性也受到計算單位(CUs)的限制。計算單位量化了處理交易所需的計算資源。

請記住
SOL的最小單位稱爲“lamport”,等於SOL的十億分之一,類似於比特幣中的satoshi。lamport以計算機科學家和數學家Leslie Lamport的名字命名,他的研究奠定了現代分布式系統的許多理論基礎。

執行交易的SOL費用分爲兩部分 - 基礎費用和優先費用。基礎費用是每個籤名固定爲5000 lamports,不論交易的復雜性如何——通常,每個交易有一個籤名。

優先費用在技術上是可選的,但在區塊空間需求高峯期變得必要。這些費用以微lamports(lamport的百萬分之一)計算每個計算單位。它們的目的是作爲價格信號,使交易在經濟上更具吸引力,以便驗證節點將其包含在區塊中。

總費用 = 優先費用 + 基礎費用

優先費用 = 計算單位價格(微lamports)x 計算單位限制

目前,所有交易相關費用的50%被銷毀,永久從流通中移除,而剩餘的50%歸區塊生產者所有。即將引入的新變化(SIMD 96)將允許100%的優先費用歸區塊生產者,基礎費用保持不變。

發送交易

用戶將錢包連接到應用程序,這樣應用程序就可以讀取用戶的公鑰。私鑰則保持加密,並在與應用程序分離的安全環境中得到保護。

應用程序根據用戶的操作構建交易消息參數。例如,如果用戶想要交換兩個代幣,他們需要指定要購買的代幣數量、要出售的對應代幣,以及可接受的交易滑點。

交易消息準備好後,它會被發送到錢包進行用戶私鑰籤名。此時,用戶會彈出確認交易的窗口。該窗口可能會包含交易結果的模擬。一旦籤名完成,交易消息和籤名將返回給應用程序,應用程序可以將交易轉發給其選擇的 RPC 提供商,無論是其自有的還是使用錢包提供商的服務。

RPC(遠程過程調用)提供商充當應用程序與構建區塊的驗證者之間的中介。他們是一個重要服務,使應用程序能夠提交或模擬籤名交易,並高效地檢索鏈上數據。希望與網路交互的應用程序通過 JSON-RPC 或 WebSocket 端點進行(參閱文檔)。

請記住
在 Solana 上,“失敗交易”這一術語可能會引起誤解並造成相當大的混亂。這些交易會產生費用,並且由運行時根據籤署者的意圖成功執行。它們之所以“失敗”,是由於交易本身的邏輯要求這樣做。超過 80% 的“失敗”交易來自錯誤代碼 0x1771,即超出滑點金額的代碼(數據)。值得注意的是,這些交易中有 95% 是由僅佔活躍 Solana 地址的 0.1% 提交的,主要是自動化的機器人,試圖利用時間敏感的價格套利機會。

Gulf Stream

“Solana 的目標字面上是讓交易的速度與新聞傳播的速度一樣快——就像光速通過光纖一樣。我們的競爭對手是 NASDAQ 和紐約證券交易所。”—— Anatoly Yakovenko,Solana 聯合創始人

RPC(遠程過程調用)指的是 RPC 節點。這些節點可以被視爲與網路交互和讀取數據的網關。它們運行與完整驗證者相同的軟件,但設置不同,使其能夠準確地模擬交易並保持對當前狀態的最新視圖。截至目前,Solana 網路上已有超過 4,000 個 RPC 節點。

與完整驗證者節點不同,RPC 節點在網路中沒有持有任何權益。沒有權益,它們就無法進行投票或構建區塊。這一設置與大多數其他區塊鏈不同,因爲在那些區塊鏈中,驗證者和 RPC 節點通常是相同的。由於 RPC 節點不接收質押獎勵,因此運行 RPC 節點的經濟模式與驗證者不同,許多 RPC 節點作爲開發者運行 Solana 應用程序的付費服務存在。

Solana 的獨特之處在於它從一開始就設計爲不使用內存池(mempool)。與傳統區塊鏈通過八卦(Gossip)協議隨機和廣泛傳播交易不同,Solana 將所有交易轉發到一個預定的主要驗證者(即領導者)處,該驗證者在每個時隙中負責處理這些交易。

重點提示
Solana 運營着四個集羣:Localnet、Testnet、Devnet 和 Mainnet-Beta。當人們提到 Solana 或 Solana 網路時,他們幾乎總是指 Mainnet-Beta。Mainnet-Beta 是唯一一個代幣具有實際價值的集羣,而其他集羣僅用於測試目的。

一旦 RPC 接收到要包含在區塊中的交易消息,它必須轉發給領導者(leader)。在每個 epoch(大約每兩天)之前,會生成一個領導者計劃。即將到來的紀元被劃分爲若幹個時隙,每個時隙固定爲 400 毫秒,並爲每個時隙選擇一個領導者。擁有更多權益的驗證者將更頻繁地被選擇爲每個紀元的領導者。在每個時隙中,交易消息被轉發給領導者,領導者有機會生成一個區塊。當輪到某個驗證者時,他們會切換到“領導者模式”,開始積極處理交易並向網路廣播區塊。

權益加權服務質量(SWQoS)

在 2024 年初,Solana 引入了一種新的機制,旨在防止垃圾信息和增強女巫抵抗能力,這一機制被稱爲“權益加權服務質量”(SWQoS)。該系統使領導者能夠優先處理通過其他已質押驗證者代理的交易消息。在這種機制下,持有更高權益的驗證者獲得相應更高的能力,將交易消息數據包傳送給領導者。這種方法有效地緩解了來自未質押節點的女巫攻擊。

在這一模型下,驗證者還可以與 RPC 節點達成協議,將其按權益加權的容量租賃給 RPC 節點。作爲回報,RPC 節點獲得了更大的帶寬,從而提高了在區塊中交易的包含率。值得注意的是,領導者的 80% 能力(2000 個連接)被保留用於 SWQoS,剩餘的 20%(500 個連接)則用於來自未質押節點的交易消息。這種分配策略類似於高速公路上的優先車道,駕駛者可通過支付通行費來避開交通擁堵。

SWQoS 對 Solana 生態系統產生了影響,通過提高將交易轉發給領導者的要求並減少垃圾信息攻擊的有效性。此變化鼓勵高流量應用程序進行縱向整合。通過運行自己的驗證者節點或訪問已質押的連接,應用程序可以確保對領導者的優先訪問,從而提升其交易處理能力。

QUIC 說明

在 2022 年底,Solana 採用了 QUIC 網路協議來管理交易消息的傳輸。這一轉變是由於網路中由於機器人刷鏈上 NFT 發行導致的幹擾。QUIC 使得快速、異步的通信成爲可能。

QUIC 最初由 Google 於 2012 年開發,旨在結合兩者的優勢。它提供類似於 UDP 的快速異步通信,同時具備 TCP 的安全會話和先進的流量控制策略。這使得可以對單個流量源設置限制,從而使網路能夠集中處理真實的交易。QUIC 還引入了獨立流的概念,因此如果某一交易丟失,不會阻塞其他交易。簡而言之,QUIC 可以被視爲試圖結合 TCP 和 UDP 的最佳特性。

請注意

權益加權是 Solana 系統中的一個反復出現的原則,涵蓋了投票獎勵、渦輪樹、領導者調度、Gulf Stream 和 Gossip 網路。持有更多權益的驗證者在網路中獲得更高的信任和優先級角色。

區塊構建

“我們認爲 SVM(Solana 虛擬機)在當前虛擬機技術中是最好的。” — Andre Cronje,Fantom Foundation

許多區塊鏈網路在廣播之前先構建完整的區塊,這種方法稱爲離散區塊構建。與此不同,Solana 採用的是連續區塊構建,即在分配的時間槽內動態地組裝和流式傳輸區塊,從而顯著降低延遲。

每個時間槽持續 400 毫秒,每個領導者被分配四個連續的時間槽(1.6 秒),然後輪換到下一個領導者。爲了獲得接受,一個區塊中的所有交易必須有效且可被其他節點重現。

在承擔領導者角色的前兩個時間槽,驗證者會停止交易轉發,以準備即將到來的工作負載。在此期間,入站流量激增,達到每秒超過十億字節,因爲整個網路將數據包發送到即將到來的領導者。

在接收後,交易消息進入交易處理單元(TPU),這是驗證者的核心邏輯,負責區塊生產。在這裏,交易處理過程開始於獲取階段(Fetch Stage),在該階段交易通過 QUIC 接收。隨後,交易進入籤名驗證階段(SigVerify Stage),進行嚴格的驗證檢查。在此階段,驗證者會驗證籤名的有效性、檢查籤名數量是否正確,並排除重復的交易

銀行階段

銀行階段可以描述爲區塊構建階段。它是 TPU 的最重要階段,得名於“銀行”。銀行實際上是某一特定區塊的狀態。對於每個區塊,Solana 有一個銀行,用於訪問該區塊的狀態。當一個區塊在足夠多的驗證者投票後變得最終確定時,他們會將銀行中的帳戶更新寫入磁盤,使其成爲永久性的。鏈的最終狀態是所有已確認交易的結果。這個狀態總是可以從區塊鏈歷史中確定性地重建。

交易以並行方式處理,並打包成分類帳“條目”,每個條目包含 64 個不衝突的交易。Solana 上的並行交易處理變得簡單,因爲每筆交易必須包含將要讀取和寫入的所有帳戶的完整列表。這個設計選擇雖然增加了開發者的負擔,但允許驗證者通過輕鬆選擇僅包含不衝突交易的條目來避免競爭條件。如果兩個交易嘗試寫入同一帳戶(兩個寫操作),或者一個交易嘗試讀取而另一個交易寫入同一帳戶(讀取 + 寫入),這些交易就會發生衝突。因此,衝突的交易會分配到不同的條目中並按順序執行,而不衝突的交易則會並行執行。

有六個線程並行處理交易,其中四個專門處理普通交易,兩個專門處理投票交易,後者對於 Solana 的共識機制至關重要。所有的並行處理都是通過多個 CPU 核心實現的;驗證者沒有 GPU 要求(參閱文檔)。

一旦交易被分組爲條目,它們就準備由 Solana 虛擬機(SVM)執行。交易所需的帳戶被鎖定;進行檢查以確認交易是最新的但尚未處理。帳戶被加載,交易邏輯被執行,帳戶狀態被更新。條目的哈希將被發送到歷史證明服務進行記錄(更多內容將在下一部分討論)。如果記錄過程成功,所有更改將提交到銀行中,並解除第一步中對每個帳戶施加的鎖定。執行由 SVM 完成,SVM 是使用 Solana 的 rBPF 分支構建的虛擬機,rBPF 是一個用於 JIT 編譯和 eBPF 程序虛擬機的庫。值得注意的是,Solana 不規定驗證者如何選擇在區塊內排序交易。這種靈活性是一個關鍵點,我們將在本報告的經濟學 + Jito 部分進一步探討。

請注意

術語 SVM 可能會引起歧義,因爲它可能指代“Solana 虛擬機”或“Sealevel 虛擬機”。這兩個術語描述的是相同的概念,其中 Sealevel 是 Solana 的運行時環境的名稱。盡管最近有努力精確定義其使用範圍,但 SVM 這個術語仍然未得到嚴格使用。

客戶端

Solana 網路由數千個獨立操作的節點組成,這些節點協作維護一個統一的帳本。每個節點都是運行相同開源軟件的高性能機器,這些軟件被稱爲“客戶端”。

Solana 最初推出了一個單一的驗證節點客戶端軟件——最初是 Solana Labs 客戶端,現在稱爲 Agave 客戶端——使用 Rust 編寫。擴展客戶端的多樣性一直是優先事項,並且這一目標將隨着 Firedancer 客戶端的推出而真正實現。Firedancer 是對原始客戶端的全面重寫,使用 C 語言構建。由高頻交易公司 Jump 的經驗豐富團隊開發,其致力於成爲任何區塊鏈上性能最優的驗證客戶端。

歷史證明

“我喝了兩杯咖啡和一杯啤酒,一直熬到凌晨 4 點。我突然有了一個靈光一現的時刻,這個謎題類似於工作量證明,使用相同的 SHA-256 抗預映像哈希函數……我知道我掌握了時間的流向。” — Anatoly Yakovenko,Solana 聯合創始人

歷史證明(PoH)是 Solana 的祕密武器,像每個驗證節點上的特殊時鍾一樣,促進了網路的同步。PoH 爲事件的順序和時間的流逝建立了一個可靠的真實來源。最關鍵的是,它確保遵循領導者計劃。盡管名稱類似,但歷史證明並不是像工作量證明這樣的共識算法。

節點之間的通信開銷通常會隨着網路的擴展而增加,協調變得越來越復雜。Solana 通過用 PoH 本地計算替代節點間的通信來緩解這一問題。這意味着驗證者可以通過一次投票來提交一個區塊。消息中的受信時間戳確保驗證者無法相互幹擾並提前開始生成區塊。

PoH 基於哈希算法的獨特屬性,具體來說是 SHA256

  • 確定性:相同的輸入總是會產生相同的哈希值。
  • 固定大小:無論輸入大小如何,輸出哈希值總是 256 位。
  • 高效:非常迅速地計算任何給定輸入的哈希值。
  • 抗預映像性:從哈希輸出中找到原始輸入在計算上不可行。
  • 雪崩效應:輸入的微小變化(甚至一個比特)會導致哈希值顯著不同,這種屬性被稱爲雪崩效應。
  • 抗碰撞性:找到兩個不同的輸入生成相同的哈希值幾乎不可能。

在每個驗證客戶端中,一個專用的“歷史證明服務”不斷運行 SHA256 哈希算法,創建哈希鏈。每個哈希的輸入是前一個哈希的輸出。這條鏈充當可驗證延遲函數,因爲哈希工作必須按順序完成,未來哈希的結果不能提前知道。如果 PoH 服務創建了一個包含一千個哈希的鏈,我們知道在計算每個哈希時時間已經過去——這可以被看作是“微型工作量證明”。然而,其他驗證者可以並行驗證這千個哈希的正確性,速度遠快於它們生成的速度,因爲每個哈希的輸入和輸出已被廣播到網路中。因此,PoH 難以生成但易於驗證。

不同 CPU 上計算 SHA-256 的性能範圍出奇地窄,最快的機器之間的差異很小。盡管在優化這一功能上投入了大量時間和精力,但一個常見的上限已經被達到,這主要是由於比特幣對其的依賴。

在領導者的時間槽中,PoH 服務將接收來自銀行階段的新處理條目。當前的 PoH 哈希與條目中所有交易的哈希結合生成下一個 PoH 哈希。這作爲時間戳,將條目插入哈希鏈中,證明交易處理的順序。這個過程不僅確認了時間的流逝,還作爲交易的加密記錄。

在一個區塊中,有 800,000 個哈希。PoH 流還包括“滴答”,這些是空的條目,表示領導者的存活性和時間的流逝,時間約爲幾分之一秒。每 6.25 毫秒發生一次滴答,每個區塊包含 64 次滴答,總區塊時間爲 400 毫秒。

即使在不是領導者的時候,驗證者也會不斷運行 PoH 時鍾,因爲它在節點之間的同步過程中發揮着關鍵作用。

請記住

PoH 的關鍵好處是確保即使在區塊生產者離線——即所謂的“失職”狀態下——也必須遵循正確的領導者計劃。PoH 防止惡意驗證者在未輪到他們之前生成區塊。

帳戶模型

“在 SVM 中分離代碼和狀態是最好的設計決策。嵌入式系統開發人員有福了,他們虔誠地將這個概念灌輸到我的大腦中。” ——Solana 聯合創始人阿納托利·雅科文科 (Anatoly Yakovenko)

在 Solana 驗證者中,全局狀態保存在稱爲 AccountsDB 的帳戶數據庫中。該數據庫負責在內存和磁盤上存儲所有帳戶。帳戶索引中的主要數據結構是哈希圖,這使得 AccountsDB 本質上是一個巨大的key-value存貯庫。這裏,key是帳戶地址,value是帳戶數據。

隨着時間的推移,Solana 帳戶的數量已激增至數億。如此大的數字部分是因爲,正如 Solana 開發人員喜歡說的那樣,“Solana 上的一切都是一個帳戶!”

Solana 帳戶

帳戶是一個持久存儲數據的容器,類似於計算機上的文件。帳戶有多種形式:

  • 用戶帳戶:這些帳戶具有私鑰,通常由錢包軟件爲用戶生成。
  • 數據帳戶:這些帳戶存儲狀態信息,例如用戶持有的特定代幣數量。
  • 程序帳戶:這些帳戶較大,包含可執行的字節碼,類似於 Windows 上的 .exe 文件或 Mac 上的 .app 文件。
  • 本地程序帳戶:這些是特殊的預部署程序帳戶,執行網路的各種核心功能。例如,Vote Program 和 BPF Loader。

所有帳戶都有以下字段:

程序

Solana 的程序帳戶僅包含可執行邏輯。這意味着當程序運行時,它會改變其他帳戶的狀態,但自身不會發生變化。代碼和狀態的分離使 Solana 與其他區塊鏈不同,並支持其許多優化。開發者主要使用 Rust 編寫這些程序,Rust 是一種因注重以安全性和性能而聞名的通用編程語言。此外,還有多種 TypeScript 和 Python 的 SDK 可用於創建應用程序前端並實現與網路的程序化交互。

許多常見功能由本地程序提供開箱即用的服務。例如,Solana 不要求開發者部署代碼來創建代幣。相反,指令被發送到預部署的本地程序,該程序將設置一個帳戶來存儲代幣的元數據,從而有效地創建了一個新的代幣。

租金

租金是一種機制,旨在激勵用戶關閉帳戶,減少狀態膨脹。要創建一個新帳戶,帳戶必須持有一定數量的 SOL,稱爲“免租金”金額。這可以看作是爲了保持帳戶在驗證者內存中活躍而產生的存儲成本。如果帳戶數據的大小增加,最低餘額的租金要求也會相應增加。當帳戶不再需要時,可以關閉帳戶,租金將返還給帳戶所有者。

例如,如果用戶持有一個以美元計價的穩定幣,這個狀態會存儲在一個代幣帳戶中。目前,代幣帳戶的免租金金額爲 0.002 SOL。如果用戶將其全部穩定幣餘額轉移給朋友,該代幣帳戶可以關閉,用戶將會收回 0.002 SOL。程序通常會自動爲用戶處理帳戶的關閉。還有幾個應用程序可以幫助用戶清理舊的、未使用的帳戶,並回收存儲在這些帳戶中的少量 SOL。

所有權

盡管讀取帳戶數據通常是允許的,但 Solana 的所有權模型通過限制誰可以修改(寫入)帳戶的數據來增強安全性。這個概念對於在 Solana 區塊鏈上執行規則和權限至關重要。每個帳戶都有一個程序“所有者”。帳戶的所有者負責管理該帳戶,確保只有授權的程序可以更改帳戶的數據。一個顯著的例外是 Lamports(SOL 的最小單位)的轉移——增加帳戶的 Lamports 餘額通常是允許的,無論所有權如何。

狀態存儲

Solana 程序作爲只讀可執行文件,必須使用“程序派生地址”(PDAs)來存儲狀態。PDA 是與程序關聯並由程序而非特定用戶擁有的特殊類型帳戶。雖然普通 Solana 用戶地址是從 Ed25519 密鑰對的公鑰派生的,但 PDA 沒有私鑰。相反,它們的公鑰是從一組參數(通常是關鍵字或其他帳戶地址)和擁有程序的程序 ID(地址)組合中派生出來的。

PDA 地址存在於“曲線外”,意味着它們不像普通地址那樣在 Ed25519 曲線上。只有擁有 PDA 的程序才能以編程方式生成籤名,確保它是唯一可以修改 PDA 狀態的程序。


上圖:Solana 代幣帳戶是程序派生地址(PDA)的具體實例。它們用於存儲代幣,並且“離線”存在。關聯代幣帳戶(ATA)程序確保每個錢包對每種代幣類型只有一個關聯代幣帳戶,提供了管理代幣帳戶的標準化方式。

渦輪(Turbine)

“Solana 最有趣的部分不是並行化、SVM 或 Toly 的推文,而是你可能沒聽說過的東西:Turbine。” — Mert Mumtaz, Helius

在銀行階段,交易被組織成條目並發送到歷史證明流(Proof of History,PoH)進行時間戳標記。區塊的銀行被更新,條目現在準備進入下一個階段——渦輪(Turbine)。

渦輪是領導者將其區塊傳播到網路其他部分的過程。受到 BitTorrent 的啓發,它被設計爲快速而高效,可減少通信開銷,最小化領導者需要發送的數據量。

渦輪通過一種叫做“切片”(shredding)的過程,將交易數據拆分成“切片”(shreds)。切片是小的數據包,最大爲 1280 字節,類似於視頻流中的單獨幀。重新組合這些切片後,驗證者可以重放整個區塊。這些切片通過互聯網在驗證者之間使用 UDP 發送,並利用糾刪編碼處理數據包丟失或惡意丟包。糾刪編碼是一種基於多項式的錯誤檢測和修正方案,確保數據完整性。即使某些切片丟失,區塊仍然可以被重建。

切片被分組爲稱爲前向糾錯(FEC)批次的集合。默認情況下,這些批次由 64 個切片組成(32 個數據切片 + 32 個恢復切片)。數據恢復在每個 FEC 批次內進行,這意味着批次中最多可以丟失或損壞一半的數據包,所有數據仍然可以恢復。每個 64 切片的批次經過 Merkle 化,根由領導者籤名,並鏈式連接到前一個批次。這個過程確保切片可以從網路中任何擁有它們的節點安全獲取,因爲 Merkle 根鏈提供了可驗證的真實性和完整性路徑。

領導者最初向一個根節點廣播,該節點將切片傳播到所有其他驗證者節點。這個根節點會隨着每個切片的變化而變化。驗證者被組織成層級,形成“渦輪樹”。持有較多權益的驗證者通常位於樹的頂部,而權益較少的則位於底部。

樹通常跨越兩到三跳,具體取決於活躍驗證者的數量。爲了視覺簡化,上面展示了一個 3 跳的示例,但 Solana 當前的實際擴展值設置爲 200。出於安全原因,樹的順序會爲每個新的切片批次進行旋轉。

這種系統的主要目標是減輕領導者和根節點的出站數據壓力。通過利用傳輸和重傳系統,負載在領導者和重傳節點之間分配,減少了對單個節點的壓力。

共識

“一些聰明的人告訴我,在 Solana 中有一個認真聰明的開發者社區……我希望這個社區能有機會蓬勃發展。” — Vitalik Buterin, Ethereum 共同創始人

一旦驗證者通過渦輪從領導者那裏接收到新區塊,它必須驗證每個條目中的所有交易。這包括重放整個區塊、並行驗證 PoH 哈希、按照 PoH 規定的順序重建交易,以及更新本地銀行。

這個過程由交易驗證單元(Transaction Validation Unit,TVU)處理,它類似於領導者的交易處理單元(Transaction Processing Unit,TPU),作爲處理切片和區塊驗證的核心邏輯。與 TPU 類似,TVU 的流程被分爲幾個階段,從切片獲取階段開始,接收通過渦輪傳輸的切片。在隨後的切片驗證領導者籤名階段,切片經過多次一致性檢查,最重要的是驗證領導者的籤名,以確保接收到的切片來源於領導者。

在“重傳階段”(Retransmit Stage),驗證者根據其在渦輪樹(Turbine tree)中的位置,將數據片段轉發給適當的下遊驗證者。在“重放階段”(Replay Stage),驗證者精確地重建每個事務,並以正確的順序進行,同時更新其本地的銀行狀態。

重放階段類似於TPU中的銀行階段(banking stage);這是最重要的階段,可以更直接地描述爲區塊驗證階段。重放是一個單線程的過程循環,協調許多關鍵操作,包括投票、重置PoH時鍾以及切換銀行。


上圖:重放階段負責將驗證者切換到領導者模式並開始區塊生產。原始圖像來源:Justin Starry, Anza

共識

爲了實現共識,Solana 使用了 Tower BFT(TBFT),這是一個自定義實現的實際拜佔庭容錯(PBFT)算法,PBFT 是大多數區塊鏈用來達成鏈狀態一致的算法。像所有區塊鏈一樣,Solana 假設網路中存在惡意節點,因此系統必須承受不僅僅是節點故障,還要抵御一定程度的攻擊。

Tower BFT 與其他鏈的不同之處在於利用了由歷史證明(Proof of History,PoH)提供的同步時鍾。傳統的 PBFT 需要多輪通信來達成交易順序的共識,而 Solana 節點利用預先建立的事件順序,大大減少了消息開銷。

投票

爲了參與共識並獲得獎勵,驗證者需要對他們認爲有效(即沒有雙花或不正確籤名等問題)的區塊進行投票,並將這些區塊視爲規範性區塊。驗證者爲這些投票支付交易費用,這些費用由領導者處理並與常規用戶交易一起包含在區塊中。這就是爲什麼 Solana 的交易通常分爲投票交易和非投票交易。當驗證者提交正確且成功的投票時,他們會獲得信用。這一機制激勵驗證者投票支持他們認爲最有可能被包含的分叉,即“最重”的分叉。

‍分叉

Solana 的部分部分使其速度如此之快,即網路在生成下一個區塊之前並不會等待所有驗證者對新生成的區塊達成一致。因此,兩個不同的區塊連結到同一個父區塊,從而產生分叉,這並不罕見。

Solana 驗證者必須對這些分叉進行投票,並使用共識算法來確定採用哪個分叉。當存在競爭的分叉時,最終只有一個分叉會被網路確認,而其他分叉中的區塊則會被棄用。

每個時隙都有一個預定的領導者,只有該領導者的區塊會被接受;一個時隙不能有兩個提議的區塊。因此,潛在的分叉數量被限制在一個“有/沒有”跳躍列表中,這些分叉可以在領導者輪換時出現。一旦驗證者選擇了一個分叉,它會被承諾於這個分叉,直到鎖定時間過期,這意味着它必須在最小期限內堅持其選擇。

Solana 的“跳過率”——即一個區塊未生成的時隙百分比——在 2% 到 10% 之間,分叉是導致這些跳過時隙的主要原因。其他可能導致跳過時隙的原因包括新紀元的開始、領導者離線或生成無效區塊。

請記住

Solana 上交易的狀態根據其在共識過程中的當前階段而有所不同:

  • 處理(Processed):交易已被包含在區塊中。
  • 確認(Confirmed):交易所在的區塊已被三分之二的絕大多數投票確認。
  • 最終確認(Finalized):超過 31 個區塊已建立在交易區塊之上。

截至目前,Solana 的歷史上從未出現過(樂觀地)確認的區塊沒有最終確認的情況。

對於每個區塊,Solana 使用一個銀行來訪問該區塊的狀態。當一個銀行被最終確認時,該銀行及其前置帳戶更新會被刷新到磁盤上。此外,任何來自早期銀行但不是最終確認銀行的前置的帳戶更新會被修剪。這一過程使 Solana 能夠有效地維護多個潛在的狀態。

八卦網路與歸檔

“一條區塊鏈需要巧妙地結合密碼學、分布式系統、操作系統和編程語言。Solana 的超級能力就是願意逃離每個學科中最有趣的問題。” — Greg Fitzgerald, Solana 共同創始人

八卦網路

八卦網路可以被視爲 Solana 網路的控制平面。與處理交易流的數據平面不同,控制平面傳播關於區塊鏈狀態的關鍵元數據,如聯系信息、帳本高度和投票信息。如果沒有八卦網路,驗證者和 RPC 將不知道哪些地址和端口可以用於跨各種服務的通信。新節點也依賴八卦來加入網路。

Solana 的八卦協議使用非正式的對等通信,採用基於修改過的 PlumTree 算法的樹廣播方法。這種方法在不依賴任何中央來源的情況下高效傳播信息。

八卦操作有點像一個獨立的系統,與大多數其他驗證者組件相對獨立。驗證者和 RPC 每 0.1 秒通過 UDP 使用八卦共享籤名數據對象,確保信息在網路中的可用性。所有八卦消息必須小於或等於 1280 字節的最大傳輸單元(MTU),在代碼庫中稱爲“數據包結構”(packet struct)。

八卦記錄是節點之間共享的實際數據對象。大約有 10 種不同類型的記錄,每種記錄都有不同的用途。八卦記錄是經籤名的、版本化的,並有時間戳的,以確保完整性和時效性。

八卦消息有四種類型:

  • 推送(Push):最常見的消息,與一部分“推送對等體”共享信息。
  • 拉取與拉取響應(Pull & Pull Response):定期檢查遺漏的消息,拉取響應會發送回節點沒有的信息。
  • 修剪(Prune):允許節點選擇性地減少維護的連接數量。
  • Ping 和 Pong:節點的健康檢查——如果發送了 ping,則期望收到 pong,表示對等節點仍然活躍。

八卦數據存儲在集羣復制數據存儲(CrdsTable)中。這個數據結構可能會變得非常大,需要定期修剪。

歸檔

Solana 在區塊鏈領域的獨特之處在於不需要完整的歷史記錄來確定帳戶的當前狀態。Solana 的帳戶模型確保了在任何給定時隙的狀態都是已知的,使得驗證者可以存儲每個帳戶的當前狀態,而無需處理所有歷史區塊。RPC 和驗證者在設計上不會保留完整的歷史帳本。相反,他們通常只存儲 1 或 2 個紀元(2-4 天)的交易數據,這足以驗證鏈的末端狀態。

歸檔目前由“倉庫節點”管理,這些節點由專業 RPC 服務提供商、Solana 基金會及其他希望確保交易歷史可用的生態系統參與者運營。倉庫節點通常維護以下一個或兩個內容:

  1. 帳本歸檔:上傳原始帳本和適合從頭開始重播的 AccountsDB 快照。
  2. Google Bigtable 實例:存儲從創世區塊開始的區塊數據,並以適合 RPC 請求的格式提供。

經濟學與 Jito

“人們逐漸認識到,Solana 是今天唯一能夠支持主流消費應用的區塊鏈。” — Ted Livingston, 創始人

Solana 採用通貨膨脹機制來分發質押獎勵,每個紀元生成新的 SOL 代幣。這一過程導致非質押者在網路中的份額相對於質押者減少,從而使財富從非質押者轉移到質押者。通貨膨脹從 2021 年初開始,初始年率爲 8%,每年減少 15%,直到穩定在長期的 1.5%。

任何 SOL 代幣持有者都可以通過將代幣質押給一個或多個驗證者來獲得獎勵並幫助保護網路。將代幣分配給驗證者稱爲委托。委托代幣給驗證者表示對該驗證者的信任,但並不會賦予驗證者對代幣的所有權或控制權。所有質押、解質押和委托操作都在下一個新紀元的開始時執行。

投票獎勵

當驗證者提交投票時,如果投票準確且成功,他們會獲得信用。投票交易費用爲 0.000005 SOL,並免除優先費用。投票費用大約爲每個驗證者每天 1 SOL,使其成爲運行驗證者的主要運營成本。在一個紀元內,驗證者通過投票積累信用,這些信用可以在紀元結束時兌換成通貨膨脹獎勵的一部分。

表現最佳的驗證者能夠成功投票大約 90% 的時隙。請注意,無區塊的時隙百分比(跳過時隙率)從 2% 到超過 10% 不等,這些時隙無法進行投票。平均而言,驗證者在大約 80% 的時隙上成功投票,在一個 432,000 時隙的紀元中,獲得 345,600 個信用。

總通貨膨脹獎勵池首先根據紀元內獲得的信用進行分配。驗證者在總信用中的份額(其信用除以所有驗證者信用之和)決定了他們的相應獎勵。這一獎勵進一步根據質押量進行加權。

因此,擁有總質押 1% 的驗證者如果獲得平均數量的信用,其通貨膨脹獎勵應該大約爲總獎勵的 1%。如果他們的信用高於或低於平均水平,其獎勵將相應波動。

投票表現差異是驗證者提供的回報(以年化收益率APY衡量)變化的一個原因。另一個因素是驗證者收取的佣金率,這是指向他們驗證者的總通貨膨脹獎勵的百分比。此外,驗證者離線或與區塊鏈不同步(稱爲失職)也會顯著影響回報。

區塊獎勵

被指定爲特定區塊的領導者的驗證者將獲得額外的區塊獎勵。這些獎勵包括該區塊內所有交易的基礎費用和優先費用的 50%,其餘費用則被銷毀。只有生成區塊的驗證者才能獲得這些獎勵。與每個紀元分發的質押獎勵不同,區塊獎勵在區塊生成時會立即記入驗證者的身分帳戶。

流動性質押

流動性質押已成爲原生質押的熱門替代方案。參與者將SOL質押到一個質押池中,並獲得一種稱爲流動性質押代幣(LST)或流動性質押衍生品(LSD)的代幣。這些LST代幣代表了用戶質押SOL的份額。盡管質押者仍在獲得質押獎勵,這些代幣可以進行交易、用於各種應用程序,或轉移給他人。該系統的主要優勢在於顯著提高了資本效率。

LST的價格 = (質押池中的總SOL * SOL的價格)/ 鑄造的總LST數量

與傳統的原生質押不同,隨着時間的推移,質押者會直接增加更多的SOL。而在流動性質押中,獎勵被重新投資到池中,從而提高LST的公允價值。只要存在機制可以用LST贖回底層質押的SOL,套利交易者將確保代幣價格保持合理。

Jito

截至撰寫本文時,超過80%的Solana質押量(來源)使用了Jito客戶端驗證軟件。該客戶端是原Agave客戶端的一個分支,引入了一種協議外的區塊空間拍賣,爲驗證者提供額外的經濟激勵。這個額外的激勵是Jito客戶端在驗證者中廣泛採用的主要因素。

當領導者使用Jito驗證客戶端時,他們的交易會首先被定向到Jito-Relayer。這個開源軟件充當交易代理路由器。其他網路節點並不知道Jito-Relayer的存在,因爲它們只是將交易發送到領導者通過八卦網路公布的地址和端口配置,即他們的入口套接字(ingress_socket),假設這是領導者的。

中繼節點在將所有交易轉發給領導者之前,會將其保存200毫秒。這一“速度緩衝”機制延遲了交易消息的傳遞,提供了一個簡短的拍賣窗口。200毫秒後,無論拍賣結果如何,中繼節點會樂觀地釋放這些交易。

區塊空間拍賣通過Jito區塊引擎在鏈外進行,允許搜索者和應用程序提交一組原子執行的交易,稱爲“交易捆綁包”。這些捆綁包通常包含時間敏感的交易,如套利或清算。Jito對所有小費收取5%的費用,最低小費爲10,000 lamports。小費完全在協議外操作,與協議內的優先費和基本費分開。此前,Jito運行了一個規範的協議外內存池服務,但該服務現已被棄用。

聲明:

  1. 本文轉載自[helius],著作權歸屬原作者[Lostin],如對轉載有異議,請聯系Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得復制、傳播或抄襲經翻譯文章。
Start Now
Sign up and get a
$100
Voucher!