某岛

… : "…アッカリ~ン . .. . " .. .
June 19, 2019

从 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)