Move: A Language for programming resources

// Facebook 推出 Libra 有一段時間,按說應該在第一時間就對 Libra 和 Move 做一些評估才是區(qū)塊鏈團隊一員應有的覺悟行冰,推到了現(xiàn)在才開始寫的唯一原因就是 — 才看完 Move:A Language With Programmable Resources 這篇官方的論文溺蕉。

最近被 Libra 刷了屏。好多人都在談論 Libra 對未來的影響悼做,有說正面的疯特,會影響未來的數(shù)字經(jīng)濟;也有負面的肛走,我們還是逃不過被各大財閥控制的悲務奚帧;有說 Facebook 在推動世界的進步的羹与;也有說小扎陰謀論的。這篇文章里庶灿,我們就不談這些了纵搁,這些留給別人吧,作為一個 Developer往踢,我們聊聊 Libra 附帶推出的 Move 這門語言好了腾誉。

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

作為一名區(qū)塊鏈“從業(yè)者”,自從業(yè)以來峻呕,總有一種感覺利职,就是區(qū)塊鏈這個新興的技術,在寫代碼的時候能做的事情太多了瘦癌。這并不是一種夸贊猪贪。我一直覺得總有一天區(qū)塊鏈的世界里應該也會出現(xiàn)“編程范式”一樣的東西來限制大家能做什么,不能做什么讯私。

先來看幾個例子:

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

Solidity 讓你可以做很多事情热押,比如去年我嘗試寫一個頒發(fā) Token 的智能合約。我簡單的實現(xiàn)了我自己期待的 Issue斤寇,Transfer桶癣,Destroy 方法,就可以了娘锁。

當然牙寞,假如你知道 Open-Zeppelin 的話,把它引到了代碼庫中莫秆,然后實現(xiàn)它里面的 ERC-20 就更完美了间雀。

可是問題在于悔详,它賦予了你選擇的權利,你可以用也可以不用雷蹂,那么你安全可以隨意寫一個 Token 然后部署到 Production 上伟端。然后你就會遇到各種奇奇怪怪的問題。比如:

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

問題在于霜医,以太坊讓我可以很自由的去做很多事情,定義很多事情驳规。

b. 基于 Corda 的智能合約

從去年就開始在一個用 Corda 的項目上肴敛,從開始接觸 Corda 到后來使用 Kotlin 寫 Corda 的智能合約,就一直有一個苦惱吗购,要寫的 Corda 的邏輯幾乎超過了業(yè)務邏輯医男。

我們消耗了大量的時間去處理,交易發(fā)起方應該找誰索要簽名捻勉;作為交易接收方要如何處理镀梭,等一系列出如此類的問題。

我們暫且拋開 Corda 的自身原因不談踱启,但是我一直納悶报账,為什么想要專心寫業(yè)務邏輯這么麻煩,為什么要把業(yè)務邏輯和這些區(qū)塊鏈的業(yè)務混在一起呢埠偿?

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


從上面來看羽圃,我們會發(fā)現(xiàn),區(qū)塊鏈作為一個新興的技術賦予了 Developer 太多的能力抖剿,而這些能力是沒有過多的限制的统屈,以太坊不會限制我的資產(chǎn)要怎么交易,因為我的資產(chǎn)在以太坊上只是智能合約里面的數(shù)據(jù)而已牙躺;Corda 不會限制我找誰簽名或者做什么驗證愁憔,因為 Corda 是把這些權利放給了 Developer 的。

可是孽拷,有時候沒有限制吨掌,并不是一件好事。就像“編程范式”一樣,我一直在想膜宋,是不是有一天窿侈,區(qū)塊鏈也會出現(xiàn)自己的“編程范式”,規(guī)定 Developer 能做什么秋茫,不能做什么史简。比如規(guī)定作為一個資產(chǎn),它是不能被復制,不能被隨意銷毀的。

過去史侣,區(qū)塊鏈世界里的合約仿佛無所不能,沒有節(jié)制殉农。那么未來,也許需要變一變了吧局荚。

2. “他”從何處來

Libra 出的第一天在一個微信群里面看到有人問超凳,“我就不理解為什么每個人需要創(chuàng)造一種新語言∫”

在 Move: A Language With Programmable Resources 中可以找到答案轮傍,文章指出,現(xiàn)實世界中的資產(chǎn)數(shù)字化過程中面臨著兩方面的困難 — 稀缺性權限控制首装。而現(xiàn)有的平臺金麸,如以太坊、比特幣等也同樣面臨著幾個問題:

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

但從 Solidity 的開發(fā)而言揍魂,上面提出的三個問題確實是存在的桨醋,在 Solidity 中如上文提到的,如果想要自己發(fā)布 Token现斋,其本質是合約決定的喜最,其中的 Balance 多數(shù)是用 Integer 表示,而其表意性太差庄蹋;其次瞬内,由于 Token 自己頒發(fā),幾乎所有的內容都需要自己在合約中寫出來限书,合約中的內容都是由合約所有者維護的虫蝶,包括其本質的問題:稀缺性和權限控制。一旦出現(xiàn)問題倦西,那么對于這個 Token 而言將是災難性的能真。

事實上,當前區(qū)塊鏈平臺所使用的編程語言存在的普遍問題在于,他們幾乎和過往的編程語言沒有過多的區(qū)別粉铐√墼迹可是我們應該意識到的是,區(qū)塊鏈與我們傳統(tǒng)的平臺開發(fā)是不同的蝙泼。傳統(tǒng)的平臺開發(fā)基于的是大家具有不同的業(yè)務邏輯與基礎內容程剥,本質上大家所處理的內容幾乎完全不同。

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

而區(qū)塊鏈本身操作的是資產(chǎn)(Asset)茎活,資產(chǎn)本身的特性是所有被稱為資產(chǎn)的 Class 所共有的邏輯昙沦,所以其應該作為一種基本的資源向開發(fā)者提供而不是作為一種可供選擇的資源。以此為據(jù)载荔,我們可以姑且認為盾饮,在區(qū)塊鏈的世界中基礎的資產(chǎn)類型應當是開發(fā)者認為的底層,而不是業(yè)務邏輯懒熙。因此支撐區(qū)塊鏈平臺的語言要比以前的編程語言在基礎上多了一層對于基礎類型的封裝 — 即對資產(chǎn)類型的保護丘损。

而 Move 本身的設計目標就是 — 資產(chǎn)是一等公民(First-class assets)、靈活性(Flexibility)工扎、安全性(Safety)徘钥、可驗證性(Verifiability)

從語義上將資產(chǎn)(Asset)作為其支持的一部分,而不是由用戶自定義其基礎(稀缺性肢娘、權限控制)的實現(xiàn)邏輯呈础。用戶只需要自定義自己需要實現(xiàn)的部分即可,如:轉賬邏輯橱健、退款邏輯等等而钞。更加聚焦于業(yè)務而非底層。

3. “他”的特點

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

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

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

  1. Unrestricted Value
  2. Resource

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

Resource 則是我們之前所說的資產(chǎn)(Asset)珊皿,基于 Linear Logic网缝,就如同貨幣一樣,Resource 不能被復制蟋定,只能被轉移粉臊,并且只能被轉移一次;且不能被隱式丟棄驶兜。

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

Move 把代碼分成了:

  1. Transaction script
  2. Modules

這兩種不同類型的代碼分別代表了兩種不同的邏輯维费,根據(jù) Move 的描述果元,Modules 接近我們認為的智能合約,在 Module 內部可以規(guī)定定義的內容的轉移犀盟,銷毀而晒,發(fā)布等業(yè)務邏輯。

而 Transaction script 用來執(zhí)行交易指令阅畴,比如倡怎,Alice 向 Bob 轉 100 Libra,這個操作就是 Transaction script贱枣,而 100 Libra 和轉移過程中要經(jīng)歷怎樣的邏輯則是 Modules 的職責了监署。

事實上,Transaction script 具有 all or nothing 的特性纽哥,即要么都成功钠乏,要么都失敗,不會存在一種中間狀態(tài)春塌。舉一個 terraform 的例子晓避,雖然不恰當,但卻是 all or nothing 的反例只壳,在 terraform 中俏拱,如果你定義的某個 instance 創(chuàng)建失敗了,雖然結果中會提醒你命令失敗吼句,但實際上其他的 instance 都會被創(chuàng)建成功锅必。

在區(qū)塊鏈網(wǎng)絡中如果也出現(xiàn)同樣的狀況,那就很可怕了惕艳。加入 Alice 轉賬給 Bob 100 Libra搞隐,假設在轉賬過程中,我們的邏輯是先轉賬远搪,后計算 Alice 的余額劣纲,在轉賬成功后,操作失敗了终娃。那么就會出現(xiàn) Alice 的余額沒有減少,Bob 收到了 100 Libra蒸甜。而這會對區(qū)塊鏈網(wǎng)絡造成毀滅性的打擊棠耕。

值得注意的是,盡管 Libra 中允許實現(xiàn)各自的資產(chǎn)作為一種 Resource柠新,但是窍荧,Coin 和 Coin 之間是互不相通的。

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

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

c. 落到地上 — Move 源碼

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


image.png

在使用 cargo 構建項目上時瓤荔,其實是將“*.mvir”文件作為 String 傳入 Rust 編譯器中净蚤,由 Parser 轉為 Rust 代碼運行的。因此输硝,在大家想要深入了解 Move 的本質時今瀑,可以通過 parser/ 目錄中的 ast.rs 詳細了解 Move 語言的關鍵字與數(shù)據(jù)結構;也可以通過 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

在文章中贮懈,特意有一個第七小節(jié)名為”What’s Next for Move“足見 Libra 對于 Move 的期待和規(guī)劃。盡管上文我們提到了 Move 為了解決的問題影暴,以及它的主要目標 — 競爭優(yōu)勢错邦。但其實如果去看 Move 的源碼,你會發(fā)現(xiàn)它其實遠沒有到成熟的程度型宙。

作為一個新出的語言(我們前面提到撬呢,Move 其實是基于 Rust 寫的 DSL 語言),盡管它基于 Rust 構建了自己強大的類型系統(tǒng)妆兑,保證資產(chǎn)(Asset)的稀缺性權限控制魂拦。也構建了一套適用于 Libra 網(wǎng)絡的編程模型。

a. 代碼

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

  1. 在代碼表意方面棍矛,代碼中使用了大量的 Hard code 返回值狀態(tài)碼安疗;Move 語言的測試例子中,很多 test case 起不到快速上手的幫助作用够委。
  2. 如上文提到的荐类,Move 是一門基于 Rust 的 DSL 語言,在測試時產(chǎn)生的報錯會變得不是那么友好:


    image.png

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

  1. 逐步的實現(xiàn) Libra 網(wǎng)絡的核心功能(Implementing core Libra Blockchain functionality)
  2. 增加新的語言功能玉罐,如:Collection屈嗤、Event(New Language features)
  3. 增強開發(fā)人員的開發(fā)體驗(Improved developer experience)
  4. 正式規(guī)范與驗證(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。眾所周知吊输,區(qū)塊鏈要不要做 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. 生態(tài)

我們常常聽人談“生態(tài)”透硝,生態(tài)之所以重要,在于生態(tài)的存在可以讓一個語言在一個眾人共同的思維體系下完善以及推陳出新疯搅。Move 顯然十分認可“生態(tài)”的存在濒生,因此,在長遠發(fā)展的方向上將幔欧,支持第三方 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 看來礁蔗,盡管生態(tài)重要觉义,但是作為一個具有廣大用戶量的區(qū)塊鏈平臺,其本身應該還是在以不影響用戶體驗浴井、以及不產(chǎn)生 Bug 的前提下進行晒骇,所以采用這種類似于“收取 Gas 手續(xù)費”、放在 Marketplace 的方式來增加作惡成本磺浙。


需要承認洪囤,Libra 依然處在一個高速發(fā)展的階段,Move 也是如此撕氧,盡管從文章與代碼中瘤缩,我們看到了Move 對于區(qū)塊鏈世界的鄭重÷啄啵看到了他們的決心剥啤。而 Move 會大有可為的,甚至可能會成為區(qū)塊鏈的“編程范式”的一個良好的開始不脯。

最佩服的是府怯,他們就帶著那樣一股子一往無前的信念向前走去。不管他們的未來如何跨新,反正他們已經(jīng)改變了現(xiàn)在富腊,而未來也終將因為他們的存在而變的不是那么一樣坏逢。
這讓我想起了:

“大圣域帐,此去欲何赘被?”
“踏南天,碎凌霄肖揣∶窦伲”
“若一去不回……”
“便一去不回!”
—《悟空傳》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末龙优,一起剝皮案震驚了整個濱河市羊异,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彤断,老刑警劉巖野舶,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宰衙,居然都是意外死亡平道,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門供炼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來一屋,“玉大人,你說我怎么就攤上這事袋哼〖侥” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵涛贯,是天一觀的道長诽嘉。 經(jīng)常有香客問我,道長疫蔓,這世上最難降的妖魔是什么含懊? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮衅胀,結果婚禮上岔乔,老公的妹妹穿的比我還像新娘。我一直安慰自己滚躯,他們只是感情好雏门,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掸掏,像睡著了一般茁影。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丧凤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天募闲,我揣著相機與錄音,去河邊找鬼愿待。 笑死浩螺,一個胖子當著我的面吹牛靴患,可吹牛的內容都是我干的。 我是一名探鬼主播要出,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鸳君,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了患蹂?” 一聲冷哼從身側響起或颊,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎传于,沒想到半個月后囱挑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡沼溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年看铆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛末。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡弹惦,死狀恐怖,靈堂內的尸體忽然破棺而出悄但,到底是詐尸還是另有隱情棠隐,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布檐嚣,位于F島的核電站助泽,受9級特大地震影響,放射性物質發(fā)生泄漏嚎京。R本人自食惡果不足惜嗡贺,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞍帝。 院中可真熱鬧诫睬,春花似錦、人聲如沸帕涌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚓曼。三九已至亲澡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纫版,已是汗流浹背床绪。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人癞己。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓裹匙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親末秃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355