Sui系列文章(二)

SUI区块链与Move语言入门在上一章中,我们对SUI区块链进行了初步介绍,但要真正理解SUI的核心概念,我们需要深入学习Move编程语言。许多初学者可能会遇到一个常见问题:每个单词都认识,但连在一起却难以理解整体含义。这是正常的学习过程,我也曾有同样的感受。接下来,让我们系统地学习Move语言,

SUI区块链与Move语言入门

在上一章中,我们对SUI区块链进行了初步介绍,但要真正理解SUI的核心概念,我们需要深入学习Move编程语言。许多初学者可能会遇到一个常见问题:每个单词都认识,但连在一起却难以理解整体含义。这是正常的学习过程,我也曾有同样的感受。接下来,让我们系统地学习Move语言,从而更好地理解SUI区块链。

Move语言简介

Move是一种专为区块链应用设计的编程语言,最初由Facebook(现Meta)为Libra(后改名为Diem)项目开发。虽然Diem项目已经终止,但Move语言继续在多个区块链项目中得到应用,包括Sui、Aptos和Starcoin等。

Move的主要特点

  • 专注于数字资产安全管理:核心设计理念是安全处理区块链上的数字资产
  • 资源导向设计:资源不能被复制或隐式丢弃,确保资产安全
  • 静态类型系统:提供编译时安全保证,减少运行时错误
  • 形式化验证友好:便于代码正确性证明,提高智能合约安全性

语法与数据类型

Move的语法类似Rust和Swift,但有其特定的设计考虑。如需深入了解Move语言,可参考Move Book

Move的基本数据类型包括:

  • 整型数字:u8, u32, u64, u128, u256
  • 布尔型:boolean
  • 地址:address

值得注意的是,Move不直接支持字符串和浮点数。在Move中,字符串通常以bytes数组的形式表示,但不属于基本数据类型。

Sui Framework

Sui Framework是Sui Move的标准库,由官方团队精心设计并经过安全验证:

  • 简单来说,这是Sui生态系统中的标准工具库,提供常用功能
  • 深入学习Framework不仅能掌握实用工具,还能更好地理解Sui Move编程范式
  • 每个包和库都值得仔细研究,当然在实际开发中可以直接使用现有功能

此外,move stdlib是来自Move上游的核心标准库,可以理解为最基础的标准库。具体代码可在GitHub仓库中查看。

COIN:理解SUI代币实现

让我们通过分析SUI代币的实现来理解Move在实际应用中的工作方式。

SUI代币源码分析

首先,我们可以在Suiscan找到SUI的源代码。也可直接在GitHub查看。

SUI代币的核心代码逻辑相对简洁:

move
Copy
// new函数会在初始化时被调用
fun new(ctx: &mut TxContext): Supply<SUI> {
  // 确保执行的是创世区块
  assert!(ctx.sender() == @0x0, ENotSystemAddress);
  assert!(ctx.epoch() == 0, EAlreadyMinted);

  let (treasury, metadata) = coin::create_currency(
    SUI {}, 9, b"SUI", b"Sui",
    // TODO: add appropriate description and logo url
    b"",
    option::none(),
    ctx,
  );

  transfer::public_freeze_object(metadata);
  let mut supply = treasury.treasury_into_supply();
  let total_sui = supply.increase_supply(TOTAL_SUPPLY_MIST);
  supply.destroy_supply();
  total_sui
}

代码分析:

  1. 函数首先验证两个条件,确保只能在创世区块执行
  2. 调用coin::create_currency创建SUI代币,设置精度为9位小数
  3. 将元数据对象冻结,使其不可修改
  4. 增加总供应量到预设值(100亿SUI)

关于public_freeze_object:此调用使指定的对象变为不可变,是一种不可逆操作。只有在确定对象不再需要修改时才应使用。

SUI代币的转账机制

SUI代币转账的实现也很直观:

move
Copy
public entry fun transfer(c: coin::Coin<SUI>, recipient: address) {
  transfer::public_transfer(c, recipient)
}

SUI使用两种主要的转账方法:

  • sui::transfer::transfer:用于定义对象的自定义转移策略
  • sui::transfer::public_transfer:用于创建地址拥有的对象(当对象具有store能力时)

对象的所有权可以在其生命周期内变化,比如添加为动态对象字段、转移到不同地址或设为不可变。但重要的是,一旦创建对象并设置所有权后,它不能被共享。

Move在SUI上的关键特性

Move在SUI上有一些与其他区块链上的Move实现的重要区别:

  1. 以对象为中心的全局存储:SUI没有传统的全局存储,而是使用对象模型
  2. 地址表示对象标识:在SUI中,地址被用作32字节对象标识符
  3. 全局唯一标识符:每个SUI对象都有全局唯一的标识符
  4. 模块初始化程序:SUI提供init函数在模块发布时执行一次性初始化
  5. 入口点以对象引用作为输入:公共函数的参数可以是对象值或引用

深入理解:初始化函数(Initializers)

具有以下特性的init函数会在模块发布时执行一次:

  • 函数名必须是init
  • 参数列表必须以&mut TxContext&TxContext类型结束
  • 没有返回值
  • 私有可见性
  • 可选地,参数列表可以以接收模块的一次性见证的形式开始

例如,以下init函数都是有效的:

  • fun init(ctx: &TxContext)
  • fun init(ctx: &mut TxContext)
  • fun init(otw: EXAMPLE, ctx: &TxContext)
  • fun init(otw: EXAMPLE, ctx: &mut TxContext)

入口函数(Entry Functions)

entry修饰符允许函数被链上的其他对象方法调用,作为模块的"入口点":

  • 入口函数只能返回具有drop能力的类型
  • 入口函数只能接收那些在同一区块中未被作为参数的对象

这种设计有效防止了复合攻击问题。

一次性见证(One-Time Witness)

one_time_witness是一种特殊类型的对象,具有以下特点:

  • 只会在模块首次发布时创建一次
  • 与发布的模块同名(通常使用大写)
  • 数量保证只有一个
  • 可以用作全局身份标识

在SUI中,由于智能合约可以多次发布且任何人都可以使用相同名称发布合约,一次性见证解决了如何确保特权操作只能由原始发布者执行的问题。

使用一次性见证的基本步骤:

  1. 创建与模块同名的结构体(使用大写)
  2. 在初始化函数中接收并验证此结构体
  3. 发布模块时,SUI运行时会自动创建相应的witness对象

总结

通过学习Move语言和SUI区块链的基础知识,我们开始理解SUI的核心设计理念。特别是通过分析SUI代币的实现,我们看到了Move语言如何处理数字资产。在接下来的内容中,我们将继续深入探索Move编程,解答更多关于SUI区块链的实际应用问题。

  • 原创
  • 学分: 4
  • 分类: Sui
  • 标签:
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
CryptoBox
CryptoBox
0x9099...2eE6
https://www.cpbox.io 是集web3批量工具, 一键发Token, 市值管理为一身的专业web3工具