(二)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-->
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。