Skip to main content

Move 概念

Move 是一种开源编程语言,主要用于创建可安全操控链上对象(俗称 “智能合约”)的包。它是一种与平台无关的语言,能够促进不同数据结构和执行模型的区块链之间共享库、工具和开发者社区的建立。Move 的设计灵活,可以根据运行它的区块链的具体需求进行调整。要了解 Move 在 Sui 区块链上的优化情况,请参阅 Move on Sui 相关章节,其中讨论了Move语言为适应 Sui 区块链而进行的改进。

你可以使用 Move 定义、创建和管理可编程的 Sui 对象,代表用户级别的资产。Sui 的对象系统通过在 Move 中添加新功能的同时施加额外的限制来实现。有关更多详细信息,请参阅 Object Model

在 Sui 上的 Move

Move 在 Sui 上包含与其他区块链上的 Move 重要的区别。Sui 利用 Move 的安全性和灵活性,并通过以下各节描述的功能增强它,从而大大提高吞吐量、减少最终性的延迟,并使 Move 编程更易于接近。有关详细信息,请参阅 Sui 智能合约平台 白皮书。

tip

当 Sui 文档提到 Move 语言时,内容是在文档 Sui 区块链上的特定 Move 实现。如果相关,文档明确提到 Move 语言的原始用例为 Diem 上的 Move。

总体而言,为其他系统编写的 Diem 上的 Move 代码在 Sui 中也可以工作,但有以下例外:

关键区别

Move 在 Sui 上的关键区别包括:

以对象为中心的全局存储

在 Diem 上的 Move 中,全局存储是编程模型的一部分。资源和模块存储在全局存储中,由一个带有地址的帐户拥有。事务可以自由地在运行时使用特殊操作(如 move_tomove_from)从全局存储中的任何帐户访问资源。

这种方法引入了一个扩展问题,因为无法静态确定哪些事务正在争用相同的资源,哪些不是。 这类似于其他区块链面临的问题,智能合约通常在大型内部映射中存储帐户信息,从而限制了吞吐量。

Sui 通过不具有全局存储或其相关操作来解决扩展问题。当对象(与资源相对)和包(模块集合)存储在 Sui 上时,它们分别被赋予唯一标识符。通过使用这些唯一标识符,事务的所有输入都是明确指定的,以允许链调度具有不重叠输入的事务以并行方式执行。

地址表示对象标识

在 Diem 上的 Move 中,有一个用于表示全局存储中帐户地址的 16 字节 address 类型。16 字节地址足以满足 Diem 上的 Move 安全模型。

Sui 没有全局存储,因此 address 被重新用作用于对象和帐户的 32 字节标识符。每个事务都由一个帐户(“发送者”)签名,可以从事务上下文中访问,并且每个对象都将其 address 存储在其 id: UID 字段中。 (有关详细信息,请参阅 Sui 框架中的 object.move)。

具有关键能力、全局唯一标识符的对象

在 Diem 上的 Move 中,key 能力表示该类型是资源,这意味着它(连同帐户地址)可以在全局存储中用作键。

在 Sui 上,key 能力表示结构是对象类型,并伴随额外要求,即结构的第一个字段具有签名 id: UID,以包含对象在链上的唯一地址。 Sui 的字节码验证器确保新对象始终被分配新的 UID(标识符永不重用)。

模块初始化程序

以对象为中心的全局存储 中所述,你将 Move 模块发布到 Sui 存储中。Sui 运行时执行你在模块中可选定义的特殊 初始化函数 仅在模块发布时执行,以预初始化模块特定数据(例如创建单例对象)。

入口点以对象引用作为输入

你可以从 Sui 事务(称为可编程事务块)调用公共函数。这些函数可以按值、按不可变引用或按可变引用获取对象。如果按值获取,可以销毁对象、包装它(在另一个对象中)或将其传输(到由地址指定的 Sui ID)。如果按可变引用获取,则修改后的对象版本保存到存储中,所有权不发生变化。在任何情况下,Sui 网络都会验证对象并声明它作为事务的一部分的使用。

除了调用公共函数外,你还可以调用一个被标记为 入口 的函数,即使它是私有的,只要其他非entry函数尚未使用其输入。

探索概念

本节使用有注释的代码示例定义了 Move 的一些功能。

Init

init 函数是一个特殊的函数,仅在发布关联模块时执行一次。详细信息请参阅 Init

入口函数

函数的 entry 修饰符使模块函数的调用变得安全且直接,类似于脚本。详细信息请参阅 Entry

字符串

Move 没有本机字符串类型,但它有一个有用的包装器。详细信息请参阅 Strings 以获取示例。

一次性见证

一次性见证(OTW)是模块初始化程序中创建的类型的特殊实例,保证是唯一的,只有一个实例。详细信息请参阅 One-Time Witness 以获取示例。

模式

Move 编码模式或技术解决你在为 Sui 区块链开发 Move 包时遇到的逻辑问题。请参阅 Patterns 部分,了解已记录的编码模式的列表。