小學生也能看懂!Solana 的編程模型,究竟和 ETH 有啥區別?
撰文: Foresight News , Alex Liu
Solana 是一個旨在支持 dApps 的高性能區塊鏈平台,以其速度和可擴展性聞名,而這是通過獨特的共識機制和架構設計實現的。本文將以太坊作為比較對象,簡要介紹 Solana 智能合約編程模型的特點。
智能合約、鏈上程序:
運行在以太坊上的程序被稱為智能合約,它是位於以太坊上一個特定地址的一系列代碼 (函數)和數據(狀態)。(哦豁,代碼數據耦合了)智能合約也是一個以太坊帳戶,稱之為合約帳戶,它們有餘額,可成為交易對象,但是無法被人操控,被部署在網絡上作為程序運行。
而運行在 Solana 上的可執行代碼被稱為鏈上程序( On - chain Program ),它們能解釋每筆交易中發送的指令。這些程序可以直接部署到網絡核心作為原生程序,或由任何人發布為 SPL 程序。
- 指令 ( Instructions ):指令是 Solana 鏈上程序的特有名詞。鏈上程序由指令組成,是執行特定操作的最小單位: 每筆 Solana 交易中都包含一個或多個指令。指令指定了要執行的操作,包括調用特定鏈上程序、傳遞帳戶、輸入列表以及提供位元組數組。指令有計算限制,因此鏈上程序應該被優化為使用少量計算單元,或將昂貴的操作分成多個指令。

- 原生程序 :提供驗證節點所需功能的原生程序。其中最著名的是 System Program,它負責管理創建新帳戶以及在兩個帳戶之間轉帳 SOL。
- SPL 程序 :定義了一系列鏈上活動,包括代幣的創建、交換、借貸,以及創建質押池、維護鏈上域名解析服務等。其中,SPL Token Program 用於代幣操作,而 Associated Token Account Program 等則常用於編寫其他定制程序。
你叫智能合約,我叫鏈上程序,大家說法不一樣,但都是指運行在區塊鏈上的代碼。張三李四王麻子都是人名,到底素質如何還得考察其他方面。
帳戶模型、數據解耦:
與以太坊類似, Solana 也是基於帳戶模型的區塊鏈,但 Solana 提供了一套不同於以太坊的帳戶模型,用不同的方式存儲數據。
在 Solana 中,帳戶可以保存錢包信息和其他數據,帳戶定義的字段包括 Lamports(帳戶餘額)、Owner(帳戶所有者)、Executable(是否為可執行帳戶)和 Data(帳戶存儲的數據)。每個帳戶都指定一個程序作為其所有者,以區分帳戶用作哪個程序的狀態存儲。這些鏈上程序是只讀或無狀態的:程序帳戶(可執行帳戶)只存儲 BPF 位元組碼,不存儲任何狀態,程序會把狀態存儲在其他獨立帳戶(不可執行帳戶)中,即 Solana 的編程模型將代碼和數據解耦。

而以太坊帳戶主要是 EVM 狀態的引用,其智能合約既存在代碼邏輯,又需要存儲用戶的數據。這通常被認為是 EVM 歷史遺留的設計缺陷。

不要小看這區別! Solana 智能合約在根本上比具有耦合編程模型的區塊鏈(如以太坊)更難攻擊:
在以太坊中,智能合約「擁有者」是一個全局變量,與智能合約一一對應。因此,調用某個函數可能直接改變合約「擁有者」。
而在 Solana 中,智能合約的「擁有者」是與帳戶關聯的數據,而不是全局變量。一個帳戶可以有多個擁有者,而不是一對一關聯。攻擊者要利用智能合約的安全漏洞,不僅需要找到有問題的函數,還需要準備「正確」的帳戶來調用該函數。這一步驟並不容易,因為 Solana 智能合約通常涉及多個輸入帳戶,並通過約束條件(例如 ` account1 . owner == account2 . key ` )來管理它們之間的關係。從「準備正確的帳戶」到「發動攻擊」的過程,足夠讓安全監控人員可以在攻擊之前主動檢測到創建與智能合約相關的「虛假」帳戶的可疑交易。
以太坊的智能合約就像是一個使用唯一密碼的保險庫,你只要得到了這個密碼,就能獲得完整的所有權;而 Solana 的則是一個有很多個密碼的保險庫,但想要獲取權限,你不但要想辦法搞到密碼,還要弄清楚這個密碼對應的編號,才能把鎖打開。
編程語言
Rust 是 Solana 上開發智能合約的主要編程語言。因為它的性能和安全特性,使其適用於區塊鏈和智能合約的高風險環境。 Solana 同時也支持 C 、 C ++ 和其他語言(很不常見)。官方提供了 Rust 和 C 的 SDK 來支持開發鏈上程序。開發者可以使用工具將程序編譯成 Berkley Packet Filter ( BPF ) 位元組碼(文件以 . so 為擴展名),再部署到 Solana 鏈上,通過 Sealevel 並行智能合約運行時來執行智能合約的邏輯。
由於 Rust 語言本身上手難度高,且並不是為區塊鏈開發定制,導致很多需求需要重複造輪子、代碼冗餘。(生產中許多項目採用 Backpack 聯創 Armani 創造的 Anchor 框架簡化開發)許多新創造的專用於區塊鏈開發的編程語言是基於 Rust 的,如 Cairo ( Starknet )、 Move ( Sui 、 Aptos )。

生產中許多項目採用 Anchor 框架
而以太坊智能合約主要用 Solidity 語言開發(語法和 javascript 類似,代碼文件以 . sol 為擴展名)。由於語法相對簡單以及開發工具更加成熟( Hardhat 框架、 Remix IDE …)通常我們認為以太坊的開發體驗更簡單爽快,而 Solana 開發的上手難度高。所以儘管現在 Solana 的熱度很高,事實上以太坊的開發者數目仍然是遠多於 Solana 的。
特定路況下,頂級賽車沒有改裝車跑得快。 Rust 就像頂級賽車,有力地保證了 Solana 的性能和安全性,但非為鏈上程序開發這條賽道而生,反而造成了駕駛(開發)難度的上升。採用基於 Rust 、為鏈上開發定制語言的公鏈則相當於改裝了這輛賽車,使其更適應路況。 Solana 在這點上處於劣勢。
總結
Solana 的智能合約編程模型是創新的。它提供了一種無狀態的智能合約開發方法,將 Rust 作為主要編程語言,以及讓邏輯與狀態分離的架構,為開發人員構建和部署智能合約提供了強大環境,確保安全性和性能,但開發難度較大。 Solana 專注於高吞吐量、低成本和可擴展性,仍是尋求創建高性能 dApps 的開發人員目前的理想選擇。








