作者: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 的開發人員目前的理想選擇。
參考連結
https://solana.com/docs
https://ethereum.org/en/developers/docs
https://www.anchor-lang.com/