帖子
分享您的知识。

掌握动作语言概念 — 课程 #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 }
了解这些能力对于设计安全和可预测的智能合约至关重要.
为什么能力很重要
能力在编译时执行严格的规则. 例如:
-仅包含key
且store
无法复制或删除的结构.
-除非已存储或传输,否则您无法从函数中返回不可删除的结构.
这样可以防止诸如双重支出或意外代币丢失之类的错误.
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_context
Sui 框架提供经过实战考验的模块,如、和. 在编写自定义逻辑之前,请务必检查可用内容.
例如,要传输对象,请执行以下操作:
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 Explorer、Subsquid或 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
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.