Move是一門強類型的位元組碼語言,基於棧式虛擬機設計,受Linear Logic類型系統的啟發,將資源(數字資產)作為第一等公民,藉助所有權轉移和最多一次可變引用等規則保證資產安全。名字Move的來歷也就自然而然可以理解了。
三個大特點
1. first-class resouces. 用資源表示數字資產是一等公民,然後通過語法藉助borrow check等思路在合約編譯期間保證資產的不可雙花,不可消失,必有歸屬性;
2. flexibility 通過交易腳本來定義單個交易裡面的一次性(不可重用)合約邏輯,交易腳本定義了合約的main函數,可以插入多個module實現複雜邏輯和可重用邏輯。合約的結構原語modules/resources/procedure,類比與面向對象的class/object/method,同時通過module做合約資源的聲明周期管理,極大的提升了合約可復用性和安全性。
3. 強類型的位元組碼,在位元組碼層面的靜態代碼檢查保證運行時的大多數錯誤都在編譯期間被發現。Move沒有動態指派(dynamic dispath),函數調用完全是在編譯期間確定,沒有什麼類似c++的RTTI的機制,這樣驗證工具可以快速構建調用圖驗證,borrow check保證資源任何時候只有一個muttable引用,這樣寫操作就可以被嚴格檢驗。保證足夠安全。
Move實例介紹
先舉個Move寫的合約例子:
public main(payee: address, amount: u64) {
let coin: 0x0.Currency.Coin = 0x0.Currency.withdraw_from_sender(copy(amount));
0x0.Currency.deposit(copy(payee), move(coin));
}
合約接受2個參數轉賬接收人payee和轉賬金額amount。0x0表示賬戶地址,Currency表示module, 0x0.Currency.Coin表示資源類型,0x0.Currency.withdraw_from_sender這個procedure(過程)返回一個0x0.Currency.Coin類型的值coin,然後通過deposit這個過程,將coin轉移到payee的地址下面去。 藉助於linear logic的轉移原則, 限制資源(數字資產的)的不可重用(只能轉移一次),不可複製(不能copy資源)以及不可丟失(轉移之後必有地址接受)。
Move通過一個地址到賬戶的map來表示global state。如下: