分析和評估智能合約開發語言通常包含易用性(是否容易上手和掌握)、安全性(是否能減少安全漏洞的出現)和生態資源(是否有豐富的開發工具和類別庫)。本文將智能合約開發語言依照 EVM 系、Solana 系和 Move 系進行分類介紹。
作者:小豬 Web3
封面: Photo by Shubham's Web3 on Unsplash
智慧合約是一種在區塊鏈平台上運行的自動化執行協議,它使得合約雙方能夠在無需中間人或信任第三方的情況下直接進行可信任交易,這些交易可追蹤且不可逆轉。智能合約當中內含了代碼函數,亦能與其他合約進行交互,當預先定義的條件得到滿足時,智能合約會自動執行合約中指定的代碼函數。
智慧合約概念最早由電腦科學家 Nick Szabo 在上世紀 90 年代提出,但直到以太坊區塊鏈的出現,智慧合約才開始廣泛應用。以太坊 2015 年推出,支援智慧合約的部署與執行,與比特幣主要用於加密貨幣的簡單交易不同,能夠使用其圖靈完備程式語言在以太坊平台上建構去中心化應用,因此被譽為第二代區塊鏈。
智慧合約語言是用來編寫智慧合約的程式語言,編譯成字節碼後在區塊鏈智慧合約平台的虛擬機器上執行,實現預定邏輯的程式碼。一個智慧合約語言需要能夠使開發者以安全、高效的方式表達合約的規則,並通常提供一系列用於處理區塊鏈事務和狀態的工具和抽象。
智能合約開發語言
智能合約開發者中大多數都在以太坊以及兼容 EVM 的區塊鏈上進行開發,而 Solana 是非 EVM 兼容區塊鏈生態中開發者最多的,Move 則是專門為安全地開發區塊鏈智能合約而建構的。
雖然還有許多其他公鏈有專門的智慧合約語言,例如 TON/FunC、Cardano/Plutus、 ICP/Motoko、Flow/Cadence、Starknet/Cairo 等,但過於碎片化。
因此本文將智能合約開發語言依照 EVM 系、Solana 系及 Move 系進行分類介紹。
EVM 系
EVM(Ethereum Virtual Machine, 以太坊虛擬機)是以太坊的核心,負責運行智慧合約和處理交易。以太坊協議規定了一種運行在 EVM 之上的字節碼,並在其之上構建了中間語言 Yul 和 Yul+,在中間語言之上再次構建了 Solidty/Vyper/Fe 等高級語言,高級語言面向前端用戶降低智能合約的開發難度。採用多層分層的好處是中間語言既適合於翻譯到機器語言,又適合全程序優化,易於手動檢查,進行形式化驗證等檢查,但是分層越多保證可證可信的成本就會更高,每一層都需要做對應的驗證,當然越底層的語言由於更簡單所以驗證成本更低。
在以太坊以及相容 EVM 的區塊鏈(例如 BSC、Polygon、Avalanche、Arbitrum、Optimism 等)上,開發者可以使用不同的高階程式語言,目前最受歡迎和維護得最好的語言是 Solidity 和 Vyper ,此外還可以選擇 Yul、Yul+、Fe 和 Huff。
Solidity 最早是由以太坊 CTO Gavin Wood 於 2014 年提出,後期則以 Christian Reitwiessner 所領導的以太坊團隊接手開發。 Solidity 作為一種物件導向的程式語言,深受 C++、Python 和 JavaScript 的影響,並且專為 EVM 而設計。 Solidity 為了程式碼重用,智慧合約被視為類別對象,利用了多重繼承。特別地,Solidity 規定了一種應用程式二進位介面(ABI)標準來與其合約互動。目前,Solidity ABI 被視為 EVM DSL 的事實標準。
Vyper 則由以太坊創始人之一 Vitalik Buterin 的團隊開發,旨在作為 Solidity 的替代選擇,於 2017 年推出。 Vyper 是一種以合約為導向的類似 Python 的程式語言,也是為 EVM 設計的。 Vyper 針對安全性、可讀性、稽核能力和 Gas 效率進行了最佳化。 Vyper 不採用物件導向模式,也不能使用內聯彙編。
Yul 是一種具有高階控制流程和大量抽象的組合語言,是 Solidity 工具鏈的一部分。 Yul 中的大多數功能在 Solidity 中使用內聯彙編區塊公開,可以利用 Solidity 不支援的功能,並自訂儲存、記憶體和 calldata。 Yul+ 是 Yul 的擴展,可以視為 Yul 的實驗性升級。
Fe 是一種類似 Rust 的高階語言,於 2021 年 1 月發行。 Fe 不使用物件導向的模式,而是透過基於模組的系統重複使用程式碼,在模組內宣告變數、類型和函數,可以以類似 Rust 的方式進行導入。
Huff 是一種組合語言,具有手動堆疊控制和對 EVM 指令集的最小化抽象。透過「#include」指令,編譯時可以解析任何包含的 Huff 文件,從而實現程式碼重複使用。
在以太坊上,基於 Solidity 開發的智能合約佔絕大多數,約 90%,是第二名 Vyper 的十倍,而 Fee 由於起步更晚,鮮有開發者使用。 Yul 和 Yul+ 一般作為 Solidity 的內聯彙編區塊,允許對 EVM 指令集進行低階訪問,通常用於進行 Gas 最佳化。 Huff 比 Yul/Yul+ 更底層,可以手動操作堆疊和呼叫 EVM 指令,通常用於 Gas 極限優化。
Solana 系
Solana 以其 PoH(Proof of History)機制以及低延遲高吞吐量而聞名,是最著名的「以太坊殺手」之一。 Solana 也是過去一年市值和生態發展最快的公鏈之一,催化了其開發者社群的顯著成長。
Solana 將智慧合約稱為鏈上程式(Program),主要採用 Rust 語言編寫,但與其他採用 Rust 語言的公鏈(例如 Near、Polkadot/Substrate、CosmWasm)不同,Solana 並未使用 WASM runtime,Solana 有自己獨特的虛擬機器 SVM 和字節碼 SBF。
SVM 是在 Solana 網路上運行智慧合約和處理交易的 runtime,關鍵元件是 Sealevel。 Sealevel 透過讓多個智慧合約同時運作而不會影響彼此的效能,從而在 Solana runtime 中實現並行處理。 Solana 的智能合約指定了在運行時將讀取或寫入哪些狀態(帳戶),這使得沒有衝突的交易可以並行執行,同時確保資料一致性。
SBF 基於 eBPF,前身是 BPF(Berkeley Packet Filter ,伯克利包過濾器),原本是用於網絡數據包的高效過濾,eBPF 提供更豐富的指令集,允許在不改動源碼的情況下對操作系統內核進行動態介入和修改其行為,具有高效能、安全和可移植性。 SBF 相對於 eBPF,使用了一個自訂驗證器,不僅會驗證程式需要確定程式在一定數量的指令內終止(也就是著名的停機問題),還會檢查指令是否正確以及是否有越界跳轉。除了驗證器之外,還解決了一些對於編譯智能合約來說有點問題的 eBPF 細節。
LLVM(Low Level Virtual Machine)是現代化的編譯架構和工具鏈,編譯器可以將 Rust 翻譯成中間語言 LLVM IR,之後再由 LLVM IR 利用後端翻譯成目標平台的 eBPF。理論上,只要支援編譯成 LLVM IR 的程式語言都可以編寫 Solana 智能合約,但實際上 Solana Labs 對 Rust 和 eBPF LLVM 後端進行了多項更改,其中一些更改本質上不是上游(Rust 和 LLVM)可用的。 Solana 合約開發目前只支援 Rust 和 Solang。
Rust 由 Mozilla 主導開發,於 2011 年推出,語法上與 C++ 類似,是一種為效能和安全,尤其是安全而設計的通用的靜態編譯型語言,並不限於智能合約程式。與 Solidity 相比,Rust 是一種低階(low-level)、多範式的程式語言,效能高且記憶體安全。 Rust 官方的編譯器為 rustc,rustc 將 Rust 原始碼進行詞法分析、語法分析、語意分析,最後將程式碼編譯為 LLVM IR。
Solang 由 Hyperlege Labs 主導開發,於 2023 年推出,是 Solana 和 Polkadot 的基於 LLVM 架構的 Solidity 的編譯器,支援使用 Solidity 編寫智能合約,但實際語法為了與 Solana 和 Polkadot 的體系結構保持一致做了一些改動。 Solang 的目的是簡化開發人員向 Solana 或 Polkadot 的過渡,並擴大 Solidity 的開發範圍。
Rust 是 Solana 官方主要支援的語言,穩定性更強;Solang 主要優勢在於其與 Solidity 語言的兼容性。
Move 系
Move 是 Diem (前身 Libra) 設計的一種新的智慧合約程式語言,於 2019 年推出,最初是為 Meta 的 Diem 區塊鏈專案而開發的。 Move 旨在解決資產和交易中的安全性問題,使得資產和交易能夠被嚴格定義和控制,其語言特徵是:
- 一等資源類型的保護(Frist Class Resources):一等資源類型首先是一種變數類型,然後規定這種類型的變數:不能被複製;不能被隱式地銷毀;只能在不同程式位址上 “ Move」;
- 靈活性:Move 字節碼可以直接執行,也可以調用其他已發布的 Modules 代碼,可以在一個交易中調用多個程序,能夠靈活的實現在一筆交易中給多人轉賬。
- 安全性、可驗證性:Move 編碼系統為資源提供了針對性的安全保護。 Move 資源不可複製,重複使用或銷毀。一個資源類型僅能被定義其類型的模組創建或銷毀。 Move 虛擬機器將透過靜態字節碼驗證,並拒絕未通過字節碼驗證的程式運行,以確保其安全性。
在 Diem 計畫解散之後,其創始團隊出走分別創立的 Aptos 與 Sui,也將 Move 作為核心智能合約語言。 Aptos 繼承了 Diem Move(Core Move),Sui 則透過自身定製版本的 Sui Move 來編寫其智能合約。
在 Move 中,每個智能合約都是一個模組,由函數和結構定義組成,結構在函數中實例化,可以透過函數呼叫傳遞給其他模組。 Sui Move 相較於 Core Move,採用了一種基於對象的資料模型,Sui 中存在三種不同類型的對象,分別是擁有者對象,共享對象和不可更改對象。 Sui 的平行化策略與 Solana 相似,交易也需要指定操作哪些對象,這種設計使得 Sui 可以有效地處理並發交易,實現無需傳統區塊鏈所需的全局排序的平行處理能力。
Move 的編譯器、驗證器以及虛擬機器都是從頭設計的。其中驗證器是 Move 的核心安全機制之一,用於維護 Move 以資源為中心的程式設計模型。 Move 的驗證器是一個靜態分析工具,分析 Move 字節碼並確定是否遵守所需的類型、記憶體和資源安全規則,所有上傳到鏈上的模組都需要通過驗證器。
相較於 Solidity 等語言,Move 是一種對形式化驗證友善的語言,例如不支援動態指派(dynamic dispatch)等特性,所有合約路徑都可以在編譯期就確定,而無需在合約執行時才確定需要執行的函數,可以充分的進行分析與驗證。
Move 還有一個用於智能合約的形式化驗證工具,稱為 Move Prover。開發者需要針對智慧合約編寫驗證條件(以斷言的形式),Move Prover 會在背景將這些驗證條件轉換為 SMT 公式,然後使用 SMT 解算器進行檢查。
智能合約開發工具
對於想入門 Web3 或想學習以太坊及其他相容 EVM 的區塊鏈的合約開發者而言,Solidity 都是不二之選。而由於 Solidity 的流行,開發工具也更加成熟,代表有 Hardhat、OpenZeppelin、Foundry:
- Hardhat 是一個編譯、部署、測試和調試以太坊應用的開發環境。幫助開發人員管理和自動化建立智慧合約和 DApps 流程中固有的重複性任務,並圍繞此工作流程輕鬆引入更多功能;
- OpenZeppelin 提供開源的 OpenZeppelin Contracts,用 Solidity 編寫,用於建立安全的智慧合約。 OpenZeppelin Contracts 使用 ERC 標準,可用於許多類型的專案;
- Foundry 是一個 Solidity 框架,用於建置、測試、模糊、調試和部署 Solidity 智慧合約, Foundry 的優點是以 Solidity 作為第一公民,完全使用 Solidity 進行開發與測試。
Solana 是開發者在以太坊之外的第二個選擇,Rust 語言的應用場景也非常廣泛。但 Solana 合約程式設計模型相對複雜,Rust 語言學習曲線相對陡峭,對開發者造成不小的開發難度。 Solana 的開發框架 Anchor,可以類比 Solidity 的開發框架 Hardhat,透過減少諸如帳戶(反)序列化和指令資料等領域的樣板文件、進行必要的安全檢查、自動生成客戶端庫以及提供廣泛的測試環境來簡化 Solana 開發流程。
Move 語言在底層的安全設計上有重大的創新,在確保語言表達能力和靈活性的同時,也讓 DApps 更加安全可靠。但目前基於 Move 的公鏈只有 Aptos 和 Sui,都是新興公鏈,開發工具也不夠完善。
總結
分析和評估智能合約開發語言通常包含易用性(是否容易上手和掌握)、安全性(是否能減少安全漏洞的出現)和生態資源(是否有豐富的開發工具和類別庫)。
Solidity 是影響力最大的智慧合約開發語言,透過開源社群的形式,累積了大量的成熟的開發工具和類別庫,可以簡化開發流程,復用安全約束,有助於實現業務的快速開發。
Rust 彌補了 Solidity 的安全性,雖然學習難度讓人望而生畏,但 Solana 生態僅次於以太坊,對開發者有足夠的吸引力,並且 Solang 也能連結 EVM 和 Solana 生態。
Move 基於 Rust 編寫,底層增加了更多安全機制,能保障資產守恆,學習難度也對開發者更加友好,但生態發展過於早期,距離大規模的工程化使用仍然有一定的距離。
免責聲明:作為區塊鏈資訊平台,本站所發布文章僅代表作者及來賓個人觀點,與 Web3Caff 立場無關。文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。