Sui.

帖子

分享您的知识。

article banner.
MiniBob.
Jul 01, 2025
文章

掌握动作语言概念 — 课程 #2

虽然我之前做的课程 #1向你介绍了在Move中编写智能合约和在Sui区块链上构建简单DApp的基础知识,但本课程的重点是加深你对Move语言本身的理解——从其强大的类型系统到泛型、事件、模块和访问控制机制等高级模式.

在本课程结束时,你将能够:

-编写模块化、可重复使用且安全的移动代码 -有效使用泛型、技能和资源类型 -使用功能实现精细的访问控制 -发送和监听事件以进行链下集成 -处理复杂的数据结构,例如表格和向量 -了解 Move 与 Solidity 等其他智能合约语言有何不同

让我们深入了解 Move 语言的核心!

第 1 步:了解 Move 的核心语言特性

Move 在设计时充分考虑了安全性和清晰度. 让我们来探索使Move作为智能合约语言独一无二的一些最重要的功能.

1.1 面向资源的编程(重温)

Move 的核心是资源的概念,资源是特殊类型,除非明确允许,否则无法复制或删除. 这强制安全处理代币或NFT等数字资产.

module examples::token {
    use sui::object::{Self, UID};

    struct MyToken has key, store {
        id: UID,
        value: u64,
    }

    public fun mint(ctx: &mut TxContext): MyToken {
        MyToken {
            id: object::new(ctx),
            value: 100,
        }
    }
}

在这个例子中: MyToken-key资源,因为它有能力. -它可以存储 (store) 并由其唯一标识id. -除非指定,否则无法复制或删除.

这样可以保证每个MyToken实例都是唯一拥有和管理的,从而防止意外复制或删除.


1.2 能力系统

Move 中的每种类型都有一组技能,用于定义其支持的操作:

能力意义
copy可以复制
drop可以在不破坏的情况下丢弃
store可以存储在全局存储中
key可用作带有 ID 字段(即对象)的结构

示例:

struct Example has copy, drop { value: u64 }

了解这些能力对于设计安全和可预测的智能合约至关重要.

为什么能力很重要

能力在编译时执行严格的规则. 例如: -仅包含keystore无法复制或删除的结构. -除非已存储或传输,否则您无法从函数中返回不可删除的结构.

这样可以防止诸如双重支出或意外代币丢失之类的错误.


1.3 泛型和类型参数

Move 支持泛型类型,允许开发人员编写灵活且可重用的代码.

module examples::storage {
    use sui::object::{Self, UID};

    struct Box<phantom T> has key {
        id: UID,
        content: T,
    }

    public fun new_box<T>(ctx: &mut TxContext, content: T): Box<T> {
        Box {
            id: object::new(ctx),
            content,
        }
    }
}

这里<T>是一个类型参数,可以在Box安全高效的同时处理任何类型.

注意:phantom关键字表示T不影响结构的运行时表示形式——这对于抽象建模很有用.


步骤 2:模块化开发和包管理

随着您的 Move 项目变得越来越复杂,组织代码变得至关重要.

2.1 创建和发布移动包

Move 包包含一个或多个模块并定义依赖关系. 它是 Move 中的部署和版本控制单元.

目录结构:

sources/
  place.move
  user.move
Move.toml

在以下位置定义依赖关系Move.toml

[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework" }
MyLibrary = { local = "../my-library" }

您可以将包发布到 Sui 网络,并在多个 DApp 中重复使用它们.

2.2 重用现有模块

coin``transfer``tx_contextSui 框架提供经过实战考验的模块,如、和. 在编写自定义逻辑之前,请务必检查可用内容.

例如,要传输对象,请执行以下操作:

use sui::transfer;

public entry fun send_place(place: Place, recipient: address) {
    transfer::public_transfer(place, recipient);
}

使用标准库可确保更安全、更快的开发和更好的互操作性.


第 3 步:事件和链下通信

要构建现实世界的应用程序,您的Move合约需要与前端或索引器等链下系统进行通信.

3.1 发出事件

移动允许发出可以由外部服务索引的事件.

use sui::event;

struct PlaceCreated has drop {
    name: String,
}

public fun emit_place_created(name: String) {
    event::emit(PlaceCreated { name });
}

该事件将出现在区块链上,可供探索者或索引工具接收.

3.2 监听事件

使用诸如Suiet ExplorerSubsquid或 Sui JSON-RPC API之类的工具来监听发出的事件并在应用程序中做出相应的反应.

在 JavaScript/TypeScri

import { JsonRpcProvider } from '@mysten/sui.js';

const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io');

const events = await provider.getEvents({
  MoveEventType: '0x...::example::PlaceCreated'
});

步骤 4:访问控制和安全模式

在处理智能合约时,安全性至关重要. Move 提供了多种工具来实现强大的访问控制.

4.1 对象所有权模型

Sui 在协议层面强制执行所有权. 只有对象的所有者才能对其进行变异或转移.

public entry fun update_name(sweet_place: &mut SweetPlace, new_name: String) {
    sweet_place.name = new_name;
}

只有当前所有者才能调用此函数.

4.2 能力模式

要获得更精细的权限,请使用能力模式——创建特殊对象,授予对某些功能的有限访问权限.

struct AdminCap has key { id: UID }

public entry fun grant_admin_cap(ctx: &mut TxContext) {
    let cap = AdminCap { id: object::new(ctx) };
    transfer::public_transfer(cap, tx_context::sender(ctx));
}

public entry fun restricted_action(_: &AdminCap) {
    // perform admin action
}

现在,只有持有该的用户AdminCap才能执行restricted_action.

这种模式广泛用于 DeFi 和 DAO 中,以安全地委托权限.


步骤 5:处理复杂的数据结构

Move 支持结构化数据类型,允许开发人员对复杂的逻辑和关系进行建模.

5.1 向量

向量用于存储相同类型项目的有序集合.

let names = vector[String::utf8(b"Alice"), String::utf8(b"Bob")];

它们对于存储 NFT、用户角色或动态元数据列表很有用.

用法示例:

vector::push_back(&mut names, String::utf8(b"Charlie"));

5.2 表(通过 Sui 标准库)

虽然 Move 本身不支持地图或哈希表,但 Sui Table在其标准库中提供了该类型.

use sui::table::{Self, Table};

struct Registry has key {
    id: UID,
    entries: Table<u64, String>,
}

public fun add_entry(registry: &mut Registry, key: u64, value: String) {
    table::add(&mut registry.entries, key, value);
}

使用表高效管理大型数据集.


步骤 6:测试和调试合约

测试可确保您的 Move 代码在各种条件下都能按预期运行.

6.1 Move 中的单元测试

使用测试框架直接在 Move 模块中编写单元测试.

#[test]
public fun test_create_sweet_place() {
    let ctx = tx_context::dummy();
    create_sweet_place(&mut ctx, String::utf8(b"My House"));
}

使用以下命令运行测试:

sui move test

6.2 使用 Sui Explorer

部署合约后,使用 Sui Explorer 检查交易、查看对象状态和调试问题.


步骤 7:高级动作概念的实际应用

现在您已经了解了核心语言特性,让我们来探索它们如何应用于现实场景.

7.1 NFT 铸币平台

创建一个平台,允许用户利用所有权和资源模型铸造由 Move 资源支持的 NFT.

7.2 DAO 投票系统

使用 Move 实施去中心化自治组织 (DAO) 进行投票、提案和治理,使用事件和功能进行安全操作.

7.3 代币互换和 AMM

使用Move模块构建去中心化交易所(DEX)来表示流动性池和代币互换,使用泛型和表格进行有效的状态管理.

  • Sui
  • Architecture
  • Move
2
分享
评论
.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

352帖子499答案
Sui.X.Peera.

赚取你的 1000 Sui 份额

获取声誉积分,并因帮助 Sui 社区成长而获得奖励。

奖励活动七月