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

一句话了解Move

Move 是 Diem 项目 专门为区块链开发的一种安全可靠的智能合约编程语言。

什么是区块链?

区块链最早出现在1991年,由一群研究人员用来给数字化文档打时间戳。以使得这些文档不能被篡改,看上去区块链技术就像一位公证人一样。然而这个技术自从那之后就没有再发挥其它作用,直到2009年一个叫中本聪的人采用区块链技术创造了数字加密货币比特币。

区块链和比特币等数字货币的关系

区块链并不等同于比特币。区块链是比特币的底层技术和基础架构,而比特币是区块链的一种应用。

区块链是什么是?

区块链本质上是一个去中心化数据库。是一种分布式数据存储点对点传输共识机制加密算法等计算机技术的新型应用模式。


打个比方

比如说小明找小红借一百块钱,但小红怕他赖账,于是就找来村长做公证,并记录下这笔账,这个就叫中心化。但如果,你不找村长,直接拿个喇叭在村里大喊“我小红借给小明一百块钱!请大家记在账本里”,这个就叫去中心化

以前村长德高望重,掌握全村的账本,大家都把钱存在他这里,这是过去大家对中心化的信任。现在,大家都担心村长会偷偷挪用大家的钱,怎么办呢? 于是大家就给每个人都发了一本账本,任何人之间转账都通过大喇叭发布消息,收到消息后,每个人都在自家的账本上记下这笔交易,这就叫去中心化。有了分布式账本,即使老孔或老周家的账本丢了也没关系,因为A用户、B用户等其他家都有账本。

区块链有什么特点:

  1. 去中心化
  2. 开放性
  3. 安全
  4. 不可篡改
  5. 匿名性

区块链应用领域

  1. 金融领域
  2. 物联网和物流领域
  3. 公共服务领域
  4. 数字版权领域
  5. 保险领域

了解完区块链,我们再来进一步了解一下什么是Move.

什么是MOVE?❓

MOVE是一种实用的编程语言,支持智能合约和可定制交易。它的开发是为了解决困扰区块链编程语言的常见困难。有了MOVE提供安全和保护,开发者能够构建适应性强的程序,轻松地管理和转移数字资产。

虽然MOVE还有其他应用,但其主要动机是开发一种编程语言,以确保数字资产的独特所有权和单一使用。

MOVE编程语言的背景简介

Move是由Facebook公司开发设计的智能合约语言 。 Move它提出的一套完整的面向数字资产的编程体系。 与现有的区块链编程语言相比,Move着重强化了数字资产的地位。 使用Move语言,开发者能够更灵活、安全地在链上定义和管理数字资产。

在2020年底之前,Libra面临国际经济成员对该公司之前的名称和标志的批评,于是它将名称改为Diem。2022年1月,由于全球大国担心Libra的推出会导致安全和洗钱问题,因此Libra区块链的推出失败了。

MOVE是用RUST语言编写的,这是一种多范式编程语言,在2018年备受全球程序员的追捧。Rust的编程语言优先考虑内存安全和避免并发问题(数据争用)。它是由Graydon Hoare在2006年为Mozilla Research工作时开发的。

MOVE的设计目标

Libra 的使命是打造一个简单的全球货币和金融基础设施,为数十亿人提供支持。Move 语言旨在提供一个安全、可编程的基础,可以在此基础上构建这一愿景。Move 必须能够以精确、可理解和可验证的方式表达 Libra 货币和治理规则。 从长远来看,Move 必须能够对构成金融基础设施的各种资产和相应的业务逻辑进行编码。

为了满足这些要求,MOVE的开发者们在设计 Move 时考虑了四个关键目标:first-class 资产灵活性安全性可验证性

First-Class Resources(一级资源)

区块链系统允许我们编写程序,直接与数字资产进行交互。数字资产有一些特殊的特征,区别于传统编程中使用的布尔值、整数和字符串等值。为了能够以强大而优雅的方式使用资产进行编程,我们需要保留这些特征的表示方式。

Move是一种编程语言,它的关键特性是可以定义自定义的资源类型。资源类型在程序中有一些特殊规则:它们永远不能被复制或隐式丢弃,只能在不同的程序存储位置之间移动。Move的类型系统静态地强制执行这些安全保证。尽管有这些特殊规则,资源也可以像普通的程序值一样使用——它们可以存储在数据结构中,作为参数传递给函数等等。”First-Class Resources”是一个非常抽象的概念,程序员可以使用它来实现安全的数字资产,并编写正确的业务逻辑来包装资产和执行访问控制策略。

Libra币本身就是用Move实现的普通资源,语言中没有特殊状态。由于Libra代币代表由Libra储备管理的现实世界资产,Move必须允许创建资源(例如,当新的现实世界资产进入Libra储备时)、修改资源(例如,当数字资产所有权发生变化时)和销毁资源(例如,当支持数字资产的实物资产被出售时)。Move程序员可以使用模块来保护对这些关键操作的访问。Move模块类似于其他区块链语言中的智能合约。模块声明资源类型和过程(函数),这些过程编码了创建、销毁和更新所声明资源的规则。模块可以调用其他模块声明的过程并使用其他模块声明的类型。然而,模块强制执行强大的数据抽象:一个类型在声明它的模块内部是透明的,而在模块外部是不透明的。此外,只有在定义资源类型的模块内部才能执行对该类型的关键操作。

MOVE允许用户声明自定义的资产作为资源类型。这些资产被称为一级资源,并被授予特殊的权限和更好的安全性。一级资源也将自动进行访问控制,只有拥有正确字节码验证的用户才能通过访问进行扩展。MOVE也有与以太坊智能合约(Solidity)类似的多种模块。这些模块是持有资源,具有不同类型和程序的代码块。

MOVE的特殊构建使得资源在模块中具有出色的透明度,而对模块的外部调用则是完全不透明的。MOVE语言的另一个重要特征是使用语义定义自定义资源类型,资源永远不能被复制或完全删除。它们只能被从一个存储位置移动到另一个存储位置。

简单来说,Move是一种区块链编程语言,它允许我们使用资源来表示数字资产,并定义规则来保护这些资产的访问和操作。它的设计使得我们可以更安全地管理和交互数字资产,并执行与资产相关的业务逻辑。

灵活性

Move为Libra增加了灵活性,它使用交易脚本来定义交易的主要程序。每个Libra交易都包含一个交易脚本,它实际上就是交易的核心代码。交易脚本是一个包含任意Move代码的过程,允许自定义交易行为。脚本可以调用区块链中已发布的模块的多个过程,并在本地进行计算。这意味着脚本可以执行一次性的表达性行为(例如支付给一组特定收件人)或可重复使用的行为(通过调用封装了可重复逻辑的单个过程)。

Move模块通过安全但灵活的代码组合实现了不同类型的灵活性。从高层次上看,Move模块、资源和过程之间的关系类似于面向对象编程中的类、对象和方法之间的关系。然而,有一些重要的区别——Move模块可以声明多种资源类型(或零个资源类型),而Move过程没有self或this值的概念。Move模块更类似于ML样式的模块,但有一些限制。

可验证性

理想情况下,我们将通过链上字节码分析或运行时检查来检查 Move 程序的每个安全属性。不幸的是,这是不可行的。 我们必须仔细权衡安全保证的重要性和普遍性与计算成本和通过链上验证执行保证的增加的协议复杂性。

我们的方法是尽可能多地对关键安全属性执行轻量级的链上验证,但设计 Move 语言以支持先进的链下静态验证工具。 我们做出了一些设计决策,使 Move 比大多数通用语言更适合静态验证:

  1. 没有动态调用。 每个过程的调用点都可以静态确定。 这使得验证工具可以轻松准确地推断过程调用的效果,而无需执行复杂的调用图构造分析。
  2. 有限的可变性。 Move每个值的变化都是通过引用发生的。 引用是必须在单个交易脚本范围内创建和销毁的临时值。 Move 的字节码验证器使用类似于 Rust 的“借用检查”方案来确保在任何时间点最多存在一个对值的可变引用。 此外,该语言确保全局存储始终是树而不是任意图。 这允许验证工具模块化推理写操作的影响。
  3. 模块化。 Move模块强制执行数据抽象并本地化对resouces的关键操作。 模块启用的封装与 Move 类型系统强制执行的保护相结合,确保为模块类型建立的属性不会被模块外部的代码违反。我们希望这种设计能够通过孤立地查看模块而不考虑外部调用者来对重要的模块不变量进行详尽的功能验证。
不提供动态分发

这是为了避免产生复杂的调用图,并允许静态地确定调用站点。

模块化

MOVE在模块化的帮助下,能够隔离模块进行功能验证。移动模块将有助于数据抽象并本地化执行资源。

有限的可变性

这种设计对于面向利用类似于C++的引用类型的情况来说是不错的。它在一个点上最多只允许一个可变的引用。

安全性

Move 必须拒绝不满足关键属性的程序,例如Resource安全、类型安全和内存安全。 我们如何选择一个可执行的表示,以确保在区块链上执行的每个程序都满足这些属性? 两种可能的方法是:
(a) 使用带有检查这些属性的编译器的高级编程语言
(b) 使用低级无类型汇编并在运行时执行这些安全检查。

Move 采取了介于这两个极端之间的方法。 Move 的可执行格式是一种类型化的字节码,它比汇编高级,但比源语言低。 字节码由字节码验证器在链上检查Resource、类型和内存安全性,然后由字节码解释器直接执行。 这种选择允许 Move 提供通常与源语言相关的安全保证,但无需将源编译器添加到受信任的计算库或将编译成本添加到交易执行的关键路径中。

在MOVE编程语言中,三个安全属性是必不可少的;资源,类型以及内存安全性。MOVE可以采用不同的方法来确保不遵守这些安全属性的程序不被接受。

第一种方法是让MOVE使用高级编程语言,并配备相应编译器来实现这些属性。

第二种方法是使用低级别的非类型化汇编和安全检查。MOVE并未使用这两种方法,转而采用自己的执行方式,即一个相对高级的类型化字节码。它比汇编语言更高级但比源语言更低级。

MOVE的运行原理

Move采用了线性逻辑开发,这意味着它可以防止数字资产被删除或复制,并将其使用限制为仅有一次。它将编码的资源类型视为非常重要的,开发者可以保护这些资源不被意外地覆盖或删除。

作为一种编程语言,Move使用了静态类型系统,这意味着程序中的变量被定义为特定的类型(例如数字或单词)。Move允许资源像其他非重要资源一样使用,同时仍然确保它们的安全性。资源可以轻松地存储在数据结构中或作为计算中的值进行传递。

这确保了Move的资源非常安全,同时在执行性能上没有限制。这种代码在提供额外保护的同时,可以轻松适应其他操作。通过这种组合,Move解决了大多数区块链所面临的安全和可扩展性问题。

总结

尽管人们期望MOVE成为一种广泛使用的编程语言,但它的发展因Diem(以前的Libra)的问题而受阻。而最近由于Aptos的出现,MOVE又一次获得了机会。

资产安全、资源抽象、可组合这些都是 Move 在语言层面上的特性,综合来说,我认为它是最适配链上应用开发的语言,它的特性与 DeFiNFT 等产品的需求高度契合,并且 AptosSuiStarcoin 等新公链存在市场空白,NFTDeFi 等业态尚未成熟,个人认为以 Aptos 为代表的新公链崛起将是所有掌握 Move 语言团队的巨大机会。

MOVE是一种特殊类型的编程语言,有望彻底改变整个区块链行业。到目前为止,它已经激起了新兴区块链如Aptos的兴趣,但只有时间能证明他们是否会走向成功。