系列文章目录😊
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 的代币,并将初始代币发送给调用者,同时冻结代币的元数据以确保其不可篡改。
我的代码示例:
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 编程技巧,还体验了区块链合约开发的完整生命周期,为后续的任务或主网操作奠定了坚实的基础。