本文將公鏈 Solana 與第二大公鏈以太坊進行對比,簡要介紹了二者在智能合約程式設計模型上的差異。
(前情提要: Vitalik 提新以太坊改進提案「EIP-7706」多維 Gas 概念如何釋放 L2 可擴充性)
(背景補充: Solana網路堵塞如何解?Helius:修復程式4/15推出、Firedancer升級可再提高交易量10~100倍)
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)。
而以太坊智能合約主要用 Solidity 語言開發(語法和 javascript 類似,程式碼檔案以 .sol 為副檔名)。由於語法相對簡單以及開發工具更加成熟(Hardhat 框架、Remix IDE …)通常我們認為以太坊的開發體驗更簡單爽快,而 Solana 開發的上手難度高。所以儘管現在 Solana 的熱度很高,事實上以太坊的開發者數目仍然是遠多於 Solana 的。
特定路況下,頂級賽車沒有改裝車跑得快。Rust 就像頂級賽車,有力地保證了 Solana 的效能和安全性,但非為鏈上程式開發這條賽道而生,反而造成了駕駛(開發)難度的上升。採用基於 Rust 、為鏈上開發訂製語言的公鏈則相當於改裝了這輛賽車,使其更適應路況。Solana 在這點上處於劣勢。
總結
Solana 的智能合約程式設計模型是創新的。它提供了一種無狀態的智能合約開發方法,將 Rust 作為主要程式語言,以及讓邏輯與狀態分離的架構,為開發人員構建和部署智能合約提供了強大環境,確保安全性和效能,但開發難度較大。
Solana 專注於高吞吐量、低成本和可擴展套件性,仍是尋求建立高效能 dApps 的開發人員目前的理想選擇。