(二)Let's Move共学,初始语法
首先感谢Let's Move共学,感谢HOH社区

让我们对上一篇文章里面提到的代码语法进行详解
module hello_move::hello ;
use std::ascii::{String, string};
use sui::object::{Self, UID};
use sui::transfer::transfer;
use sui::tx_context::{TxContext};
public struct Hello has key {
id: UID,
say: String
}
fun init(ctx: &mut TxContext) {
let hello_move = Hello {
id: object::new(ctx),
say: string(b"move"),
};
transfer(hello_move, ctx.sender());
}
这段代码是用 Move 编程语言编写的,Move 是一种用于区块链的智能合约编程语言,最初由 Libra(后更名为 Diem)项目引入,现在也被其他项目如 Sui 使用。这段代码定义了一个简单的智能合约模块 hello_move,其中包含一个结构体 Hello 和一个初始化函数 init。
模块声明
module hello_move::hello ;
这行代码声明了一个新的模块,名为 hello_move::hello。在 Move 中,模块是组织代码的基本单元,类似于其他编程语言中的包或库。<!--StartFragment-->
-
hello_move:- 这是命名空间(namespace)。命名空间用于组织和隔离不同的模块,以避免名称冲突。你可以把命名空间理解为一个文件夹或目录,里面可以包含多个模块。
-
hello:- 这是模块名(module name)。模块是 Move 语言中定义和封装逻辑的基本单位。在这个模块中,你可以定义结构体、函数、常量等。
<!--EndFragment-->
导入标准库
use std::ascii::{String, string};
use sui::object::{Self, UID};
use sui::transfer::transfer;
use sui::tx_context::{TxContext};
这里导入了一些标准库中的类型和函数:
std::ascii::{String, string}:导入了 ASCII 字符串类型String和用于创建字符串的函数string。sui::object::{Self, UID}:导入了 Sui 对象相关的类型UID,这是一个唯一标识符类型,用于标识链上的对象。sui::transfer::transfer:导入了用于转移对象所有权的函数transfer。sui::tx_context::{TxContext}:导入了事务上下文类型TxContext,它提供了关于当前执行环境的信息,如发送者地址等。
结构体定义
public struct Hello has key {
id: UID,
say: String
}
定义了一个公共结构体 Hello,它有两个字段:
id: 类型为UID,表示这个对象的唯一标识符。say: 类型为String,存储了一条消息。
has key 表示这个结构体可以作为资源存放在账户中,并且可以被其他脚本引用。这意味着 Hello 结构体实例可以在链上存在并被追踪。
初始化函数
fun init(ctx: &mut TxContext) {
let hello_move = Hello {
id: object::new(ctx),
say: string(b"move"),
};
transfer(hello_move, ctx.sender());
}
这是一个公共函数 init,用于初始化一个新的 Hello 实例:
- 参数
ctx: &mut TxContext是一个可变引用,指向当前事务的上下文。 let hello_move = Hello { ... }创建了一个新的Hello实例,其中id字段通过调用object::new(ctx)生成一个新的UID,而say字段则是一个包含字节 "move" 的字符串。transfer(hello_move, ctx.sender())将新创建的Hello实例转移到发送该事务的账户中。ctx.sender()返回发起该事务的账户地址。
简单补充一下ctx的用法 <!--StartFragment-->
TxContext 的主要用途
-
获取发送者的地址:
ctx.sender(): 返回当前事务的发送者地址。这是最常用的方法之一,特别是在需要验证权限或进行资源转移时。 -
获取事务的序列号:
ctx.tx_sequence_number(): 返回当前事务的序列号。序列号是一个递增的数字,用于确保事务的顺序执行。 -
生成新的对象 ID:
object::new(ctx): 用于生成一个新的UID,通常用于创建新的资源对象。 -
获取事务的时间戳:
ctx.now(): 返回当前事务的时间戳,以毫秒为单位。 -
获取事务的 gas 价格:
ctx.gas_price(): 返回当前事务的 gas 价格,即每单位 gas 的费用。 -
获取事务的 gas 预算:
ctx.gas_budget(): 返回当前事务的 gas 预算,即事务可以消耗的最大 gas 数量。
<!--EndFragment-->
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
区块链技术网


发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。