写点什么

Move: 一门面向资产的编程语言

  • 2019-07-10
  • 本文字数:4796 字

    阅读完需:约 16 分钟

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 语言。



在使用 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 语言,在测试时产生的报错会变得不是那么友好:



所以就像文章中提到的:接下来的,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 咨询师,区块链技术专家。曾为多个航运、银行、汽车客户提供咨询服务,并参与到多个区块链项目中。目前主要聚焦于区块链、分布式计算、共识算法等领域。


2019-07-10 15:0315634

评论

发布
暂无评论
发现更多内容

大模型训练中错误数据集的影响及应对策略

百度开发者中心

大模型 人工智能’

如何构建适合工业设计企业的云端图形工作站?

青椒云云电脑

图形工作站

软件测试/人工智能|使用 Pip 管理 Python 包

霍格沃兹测试开发学社

软件测试/人工智能|一文告诉你Python集合相关知识

霍格沃兹测试开发学社

新动力、新引擎,企业知识大模型释放数字生产力

中关村科金

大模型营销助手“打辅助”,加速保险展业

中关村科金

如何教会小白使用淘宝API接口获取商品数据

Noah

机器学习与低代码开发:创新驱动的双剑合璧

EquatorCoco

机器学习 软件开发 低代码

SwitchResX for Mac(屏幕分辨率修改工具) v4.13.2完美激活版

mac

苹果mac Windows软件 switchresx

IPQ4019 IPQ4029 Platform DR40x9 Provide 23-30KM Long Range Transfer AP Controller Support Openwrt Openwifi|802.11AC Solution

wallyslilly

IPQ4019 ipq4029

如何给网页和代码做HTML加密?

软件测试/人工智能|一文告诉你Python字典知识

霍格沃兹测试开发学社

从概念到实践,带你掌握层次递归查询

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

当前最高4+级!大模型能力获信通院标准符合性验证

中关村科金

大模型 大模型评估

智能双录解决方案助力保险代销机构探索市场新机遇

中关村科金

保险 智能双录

什么是item_get,它在电商中有什么作用?

技术冰糖葫芦

API 接口

大模型训练中CPU高负载与GPU低使用率的优化策略

百度开发者中心

gpu 大模型

新一代私有云部署四大优势和案例解读

青椒云云电脑

云电脑平台

我还是无法忘记那个午夜,当oncall的告警响起

Java 工程师蔡姬

#on-call 21 天技术人写作行动营 #线上问题 #性能问题

每日一题:LeetCode-151. 反转字符串中的单词

Geek_4z9ami

Go 面试 算法 LeetCode 字符串

Java 11 到 Java 21:无缝迁移的可视化指南

高端章鱼哥

Java Java11 Java21

.NET使用分布式网络爬虫框架DotnetSpider快速开发爬虫功能

不在线第一只蜗牛

.net 分布式 爬虫

【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法

阿里云大数据AI技术

从内容生产到企业经营,大模型将如何改变数字营销?

中关村科金

大数据 大模型 智能营销

云电脑和一体机有什么区别?

青椒云云电脑

云电脑 桌面云一体机 云桌面一体机

大模型训练引领AI新时代

百度开发者中心

人工智能 大模型 LLM

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

3DCAT实时渲染

实时云渲染 实时渲染云 汽车虚拟仿真 汽车3D可视化

春晚回应吉祥物“龙辰辰”被质疑 AI 合成;周星驰 Web3 团队下月上线独立 App 丨 RTE 开发者日报 Vol.102

声网

Move: 一门面向资产的编程语言_编程语言_王瑞鹏_InfoQ精选文章