Move語言的創新和機遇
摘要
一級標題
摘要
為更好的實現資產安全,Move在語言設計、虛擬機和驗證工具三個層面均作出了創新改變:Move為數字資產定義了新的Resource類型,並抽像出資源應滿足的兩種基本屬性,稀缺性和訪問權限;通過強數據抽象的Module系統實現賬戶的權限控制;繼承Rust的Ownership系統來實現資產所有權的轉移。除此之外,靜態調用、形式化驗證、字節碼校驗器等機制的引入也共同為數字資產的安全提供了多重保障。
從語言接受度上看,Move 對開發者非常友好,其宗旨就是降低開發者的安全門檻,使合約開發者可以專注於業務邏輯,上手容易,整體開發者遷移成本並不算高;從生態上看,Move的實際應用場景還處於早期,尚未大面積鋪開應用生態。目前使用Move孵化出的公鏈項目只有Aptos、Sui以及國內的Starcoin。未來,由於Move為金融而生的特性和賽道成熟度等因素,DEX、DeFi、錢包這類金融基礎設施會率先落地,緊接著是Socialfi、Gamefi等金融類相關應用。
概述
一級標題
概述
近日,公鏈賽道異常活躍:兩條逆市狂攬近5億美元融資的新公鏈Aptos和Sui引起了行業內的廣泛關注。要說它們為何能有如此大的能耐,除了創始團隊大部分來自於已然夭折的穩定幣項目Libra(後改名Diem)的深厚背景外,更大可能是因為它們從Diem那繼承了最核心的遺產— — Move語言。
一級標題
一級標題

過去幾年,區塊鏈領域裡的每一批新公鏈崛起的浪潮都包含一定程度的發展範式的轉移。現在,以Move為首的Diem系公鏈似乎正在暗示,新編程語言的敘事已經成為公鏈競爭的戰場之一。

一級標題

世界上的語言這麼多了,為何Libra還要“多此一舉”設計Move呢?我們知道,Libra的願景是成為全球化貨幣的金融基礎設施,賦能幾十億人。因此, Move就必須把保證資產安全性放到設計目標的首要位置。然而,過去的編程語言並不能很好地滿足這個要求。
據SlowMist Hacked數據不完全統計,僅在2021年裡區塊鏈生態裡被公開的安全事件就超過200例,損失金額超98億美元。其中,絕大多數安全問題都出現在生態DApp或DeFi協議中。
一級標題
2. Move如何保證資產安全性
二級標題
二級標題
Move在資產安全性上的表現優於以往的編程語言,很大程度上是因為它站在前人的肩膀上作出了創新型的改進,這些改進主要體現在三個方面,分別是語言設計、虛擬機和鏈下驗證工具。
二級標題

2.1 語言設計:為數字金融而生

Move在慢慢弱化“數字”屬性,強調“資產”屬性。為什麼這麼說?先來看看以往圖靈完備的智能合約語言是如何定義數字資產的。
我們知道,以太坊採用的是賬戶模型,本身是一個巨大的交易狀態機,每一筆交易都會改變以太坊的世界狀態,而交易又是打包在區塊裡。所以,以太坊一方面可以看成是打包成一個個區塊的交易而形成的賬本鏈條,另一方面也可以看成是隨著區塊的產生,不斷地從一個世界狀態躍遷到另一個世界狀態的狀態機。
進一步來說,每一個賬戶的信息總和組成了每個時刻的世界狀態。同時,對於每一個賬戶來說,他都是從地址到賬戶狀態的一個映射。這樣表達可能比較抽象,我們可以這樣通俗來理解。打開你的錢包,你每一張銀行卡都對應了一個銀行賬戶。銀行卡的卡號就相當於賬戶的地址,卡號中的資金餘額、消費明細、理財產品持倉等等都是這個賬戶的狀態。所以每一張卡在某一個時間點都對應了一個狀態。你所有銀行卡的集合,就對應了你的資金的世界狀態。隨著你使用銀行卡進行交易、進行消費,你的銀行卡的狀態就會發生變更,你的資金的世界狀態也就會發生躍遷。
這種映射關係主要通過以太坊賬戶關鍵字段裡的balance來體現。直觀上看,這是一個典型的KV鍵值對(mapping (address => uint256) public balances),Value體現為賬戶的某種Token餘額。所以,Token在Solidity裡是用整型數值變量(uint)來表示的,不同賬戶之間的代幣轉移過程是通過數字加減法操作的。
下面是使用Solidity實現的一個ERC20的轉賬邏輯,“from用戶“(即發送方給“to用戶”(接收方)轉Value數量的token,其主要過程為:
i. 從發送方地址(from)映射出初始餘額balance,賦值給oldFromVal變量;
ii. 要求oldFromVal大於value,即發送方餘額足夠;
iii. 從接收方地址(to)的映射出初始balance,賦值給oldToVal變量
iv. 將oldToVal + value並且賦值給newToVal;
v. 將oldFromVal — value並且賦值給newFromVal;
vi. 將newFromVal設置成發送方地址(from)的新balance;
vii. 將newToVal設置成接收方(to)的新balance;
用通俗的例子簡化一下,Alice給Bob轉賬10塊錢,調用智能合約在Alice的賬戶地址下減去10,給Bob的地址上加10。整個修改balance的過程,在中心化金融場景裡是常見的扣款邏輯。
從這個例子可以看出,用戶間的交易過程就是依靠合約代碼邏輯來強硬實現的,最終體現為地址下對應的數目更新。它的可靠性依賴合約的開發者,很難保證不會出現一些人為錯誤。歸根結底,Solidity是面向區塊鏈智能合約的語言,並非面向資產的語言。數字資產在Solidity裡只是單純可以被加減的數字,沒有進行類型定義;而數字的表意性不夠,資產理應有所區別。
●稀缺性
a) First-class Resource — — 實現數字資產化
為解決上述問題,Move專門為數字資產定義了新的數據類型First-class Resource,直譯為資源是一等公民。一等公民的意思很好理解,就是編程語言在編程時要將一等公民作為首要考慮的被編程對象;至於資源,簡而言之,就是數量有限,並且能產生價值的事物即是資源。 Move沿襲該思想抽像出了資源在編程時應遵循的兩種約束,即稀缺性和訪問權限。
●稀缺性
稀缺性是有價值的實物資產的重要屬性,比如物理世界的金條,無論中間進行了多少次流轉,這根金條都不會從1根變為2根,也不會突然消失;但是數字資產並不存在固有的物理稀缺性。因此,Move認為數字資產計算規則必須以編程方式強制執行這種稀缺性。它規定了系統內的資產的供應要有所限制,資產不能憑空消失,複製現有的資產應該被禁止,創造新的資產應該是一種特權操作。這裡提到的編程方式是指Move定義的語法結構Ability。它包含Move為各種變量抽像出的4個屬性,可複制(copy ) 、可索引( key )、可丟棄( drop )、可儲存( store ),開發者可以相互組合使用這些字段來賦予變量不同的能力。需要注意的是,一旦該變量聲明為Resource類型,它只能使用Key和Store屬性,無法被添加Copy和Drop。這樣一來,Move從編程語法結構上保證了資源類型的稀缺性;

● 訪問權限
資產的所有者應該可以通過某種訪問控制策略來保護自己的資產。我們知道,以太坊主要依靠的是公鑰簽名機制,而Move又在這個基礎上提供了新的Module系統。我們後面還會詳細闡述Module,這裡先按下不表。
總的來說,Move利用Resource從底層將資產的概念進行了封裝,使得數字資產真正成為了合約變量,不僅可以存儲、賦值,還能作為函數/過程的參數和返回值;Ability結構也從語法上體現出Move對Resource變量做出的強制規則,保證了資產不能憑空消失、也不能任意複製,很好的避免了諸如上述無限複製增發漏洞等安全隱患。
b) Module — — 實現權限控制和可組合
Module即模塊,和Rust中的Mod、Solitidy中的Contract類似,內部可以聲明一系列數據類型和函數,包括Resource,Struct,Function;其中Struct和Resource都是用來定義新的數據結構類型,區別在於Resource無法被複製和丟棄;至於Function函數則和其它大多數語言類似,可以用來創建、銷毀和更新Module裡聲明的類型。整體來看,Module具有以下特性:
●強數據抽象
之所以說Module是強數據抽象的,是因為它規定了數據類型在其聲明的Module內部裡是透明的,在外部是不透明的,且每個Resource對像都被封裝在特定的Module裡,由所有者的賬戶控制和更新,對外提供函數來按照詳細的策略來創建、修改和銷毀資產。如前文所述,這個特性也常被用於Move的訪問權限控制。 Module外部無法繞過Module直接對內部的Resource進行操作,必須通過提供的函數有所限制的使用Reource。體現在代碼裡,外部開發者只能調用Module裡的Public類型的函數,根據模塊內部的定義進行操作,避免了意外調用帶來的安全隱患。
●靈活性與無狀態性
Module在設計時仍然保留了對外提供模塊的公開接口來進行合約間的相互組合和資源使用,這在功能上和Solidity使用的Interface標準並無太大差別,不同點在於Move語言的模塊是無狀態的,狀態保存在全局存儲中。具體來說,Solidity裡的諸如ERC-20合約的Token實現更像是一個賬本,通過賬本的狀態變更記錄著每個用戶與合約交互的完整數據;而Move通過Module將資產封裝後分散存儲在賬戶地址下,更像貼好標籤的獨立保險櫃。
c) Ownership系統— — 實現資產所有權
這個概念是從Rust傳承下來的,它對所有權是這樣定義的:
1. 每個值(value)都有對應的被稱為所有者的變量;
3. 當所有者離開作用域時,值將被丟棄。
所以,回過頭來看Resource的資源屬性,雖然用戶之間的Resource交易仍按照資產數值大小進行相應的加減和索引,但與Solidity中強行利用代碼邏輯將一個地址的餘額減少,另一個地址增加的方式有本質區分;Resource的轉移過程更像是搬磚,把資源從一個賬戶搬到另一個賬戶,傳輸期間不會出現丟失和復制的情況,更好的保證了資產安全性。
二級標題
二級標題
總的來看,Move通過線性類型概念明確了數據的所有權,強調資源稀缺性、保護性和訪問控制,並利用模塊系統定義了每個資源的生命週期、存儲和訪問模式。這些特徵共同確保了數字資產不會憑空產生和隱式丟棄,減少了諸如雙花、無限增發等安全問題的產生。

二級標題
上文介紹了Move的語言設計特性,開發人員可以利用這些特性來編寫特定需求的智能合約。不過,Move與Solidity都屬於高級編程語言,計算機並不能直接讀取和執行這些源代碼,因此需要依賴專用的執行器來實現具體的合約。

●工作流程
目前,虛擬機是智能合約主流的實現方式之一,Move也不例外。它可以為程序提供一個完全對底層透明的執行環境,其目的是實現“一次編寫,到處運行”的特性,而不是讓程序開發人員為兼容每個不同的服務器編寫不同版本的程序。這麼設計的原因是智能合約是運行在需要進行拜占庭容錯來達成共識的分佈式系統環境裡,所有節點必須按照智能合約約定的規則產生相同的計算結果,否則合約執行的結果無法被各個節點所共識;而虛擬機能屏蔽區塊鏈節點自身執行環境的區別,在所有節點上的運行均一致,實現智能合約的確定性。
Move虛擬機是典型的基於棧的字節碼解釋器,輸入為字節碼,加上當前的世界狀態,輸出是對世界狀態的改變;其內部有獨立的指令集來執行和處理系統的所有狀態變動,用戶可以在Move提供的字節碼對照表裡找到命令對應的意義。
●工作流程
Move虛擬機具體的工作流程為:首先通過編譯器將源代碼變為低級的字節碼Bytecode並傳遞給虛擬機;收到字節碼後,虛擬機要先調用字節碼校驗器進行校驗,驗證器可以檢查出Move源代碼裡的各種類型錯誤;最後,虛擬機解釋器按照腳本順序解釋執行,從左到右遍歷每個數據或者字節碼。運行時基於堆棧執行,遇到數據就壓入堆棧,遇到字節碼就彈出相應數據的數據,利用字節碼進行計算,算完之後再把計算結果壓回堆棧,直到退出。
通過這個流程檢查源代碼可能出現的類型錯誤主要包括:

ii. Type&Kind檢查。檢查推導棧內的變量的具體類型是否正確;比如棧類無法對Resource類型變量使用CopyLoc字節碼,這也是資產稀缺性的直接體現;

EVM是鏈節點為智能合約創造的一個隔離的、可確定的沙盒環境,多個合約程序是運行在同一個進程內的不同的虛擬機沙箱中。這意味著以太坊合約之間的調用是同一個進程內不同的智能合約虛擬機之間的調用,安全依賴於智能合約虛擬機之間的隔離。
二級標題
二級標題
而Move虛擬機支持並行執行。合約之間的調用被集中放置在一個沙盒中,在這種架構下,合約的狀態的安全性主要要通過編程語言內部的安全性進行隔離,而非依賴虛擬機進行隔離。

二級標題
理想的情況下,Move可以通過運行bytecode校驗來發現合約運行時的安全漏洞。但是,這種鏈上校驗的計算成本非常高,且這種計算往往會佔用非常多的網絡資源,影響鏈上TPS。因此,Move希望採取的策略是只對關鍵的安全屬性進行輕量級的鏈上驗證,其它的安全問題則是依賴鏈下的靜態驗證工具來進行檢查。基於這種策略,Move開發了獨有的Move Prover形式化驗證器來防止人為編寫錯誤,進而提高代碼的安全性。
● 靜態調用
一級標題
一級標題
值得一提的是,Move Prover是靜態驗證工具,這是因為Move從機制設計上是完全不支持動態調用的。動態調用指,如果一個程序在調用另一個程序時,必須在運行時才能確定被調用的目標,則稱這種合約調用是動態的。從機制上看,它有點類似服務器的遠程調用。但是,動態調用會引發循環調用時的並發問題。比如A合約調用B合約,而B合約又調用A合約,A合約的前一次執行未完成又進行下一次執行,導致後面的執行無法讀取到前面的中間狀態,最終引發安全漏洞。著名的The DAO事故就是由合約動態調用問題導致的。因此,在Move設計裡每個函數調用都是靜態的,開發者能夠在程序運行之前,知道它以某種順序調用了哪些函數。這種靜態類型系統更適合通過形式化驗證推理,將問題的暴露前置到了編譯階段,以降低在運行時出現bug的可能,很好的分擔了安全檢查的壓力。
一級標題
聯繫我們:
參考資料
2. https://move-book.com/cn/index.html
3. https://move-dao.github.io/move-book-zh/modules-and-scripts.html
4. https://jolestar.com/why-move-1/
5.https://mirror.xyz/0xbuidlerdao.eth/MePeSGYe63OX8xXb8IwIrXzGk_S606NG7SR879XMXRE
6. https://mp.weixin.qq.com/s/bSS9GAcVp6tuWjedpTysQw
7. https://starcoin.org/zh/developers/others/starcoin_ecology/
8. https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/design/virtual_machine/evm.html
9. https://doc.rust-lang.org/book/
10. https://solidity-cn.readthedocs.io/zh/develop/
一級標題
官方網站:
聯繫我們:
諮詢郵箱: research@huobi.com
官方網站:https://research.huobi.com/
Twitter: Huobi_Research
https://twitter.com/Huobi_Research
Medium: Huobi Research
https://medium.com/huobi-research
Telegram: Huobi Research
https://t.me/HuobiResearchOfficial
免責聲明
諮詢郵箱: research@huobi.com
2. 本報告所引用的資料及數據均來自合規渠道,資料及數據的出處皆被火幣區塊鏈研究院認為可靠,且已對其真實性、準確性及完整性進行了必要的核查,但火幣區塊鏈研究院不對其真實性、準確性或完整性做出任何保證。
3. 報告的內容僅供參考,報告中的結論和觀點不構成相關數字資產的任何投資建議。火幣區塊鏈研究院不對因使用本報告內容而導致的損失承擔任何責任,除非法律法規有明確規定。讀者不應僅依據本報告作出投資決策,也不應依據本報告喪失獨立判斷的能力。
4. 本報告所載資料、意見及推測僅反映研究人員於定稿本報告當日的判斷,未來基於行業變化和數據信息的更新,存在觀點與判斷更新的可能性。
3. 報告的內容僅供參考,報告中的結論和觀點不構成相關數字資產的任何投資建議。火幣區塊鏈研究院不對因使用本報告內容而導致的損失承擔任何責任,除非法律法規有明確規定。讀者不應僅依據本報告作出投資決策,也不應依據本報告喪失獨立判斷的能力。


