开发中常用的命令,并创建发布第一个 Sui 合约项目 hello world
在第一节入门 Sui Move 开发:1. 环境安装 中我们已经成功安装了 Sui Move
开发环境及开发 IDE。
本节介绍在开发中常用的命令并创建发布第一个 Sui
合约项目 hello world
。
为了方便新手使用时快速查找,下面按命令的功能进行了粗略分类,但是实际上没有这样的概念。
sui client
连接到 sui 网络,首次执行按提示输入会创建钱包(后续领水、合约发布都是在跟这个地址交互。可以创建多个钱包,通过命令切换)sui client envs
查看当前连接的网络(Sui 官方提供了开发网、测试网、主网)
sui client new-env --alias <ALIAS> --rpc <RPC-SERVER-URL>
添加网络并设置别名
sui client new-env --alias=devnet --rpc https://fullnode.devnet.sui.io:443
// 添加开发网络并设置别名为 devnet
sui client new-env --alias=mainnet --rpc https://fullnode.mainnet.sui.io:443
// 添加主网并设置别名为 mainnet
sui client switch --env <ALIAS>
切换网络
sui client switch --env mainnet
// 切换到主网
sui client gas
查看活跃地址余额以及 gasCoinId
sui client balance
查看活跃地址余额
sui client new-address ed25519 test
生成新钱包,test 为钱包别名可以省略
sui client switch --address <address别明>
切换当前活跃地址(活跃地址也就是执行操作与之交互的地址)
sui client active-address
查看当前活跃的地址
sui client faucet
通过水龙头来获取 sui 代币,合约发布、执行合约都需要 sui 代币作为 gas 费(可以理解链上交互都需要手续费),注意:仅可在 devnet 和 testnet 网络上获取
sui client verify-bytecode-meter
检查字节码是否超过规定值,发布之前执行,避免消耗不必要 gas
sui client publish
发布合约,发布之前会自动执行编译,切记:发布之前要确定当前网络和活跃地址
调用已发布的包的方法:
调用一个没有参数的函数
sui client call [OPTIONS] --package <package id> --module <module名称> --function <函数名> --gas-budget <GAS_BUDGET>
调用带参数的函数
sui client call [OPTIONS] --package <package id> --module <module名称> --function <函数名> --gas-budget <GAS_BUDGET> --args <参数1> <参数2>
sui move new <package_name>
创建一个项目,项目名就是包名,一个包里可以有多个模块
sui move test
执行单元测试,需要在创建的项目的根目录执行
sui move build
编译项目,同样需要在创建的项目的根目录执行
接下来终于可以写 Hello World
了。接下来会用到上面所讲的命令。
hello world
执行命令:sui move new hello_world
,执行之后会创建 hello_world
目录及子目录,具体结构和说明如下:
hello_world
├── Move.toml // 清单文件,定义包名、版本、依赖等信息
├── sources // 存放模块代码的目录,一个包里可以有多个模块
│ └── hello_world.move // 默认创建的和包名同名的模块文件
└── tests // 存放测试单元测试文件的目录
└── hello_world_tests.move // 默认创建的和包名同名的模块单元测试文件
打开文件 hello_world.move
,修改内容如下:
/// Module: hello_world
module hello_world::hello_world {
// 导入需要使用的模块中的结构体和方法
use std::string::{String, utf8};
// 定义结构体 Hello,Hello 中有两个字段:id、text,并且 Hello 有 key、strore 能力
public struct Hello has key, store {
id: UID,
text: String
}
// 定义 mint 方法,
public entry fun mint(ctx: &mut TxContext) {
// 定义一个 Hello 结构体的实例对象
let hello = Hello {
id: object::new(ctx),
text: utf8(b"hello world, hello Sui!")
};
// 将 hello 转给当前发起交易的地址
transfer::transfer(hello, tx_context::sender(ctx));
}
}
使用 sui client envs
确认当前所在的网络,我这里使用 testnet
网络发布,可以使用 testnet
或 devnet
。
*通过 `` 所在的行确认所在的网络**
使用 sui client active-address
确认当前地址,也是就是接下来会发布合约的地址。
使用 sui client envs
领水,如下输出就是领取成功了(可以查询余额进行确认)。
首先需要进入到项目的根目录 cd hello_world
,然后使用 sui client publish
发布。
成功发布之后,会看到输出很多内容。
我们可以找到 Object Changes
中 Published Objects
(发布合约一定有这个值) 对应的值,用这个值去浏览器上查看。
在浏览器上可以查到链上所有的数据。 Sui 有以下两个比较好用的浏览器,可以根据自己的习惯进行选择使用哪儿个。
我这里使用 suiscan
,打开网站后搜索上一步中复制的 Published Objects
的值。就可以看到我们发布的合约的所有信息。
在合约中我们定义了一个 mint
方法,接下来我们使用上面介绍的命令:sui client call [OPTIONS] --package <package id> --module <module名称> --function <函数名> --gas-budget <GAS_BUDGET>
来调用这个 mint
方法。
命令中需要的参数:
package id
就是 Published Objects
module名称
就是 hello_world
函数名
就是 mint
--gas-budget <GAS_BUDGET>
在现在的版本可以省略。最终命令:sui client call --package <你发布合约的合约 ID> --module hello_world --function mint
执行成功后同样可以看到很多输出,我们直接找 Object Changes
-> Created Objects
-> ObjectID
。
同样复制这个值在浏览器中查看。
到这里我们就已经成功编写和发布合约,并调用了合约中的方法。
合约代码我添加了相关注释,如果你现在看不懂没有关系,我们后面会详细介绍。
如果你对文章中内容有任何疑问可以留言。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!