從 Move 語言的設計看 Facebook 的開放式金融

接上文

Facebook 如期上線了 FBCoin 的 官網白皮書中譯),官宣 里還放了幾個錢包的截圖,可謂吊足了人們的胃口。坊間已經有了各種討論了1,各種陰謀論2也緊隨其後。這裡還是推薦 Binance Research 的調研報告孟岩老師的訪談

這一次同時上線的還有一個開發者網站,裡面有三篇 Technical Papers,分別是:

之前就在想 FBCoin 的誕生如果要給開放式金融提供新的可能,就一定要看 FBCoin 賦予了開發者哪些許可權,會不會推出自己的智能合約語言。這個想法現在得到了證實,這個語言直接被命名為 Move,一如 Facebook 的格言「Move Fast and Break Things」。同時 Move 也表示智能合約的本質就是對用戶資產的轉移(Move)進行編程,還真是一語雙關呢。

初看 FBCoin 的白皮書和官網,特別是首頁的那個宣傳視頻,裡面反覆的在各種普通人的生活日常中快速的切換著 —— 大多是還是來自我們這些第三世界國家 —— 這讓我產生了一種非常不真實的穿越感,看來幣圈還真的是一個有 時間膨脹 效應的地方。

但是無論如何,我們都要在這種不真實感中尋找真實。這三篇 Technical Papers 包含比我預想的還要多的 Good Stuff(怎麼那麼多 Authors?),總之我吃的很飽。

Move 語言的必要性

李笑來:Facebook 又犯傻,用得著專門設計個 Move 語言嗎?
—— 巴比特,對於 Facebook 發幣,行業大咖如此點評

「If you』re writing a program that has to work very closely with a program written in a certain language, it might be a good idea to write the new program in the same language.」 
——  Paul Graham

FBCoin 會推出自己的智能合約語言並不令人意外,畢竟上個月 Durov 在 TON 的 Channel 里就已經丟出了一份 Fift 的文檔了3。不出一個新語言,感覺扎克伯格在面子上也掛不住。另外 FBCoin 要處理的 Context 和我們目前所遇到的 Blockchain 都不一樣4,在 Move 的 Technical Paper 中這些訴求被歸結為以下四點:

  • First-class assets
  • Flexibility
  • Safety
  • Verifiability

安全性 Safety

我們一個一個來看,先說安全性。和其他擁有自己的智能合約語言的區塊鏈項目一樣5,Move 設計之初的一個核心訴求就是安全性,你能想像 Billions of People 因為一個智能合約的漏洞就被黑客薅的傾家蕩產家破人亡嗎? —— 雖然我實際上相信 FBCoin 是可以回滾的 …

In particular, transferring Ether to a smart contract involves dynamic dispatch, which has led to a new class of bugs known as re-entrancy vulnerabilities [16]. High-profile exploits, such as the DAO attack [17] and the Parity Wallet hack [18], have allowed attackers to steal millions of dollars worth of cryptocurrency.
—— Move: A Language With Programmable Resources

這裡 Move 喜聞樂見的又把 Ethereum 上的這幾個 Case 拿出來批判了一番。Move 的白皮書提到,想要一勞永逸的解決安全性的問題,不能信任智能合約的開發者,要麼在編譯期,要麼在執行期一定要做檢查。而 Move 看起來則是參考了 JVM 中的設計,選擇了一個折衷主義的方案,在執行期之前,加了一個 Bytecode Verifier。

一等公民 First-class assets

這是一組 PL 里的概念6,所謂的編程語言中的一等公民就是在我們編程時首要考慮的被編程對象,最常見於理解各種函數式語言。

  • First Class:該類型的值可以作為函數的參數和返回值,也可以賦給變數。
  • Second Class:該類型的值可以作為函數的參數,但不能從函數返回,也不能賦給變數。
  • Third Class:該類型的值作為函數參數也不行。

FBCoin 這裡用這種說法,我認為只是在強調一件事情,就是用戶自己發行的數字資產和 Libra 里的那個 StableCoin 是平級的。

這裡原文還是繼續 Challenge Ethereum。

However, the expressivity of the EVM has opened the door to expensive programming mistakes. Like StrawCoin, the Ether currency has a special status in the language and is implemented in a way that enforces scarcity. But implementers of custom assets (e.g., via the ERC20 [15] standard) do not inherit these protections (as described in (2)) — they must be careful not to introduce bugs that allow duplication, reuse, or loss of assets. This is challenging due to the combination of the indirect representation problem described in (1) and the highly dynamic behavior of the EVM.

一個典型的例子就是 美圖幣(BEC)。雖然這個 ICO 合約只在 OpenZeppelin 標準庫的基礎上增加了一個函數,結果那個函數里的操作就溢出了,使得黑客可以無限增發。類似的例子還有 POWHHexagon、etcs,不勝枚舉。

另一方面,一些用戶自己的代幣不是第一公民,使得合約有的時候處理 Ether 和 ERC20 時,需要分別討論。一個典型的例子就是 Bancor 的合約,為了避免額外的判斷,Bancor 合約中單獨寫了一個 ERC20 Token 來打包 Ether,將相關的邏輯統一起來。後來這種方式逐漸形成標準,就是我們後來經常看到的 wETH 交易對。

這方面 EOS 的處理的則更為優雅,絕大部分底層的功能,也是通過超級節點部署智能合約的方式上線的,其中就包括 eosio.token 本身。而 EOS 和你自己發行的數字資產在合約里的唯一區別就是發行的合約不同而已,並且 EOS 的 assets 結構(還有 extended_assets),也已經包含了這些邊界保護。

EOS 中是把原生資產和用戶資產同時下放到了合約層面,而在 Libra 中,是把用戶資產和原生資產同時上升到協議底層。

可驗證性 Verifiability

但是 Bytecode Verifier 理論上只能檢查一下類型不匹配、內存溢出這樣的簡單 Bug,要檢查出所有邏輯上的 Bug 無異說要解決 停機問題(Halting Problem),而且這部分時間複雜度也會被加到共識演算法的 Critical Path 上,必須要做出相應的權衡。Move 的解決方法是,只將一些時間複雜度最低,同時又最關鍵的檢查工作放在這個階段,其他則寄希望於鏈下的 靜態驗證 工具。

為了簡化這些靜態檢查工具的設計,Move 在語言層面的功能上進行了一些必要的犧牲,而這一切都是為了將來做形式化驗證做鋪墊。

No dynamic dispatch

The target of each call site can be statically determined. This makes it easy for verification tools to reason precisely about the effects of a procedure call without performing a complex call graph construction analysis.

首先拿掉的就是動態分派。動態分派是指在運行期選擇調用方法的實現的流程。現代高級編程語言中被廣泛採用,被認為是面向對象語言的基本特性。但是一旦包含這個特性就會使得做靜態驗證十分困難。一個典型的例子就是 The DAO 硬分叉事件 [17] 裡面的 Re-entrancy 攻擊 [16]

Limited mutability

Every mutation to a Move value occurs through a reference. References are temporary values that must be created and destroyed within the confines of a single transaction script. Move』s bytecode verifier uses a 「borrow checking」 scheme similar to Rust to ensure that at most one mutable reference to a value exists at any point in time. In addition, the language ensures that global storage is always a tree instead of an arbitrary graph. This allows verification tools to modularize reasoning about the effects of a write operation.

函數式語言的一個基本特性就是 Immutability,這使得我們可以在執行函數之前就可以對程序的狀態進行斷言。但是保持純粹的 Immutability 的話,編寫業務邏輯勢必會十分痛苦。Move 這裡依然採取了折衷主義的辦法,參考了 Rust 的實現,保證每個對象在任何階段只有一個可修改的引用,這樣靜態驗證時就只要 trace 一個目標。

Modularity

Move modules enforce data abstraction and localize critical operations on resources. The encapsulation enabled by a module combined with the protections enforced by the Move type system ensures that the properties established for a module』s types cannot be violated by code outside the module. We expect this design to enable exhaustive functional verification of important module invariants by looking at a module in isolation without considering its clients.

Module 也是函數式語言中的概念,原本的目標是達成介面與實現分離這個目的,從而實現各個模塊分別開發,驗證與編譯。與 Class 最大的區別在於 Class 是動態的,而 Module 是靜態的。

在 Move 里則是擴展了這個概念的意義,根據白皮書,Move 里的智能合約分為兩類:
– Transaction Script:一組順序執行的,可以包含 Module 調用的轉賬語句,通常是一次性的,不在賬本里進行保存。
– Module:定義和某個資產相關的操作方法的集合。

換句話說,這個 Module 才是更接近我們一般認為的智能合約。但是我強烈猜測只有資產的發行方才能夠定義 Module 到 Libra 中去,例如 Uber 可以在 Libra 中定義一個資產叫優惠券,可以 Claim、使用和轉讓,而 Spotify 可能可以在 Libra 中定義另一個資產,比如一首曲子或一部專輯,支持訂閱、轉讓、購買和註銷。

而一般的開發者和 Startup 很可能只能開發一些 Transaction Script,來給你的 App 和網站描述一些功能有限的業務邏輯。所以大概率那 25 個合作夥伴才是 Libra 里的一等公民。

靈活性 Flexibility

最後 Libra 的靈活性僅僅只是相對於 Bitcoin Script 而言的,我們一般開發者還是老實一點寫 Transaction Script 好了。

形式化驗證 Formal Verification

如何保證智能合約的正確呢?這跟保證程序的正確性是一樣的問題。只有懂得如何寫出乾淨簡單的代碼,進行嚴密的思考,才能寫出正確的智能合約。關於如何寫出乾淨,簡單,嚴密可靠的代碼,你可以參考我之前的一些文章。

做智能合約驗證的工作也許能圈到錢,然而卻是非常枯燥而沒有成就感的。為此我拒絕了好幾個有關區塊鏈的合作項目。雖然我對區塊鏈的其它一些想法(比如去中心化的共識機制)是感興趣的,我對智能合約的正確性驗證一點都不看好。
—— 垠神,智能合約和形式驗證

怎麼樣,這一套聽下來,是不是很像 Tezos?Tezos 設計了一種參考了 OCmal 語法的函數式語言 Liquidity 來編寫合約。合約又會被首先編譯成一個 Stack-based 的中間語言 Michelson,並使用了一個魔改出來的 Mi-Cho-Coq 工具,來跑形式化驗證的 Framework。

但是形式化驗證真的是解決智能合約安全性問題的銀彈嗎?對此我抱有反對意見。為了安全性問題而在表達性上做犧牲似乎有捨本逐末的嫌疑,而且我認為即便要跑形式化驗證,也可以讓開發者使用一個 Solidity 語言的子集,姑且稱之為 XSolidity 來跑7(類比 XHTML) —— 當然我期待著自由市場來打我的臉。

重新審視區塊鏈

To say something is something, but unlike the previous version of that something because its defining characteristics are different, is a bit like saying:

「Unlike previous loaves of bread, which view the loaf of bread as a collectively baked set of ingredients, the Libra Loaf of Bread is a single ingredient structure that bakes the components sequentially over time.」
Facebook』s Libra: blockchain, but without the blocks or chain – Financial Times

越來越多的人開始注意到,Libra 事實上既沒有 Blocks,也沒有 Chain,只是使用了 PBFT 跑了一個分散式資料庫而已。但是我們知道,實際上比特幣所要面對的,是一個比拜占庭將軍問題更加困難的場景,在比特幣里你實際上是沒有一個 Global View 的。節點可以隨時加入和離開,通訊路徑也是不可靠的,節點必須持續進行發現新節點,和幫助其他節點啟動的工作。每個節點都只包含一部分關於網路的信息,因而邏輯上更像是一個 Mesh Network8

Libra 這樣的數據結構,也能算是區塊鏈嗎?如果按照 ConsenSys 的說法,大概是會被冠上 “Libra might not be a Real Blockchain at All”9 的帽子的。Jameson Lopp 也直接在 他的文章 標題里給 Blockchain 加了引號。

Blockchain: A blockchain is a replicated state machine [4][5]. Replicators in the system are known as validators. Users of the system send transactions to validators. Each validator understands how to execute a transaction to transition its internal state machine from the current state to a new state.

Cryptocurrency: A digital currency that uses cryptography to verify and secure financial transactions.

但是從上面 Libra 給 Blockchain 和 Cryptocurrency 的定義來看,好像又沒什麼問題。所以為什麼我們會感覺那麼奇怪呢?

作為銀行的天秤座 Libra as a Bank Service

Fb coin looks like eth and btc had a baby and switched to bft with appointed nodes that they claim will eventually be elected dpos style. The utxo model and asset focused primitives is likely to heavily restrict its applications. The concept of backing it with other assets means it fails when those assets fail. In effect it』s a new central bank. Note I have only read half of the white paper so I reserve my right to change my analysis.
—— Daniel Larimer

《精通比特幣》《精通以太坊》的作者,Andreas M. Antonopoulos 為此事先專門做了 一期 QA 視頻,來解釋為什麼自己認為 FBCoin 不是真正的 Crypto。在這期視頻里,Andreas M. Antonopoulos 給了 Cryptocurrency 的五個支柱,它們分別是:

  • 開放 Open
  • 公開 Public
  • 中立 Neutral
  • 無國界 Borderless
  • 抗審查 Censorship Resistant

抗審查很容易理解,Facebook 只是一家 Yet Another 坐落在矽谷的公司,僅僅是用戶在上面提供內容就會受到各國政府的審查,更別說提供管制更加嚴格的金融服務了。事實上,這份白皮書一出,Facebook 立刻遭到了法國議員、美國民主黨議員的口誅筆伐,據說下個月還要開聽證會10。基於同樣的原因,FBCoin 也無法做到無邊界和中立。向在 美國制裁名單 上的國家(伊朗、敘利亞、朝鮮、古巴、委內瑞拉、etcs)和個人匯款會違反美國的相關法律,因此美國政府一定會要求 FBCoin 做出 KYC 的要求,Who you are? Where you are? What are you doing with your money … 我們也很難想像 FBCoin 會提供一個公開透明的賬本(Blockchain Explorer),這相當於把每個人每天做了什麼完全暴露出來。

最後最重要的,FBCoin 不能夠 Open,Libra is only permissionless for those who already have permission. 你當然也不能脫離這個系統之外使用和出售 FBCoin,你不能繞過這個平台提現走人 … 因此 Andreas M. Antonopoulos 的結論是 FBCoin is a new kind of bank, is not a cryptocurrency.(不過對於是否是 Cryptocurrency 上,顯然 BM 的 bar 要低得多 …)

留精棄粗 Child Error

但是 FBCoin 似乎在白皮書早就預見了你們的這些問題,直接拎出來三段給予正面回應。

Blockchains are described as either permissioned or permissionless in relation to the ability to participate as a validator node. In a 「permissioned blockchain,」 access is granted to run a validator node. In a 「permissionless blockchain,」 anyone who meets the technical requirements can run a validator node. In that sense, Libra will start as a permissioned blockchain.

To ensure that Libra is truly open and always operates in the best interest of its users, our ambition is for the Libra network to become permissionless. The challenge is that as of today we do not believe that there is a proven solution that can deliver the scale, stability, and security needed to support billions of people and transactions across the globe through a permissionless network. One of the association』s directives will be to work with the community to research and implement this transition, which will begin within five years of the public launch of the Libra Blockchain and ecosystem.

Essential to the spirit of Libra, in both its permissioned and permissionless state, the Libra Blockchain will be open to everyone: any consumer, developer, or business can use the Libra network, build products on top of it, and add value through their services. Open access ensures low barriers to entry and innovation and encourages healthy competition that benefits consumers. This is foundational to the goal of building more inclusive financial options for the world.

可以看出,FBCoin 很清楚自己就是一個 Permissioned Blockchain,但是我們之所以沒有 as open as bitcoin 是因為,咳咳,是因為目前 technical 水平不行(It is not my fault I am so evil11 … )

FBCoin 在白皮書里標明自己會在五年後,開始從 Permissioned 向 Permissionless 去做 Migrate。。。But wait… 這實在太不真實了。畢竟我們都看到了,以太坊從 PoW migrate 到 PoS 都花了那麼多年,我實在很難想像 FBCoin 能真正做到這一點。。。

孟岩:開放金融是個大話題。至於 Libra,還不是完全達到了,畢竟現在還是個有準入的限制。他們宣布說未來要實現非許可網路,我挺驚訝的,技術上挑戰很大,能不能兌現承諾難說。
—— 孟岩:扎小哥,你還能再鋒芒畢露一點嗎?丨SheKnows 深度解讀 Libra 白皮書

但是這一點也不妨礙 Libra 走向公眾,上一篇文章 里我們討論政治正確。Libra 看起來是最不政治正確的了:

  • Libra 是聯盟鏈,但是不妨害她發幣甚至上所 —— 而且還是雙通證。
  • Libra 要做 KYC,但是我一上來就開放源代碼,還要成立基金會。
  • Libra 使用非對稱加密有公私鑰,但是所有人都得來用我的錢包,所有私鑰都在我的雲端伺服器上管理。

這實在太耐人尋味了,FBCoin 很清楚自己想要的是什麼,整個白皮書通篇都在對 BTC 和 ETH 進行批判,按照 BM 的話說,就像是 BTC 和 ETH 生了一個用 PBFT 的孩子。但 FBCoin 的世界觀里認為,BTC 和 ETH 就是兩個需要留精棄粗的 child error,按照魯迅的話說,就是要「取其精華、去其糟粕」。但是什麼是精華,什麼又是糟粕?FBCoin 棄掉的糟粕恰恰是原教旨主義者眼中所認為的精華。

而這也正是 Libra 真正可怕的地方。

開放式金融的邊界

在傳統金融裡面,你自己去發行貨幣,是很難形成市場的。但是在開放式金融裡面,基本就沒什麼門檻,你需要做的就是利用區塊鏈這個技術,然後再利用自己的一些資源如 reputation,參與產品的構建。
—— X-Order 創始人 Tony Tao:數字資產的貨幣化非常重要

最後回到我們開始的話題,討論開放式金融。之前坊間很多文章都會混淆 DeFi 和 Open Finance,現在 Libra 一出,估計以後這兩個概念就能夠更清晰的劃分了。

1900 年在巴黎舉行的第二屆國際數學家大會上,希爾伯特作了題為《數學問題》的演講,提出了著名的希爾伯特的 23 個問題。去年的萬向區塊鏈峰會上,吳忌寒也提出了未來十年區塊鏈技術發展的 8 個課題。

下面是「吳忌寒第 5 課題 —— 擴展區塊鏈技術應用場景的專門技術」:

過去的 ICO 泡沫浪潮中,很多項目都涉及到一個基本的邏輯,區塊鏈和現實世界並不交融。區塊鏈的現實交互介面將在區塊鏈第二個十年結束時得到極大發展。

大概有兩個方向:一是現實世界的重壓事件都在區塊鏈上得到忠實記錄,例如食品溯源;二是區塊鏈上的虛擬事件驅動現實世界的物質產生變化,例如去中心化的 Airbnb、網約車。
—— 比特大陸吳忌寒:未來十年區塊鏈技術發展的 8 個課題

現在我們應該能看得更清楚了。Facebook 為我們描繪了開放式金融的新邊界。我們回顧 Libra 的架構,發現這個連接現實與鏈上空間的基礎設施,最後不是什麼技術手段,而是 Facebook 的信用背書。換句話說,就是 「利用自己的資源、Reputation、當然還有放在 Facebook 那兒的儲備金,參與資產的構建」。而這個構建的過程就是用 Move 去 Submit 一個 Module,裡面定義了關於這個資產的各種方法和介面。再讓 third party 調用這些介面來編寫自己的業務邏輯。

而這個資產的開放程度,實際上是你在設計 Module 介面的時候決定的。這裡面蘊含了非常多想像的空間,比如 Lyft 和 Uber 同時定義了優惠券這個資產(或者是某種服務),誰預留的介面更豐富,第三方發揮創意的空間也就更多。最後可能會倒逼各個商家都加入這種 Open Assets 的創建中去,從而形成新的網路效應。未來這種開放資產是否會支持跨鏈,從而 migrate 進其他的 public blockchain?我們尚不得知,但是可以預見的是舊世界一定會因此變得更加開放。

10 年前,中本聰打開了加密貨幣的潘多拉之盒,在創世區塊中摘抄了當天泰晤士報的標題,「The Times 03/Jan/2009 Chancellor on brink of second bailout for banks」。那個時候,他是否會想像到,在 10 年後的今天,世界已經發生了如此多的深刻的變化了。


  1. 用 FBCoin 自己的話說就是:The Libra mission is to enable a simple global currency and financial infrastructure that empowers billions of people。 
  2. Lolisa: Formal Syntax and Semantics for a Subset of the Solidity Programming Language 
  3. 對於比特幣比特幣網路是否是 mesh network 存在爭議,一般認為是邏輯上的 mesh network,但不是物理意義上的 mesh network。
    Is Bitcoin a mesh network or not?
    《精通比特幣》2nd,Ch08 
  4. EOS might not be a Real Blockchain at All 
  5. I Can Change – Saddam Hussein (South Park The Movie)