在 Sui 区块链上创建、部署与测试自定义 Move 合约的完整教程

系列文章目录😊

Task1:hello_move
Task2:move_coin

目录

  • 系列文章目录😊
  • 引言
  • 一、更新本地代码
    • 1、查看当前项目的远程仓库信息。
    • 2、将远程仓库的最新代码同步到本地的代码分支
  • 二、创建一个新的 Move 项目
  • 三、编写合约代码
    • 1、编写yoona333Coin.move合约
  • 四、部署合约(测试网部署)
    • 1、在my_coin目录下,输入命令进行部署(测试网部署)
    • 2、查看部署到Sui区块链的信息
    • 3、进入Changes页面找到Object Changes
    • 4、调用 coin 模块中的 mint_and_transfer 函数
      • ①查看packageId
      • ②查看铸造代币的资金池对象
    • 5、查看铸造的代币
    • 6、再创建一个yoona333FaucetCoin合约
      • ① 进行编译
      • ②在my_coin目录下,输入命令进行部署(测试网部署)
  • 五、部署合约(主网部署)
    • 1、创建一个新的客户端环境,指向 Sui 主网的 RPC 节点
    • 2、切换当前的 Sui 客户端环境到主网
    • 3、查看当前所有环境
    • 4、检查账户余额
    • 5、检查主网账户余额
    • 4、将当前目录中的 Move 合约部署到主网,同时跳过依赖验证
  • 六、验证部署结果
    • 1、查看链上模块,找到你发布的模块 ID。
    • 2、调用 coin 模块中的 mint_and_transfer 函数
  • 总结

引言

本教程将带您完成在 Sui 区块链上创建、部署和测试自定义 Move 合约的全过程。从初始化一个新的 Move 项目到定义代币模块,再到在测试网和主网环境中部署合约,以及铸造和转移代币。通过这一系列操作,你将学会如何在区块链环境下高效开发并验证智能合约,完成完整的任务需求。

一、更新本地代码

1、查看当前项目的远程仓库信息。

找到你task1 Fork下来的代码,然后再任意目录下都可以。会列出项目中配置的所有远程仓库的名称及其对应的 URL。
origin: 是默认的远程仓库名称(可以配置其他名字)。
URL: 是远程仓库的地址
(fetch): 表示用于拉取代码的 URL
(push): 表示用于推送代码的 URL
常见的有:

添加远程仓库:

git remote add origin 远程仓库名

例如:git remote add origin https://github.com/yoona333/huan.git

修改远程仓库:
git remote set-url origin 远程仓库名

删除远程仓库:
git remote remove origin

设置上游:
git remote add upstream 仓库名

如图,查看我们的远程仓库。
在这里插入图片描述

2、将远程仓库的最新代码同步到本地的代码分支

在这里插入图片描述
解释:
git fetch upstream
从名为 upstream 的远程仓库获取最新的更新。fetch 只是将远程仓库的更新下载到本地的 远程跟踪分支,不会自动与本地分支合并。
比如,upstream/main 会更新,但本地分支 main 还是原样。

git merge upstream/main
将 upstream/main 分支的最新代码合并到你当前所在的分支。upstream/main 是 fetch 后更新的远程跟踪分支。merge 会将这些更新应用到当前所在的分支,比如本地的 main。如果没有冲突,Git 会自动完成合并;如果有冲突,需要手动解决。

二、创建一个新的 Move 项目

初始化基本的文件和目录结构:
在文件夹 my_coin 中,工具会生成一个标准的Move 项目模板,包括:

Move.toml:项目的配置文件,定义项目的依赖项、模块名称等。
sources/:存放你的 Move 源代码文件。
tests/:存放测试用例代码的目录。
在这里插入图片描述

三、编写合约代码

1、编写yoona333Coin.move合约

创建一个自定义的代币,我这里是 YOONA333COIN,并初始化相关的元数据与初始代币分发。
在这里插入图片描述

以下是我的代码,可供参考。

module my_coin::yoona333Coin{   //定义了yoona333Coin模块

//导入依赖
use sui::coin::create_currency;  
use std::option::{none,some};   
use sui::transfer::{ public_transfer,public_freeze_object};   
use sui::url::{Self,Url};    

public struct YOONA333COIN has drop{}

fun init(yoona333Coin:YOONA333COIN, ctx: &mut TxContext) {

    // let no = none<Url>();
    
    let url = url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/167958904?v=4");  
    let yes = some<Url>(url);  
    let (treasury,coin_metadata) =
    create_currency(yoona333Coin,8,b"YOONA333COIN",b"YOONA333COIN",b"This is YOONA333COIN",yes,ctx);
    
    
    public_freeze_object(coin_metadata);   //冻结 coin_metadata 对象,使其不可再被修改。
    
    public_transfer(treasury,ctx.sender())    //将 treasury 对象(初始代币)转移到当前交易的发送者地址。
    
}
}

四、部署合约(测试网部署)

1、在my_coin目录下,输入命令进行部署(测试网部署)

sui client publish

在这里插入图片描述

Transaction Digest:是这次交易的唯一标识符(类似交易的“哈希”),可以用来在链上查找这次操作的具体信息。

如果出现这个报错,就手动删除lock文件或者以管理员权限运行命令行,因为我pubilsh了两次。
这个文件是 Move 项目中的一种“依赖锁定文件”,用来记录当前项目所依赖的 Move 包的具体版本或状态。如果文件被破坏、占用或不兼容,就可能引发部署失败的问题。
在这里插入图片描述

2、查看部署到Sui区块链的信息

部署之后,得到Transaction Digest,然后去 Sui 区块链浏览器上进行查看。
在这里插入图片描述

3、进入Changes页面找到Object Changes

在这里插入图片描述

4、调用 coin 模块中的 mint_and_transfer 函数

输入命令来查看帮助文档,包括支持的参数、选项以及它的功能描述。

sui client call --help

在这里插入图片描述
在这里插入图片描述
解释:

sui client call
表示调用链上模块的一个函数。

--package 0x2
模块所在的包 ID:指定要调用的模块所在的 Sui 包 ID。
0x2 是系统包 ID,其中包含一些标准模块,例如 coin

--module coin
模块名称:指定调用的是 coin 模块。

--function mint_and_transfer
函数名称:指定调用的是 mint_and_transfer 函数。
该函数通常用于铸造新的代币,并将铸造的代币直接转移给指定的账户。

--type-args 代币类型所在模块id::模块名称::代币的结构体名称

--args 铸造代币的资金池对象(Treasurycap的object id) 铸造的代币数量 接收代币的目标地址
我这里写的是给另一个帐户进行铸币。

①查看packageId

刚刚我们在Sui区块链浏览器哩查看哈希了,然后现在找到package这条,点击,进来之后,就能找到啦。
在这里插入图片描述
在url上,这个就是packageId了。
在这里插入图片描述

②查看铸造代币的资金池对象

点进来之后,找到Treasurycap的object id,也是在url里获取。
在这里插入图片描述
在这里插入图片描述

5、查看铸造的代币

去查看接收代币的目标地址,我的代币叫YOONA333COIN,数量是10的8次方,也就是100个代币。发送给这个地址了,这是他在sui钱包上查看到的记录。就完成了铸造指定数量的代币并将其转移给目标地址
在这里插入图片描述

6、再创建一个yoona333FaucetCoin合约

这个模块是一个基础的“水龙头”(Faucet)合约,用于生成自定义代币并分发给用户。调用 init 方法会创建一种名为 YOONA333FAUCETCOIN 的代币,并将初始代币发送给调用者,同时冻结代币的元数据以确保其不可篡改。
a'g'f'f

我的代码示例:

module my_coin::yoona333FaucetCoin{   //定义了yoona333Coin模块

//导入依赖
use sui::coin::create_currency;  
use std::option::{none,some};   
use sui::transfer::{public_share_object,public_freeze_object};   
use sui::url::{Self,Url};    

public struct YOONA333FAUCETCOIN has drop{}

fun init(yoona333FaucetCoin:YOONA333FAUCETCOIN, ctx: &mut TxContext) {

    // let no = none<Url>();
    
    let url = url::new_unsafe_from_bytes(b"https://avatars.githubusercontent.com/u/167958904?v=4");  
    let yes = some<Url>(url);  
    let (treasury,coin_metadata) =
    create_currency(yoona333FaucetCoin,8,b"YOONA333FAUCETCOIN",b"YOONA333FAUCETCOIN",b"This is YOONA333FAUCETCOIN",yes,ctx);
    
    
    public_freeze_object(coin_metadata);   //冻结 coin_metadata 对象,使其不可再被修改。
    
    public_share_object(treasury);    //将 treasury 对象(初始代币)转移到当前交易的发送者地址。
    
}
}

① 进行编译

在这里插入图片描述
在这里插入图片描述

②在my_coin目录下,输入命令进行部署(测试网部署)

在这里插入图片描述

五、部署合约(主网部署)

1、创建一个新的客户端环境,指向 Sui 主网的 RPC 节点

会在本地配置中新增一个名为 mainnet 的环境,连接到主网的 RPC 服务

sui client new-env --alias mainnet --rpc https://fullnode.mainnet.sui.io:443

new-env:创建一个新的环境。
--alias mainnet:为这个新环境起一个别名,方便以后切换。
--rpc https://fullnode.mainnet.sui.io:443:指定主网的全节点 RPC 地址。
在这里插入图片描述

2、切换当前的 Sui 客户端环境到主网

所有客户端操作(如发布合约、查询账户状态等)都会连接到主网。

sui client switch --env mainnet

--env mainnet:选择之前创建的 mainnet 环境
在这里插入图片描述

3、查看当前所有环境

sui client envs

在这里插入图片描述

4、检查账户余额

发布合约需要支付 SUI 费用,因此确保主网地址有足够的 SUI。
查看当前地址

sui client active-address

在这里插入图片描述

5、检查主网账户余额

sui client gas

如果余额不足,可以从交易所购买 SUI,并转入你的地址。
在这里插入图片描述

4、将当前目录中的 Move 合约部署到主网,同时跳过依赖验证

在主网发布前,确保 Move 合约已经在 Devnet 或 Testnet 上充分测试,行为完全符合预期。可以使用以下命令在测试环境中发布。Move 合约会直接部署到 Sui 主网,但跳过依赖验证可能存在风险,尤其是在主网环境中发布合约时需要非常小心,因为主网上发布是不可撤销的

sui client publish --skip-dependency-verification

在这里插入图片描述

六、验证部署结果

1、查看链上模块,找到你发布的模块 ID。

将刚刚的Transaction Digest,复制到Sui区块链主网上,查询信息。
在这里插入图片描述

或者在控制台输入命令查看。

sui client objects

在这里插入图片描述

2、调用 coin 模块中的 mint_and_transfer 函数

在这里插入图片描述
然后去主网上查看此交易。

在这里插入图片描述
就可以看见你给这个账户铸造的代币啦。根据task2的需求,提交相应的id和hash,再提交代码就好啦。

总结

总结
通过本文的指导,我们成功完成了以下任务:初始化了 Move 项目、编写了自定义代币模块(包括 yoona333Coin 和 yoona333FaucetCoin),在测试网和主网上部署了合约,并通过实际调用验证了合约的正确性。借助详细的代码示例和部署流程,不仅掌握了基础的 Move 编程技巧,还体验了区块链合约开发的完整生命周期,为后续的任务或主网操作奠定了坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/919161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】归并排序 —— 递归及非递归解决归并排序

归并排序 一、归并排序1、归并排序的思想2、归并排序代码实现&#xff08;递归&#xff09;<1> 归并排序的递归区间<2> 归并排序的稳定性<3> 拷贝 3、归并排序代码实现&#xff08;非递归&#xff09;<1> 循环区间溢出问题 二、总结 一、归并排序 1、…

单片机学习笔记 6. 数码管动态显示

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示 目录 0、实现的功能 1、Keil工程 1-1 数码管动态显示 1-2 数组的定义与引用…

go 学习网站,go例子 go demo go学习视频

1. 代码例子&#xff1a; Go by Example 2. b站 视频&#xff1a; 尚硅谷视频&#xff1a; 004_尚硅谷_程序的基本概念_哔哩哔哩_bilibili 3. go技术文档&#xff1a; fmt Go语言中文文档

MySQL(5)【数据类型 —— 字符串类型】

阅读导航 引言一、char&#x1f3af;基本语法&#x1f3af;使用示例 二、varchar&#x1f3af;基本语法&#x1f3af;使用示例 三、char 和 varchar 比较四、日期和时间类型1. 基本概念2. 使用示例 五、enum 和 set&#x1f3af;基本语法 引言 之前我们聊过MySQL中的数值类型&…

# 06_ Python基础到实战一飞冲天(二)-python基础(六)--变量的使用与变量类型

06_ Python基础到实战一飞冲天&#xff08;二&#xff09;-python基础&#xff08;六&#xff09;–变量的使用与变量类型 一、程序执行原理-06-明确程序的作用 1、程序的作用 程序就是 用来处理数据 的&#xff01; 2、各类软件的场景&#xff1a; 新闻软件 提供的 新闻内容…

人工智能之机器学习5-回归算法1【培训机构学习笔记】

培训内容&#xff1a; 模型评估 培训班上课的PPT里很多错误&#xff0c;即使讲了很多年也从没改正过来。 而且很多字母没有给出具体的解释&#xff0c;比如RSS和TSS&#xff0c;对初学者非常不友善。 个人学习&#xff1a; 分类和回归的区别 回归和分类是机器学习和统计学…

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…

nvm安装node遇到的若干问题(vscode找不到npm文件、环境变量配置混乱、npm安装包到D盘)

问题一&#xff1a;安装完nvm后需要做哪些环境变量的配置&#xff1f; 1.打开nvm文件夹下的setting文件&#xff0c;设置nvm路径和安装node路径&#xff0c;并添加镜像。 root: D:\software\nvm-node\nvm path: D:\software\nvm-node\nodejs node_mirror: https://npmmirror.c…

数据结构-树状数组专题(1)

一、前言 树状数组可以解决部分区间修改和区间查询的问题&#xff0c;相比于线段树&#xff0c;代码更加简单易懂 二、我的模板 搬运jiangly鸽鸽的模板&#xff0c;特别注意这个模板中所有涉及区间的都是左闭右开区间&#xff0c;且vector的有效下标都从0开始 template <…

Linux网络——套接字编程

1. 网络通信基本脉络 基本脉络图如上&#xff0c;其中数据在不同层的叫法不一样&#xff0c;比如在传输层时称为数据段&#xff0c;而在网络层时称为数据报。我们可以在 Linux 中使用 ifconfig 查看网络的配置&#xff0c;如图 其中&#xff0c;inet 表示的是 IPv4&#xff0c;…

‘视’不可挡:OAK相机助力无人机智控飞行!

南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能&#xff0c;取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来&#xff0c;参与到各式各样的比赛中去。我们相信&#xff0c;有了我们相机的助力&#xff0c;大家…

复旦微电子FM33LC046U在keil工程中无法使用j-link下载问题解决

在Keil环境下使用JLINK工具下载程序&#xff0c;发现J-link V7.89a无法识别FM33LC046U&#xff0c;提示如下&#xff1a; 选择Cortex-M0 设置为SW模式&#xff0c;即可识别到芯片 经过如上步骤&#xff0c;就可以使用Jlink下载和仿真程序

java中设计模式的使用(持续更新中)

概述 设计模式的目的&#xff1a;编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序&#xff08;软件&#xff09;&#xff0c;具有…

【计算机网络实验】之静态路由配置

【计算机网络实验】之静态路由配置 实验题目实验目的实验任务实验设备实验环境实验步骤路由器配置设置静态路由测试路由器之间的连通性配置主机PC的IP测试 实验题目 静态路由协议的配置 实验目的 熟悉路由器工作原理和机制&#xff1b;巩固静态路由理论&#xff1b;设计简单…

【PS】矢量绘图技巧

1、先使用钢笔工具结合ctrl和alt建将苹果大致扣出来。 任意选择一个颜色进行填充 新建一个图层&#xff0c;使用渐变工具为图层添加渐变颜色 选择剪切蒙版&#xff0c;将图层颜色填入苹果&#xff0c;得最终结果。 内容二、麦当劳 与内容一类似的&#xff0c;使用钢笔工具将M形…

【HCIP]——OSPF综合实验

题目 实验需求 根据上图可得&#xff0c;实验需求为&#xff1a; 1.R5作为ISP&#xff1a;其上只能配置IP地址&#xff1b;R4作为企业边界路由器&#xff0c;出口公网地址需要通过PPP协议获取&#xff0c;并进行CHAP认证。&#xff08;PS&#xff1a;因PPP协议尚未学习&#…

django启动项目报错解决办法

在启动此项目报错&#xff1a; 类似于&#xff1a; django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动&#xff0c;以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…

【GeekBand】C++设计模式笔记12_Singleton_单件模式

1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题&#xff0c; 但是必不可免地要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…

计算机网络 (1)互联网的组成

一、互联网的边缘部分 互联网的边缘部分由所有连接在互联网上的主机组成&#xff0c;这些主机又称为端系统&#xff08;end system&#xff09;。端系统可以是各种类型的计算机设备&#xff0c;如个人电脑、智能手机、网络摄像头等&#xff0c;也可以是大型计算机或服务器。端系…

电商行业客户服务的智能化:构建高效客户服务知识库

在电商行业&#xff0c;客户服务是提升用户体验和品牌忠诚度的关键。随着数字化转型的深入&#xff0c;构建一个高效的客户服务知识库变得尤为重要。本文将探讨电商行业如何构建客户服务知识库&#xff0c;并分析其在提升服务质量中的作用。 客户服务知识库的重要性 客户服务…