(二)Let's Move共学,初始语法

  • aimotee
  • 更新于 2024-11-19 17:15
  • 阅读 382

首先感谢Let'sMove共学,感谢HOH社区让我们对上一篇文章里面提到的代码语法进行详解modulehello_move::hello;usestd::ascii::{String,string};

首先感谢Let's Move共学,感谢HOH社区

8b84cc26a04f2077f2209b67997fe39.png

让我们对上一篇文章里面提到的代码语法进行详解

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-->

  1. hello_move:

    • 这是命名空间(namespace)。命名空间用于组织和隔离不同的模块,以避免名称冲突。你可以把命名空间理解为一个文件夹或目录,里面可以包含多个模块。
  2. 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 的主要用途

  1. 获取发送者的地址

    ctx.sender(): 返回当前事务的发送者地址。这是最常用的方法之一,特别是在需要验证权限或进行资源转移时。

  2. 获取事务的序列号

    ctx.tx_sequence_number(): 返回当前事务的序列号。序列号是一个递增的数字,用于确保事务的顺序执行。

  3. 生成新的对象 ID

    object::new(ctx): 用于生成一个新的 UID,通常用于创建新的资源对象。

  4. 获取事务的时间戳

    ctx.now(): 返回当前事务的时间戳,以毫秒为单位。

  5. 获取事务的 gas 价格

    ctx.gas_price(): 返回当前事务的 gas 价格,即每单位 gas 的费用。

  6. 获取事务的 gas 预算

    ctx.gas_budget(): 返回当前事务的 gas 预算,即事务可以消耗的最大 gas 数量。

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
aimotee
aimotee
江湖只有他的大名,没有他的介绍。