一文了解 Move 相比 Solidity 的三大優勢

作者:响指建設者 DC @Yao#3727
Twitter @linyao1900

智能合約的概念最早由 Nick Szabo 在 1996 年提出。但直到 2015 年以太坊平台出現才使得開發真正的智能合約成為現實。智能合約是一種自動執行的計算機應用程序,它執行合約時不需要來自第三方驗證。這意味著交易雙方不需要相互信任就能進行交易。這種新的開發環境催生了一種新型應用,即去中心化應用(dAPP),但給智能合約的開發者帶來了一系列新的挑戰。

與傳統開發不同,去中心化的區塊鏈環境裡,所有節點都會運行程序,這時如果遇到死循環或者安全問題,就顯得非常棘手。即便所有節點都同意回滾——這幾乎不可能,也會造成巨大損失。如果部分節點沒有回滾,那就會出現分叉。

Solidity 是現在區塊鏈構建最常用的語言之一,它是由以太坊開發的面向對象的高級語言,其靈感來自 JavaScript、C++ 和 Python 等,因此在編程上提供了豐富的基礎類型和復雜數據類型。並且引入了 Gas Fee 來避免死循環的出現,從而解決了停機問題。

Solidity 提供了一個強大的工具和生態系統,許多智能合約和去中心化應用都是用 Solidity 構建的,它們在以太坊網絡上每天處理大量交易。但是Solidity 基於接口機制和動態調用在帶來強大擴展性的同時,也帶來很大的安全問題,諸如 DelegateCall 漏洞、無限增發等,引發了大量的攻擊事件和漏洞。

近期 Diem 系新公鏈讓人們重新註意到 Move 語言。 Move 是由 Meta 開發的智能合約語言,早期用於支持 Libra(後改名為 Diem)項目。 Move 的設計和實現很大程度參考了 Rust,同樣具有豐富的基礎類型和數組。它還通過省略某些特性限制了語言的表達能力,比如動態調度和通用指針,基於 Ability+Resource 設計了一套資源管理特性,確保不可能在 Move 中出現複製或隱式丟棄任何資源。語言和 VM 層面的保障,大大降低了開發人員處理漏洞的代價和成本。

相比 Solidity,Move 最大三個優勢是針對金融場景引入了面向資源編程,具有更高的安全性,增強了可組合性。

一、面向資源編程更適金融場景

Move 的核心特點是面向資源編程。這裡的資源(Resource)來自於類似Rust 的所有權系統,靈感來源於線性類型(Linear Types)。

線性類型來自於線性邏輯,通常是為了表達資源轉換的有效性。比如在經典的自動售貨機例子中,普通邏輯針對一塊錢可以買到一顆糖,會表達為最后買到了糖果的同時還保留了錢。造成 bug 的原因在於錢和糖果在這裡屬於資源類型,必須在所有狀態變化中仔細計量而非自由支配。因此準確陳述應該是從一塊錢和一塊錢購買一顆糖的過程中,我們得到了一顆糖。

在編程環境中,內存管理並沒有完全從程序員那裡抽象獨立出來,如果說代碼中寫了一個對象,那麼該代碼必須管理並釋放分配給該對象的內存。所以資源可以作為一種新方法,用來跟踪某代碼以管理某種數據結構或系統資源,從而在編程語言中直接表達所有權。

Move 可以定義自定義資源類型。比如將 Token 標記為 Resource 就是在告訴編程環境:這個數據結構代表了某 Token 的價值,與該數據結構進行交互的所有代碼都需要遵循一系列特殊的規則,以維護該數據結構的價值。

這些規則如下:

  • 每個 Resource 在某一時刻只能存在於一個地方。 Resources 不能通過編程錯誤或惡意代碼進行複製或意外刪除。
  • Resource 的所有權由其存儲位置決定。
  • 只有所有者可以對 Resource 上的方法進行訪問。

也就是說通過設定複製 ( copy )、可索引 ( key )、可丟棄 ( drop )、可儲存 ( store )這四個屬性避免資源變量被隨意複製或修改。同時也可以根據屬性方便的定義出任何類型的資源,從而確保該數據得到保護。

使用資源類型讓智能合約尤其適用管理金融產品,既保證了所有權靈活性,也有強大的安全性(以太坊歷史上最著名的智能合約 bug 就是由可重入性問題引起的)

二、更高的安全性

Move 語言的安全性表現在三個方面:語言層面、虛擬機層面、工具層面。

  • 語言層面在一些中大型項目中,單個智能合約無法實現所有所需功能。因此通常採用動態方式調用,將代碼按功能劃分到不同的庫(library)或者合約中,然後提供接口互相調用。動態調用是一把雙刃劍。在提供了靈活性的同時,也帶來了挑戰。比如在 Solidity 中,考慮代碼復用,一般會將公共代碼部署到一個 library 中。此時如果需要修改合約狀態,就需要部署一個新的合約,這就涉及到合約調用合約的情況。開發人員需要考慮多種因素保障合約準確執行,還要避免循環調用可能出現的安全隱患(構造惡意合約),等於變相增加開發難度。在 Move 語言中函數調用都是靜態的。 Move 的靈活性體現在支持 transaction scripts。每筆交易都包含一個腳本,包含任意代碼,或者調用鏈上的其他 modules。 module 聲明了資源的類型和過程,也可以被其他的 module 進行調用。
  • 虛擬機層面Move 虛擬機有類似 Java 的字節碼驗證器。在合約運行前會進行校驗,這個驗證器可以檢查出各種類型錯誤。在合約調用過程中合約的狀態的安全性主要要通過編程語言內部的安全性進行隔離。
  • 工具層面形式化驗證即將合約程序形式化為數學可驗證的方式來驗證安全有效性。 Move 擁有團隊自己開發的形式化驗證工具—— Move Prover。它的基本思想是通過形式驗證領域的自動定理證明求解器來驗證程序是否符合某種規範。總體而言,Move Prover 可以保護鏈上資產不受合約漏洞影響,同時面對監管機構審查與合規要求也有一定預測作用,讓合約更加值得信賴。

三、基於模塊的可組合性

智能合約可組合性對於構建高效的 Web3 生態有非常重要的意義。 Move 語言的可組合性體現在模塊(Module)上。對比 Solidity 生態下的合約可組合性,主要為依賴於類似遠程調用下通過信息傳遞進行組合。

模塊包含定義結構類型的庫,以及對這些類型進行操作的函數。結構類型定義了 Move 的全局存儲的模式,模塊函數在其中定義了更新存儲的規則。模塊本身也被存儲在全局存儲中。所以在智能合約優化升級方面只需針對其組合的模塊進行即可,加速合約的升級優化速度。

綜合來看,作為 Diem 系新公鏈的核心資產,Move 語言的上述特點恰好是未來 Web3 生態建設中最迫切需要的。對於 NFT、GameFi 等新敘事會有重要影響。

本文不構成投資建議,虛擬貨幣波動大請謹慎小心

掌握虛擬貨幣、區塊鏈大小事

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。