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

news2025/7/7 4:51:46

系列文章目录😊

Task1:hello_move🍀
Task2:move_coin🍀
Task3:move_nft🍀

目录

  • 系列文章目录😊
  • 引言
  • 一、更新本地代码
    • 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 编程技巧,还体验了区块链合约开发的完整生命周期,为后续的任务或主网操作奠定了坚实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三层交换机静态路由实验

1、前置知识 2、实验目的 3、实验器材&#xff1a; 3560-23PS交换机2台、主机4台、交叉线1根和直通网线4根。 4、实验规划及拓扑 实验要求&#xff1a; &#xff08;1&#xff09;在交换机A和交换机B上分别划分基于端口的VLAN&#xff1a; 交换机 VLAN 端口成员 交换机…

iOS构建版本以及Hbuilder打iOS的ipa包全流程

目录 Hbuilder打ipa包 打包之前进行应用配置 应用版本号设置 使用广告标识设置 iOS-云打包 下载并转移安装包 使用Transporter提交版本 应用简介 下载应用 账号登录 提交安装包到apple store connect 在apple开发者平台上确认 总结 本篇文章详细的介绍了使用Hbuil…

java学习-集合

为什么有集合&#xff1f; 自动扩容 数组&#xff1a;长度固定&#xff0c;可以存基本数据类型和引用数据类型 集合&#xff1a;长度可变&#xff0c;可以存引用数据类型&#xff0c;基本数据类型的话需要包装类 ArrayList public class studentTest {public static void m…

返回流类型接口的错误信息处理

返回流类型接口的错误信息处理 前言axios拦截器src/utils/request.ts对应接口 前言 返回流类型接口需要在响应成功回调里拦截&#xff0c;且该接口的status始终是200&#xff0c;尽管后端返回的code可能是非2xx&#xff0c;因此返回流类型的接口&#xff0c;其错误信息需要单独…

用宏实现简单的计算器

大家好&#xff0c;那么经过我们前面几期的学习&#xff0c;我们对宏有了一定的了解&#xff0c;那么我们今天就来试试实现一个简单的加减乘除运算。 我们的思路是使用三目操作符来分别进行加减和乘除的运算&#xff0c;然后用if判断来”进入相关的判断体进而来进行计算。当然…

WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-php语言特性 详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整型&#xff0c;二次渲染等 3、检…

《Vue零基础教程》(3)创建第一个应用案例

1 应用实例 参考官方文档 https://cn.vuejs.org/api/application.html#create-app 示例 const {createApp} Vue// 通过createApp创建一个应用实例 const app createApp({/* 选项 */ }) console.log(app) 分析打印结果, 可知 应用实例是一个对象没有_开头的是公开属性/方…

复合瓦片切片集集合数量与性能关系验证

作者&#xff1a;lzzzz Sci瓦片聚合性能分析 需要聚合的图层越多&#xff0c;性能越低&#xff0c;目前测试以每个瓦片仅包含一个矢量面数据为例&#xff1a; sci数量 服务拉起耗时 前端加载&#xff08;单瓦片&#xff09; 100 10s 500ms 1000 5min 3s 10000 1hour …

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

摄影:相机控色

摄影&#xff1a;相机控色 白平衡&#xff08;White Balance&#xff09;白平衡的作用&#xff1a; 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡&#xff08;White Balance&#xff09; 人眼看到的白色&#xff1a;会自动适应环境光线。 相…

性能监控利器:Ubuntu 22.04 上的 Zabbix 安装与配置指南

简介 今天我们来聊聊如何在 Ubuntu 22.04 上安装和配置 Zabbix。我们会用到 PostgreSQL 作为数据库后端&#xff0c;Nginx 作为 Web 服务器&#xff0c;并用 Let’s Encrypt SSL 证书来保驾护航。 什么是 Zabbix&#xff1f; Zabbix 是一个开源的网络监控和管理解决方案&…

队列基本实现

模板 int queue[10010]; int hh1,tt0; void push1(int x) {queue[tt]x; } void pop1() {if(hh>tt){cout<<"ERR_CANNOT_POP"<<endl;}else{hh;} } int query1() {if(hh>tt){cout<<"ERR_CANNOT_QUERY"<<endl;}return queue[hh…

【ArcGISPro】使用AI模型提取要素-提取车辆(目标识别)

示例数据下载 栅格数据从网上随便找一个带有车辆的栅格数据 f094a6b1e205cd4d30a2e0f816f0c6af.jpg (1200799) (588ku.com) 添加数据

GitLab|数据迁移

注意&#xff1a;新服务器GitLab版本需和旧版本一致 在旧服务器执行命令进行数据备份 gitlab-rake gitlab:backup:create 备份数据存储在 /var/opt/gitlab/backups/ 将备份数据传输到新服务器的/var/opt/gitlab/backups/下&#xff0c;并修改文件权限&#xff08;下载前和上传…

UE5 5.1.1创建C++项目,显示error C4668和error C4067的解决方法

因为工作要求&#xff0c;没法使用最新 5.5版本的ue5 而是要用ue5.1和5.2版本。 但是我在安装下载了visual studio2022后&#xff0c;使用 ue5.1编辑器 创建C项目&#xff0c;爆出如下错误。 error C4668: ?????__has_feature?????ΪԤ?????꣬???0????…

网络安全概论

一、 网络安全是一个综合性的技术。在Internet这样的环境中&#xff0c;其本身的目的就是为了提供一种开放式的交互环境&#xff0c;但是为了保护一些秘密信息&#xff0c;网络安全成为了在开放网络环境中必要的技术之一。网络安全技术是随着网络技术的进步逐步发展的。 网络安…

51单片机基础01 单片机最小系统

目录 一、什么是51单片机 二、51单片机的引脚介绍 1、VCC GND 2、XTAL1 2 3、RST 4、EA 5、PSEN 6、ALE 7、RXD、TXD 8、INT0、INT1 9、T0、T1 10、MOSI、MISO、SCK 11、WR、RD 12、通用IO P0 13、通用IO P1 14、通用IO P2 三、51单片机的最小系统 1、供电与…

DASCTF 2024 10月 Reverse 完成笔记 附题目

题目链接: https://github.com/Airrcat/long_long/tree/main/DASCTF_2024_10 ezre 查PE 32位无壳 开始分析 看起来很像加壳了 字符串未有暴露信息&#xff0c;但是段中有一个themida 发现是一个壳&#xff0c;直接去找脱壳机 一些脱壳工具&#xff08;Magicmida)是…

JavaScript 中 arguments、类数组与数组的深入解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 &#x1f4af;深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性 3.2 类数组…

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化

Kafka&#xff1a;分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析&#xff1a;从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…