Battle of the Languages
三句話摘要
編程語言在區塊鏈智能合約安全中的角色:Move、Solidity、Rust 的設計哲學與取捨。 安全並無銀彈——語言設計必在開發者直觀性與執行效能間平衡,編譯器安全靠工程紀律與持續模糊測試,區塊鏈真正風險在邏輯缺陷而非語言特性,開發者自我修養與對抗性思維才是根本。 Move 的後發優勢與設計目標:Move 在 Facebook(現 Meta)於 2018 年創建時,汲取了既有語言經驗,特別針對安全性設計。其虛擬機基於高層級字節碼,在加載和執行時能完全驗證類型安全和參考安全,字節碼無資訊損失可反編譯回源碼,這使得形式化驗證和程序分析工具更易應用。Move V2 編譯器統一了驗證架構與編譯器架構,加速語言迭代,但新編譯器本身被視為業界高風險因素。
重點整理
重點- 1
Move 的後發優勢與設計目標:Move 在 Facebook(現 Meta)於 2018 年創建時,汲取了既有語言經驗,特別針對安全性設計。其虛擬機基於高層級字節碼,在加載和執行時能完全驗證類型安全和參考安全,字節碼無資訊損失可反編譯回源碼,這使得形式化驗證和程序分析工具更易應用。Move V2 編譯器統一了驗證架構與編譯器架構,加速語言迭代,但新編譯器本身被視為業界高風險因素。
- 2
Solidity 的實用主義設計與安全現實:Solidity 刻意選擇極度簡潔設計,使非計算機科學背景的開發者也能學習。其安全漏洞並非來自語言缺陷,而是應用邏輯問題和區塊鏈獨特的對抗性環境。記憶體管理等傳統系統語言安全問題在區塊鏈不適用(交易後記憶體即棄),真正威脅來自舍入誤差、重入等邏輯漏洞。Solidity 編譯器透過自制實現、最少外部依賴、多代碼生成管道、模糊測試等手段,在主網歷史上零編譯器漏洞。
- 3
Rust 的編程習慣強制與安全提升:Rust 本質上是 ML 系語言,源於解決 C++ 中的記憶體管理和安全問題。其借用檢查器強制單一可變參考、默認不可變變量等習慣,消除了由來已久的安全漏洞整類。Firefox URL 解析器改用 Rust 後安全漏洞從「源源不絕」降至零。但完全理解 Rust 需先經歷 C/C++ 的「段錯誤羞辱」,新手難以直觀把握其設計意圖。
- 4
編譯器錯誤防止的多層策略與限制:針對 Sway 編譯器漏洞導致資金被凍結的案例,業界採用對比測試(新舊編譯器跑同一交易)、模糊測試(語法生成隨機程序檢查斷言)、雙代碼生成管道(編譯兩份、對比狀態差異)等方法。Rust 層級風險較低(LLVM 後端更高風險),長期需要如 Google 無頭瀏覽器模糊測試的持續驗證,版本切換需數年謹慎推進。無單一銀彈,只能依靠工程紀律和持續模糊。
實用技巧與重點
乾貨- Move 相關
- 創建時間:2018年(Facebook時期)
- 字節碼特性:高層級、完全可驗證、可反編譯
- 新版本:Move V2(統一驗證與編譯器架構)
- 支持工具:形式化驗證、程序分析
- Solidity 相關
- 編譯器漏洞歷史:主網零編譯器漏洞記錄
- 設計策略:自制編譯器、最少外部依賴、多代碼生成管道、密集模糊測試
- 實際案例:Firefox URL解析器重寫前「源源不絕」的漏洞→重寫後零漏洞
- 版本管理:Solidity V3.0 時代(6-7年前)→ 現在(含Custom Errors、Traits等功能)
- Rust 相關
- 設計源頭:Mozilla 為解決 Firefox C++ DLL+JavaScript 組合的漏洞
- 核心機制:借用檢查器、默認不可變、RAII 機制
- 編譯時靜態分析深度、C ABI 相容性(允許漸進式替換舊代碼)
- Cargo 管理缺陷:版本管理僅用哈希,缺乏依賴變更深度分析(不檢測密碼學算法改動、類型變更)
- 編譯器安全測試方法
- 對比測試:同一交易用新舊編譯器執行、對比結果
- 模糊測試:用語法生成隨機源碼、執行編譯檢查斷言觸發
- 雙管道驗證:同份代碼兩套代碼生成路徑、對比最終狀態
- 版本切換周期:Google GCC→Clang 耗時 2-3年;Aptos Move V2 啟動半年後仍未默認激活
- 開發者教育資源
- Solidity:競賽、Wargames(近年資源豐富)
- Move:工具和模式仍在構建(含 LLM 輔助工具)
- Rust:大量官方資源,需先學 C/C++ 以真正理解
- Move 多鏈分裂
- Aptos Move(儲存模型)
- Sui Move(對象模型,基於對象而非儲存)
- 原 Libra/Diem Move(Zola 模型,前置聲明輸入)
- 當前策略:獨立演進、選擇性同步(如最近同步 Enum Types)
結論
結論“安全並無銀彈——語言設計必在開發者直觀性與執行效能間平衡,編譯器安全靠工程紀律與持續模糊測試,區塊鏈真正風險在邏輯缺陷而非語言特性,開發者自我修養與對抗性思維才是根本。”
完整解析
詳細本場面板聚焦四位頂級編程語言設計者與區塊鏈安全專家,圍繞三種主要智能合約語言的設計哲學展開討論。
Move 的後發設計:Wolfgang 開場介紹 Move 於 2018 年在 Facebook 孵化時,團隊在採用既有語言與創造新語言間抉擇,最終因安全考量決定自創語言。Move 核心優勢在於虛擬機基於高級字節碼(不同於 EVM 的低層級架構),支持加載時和執行時的完整類型與參考安全驗證,字節碼可無損反編譯回源碼。這設計使得形式化驗證與程序分析工具易於應用。新推出的 Move V2 編譯器統一了長期獨立發展的驗證架構與編譯器架構,加快迭代速度,但新編譯器在業界視為高風險因素。為此,Aptos 與安全公司 Trail of Bits 合作,採用對比測試策略——所有歷史交易跑過新舊編譯器,確保產出一致。即便如此,新編譯器從啟動至今已半年,仍未默認激活,體現谹慎態度。
Solidity 的實用主義與邏輯風險:Harry 強調 Solidity 的成功在於極度簡潔——使首次編程語言就是 Solidity 的開發者大量存在。他並列舉 Solidity 看似「漏洞叢生」的原因:並非語言缺陷,而是區塊鏈環境特有的對抗性。傳統系統語言關切的記憶體管理、指標濫用等問題在區塊鏈不存在(交易後記憶體即棄),真正威脅來自舍入誤差、重入、邏輯缺陷等應用層問題。為此,Solidity 編譯器採用了自制實現(避免 LLVM 等為非 EVM 設計的外部依賴引入不必要複雜性)、最小化依賴、多代碼生成管道雙驗、密集模糊測試等硬件工程。結果是主網歷史上零編譯器漏洞記錄。Harry 坦陳團隊曾面臨「直觀但低效」與「最優但易困惑開發者」的設計兩難(如 Traits 特性),最終倾向 EVM 最適化。
Rust 的強制習慣與陡峭學習:Dave 揭示 Rust 解決了 Mozilla Firefox 中 C++ DLL 與 JavaScript 混編帶來的安全痛點。Rust 之所以流行,根本在於三點:其為 C++ 的原地替換(暴露 C ABI)支持漸進遷移;借用檢查器強制單一可變參考、默認不可變等習慣,擊碎了由來已久的安全漏洞種類;編譯器願意為深度靜態分析犧牲編譯速度。Firefox URL 解析器從無盡漏洞一躍至零漏洞的案例証實了這點。但 Dave 亦坦言 Rust 的暗面:Cargo 依賴管理工具未有編譯器那般「偏執」,版本升級僅按雜湊跟蹤,缺乏變更深度分析(未檢測密碼學算法改動、固定陣列大小變更等),無法承載編譯器靜態分析的最佳實踐。此外,Rust 本質是 ML 系語言而非外觀暗示的 Algol 族,新手需先經歷 C/C++ 記憶體管理的「羞辱」方能真正領悟。
編譯器錯誤防止無銀彈:針對 Sway 編譯器漏洞凍結資金的事件,業界採用多層防禦:(1)對比測試——所有歷史交易用新舊編譯器執行、對比結果;(2)模糊測試——用語法生成隨機源碼、執行編譯檢查斷言;(3)雙管道驗證——同份代碼編譯兩條不同路徑、對比最終狀態。Rust 層級風險較低(僅涉及前端糖衣語法),高風險在 LLVM 後端。Google 從 GCC 遷至 Clang 耗時 2-3 年,Aptos Move V2 已啟動半年仍未默認激活。Dave 借鑑 Google Chrome 模糊測試的做法——數百萬無頭瀏覽器實例加載網頁、監控記憶體與執行上下文——建議 LLVM 亦採持續模糊與版本管控。結論是無銀彈,只能以工程紀律、長期測試與謹慎推進應對。
最後,針對 Move 多鏈方言問題(Aptos、Sui、原 Diem 各有差異),Wolfgang 解釋不同區塊鏈的程式模型差異(物件模型 vs. 儲存模型)導致語言設計差異,完全同步既不可行也無必要,當前策略為獨立演進加選擇性同步(如近期同步 Enum Types),期待長期自然收斂。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

