SUI区块链与Move语言入门在上一章中,我们对SUI区块链进行了初步介绍,但要真正理解SUI的核心概念,我们需要深入学习Move编程语言。许多初学者可能会遇到一个常见问题:每个单词都认识,但连在一起却难以理解整体含义。这是正常的学习过程,我也曾有同样的感受。接下来,让我们系统地学习Move语言,
在上一章中,我们对SUI区块链进行了初步介绍,但要真正理解SUI的核心概念,我们需要深入学习Move编程语言。许多初学者可能会遇到一个常见问题:每个单词都认识,但连在一起却难以理解整体含义。这是正常的学习过程,我也曾有同样的感受。接下来,让我们系统地学习Move语言,从而更好地理解SUI区块链。
Move是一种专为区块链应用设计的编程语言,最初由Facebook(现Meta)为Libra(后改名为Diem)项目开发。虽然Diem项目已经终止,但Move语言继续在多个区块链项目中得到应用,包括Sui、Aptos和Starcoin等。
Move的语法类似Rust和Swift,但有其特定的设计考虑。如需深入了解Move语言,可参考Move Book。
Move的基本数据类型包括:
u8
, u32
, u64
, u128
, u256
boolean
address
值得注意的是,Move不直接支持字符串和浮点数。在Move中,字符串通常以bytes
数组的形式表示,但不属于基本数据类型。
Sui Framework是Sui Move的标准库,由官方团队精心设计并经过安全验证:
此外,move stdlib
是来自Move上游的核心标准库,可以理解为最基础的标准库。具体代码可在GitHub仓库中查看。
让我们通过分析SUI代币的实现来理解Move在实际应用中的工作方式。
首先,我们可以在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
}
代码分析:
coin::create_currency
创建SUI代币,设置精度为9位小数关于public_freeze_object
:此调用使指定的对象变为不可变,是一种不可逆操作。只有在确定对象不再需要修改时才应使用。
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实现的重要区别:
init
函数在模块发布时执行一次性初始化具有以下特性的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
修饰符允许函数被链上的其他对象方法调用,作为模块的"入口点":
drop
能力的类型这种设计有效防止了复合攻击问题。
one_time_witness
是一种特殊类型的对象,具有以下特点:
在SUI中,由于智能合约可以多次发布且任何人都可以使用相同名称发布合约,一次性见证解决了如何确保特权操作只能由原始发布者执行的问题。
使用一次性见证的基本步骤:
通过学习Move语言和SUI区块链的基础知识,我们开始理解SUI的核心设计理念。特别是通过分析SUI代币的实现,我们看到了Move语言如何处理数字资产。在接下来的内容中,我们将继续深入探索Move编程,解答更多关于SUI区块链的实际应用问题。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!