Move: 一門面向資產的編程語言

最近被 Libra 刷了屏。好多人都在談論 Libra 對未來的影響,有從正面討論的,認爲會影響未來的數字經濟,也有負面的,我們還是逃不過被各大財閥控制的悲劇;有說 Facebook 在推動世界進步的,也有說小扎陰謀論的。這篇文章裏,我們就不談這些了,作爲一Developer,我們聊聊 Libra 附帶推出的 Move 這門語言好了。

1. 過去好像“無所不能”

作爲一名區塊鏈“從業者”,自從業以來,總有一種感覺————區塊鏈這個新興的技術,在寫代碼的時候能做的事情太多了。這並不是一種誇讚。我一直覺得總有一天區塊鏈的世界裏應該也會出現“編程範式”一樣的東西來限制大家能做什麼,不能做什麼。

先來看幾個例子:

a. 基於以太坊的智能合約

Solidity 讓你可以做很多事情,比如去年我嘗試寫一個頒發 Token 的智能合約。簡單的實現了我自己期待的 Issue,Transfer,Destroy 方法,就可以了。

當然,假如你知道 Open-Zeppelin 的話,把它引到代碼庫中,然後實現它裏面的 ERC-20 就更完美了。

可是問題在於,它賦予了你選擇的權利,你可以用也可以不用,那麼你完全可以隨意寫一個 Token 然後部署到 Production 上,然後就會遇到各種奇奇怪怪的問題。比如:

  1. 雙花問題: 客戶的 Token 可以被花兩次。
  2. 重入攻擊: 以太坊 “DAO” 項目遇到的問題,黑客可以利用這個 Bug 無限的向自己的賬戶中轉賬,直到合約的餘額爲 0。

問題在於,以太坊讓我可以很自由的去做很多事情,定義很多事情。

b. 基於 Corda 的智能合約

從去年就開始在一個用 Corda 的項目上,從開始接觸 Corda 到後來使用 Kotlin 寫 Corda 的智能合約,就一直有一個苦惱,要寫的 Corda 的邏輯幾乎超過了業務邏輯。

我們消耗了大量的時間去處理,交易發起方應該找誰索要簽名;作爲交易接收方要如何處理,等一系列諸如此類的問題。

我們暫且拋開 Corda 的自身原因不談,但是我一直納悶,爲什麼想要專心寫業務邏輯這麼麻煩,爲什麼要把業務邏輯和這些區塊鏈的業務混在一起呢?

問題在於,Corda 給我的靈活度更高,可是隨之而來的風險也就越多。

從上面來看,我們會發現,區塊鏈作爲一個新興的技術賦予了 Developer 太多的能力,而這些能力是沒有過多的限制的,以太坊不會限制我的資產要怎麼交易,因爲我的資產在以太坊上只是智能合約裏面的數據而已;Corda 不會限制我找誰簽名或者做什麼驗證,因爲 Corda 是把這些權利放給了 Developer 的。

可是,有時候沒有限制,並不是一件好事。就像“編程範式”一樣,我一直在想,是不是有一天,區塊鏈也會出現自己的“編程範式”,規定 Developer 能做什麼,不能做什麼。比如規定作爲一個資產,它是不能被複制,不能被隨意銷燬的。

過去,區塊鏈世界裏的合約彷彿無所不能,沒有節制。那麼未來,也許需要變一變了吧。

2. “他”從何處來

Libra 出的第一天在一個微信羣裏面看到有人問,“我就不理解爲什麼每個人需要創造一種新語言。”

Move: A Language With Programmable Resources 中可以找到答案,文章指出,現實世界中的資產數字化過程中面臨着兩方面的困難 — 稀缺性權限控制。而現有的平臺,如以太坊、比特幣等也同樣面臨着幾個問題:

  1. 資產的不正規表示(Indirect representation of assets)
  2. 自定義資產稀缺性描述,在區塊鏈編程語言中得不到良好的支持(Scarcity is not extensible)
  3. 權限控制功能深植於語言之中,難以自定義(Access control is not flexible)

單從 Solidity 的開發而言,上面提出的三個問題確實是存在的,在 Solidity 中如上文提到的,如果想要自己發佈 Token,其本質是合約決定的,其中的 Balance 多數是用 Integer 表示,而其表意性太差;其次,由於 Token 自己頒發,幾乎所有的內容都需要自己在合約中寫出來,合約中的內容都是由合約所有者維護的,包括其本質的問題:稀缺性和權限控制。一旦出現問題,那麼對於這個 Token 而言將是災難性的。

事實上,當前區塊鏈平臺所使用的編程語言存在的普遍問題在於,他們幾乎和過往的編程語言沒有過多的區別。可是我們應該意識到的是,區塊鏈與我們傳統的平臺開發是不同的。傳統的平臺開發基於的是大傢俱有不同的業務邏輯與基礎內容,本質上大家所處理的內容幾乎完全不同。

以 Salesforce 爲例,Salesforce 內部使用的 Apex 語言本身操作的是一個個類似於 pse__XXXX__c 的 Customer Class,每個 Class 具有的屬性和自身情況不同。

而區塊鏈本身操作的是資產(Asset),資產本身的特性是所有被稱爲資產的 Class 所共有的邏輯,所以其應該作爲一種基本的資源向開發者提供而不是作爲一種可供選擇的資源。以此爲據,我們可以姑且認爲,在區塊鏈的世界中基礎的資產類型應當是開發者認爲的底層,而不是業務邏輯。因此支撐區塊鏈平臺的語言要比以前的編程語言在基礎上多了一層對於基礎類型的封裝 — 即對資產類型的保護。

而 Move 本身的設計目標就是 – 資產是一等公民(First-class assets)、靈活性(Flexibility)、安全性(Safety)、可驗證性(Verifiability)

從語義上將資產(Asset)作爲其支持的一部分,而不是由用戶自定義其基礎(稀缺性、權限控制)的實現邏輯。用戶只需要自定義自己需要實現的部分即可,如:轉賬邏輯、退款邏輯等等。更加聚焦於業務而非底層。

3. “他”的特點

a. From 30,000ft — Move 中的兩大類型

> These safety guarantees are enforced statically by Move’s type system.

> – Move: A Language With Programmable Resources

從上帝視角來看,Move 把其中的類型分成了兩個大類:

  1. Unrestricted Value
  2. Resource

Unrestricted Value 是指那些如:u64 或者 錢包地址 一類的信息,可以被正常的複製和轉移。

Resource 則是我們之前所說的資產(Asset),基於 Linear Logic,就如同貨幣一樣,Resource 不能被複制,只能被轉移,並且只能被轉移一次;且不能被隱式丟棄。

b. From 20,000ft — Move 中的兩個程序模型

Move 把代碼分成了:

  1. Transaction script
  2. Modules

這兩種不同類型的代碼分別代表了兩種不同的邏輯,根據 Move 的描述,Modules 接近我們認爲的智能合約,在 Module 內部可以規定定義的內容的轉移,銷燬,發佈等業務邏輯。

而 Transaction script 用來執行交易指令,比如,Alice 向 Bob 轉 100 Libra,這個操作就是 Transaction script,而 100 Libra 和轉移過程中要經歷怎樣的邏輯則是 Modules 的職責了。

事實上,Transaction script 具有 all or nothing 的特性,即要麼都成功,要麼都失敗,不會存在一種中間狀態。舉一個 terraform 的例子,雖然不恰當,但卻是 all or nothing 的反例,在 terraform 中,如果你定義的某個 instance 創建失敗了,雖然結果中會提醒你命令失敗,但實際上其他的 instance 都會被創建成功。

在區塊鏈網絡中如果也出現同樣的狀況,那就很可怕了。加入 Alice 轉賬給 Bob 100 Libra,假設在轉賬過程中,我們的邏輯是先轉賬,後計算 Alice 的餘額,在轉賬成功後,操作失敗了。那麼就會出現 Alice 的餘額沒有減少,Bob 收到了 100 Libra。而這會對區塊鏈網絡造成毀滅性的打擊。

值得注意的是,儘管 Libra 中允許實現各自的資產作爲一種 Resource,但是,Coin 和 Coin 之間是互不相通的。

> 0x0.Currency.Coin and 0x1.Currency.Coin are distinct types that cannot be used interchangeably.

> – Move: A Language With Programmable Resources

所以未來可能會有類似交易銀行一樣的 module 出現來幫助自定義 Coin 之間進行轉化。

c. 落到地上 — Move 源碼

Move intermediate representation(Move IR)是由 Rust 寫成的,因此,可以將 Move IR 看作是 Rust 寫成的 DSL 語言。

image

在使用 cargo 構建項目上時,其實是將***.mvir**文件作爲 String 傳入 Rust 編譯器中,由 Parser 轉爲 Rust 代碼運行的。因此,在大家想要深入瞭解 Move 的本質時,可以通過 parser/ 目錄中的 ast.rs 詳細瞭解 Move 語言的關鍵字與數據結構;也可以通過 syntax.lalrpop 對 Move 的語法結構有一個基本的瞭解,其中定義了包括諸如:AccountAddress,StructType,IfStatement,LoopStatement 等內容。

如果希望能夠通過測試來了解更多關於 Move 的用法,可以通過 language/funcational_tests/payments/ 文件夾下的代碼來了解一些基本的轉賬操作。

4. “他”向何處去

In the longer term, Move must be capable of encoding the rich variety of assets and corresponding business logic that make up a financial infrastructure.

– Move: A Language With Programmable Resources

在文章中,特意有一個第七小節名爲”What’s Next for Move“足見 Libra 對於 Move 的期待和規劃。儘管上文我們提到了 Move 爲了解決的問題,以及它的主要目標 – 競爭優勢。但其實如果去看 Move 的源碼,你會發現它其實遠沒有到成熟的程度。

作爲一個新出的語言(我們前面提到,Move 其實是基於 Rust 寫的 DSL 語言),儘管它基於 Rust 構建了自己強大的類型系統,保證資產(Asset)的稀缺性權限控制。也構建了一套適用於 Libra 網絡的編程模型。

a. 代碼

但就使用 Move 寫代碼而言,依然有很多不直觀的地方。Move 借鑑了很多 Rust 相關的內容 — move,&mut,類型等。但是其本身在很多方面依然做的不夠好。比如:

  1. 在代碼表意方面,代碼中使用了大量的 Hard code 返回值狀態碼;Move 語言的測試例子中,很多 test case 起不到快速上手的幫助作用。
  2. 如上文提到的,Move 是一門基於 Rust 的 DSL 語言,在測試時產生的報錯會變得不是那麼友好:

image

所以就像文章中提到的:接下來的,Move 會:

  1. 逐步的實現 Libra 網絡的核心功能(Implementing core Libra Blockchain functionality)
  2. 增加新的語言功能,如:Collection、Event(New Language features)
  3. 增強開發人員的開發體驗(Improved developer experience)
  4. 正式規範與驗證(Formal specification and verification)

值得注意的是:

  1. 在 “New Language features” 中的一句話: In addition, we will develop a trusted mechanism for versioning and updating Move modules, transaction scripts, and published resources。衆所周知,區塊鏈要不要做 CI/CD、怎麼做 CI/CD 一直都是大問題。讓我們拭目以待 Move 在這方面的設計吧。
  2. 在 “Formal specification and verification” 中: We will create a logical specification language and automated formal verification tool that leverage Move’s verification friendly design. 未來,Move 期待用戶在未來能夠構建一個正確性的文化,通過形式化證明的方式來理解一個 module 的功能。

b. 生態

我們常常聽人談“生態”,生態之所以重要,在於生態的存在可以讓一個語言在一個衆人共同的思維體系下完善以及推陳出新。Move 顯然十分認可“生態”的存在,因此,在長遠發展的方向上,將支持第三方 Move module(Support third-party Move modules),放在了長期目標中。

Steps such as creating a marketplace for high assurance modules and providing effective tools for verifying Move code will help. 說明在 Move 看來,儘管生態重要,但是作爲一個具有廣大用戶量的區塊鏈平臺,其本身應該還是在以不影響用戶體驗、以及不產生 Bug 的前提下進行,所以採用這種類似於“收取 Gas 手續費”、放在 Marketplace 的方式來增加作惡成本。

需要承認,Libra 依然處在一個高速發展的階段,Move 也是如此,儘管從文章與代碼中,我們看到了Move 對於區塊鏈世界的鄭重。看到了他們的決心。而 Move 會大有可爲的,甚至可能會成爲區塊鏈的“編程範式”的一個良好的開始。

最佩服的是,他們就帶着那樣一股子一往無前的信念向前走去。不管他們的未來如何,反正他們已經改變了現在,而未來也終將因爲他們的存在而變的不是那麼一樣。

作者介紹:王瑞鵬,ThoughtWorks 諮詢師,區塊鏈技術專家。曾爲多個航運、銀行、汽車客戶提供諮詢服務,並參與到多個區塊鏈項目中。目前主要聚焦於區塊鏈、分佈式計算、共識算法等領域。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章