Hello, Sui Move
在本节中,我们将编写一个使用Sui存储模型并可与之交互的简单应用程序。为此,我们将创建一个简单的待办事项列表应用程序。
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK
在上一节中,我们创建了一个新包,并演示了创建、构建和测试 Move 包的基本流程。在本节中,我们将编写一个使用Sui存储模型并可与之交互的简单应用程序。为此,我们将创建一个简单的待办事项列表应用程序。
1、创建新包
按照与 Hello, World! 中相同的流程,我们将创建一个名为 todo_list 的新包:
$ sui move new todo_list
2、添加代码
为了加快速度并专注于应用程序逻辑,我们将提供待办事项列表应用程序的代码。将 sources/todo_list.move
文件的内容替换为以下代码:
注意:虽然内容乍一看似乎令人不知所措,但我们将在以下部分中对其进行分解。尽量专注于当前手头的事情。
/// Module: todo_list
module todo_list::todo_list;
use std::string::String;
/// List of todos. Can be managed by the owner and shared with others.
public struct TodoList has key, store {
id: UID,
items: vector<String>
}
/// Create a new todo list.
public fun new(ctx: &mut TxContext): TodoList {
let list = TodoList {
id: object::new(ctx),
items: vector[]
};
(list)
}
/// Add a new todo item to the list.
public fun add(list: &mut TodoList, item: String) {
list.items.push_back(item);
}
/// Remove a todo item from the list by index.
public fun remove(list: &mut TodoList, index: u64): String {
list.items.remove(index)
}
/// Delete the list and the capability to manage it.
public fun delete(list: TodoList) {
let TodoList { id, items: _ } = list;
id.delete();
}
/// Get the number of items in the list.
public fun length(list: &TodoList): u64 {
list.items.length()
}
3、构建包
为了确保我们所做的一切都正确无误,让我们通过运行 sui move build
命令来构建包。如果一切正确,你应该会看到类似以下内容的输出:
$ sui move build
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING todo_list
如果此输出后没有错误,则表示你已成功构建包。如果有错误,请确保:
- 代码已正确复制
- 文件名和包名正确
在此阶段,代码失败的其他原因并不多。但是如果你仍然遇到问题,请尝试在此处查找包的结构。
4、设置帐户
要发布包并与之交互,我们需要设置一个帐户(account)。为了简单起见并便于演示,我们将使用 sui devnet 环境。
如果你已经设置了帐户,则可以跳过此步骤。
如果你是第一次执行此操作,则需要创建一个新帐户。为此,请运行 sui client
命令,然后 CLI 将提示你多个问题。答案用 >
标记如下:
$ sui client
Config file ["/path/to/home/.sui/sui_config/client.yaml"] doesn't exist, do you want to connect to a Sui Full node server [y/N]?
> y
Sui Full node server URL (Defaults to Sui Testnet if not specified) :
>
Select key scheme to generate keypair (0 for ed25519, 1 for secp256k1, 2: for secp256r1):
> 0
回答完问题后,CLI 将生成一个新的密钥对并将其保存到配置文件中。您现在可以使用此帐户与网络交互。
要检查我们是否正确设置了帐户,请运行 sui client active-address
命令:
$ sui client active-address
0x....
该命令将输出你的帐户地址,以 0x 开头,后跟 64 个字符。
5、请求测试币
在 devnet 和 testnet 环境中,CLI 提供了一种向你的帐户请求测试币的方法,以便你可以与网络交互。要请求测试币,请运行 sui client faucet
命令:
$ sui client faucet
Request successful. It can take up to 1 minute to get the coin. Run sui client gas to check your gas coins.
稍等片刻后,你可以通过运行 sui client balance
命令来检查 Coin 对象是否已发送到你的帐户:
$ sui client balance
╭────────────────────────────────────────╮
│ Balance of coins owned by this address │
├────────────────────────────────────────┤
│ ╭──────────────────────────────────╮ │
│ │ coin balance (raw) balance │ │
│ ├──────────────────────────────────┤ │
│ │ Sui 1000000000 1.00 SUI │ │
│ ╰──────────────────────────────────╯ │
╰────────────────────────────────────────╯
或者,你可以通过运行 sui client object
命令来查询你帐户拥有的对象。实际输出会有所不同,因为对象 ID 是唯一的,摘要也是如此,但结构会类似:
$ sui client objects
╭───────────────────────────────────────────────────────────────────────────────────────╮
│ ╭────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ objectId │ 0x4ea1303e4f5e2f65fc3709bc0fb70a3035fdd2d53dbcff33e026a50a742ce0de │ │
│ │ version │ 4 │ │
│ │ digest │ nA68oa8gab/CdIRw+240wze8u0P+sRe4vcisbENcR4U= │ │
│ │ objectType │ 0x0000..0002::coin::Coin │ │
│ ╰────────────┴──────────────────────────────────────────────────────────────────────╯ │
╰───────────────────────────────────────────────────────────────────────────────────────╯
现在我们已经设置了帐户,并且帐户中有硬币,我们可以与网络进行交互。我们将首先将包发布到网络。
6、发布
要将包发布到网络,我们将使用 sui client publish
命令。该命令将自动构建包并使用其字节码在单个交易中发布。
我们在发布期间使用 --gas-budget
参数。它指定我们愿意在交易上花费多少 gas。我们不会在本部分中涉及这个主题,但重要的是要知道 Sui 中的每笔交易都需要 gas,并且 gas 以 SUI 币支付。
gas-budget
以 MIST 为单位指定。1 SUI 等于 10^9 MIST。为了演示,我们将使用 100,000,000 MIST,即 0.1 SUI。
# run this from the `todo_list` folder
$ sui client publish --gas-budget 100000000
# alternatively, you can specify path to the package
$ sui client publish --gas-budget 100000000 todo_list
publish 命令的输出相当长,因此我们将分部分展示和解释。
$ sui client publish --gas-budget 100000000
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING todo_list
Successfully verified dependencies on-chain against source.
Transaction Digest: GpcDV6JjjGQMRwHpEz582qsd5MpCYgSwrDAq1JXcpFjW
如你所见,当我们运行发布命令时,CLI 首先构建包,然后在链上验证依赖项,最后发布包。该命令的输出是交易摘要,它是交易的唯一标识符,可用于查询交易状态。
6.1 交易数据
标题为 TransactionData
的部分包含有关我们刚刚发送的交易的信息。它具有发送者(即你的地址)、使用 --gas-budget
参数设置的 gas_budget
以及我们用于付款的 Coin 等字段。它还打印 CLI 运行的命令。在此示例中,运行了命令 Publish
和 TransferObject
- 后者将特殊对象 UpgradeCap
传输给发送者。
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Data │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Sender: 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │
│ Gas Owner: 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │
│ Gas Budget: 100000000 MIST │
│ Gas Price: 1000 MIST │
│ Gas Payment: │
│ ┌── │
│ │ ID: 0x4ea1303e4f5e2f65fc3709bc0fb70a3035fdd2d53dbcff33e026a50a742ce0de │
│ │ Version: 7 │
│ │ Digest: AXYPnups8A5J6pkvLa6RekX2ye3qur66EZ88mEbaUDQ1 │
│ └── │
│ │
│ Transaction Kind: Programmable │
│ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ Input Objects │ │
│ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 Pure Arg: Type: address, Value: "0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1" │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────────────────────────────╮ │
│ │ Commands │ │
│ ├─────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 Publish: │ │
│ │ ┌ │ │
│ │ │ Dependencies: │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │
│ │ └ │ │
│ │ │ │
│ │ 1 TransferObjects: │ │
│ │ ┌ │ │
│ │ │ Arguments: │ │
│ │ │ Result 0 │ │
│ │ │ Address: Input 0 │ │
│ │ └ │ │
│ ╰─────────────────────────────────────────────────────────────────────────╯ │
│ │
│ Signatures: │
│ gebjSbVwZwTkizfYg2XIuzdx+d66VxFz8EmVaisVFiV3GkDay6L+hQG3n2CQ1hrWphP6ZLc7bd1WRq4ss+hQAQ== │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
6.2 交易效果
交易效果包含交易的状态、交易对网络状态所做的更改以及交易涉及的对象:
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Effects │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Digest: GpcDV6JjjGQMRwHpEz582qsd5MpCYgSwrDAq1JXcpFjW │
│ Status: Success │
│ Executed Epoch: 411 │
│ │
│ Created Objects: │
│ ┌── │
│ │ ID: 0x160f7856e13b27e5a025112f361370f4efc2c2659cb0023f1e99a8a84d1652f3 │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ Version: 8 │
│ │ Digest: 8y6bhwvQrGJHDckUZmj2HDAjfkyVqHohhvY1Fvzyj7ec │
│ └── │
│ ┌── │
│ │ ID: 0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe │
│ │ Owner: Immutable │
│ │ Version: 1 │
│ │ Digest: Ein91NF2hc3qC4XYoMUFMfin9U23xQmDAdEMSHLae7MK │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ID: 0x4ea1303e4f5e2f65fc3709bc0fb70a3035fdd2d53dbcff33e026a50a742ce0de │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ Version: 8 │
│ │ Digest: 7ydahjaM47Gyb33PB4qnW2ZAGqZvDuWScV6sWPiv7LTc │
│ └── │
│ Gas Object: │
│ ┌── │
│ │ ID: 0x4ea1303e4f5e2f65fc3709bc0fb70a3035fdd2d53dbcff33e026a50a742ce0de │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ Version: 8 │
│ │ Digest: 7ydahjaM47Gyb33PB4qnW2ZAGqZvDuWScV6sWPiv7LTc │
│ └── │
│ Gas Cost Summary: │
│ Storage Cost: 10404400 MIST │
│ Computation Cost: 1000000 MIST │
│ Storage Rebate: 978120 MIST │
│ Non-refundable Storage Fee: 9880 MIST │
│ │
│ Transaction Dependencies: │
│ 7Ukrc5GqdFqTA41wvWgreCdHn2vRLfgQ3YMFkdks72Vk │
│ 7d4amuHGhjtYKujEs9YkJARzNEn4mRbWWv3fn4cdKdyh │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
6.3 事件
如果有任何事件发出,你将在此部分中看到它们。我们的包不使用事件,因此此部分为空:
╭─────────────────────────────╮
│ No transaction block events │
╰─────────────────────────────╯
6.4 对象更改
这些是交易对对象所做的更改。在我们的例子中,我们创建了一个新的 UpgradeCap
对象,这是一个特殊对象,允许发送者将来升级包,改变 Gas 对象并发布新包。包也是 Sui 上的对象。
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├──────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0x160f7856e13b27e5a025112f361370f4efc2c2659cb0023f1e99a8a84d1652f3 │
│ │ Sender: 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ ObjectType: 0x2::package::UpgradeCap │
│ │ Version: 8 │
│ │ Digest: 8y6bhwvQrGJHDckUZmj2HDAjfkyVqHohhvY1Fvzyj7ec │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x4ea1303e4f5e2f65fc3709bc0fb70a3035fdd2d53dbcff33e026a50a742ce0de │
│ │ Sender: 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 8 │
│ │ Digest: 7ydahjaM47Gyb33PB4qnW2ZAGqZvDuWScV6sWPiv7LTc │
│ └── │
│ Published Objects: │
│ ┌── │
│ │ PackageID: 0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe │
│ │ Version: 1 │
│ │ Digest: Ein91NF2hc3qC4XYoMUFMfin9U23xQmDAdEMSHLae7MK │
│ │ Modules: todo_list │
│ └── │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
6.5 余额变化
最后一部分包含对 SUI 币的更改,在我们的例子中,我们花费了大约 0.015 SUI,在 MIST 中是 10,500,000。您可以在输出中的金额字段下看到它:
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Balance Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ Amount: -10426280 │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
6.6 替代输出
可以在发布期间指定 --json
标志以获取 JSON 格式的输出。如果你想以编程方式解析输出或将其存储以供以后使用,这将非常有用:
$ sui client publish --gas-budget 100000000 --json
6.7 使用结果
在链上发布包后,我们可以与其进行交互。为此,我们需要找到包的地址(对象 ID)。它位于 Object Changes 输出的“已发布对象”部分下。每个包的地址都是唯一的,因此你需要从输出中复制它。
在此示例中,地址为:
0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe
现在我们有了地址,我们可以与包进行交互。在下一节中,我们将展示如何通过发送交易与包进行交互。
7、发送交易
为了演示与 todo_list 包的交互,我们将发送一个交易来创建一个新列表并向其中添加一个项目。交易通过 sui client ptb
命令发送,它允许充分利用交易块。该命令可能看起来很大很复杂,但我们会一步一步地介绍它。
7.1 准备变量
在构造命令之前,让我们存储我们将在交易中使用的值。将 0x4.... 替换为你已发布的包的地址。 MY_ADDRESS
变量将自动从 CLI 输出设置为你的地址。
$ export PACKAGE_ID=0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe
$ export MY_ADDRESS=$(sui client active-address)
7.2 在 CLI 中构建交易
现在来构建实际交易。交易将由两部分组成:我们将调用 todo_list 包中的新函数来创建新列表,然后将列表对象转移到我们的帐户。交易将如下所示:
$ sui client ptb \
--gas-budget 100000000 \
--assign sender @$MY_ADDRESS \
--move-call $PACKAGE_ID::todo_list::new \
--assign list \
--transfer-objects "[list]" sender
在此命令中,我们使用 ptb
子命令来构建交易。其后的参数定义交易将执行的实际命令和操作。我们进行的前两个调用是实用程序调用,用于将发送方地址设置为命令输入并设置交易的 gas 预算:
# sets the gas budget for the transaction
--gas-budget 100000000 \n
# registers a variable "sender=@..."
--assign sender @$MY_ADDRESS \n
然后我们对包中的函数执行实际调用。我们使用 --move-call
后跟包 ID、模块名称和函数名称。在本例中,我们调用 todo_list 包中的 new
函数。
# calls the "new" function in the "todo_list" package under the $PACKAGE_ID address
--move-call $PACKAGE_ID::todo_list::new
我们定义的函数实际上返回一个值,我们需要存储该值。我们使用 --assign
命令为返回的值命名。在本例中,我们将其称为 list
,然后将对象转移到我们的帐户:
--move-call $PACKAGE_ID::todo_list::new \
# assigns the result of the "new" function to the "list" variable (from the previous step)
--assign list \
# transfers the object to the sender
--transfer-objects "[list]" sender
构造命令后,你可以在终端中运行它。如果一切正确,你应该看到类似于之前的输出。我们在前面的部分中已经提到过。输出将包含交易摘要、交易数据和交易效果。
我们要关注的部分是“对象更改”。更具体地说,是其中的“创建的对象”部分。它包含你创建的 TodoList 的对象 ID、类型和版本。我们将使用此对象 ID 与列表进行交互:
╭───────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553 │
│ │ Sender: 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ ObjectType: 0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList │
│ │ Version: 22 │
│ │ Digest: HyWdUpjuhjLY38dLpg6KPHQ3bt4BqQAbdF5gB8HQdEqG │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0xe5ddeb874a8d7ead328e9f2dd2ad8d25383ab40781a5f1aefa75600973b02bc4 │
│ │ Sender: 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │
│ │ Owner: Account Address ( 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 22 │
│ │ Digest: DiBrBMshDiD9cThpaEgpcYSF76uV4hCoE1qRyQ3rnYCB │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────╯
此例对象 ID 0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553
。所有者应该是你的帐户地址。我们通过在交易的最后一条命令中将对象转移给发送者来实现这一点。
测试你是否已成功创建列表的另一种方法是检查帐户对象:
$ sui client objects
它应该有一个类似于此的对象:
╭ ... ╮
│ ╭────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ objectId │ 0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553 │ │
│ │ version │ 22 │ │
│ │ digest │ /DUEiCLkaNSgzpZSq2vSV0auQQEQhyH9occq9grMBZM= │ │
│ │ objectType │ 0x468d..29fe::todo_list::TodoList │ │
│ ╰────────────┴──────────────────────────────────────────────────────────────────────╯ │
| ... |
7.3 将对象传递给函数
我们在上一步中创建的 TodoList 是一个你可以作为其所有者与之交互的对象。你可以在此对象上调用 todo_list 模块中定义的函数。为了演示这一点,我们将向列表中添加一个项目。首先,我们将只添加一个项目,在第二个事务中,我们将添加 3 个项目并删除另一个项目。
仔细检查你是否已在上一步中设置了变量,然后为列表对象添加另一个变量:
$ export LIST_ID=0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553
现在我们可以构造事务以将项目添加到列表中。命令将如下所示:
$ sui client ptb \
--gas-budget 100000000 \
--move-call $PACKAGE_ID::todo_list::add @$LIST_ID "'Finish the Hello, Sui chapter'"
在此命令中,我们调用 todo_list 包中的 add
函数。该函数接受两个参数:列表对象和要添加的项目。该项目是一个字符串,因此我们需要将其括在单引号中。该命令将该项目添加到列表中。
如果一切正确,你应该看到与我们在前几节中提到的类似的输出。现在你可以检查列表对象以查看是否添加了该项目:
$ sui client object $LIST_ID
输出应包含你添加的项目:
╭───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ objectId │ 0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553 │
│ version │ 24 │
│ digest │ FGcXH8MGpMs5BdTnC62CQ3VLAwwexYg2id5DKU7Jr9aQ │
│ objType │ 0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList │
│ owner │ ╭──────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ │ AddressOwner │ 0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1 │ │
│ │ ╰──────────────┴──────────────────────────────────────────────────────────────────────╯ │
│ prevTx │ EJVK6FEHtfTdCuGkNsU1HcrmUBEN6H6jshfcptnw8Yt1 │
│ storageRebate │ 1558000 │
│ content │ ╭───────────────────┬───────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ │ dataType │ moveObject │ │
│ │ │ type │ 0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList │ │
│ │ │ hasPublicTransfer │ true │ │
│ │ │ fields │ ╭───────┬───────────────────────────────────────────────────────────────────────────────╮ │ │
│ │ │ │ │ id │ ╭────┬──────────────────────────────────────────────────────────────────────╮ │ │ │
│ │ │ │ │ │ │ id │ 0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553 │ │ │ │
│ │ │ │ │ │ ╰────┴──────────────────────────────────────────────────────────────────────╯ │ │ │
│ │ │ │ │ items │ ╭─────────────────────────────────╮ │ │ │
│ │ │ │ │ │ │ finish the Hello, Sui chapter │ │ │ │
│ │ │ │ │ │ ╰─────────────────────────────────╯ │ │ │
│ │ │ │ ╰───────┴───────────────────────────────────────────────────────────────────────────────╯ │ │
│ │ ╰───────────────────┴───────────────────────────────────────────────────────────────────────────────────────────╯ │
╰───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
可以通过在命令中添加 --json
标志来获取对象的 JSON 表示:
$ sui client object $LIST_ID --json
{
"objectId": "0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553",
"version": "24",
"digest": "FGcXH8MGpMs5BdTnC62CQ3VLAwwexYg2id5DKU7Jr9aQ",
"type": "0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList",
"owner": {
"AddressOwner": "0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1"
},
"previousTransaction": "EJVK6FEHtfTdCuGkNsU1HcrmUBEN6H6jshfcptnw8Yt1",
"storageRebate": "1558000",
"content": {
"dataType": "moveObject",
"type": "0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList",
"hasPublicTransfer": true,
"fields": {
"id": {
"id": "0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553"
},
"items": ["Finish the Hello, Sui chapter"]
}
}
}
7.4 命令级联
可以在单个事务中级联多个命令。这显示了事务块的强大功能!使用相同的列表对象,我们将添加另外三个项目并删除一个。该命令将如下所示:
$ sui client ptb \
--gas-budget 100000000 \
--move-call $PACKAGE_ID::todo_list::add @$LIST_ID "'Finish Concepts chapter'" \
--move-call $PACKAGE_ID::todo_list::add @$LIST_ID "'Read the Move Basics chapter'" \
--move-call $PACKAGE_ID::todo_list::add @$LIST_ID "'Learn about Object Model'" \
--move-call $PACKAGE_ID::todo_list::remove @$LIST_ID 0
如果之前的命令成功,则此命令应该没有什么不同。你可以检查列表对象以查看项目是否已添加和删除。JSON 表示更具可读性!
sui client object $LIST_ID --json
{
"objectId": "0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553",
"version": "25",
"digest": "EDTXDsteqPGAGu4zFAj5bbQGTkucWk4hhuUquk39enGA",
"type": "0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList",
"owner": {
"AddressOwner": "0x091ef55506ad814920adcef32045f9078f2f6e9a72f4cf253a1e6274157380a1"
},
"previousTransaction": "7SXLGBSh31jv8G7okQ9mEgnw5MnTfvzzHEHpWf3Sa9gY",
"storageRebate": "1922800",
"content": {
"dataType": "moveObject",
"type": "0x468daa33dfcb3e17162bbc8928f6ec73744bb08d838d1b6eb94eac99269b29fe::todo_list::TodoList",
"hasPublicTransfer": true,
"fields": {
"id": {
"id": "0x20e0bede16de8a728ab25e228816b9059b45ebea49c8ad384e044580b2d3e553"
},
"items": [
"Finish Concepts chapter",
"Read the Move Basics chapter",
"Learn about Object Model"
]
}
}
}
命令不必位于同一个包中或对同一个对象进行操作。在单个事务块中,您可以与多个包和对象进行交互。这是一个强大的功能,可让您在链上构建复杂的交互!
8、结束语
在本指南中,我们展示了如何在 Move 区块链上发布包并使用 Sui CLI 与其进行交互。我们演示了如何创建新的列表对象、向其中添加项目以及删除它们。我们还展示了如何在单个事务块中级联多个命令。本指南为你在 Sui 区块链上构建自己的应用程序提供了一个良好的起点!
原文链接:Hello, Sui!
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。