智能合约 - Encode ClubSui 系列 #2

在六个教学视频中的第二个视频中,您将学习如何在Sui 网络上编写智能合约。

智能合约 - Encode ClubSui 系列 #2

Encode ClubSui 系列的第二篇中,我们将介绍在Sui 网络上编写智能合约的过程。

Sui 基金会与编码俱乐部(Encode Club)合作,提供了六个以开发者为中心的系列视频。该系列视频从Sui 的基础知识到构建智能合约和在Sui 中处理对象的教程。

学习重点

我们的智能合约编写课程由 Encode Club 主持,让您开始在Sui 上构建智能合约。我们从准备编码环境开始,迅速进入对象特性。我们通过 "Car "对象的例子来了解对象属性,尤其是所有权。

安装Sui

安装Sui 二进制文件和任何必要先决条件的最简单方法是访问InstallSui to Build文档。您可以在这里找到分步说明和所有下载链接。如果您刚刚入门,访问此页面还有助于熟悉Sui 文档。

Sui 软件包布局和清单语法

下载二进制文件后,您可以使用命令 sui 移动新的[软件包名称] 在当前路径目录下创建一个新的Move 软件包。运行该命令将在工作区根目录中创建两个项目:一个是 Move.toml 文件,以及一个名为 资源.编译Move 代码需要 Move.toml 软件包清单文件和 资源 子目录。其他可选子目录包括 例子, 脚本试验.

Move 代码组织(和发布)的主要单位是软件包。软件包由一组模块组成,这些模块在不同的文件中以 .移动 扩展名。这些文件包括Move 函数和类型定义。软件包必须包括 Move.toml 描述软件包配置(如软件包元数据或软件包依赖关系)的清单文件。

Object

许多其他区块链的存储都以账户为中心,每个账户都包含一个键值存储空间,而Sui 的基本存储单元则是对象。对象是Sui 中的编程构件,具有以下两个特性:

  • 所有对象都用 有键 关键字。
  • 所有对象都有 id:UID 作为他们的第一个领域。

struct Car has key {
	id: UID,
	speed: u8,
	acceleration: u8,
	handling: u8
}

Sui 中的这个简单声明命名了一个对象 "Car"。

可以使用以下四种方法对对象所有权进行分类:

由地址所有: Move 对象在Move 代码中创建后,可以转移到一个地址。转移后,该地址就拥有了该对象。一个地址拥有的对象只能由该地址签署的事务使用(即作为Move 调用参数传递)。拥有的对象可以以下三种形式作为Move 调用参数传递:只读引用 (&T)、可变引用 (&mut T)和按值 (T).

被另一个对象拥有:当一个对象被另一个对象拥有时,它不会被封装。子对象仍然作为顶层对象独立存在,可以直接访问Sui 存储。我们将在第四部分讨论动态字段时更详细地介绍这一点。

永恒不变: 你不能更改不可变对象,不可变对象也没有独占所有者。任何人都可以在Move 调用中使用不可变对象。所有Move 软件包都是不可变对象:发布Move 软件包后,就不能再更改它了。Move 您可以使用 冻结对象 操作。在Move 调用中,只能将不可变对象作为只读引用 (&T).

共享:对象可以共享,这意味着任何人都可以读取或写入该对象。与可变的自有对象(单写)不同,共享对象需要达成共识才能确定读写顺序。在其他区块链中,每个对象都是共享的。不过,Sui 程序员通常可以选择使用共享对象、自有对象或两者结合的方式来实现特定用例。这种选择会对性能、安全性和实施复杂性产生影响。

函数

有几种可见性修改器可以限制或阻止访问Move 功能。 public 函数允许其他模块导入特定函数。 public(friend) 入口函数允许直接调用某个函数,如在事务中。一种特殊函数称为 init 只在发布相关模块时执行一次。它始终具有相同的签名,且只有一个参数: ctx: &mut TxContext.

能力

能力是Move 中的一种特殊模式,它允许访问某些功能。能力可与 init 函数,以确保只存在一种能力,并将其发送给模块发布者。

struct AdminCapability has key { 
	id: UID 
}

fun init(ctx: &mut TxContext) {
	transfer::transfer(AdminCapability {
		id: object::new(ctx),
	}, tx_context::sender(ctx))
}

AdminCapability 对象将被实例化并传输到模块发布者的地址。这样可以确保只有一个 AdminCapability 存在。

观看整个系列

  1. Sui 是什么?
  2. 智能合约
  3. 创建对象和 NFT
  4. 动态字段和集合
  5. RPG 构建基础
  6. 在区块链上部署游戏