Skip to main content

Sui Client CLI

Sui CLI 的 client 命令提供了直接通过命令行与 Sui 网络交互的能力。使用 sui client 常见的操作包括发布 Move 智能合约、查询对象信息、执行交易,以及管理地址等。

验证 Sui CLI 的安装

在使用 Sui CLI 前,您需要先进行安装。要验证您的系统是否已安装 CLI,可以打开终端或控制台,输入下列命令:

sui --version

如果终端或控制台显示了版本号,说明您的系统已安装 Sui CLI。

如果出现“命令未找到”的提示,请根据 Sui 安装指南 的指导在您的系统中安装 Sui CLI。

命令

下面是 sui client 命令所有可用子命令的列表。

Usage: sui client [OPTIONS] [COMMAND]

Commands:
active-address Default address used for commands when none specified
active-env Default environment used for commands when none specified
addresses Obtain the Addresses managed by the client
call Call Move function
chain-identifier Query the chain identifier from the rpc endpoint
dynamic-field Query a dynamic field by its address
envs List all Sui environments
execute-signed-tx Execute a Signed Transaction. This is useful when the user prefers to sign elsewhere and use this command to execute
gas Obtain all gas objects owned by the address
merge-coin Merge two coin objects into one coin
new-address Generate new address and keypair with keypair scheme flag {ed25519 | secp256k1 | secp256r1} with optional derivation path, default to m/44'/784'/0'/0'/0' for
ed25519 or m/54'/784'/0'/0/0 for secp256k1 or m/74'/784'/0'/0/0 for secp256r1. Word length can be { word12 | word15 | word18 | word21 | word24} default to word12 if not specified
new-env Add new Sui environment
object Get object info
objects Obtain all objects owned by the address
pay Pay coins to recipients following specified amounts, with input coins. Length of recipients must be the same as that of amounts
pay-all-sui Pay all residual SUI coins to the recipient with input coins, after deducting the gas cost. The input coins also include the coin for gas payment, so no extra gas
coin is required
pay-sui Pay SUI coins to recipients following following specified amounts, with input coins. Length of recipients must be the same as that of amounts. The input coins also
include the coin for gas payment, so no extra gas coin is required
publish Publish Move modules
replay-transaction Replay a given transaction to view transaction effects. Set environment variable MOVE_VM_STEP=1 to debug.
replay-batch Replay transactions listed in a file.
replay-checkpoint Replay all transactions in a range of checkpoints.
split-coin Split a coin object into multiple coins
switch Switch active address and network(e.g., devnet, local rpc server)
tx-block Get the effects of executing the given transaction block
transfer Transfer object
transfer-sui Transfer SUI, and pay gas with the same SUI coin object. If amount is specified, only the amount is transferred; otherwise the entire object is transferred
upgrade Upgrade Move modules
verify-bytecode-meter Run the bytecode verifier on the package
verify-source Verify local Move packages against on-chain packages, and optionally their dependencies
help Print this message or the help of the given subcommand(s)

Options:
--client.config <CONFIG> Sets the file storing the state of our user accounts (an empty one will be created if missing)
--json Return command outputs in json format
-y, --yes
-h, --help Print help

JSON 输出

在命令中加入 --json 标志可以将输出格式从默认的、更易于人类阅读的 Sui CLI 格式转换为 JSON 格式。这对于处理大型数据集特别有帮助,因为在小屏幕上展示这些大量数据可能会遇到问题。在这种情况下,使用 --json 标志是一个不错的选择。

示例

下面的示例展示了一些常用的命令。

列出所有可用的网络环境

通过使用 sui client envs 命令,您可以查看 CLI 中配置的网络环境。这些环境的相关信息还储存在 Sui 配置目录的 client.yaml 文件(路径为 ~/.sui/sui_config)中。

╭────────┬────────────────────────────────────┬────────╮
alias │ url │ active │
├────────┼────────────────────────────────────┼────────┤
│ devnet │ https://fullnode.devnet.sui.io:443 │ * │
╰────────┴────────────────────────────────────┴────────╯

添加网络环境

利用 client new-env 命令可以添加新的网络环境配置。例如,下面的示例展示了如何创建一个指向 Sui 主网的网络环境配置。设定 alias(别名)有助于减少在引用该环境时出现的打字错误。执行这个命令后,Sui 会自动在 ~/.sui/sui_config 路径下的 client.yaml 文件中更新这些新的配置信息。

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

Added new Sui env [mainnet] to config.

设置当前网络环境

通过使用 sui client switch 命令,您可以更改当前正在使用的网络。例如,以下命令将当前网络切换至 mainnet

$ sui client switch --env mainnet

Active environment switched to [mainnet]

执行这个命令后,如果您运行 sui client envs,会在表格中 mainnet 对应行的 active 列看到一个星号(或active),表示它是当前活跃的网络。

获取当前环境

使用 sui client active-address 命令来查看当前地址。当您没有提供Sui地址值时,CLI将使用当前活动地址来执行特定于地址的CLI命令(例如 sui client objects )。

$ sui client active-address
0x514692f08249c3e9951234ce29074695840422564bff85e424b56de462913e0d

根据地址获取对象信息

使用 sui client objects 命令来列出当前地址拥有对象的摘要信息。您可以向该命令提供一个Sui地址,以列出特定地址的对象。例如,本示例展示了如何列出当前地址拥有的对象信息。

$ sui client objects 0x36df11369cf00ecf0be68d6ba965b0abe2e883bc5245911e3a29ebfa0aaf6b69

╭───────────────────────────────────────────────────────────────────────────────────────╮
| ╭────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ objectId │ 0xfffbb30ccb631f15f6cd36700589fc9c31cb04af28a95f3ed26d62daf3acb57f │ │
│ │ version │ 33363559 │ │
│ │ digest │ IY7/qsIJhliQL0uxwSzNYu0SMcn5AMsqQklSGngn1V0= │ │
│ │ objectType │ 0x0000..0002::coin::Coin │ │
│ ╰────────────┴──────────────────────────────────────────────────────────────────────╯ │
│ ╭────────────┬──────────────────────────────────────────────────────────────────────╮ │
│ │ objectId │ 0xfffe59fb6f78b1ced7f6537e69a205cc45d105270857bfd66332f9a627a38ae0 │ │
│ │ version │ 33370864 │ │
│ │ digest │ b+tKChvujbCk/UCm8L+lflyb6Vjt7beB+uz6+ahUHmM= │ │
│ │ objectType │ 0x0000..0002::coin::Coin │ │
│ ╰────────────┴──────────────────────────────────────────────────────────────────────╯ │
╰───────────────────────────────────────────────────────────────────────────────────────╯

获取对象的完整信息

使用 sui client object <OBJECT-ID> 命令来列出您提供的ID的对象信息。这个示例显示了一个Coin对象的信息:

$ sui client object 0xfffbb30ccb631f15f6cd36700589fc9c31cb04af28a95f3ed26d62daf3acb57f
╭───────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ objectId │ 0xfffbb30ccb631f15f6cd36700589fc9c31cb04af28a95f3ed26d62daf3acb57f │
│ version │ 33363559 │
│ digest │ 3FzvXJVVVcXb9H6dEXdARaY9EmxXyyNFduet3X4eYV4x │
│ objType │ 0x2::coin::Coin<0x2::sui::SUI> │
│ ownerType │ AddressOwner │
│ prevTx │ ES2RQThjRE5u8rwiUEnhcnMoLA3cHeEGYJ8Pq98tmyAc │
│ storageRebate │ 988000 │
│ content │ ╭───────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ │ dataType │ moveObject │ │
│ │ │ type │ 0x2::coin::Coin<0x2::sui::SUI> │ │
│ │ │ hasPublicTransfer │ true │ │
│ │ │ fields │ ╭─────────┬───────────────────────────────────────────────────────────────────────────────╮ │ │
│ │ │ │ │ balance │ 530076676 │ │ │
│ │ │ │ │ id │ ╭────┬──────────────────────────────────────────────────────────────────────╮ │ │ │
│ │ │ │ │ │ │ id │ 0xfffbb30ccb631f15f6cd36700589fc9c31cb04af28a95f3ed26d62daf3acb57f │ │ │ │
│ │ │ │ │ │ ╰────┴──────────────────────────────────────────────────────────────────────╯ │ │ │
│ │ │ │ ╰─────────┴───────────────────────────────────────────────────────────────────────────────╯ │ │
│ │ ╰───────────────────┴─────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰───────────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

获取一个对象的动态(对象)字段

使用 sui client dynamic-field <DYNAMIC-FIELD-ID> 命令来列出您提供的ID的动态字段的详细信息。

$ sui client dynamic-field 0x5
╭─────────────┬───────────────────────────────────────────────────────────────────────────────────────────╮
│ hasNextPage │ false │
│ nextCursor │ 0x5b890eaf2abcfa2ab90b77b8e6f3d5d8609586c3e583baf3dccd5af17edf48d1 │
│ data │ ╭───────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ │ ╭────────────┬──────────────────────────────────────────────────────────────────────╮ │ │
│ │ │ │ name │ ╭───────┬───────╮ │ │ │
│ │ │ │ │ │ type │ u64 │ │ │ │
│ │ │ │ │ │ value │ 2 │ │ │ │
│ │ │ │ │ ╰───────┴───────╯ │ │ │
│ │ │ │ bcsName │ LQM2cdzDY3 │ │ │
│ │ │ │ type │ DynamicField │ │ │
│ │ │ │ objectType │ 0x3::sui_system_state_inner::SuiSystemStateInnerV2 │ │ │
│ │ │ │ objectId │ 0x5b890eaf2abcfa2ab90b77b8e6f3d5d8609586c3e583baf3dccd5af17edf48d1 │ │ │
│ │ │ │ version │ 112 │ │ │
│ │ │ │ digest │ HMrm1KNKjq3GfB1cWTRdvRo8gk7auhgvoZXaVoyEHqUR │ │ │
│ │ │ ╰────────────┴──────────────────────────────────────────────────────────────────────╯ │ │
│ │ ╰───────────────────────────────────────────────────────────────────────────────────────╯ │
╰─────────────┴───────────────────────────────────────────────────────────────────────────────────────────╯

发布 Move 包

sui client 命令的主要用途之一是在Sui网络上发布智能合约。以下示例将当前环境切换到Devnet,然后构建、测试并发布Sui 代码库中提供的一个现有Move示例:

此示例中还使用了sui move命令。要了解更多有关这些命令的信息,请参阅 Sui Move CLI

  1. 打开终端或控制台,导航到您本地Sui存储库的根目录,然后转到move_tutorial示例。

    cd examples/move
    cd first_package
  2. 切换到Devnet网络。此命令使用了一个别名,所以devnet的值可能会因您在配置中设置的别名而不同。根据您的配置设置,请使用正确的别名值执行以下命令。

    sui client switch --env devnet
  3. 使用 sui move build 命令来构建软件包。您必须在与软件包清单文件(Move.toml)相同的级别运行此命令。控制台会返回构建的状态。

    sui move build
    INCLUDING DEPENDENCY Sui
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING first_package
  4. 使用 sui move test 命令来运行单元测试。控制台会实时更新进度。

    sui move test
    INCLUDING DEPENDENCY Sui
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING first_package
    Running Move unit tests
    [ PASS ] 0x0::example::test_module_init
    [ PASS ] 0x0::example::test_sword_transactions
    Test result: OK. Total tests: 2; passed: 2; failed: 0
  5. 使用 sui client verify-bytecode-meter 命令来检查模块是否通过了字节码计量。控制台会返回允许的包最大值以及当前包使用的量。

    $ sui client verify-bytecode-meter
    Running bytecode verifier for 1 modules
    ╭──────────────────────────────────╮
    │ Module will pass metering check!
    ├────────┬────────────┬────────────┤
    │ │ Module │ Function │
    │ Max │ 1600000016000000
    │ Used │ 45654565
    ╰────────┴────────────┴────────────╯
  6. 使用 sui client gas 命令来验证当前地址是否具有用于支付Gas的代币。在这个示例中,控制台会返回当前地址没有代币。

    $ sui client gas
    No gas coins are owned by this address
  7. 如果您需要代币,请使用cURL命令为地址获取Gas(在Mainnet不可用)。有关在开发网络上为地址获取燃料的更多信息,请参阅获取Sui代币

    $ curl --location --request POST 'https://faucet.devnet.sui.io/v1/gas' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "FixedAmountRequest": {
    "recipient": "0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"
    }
    }'
    {"task":"10bba759-d4fe-4a7a-ab59-5264056b5665","error":null}
  8. 使用 sui client gas 命令来验证当前活跃地址是否已收到代币。

    $ sui client gas
    ╭────────────────────────────────────────────────────────────────────┬─────────────╮
    │ gasCoinId │ gasBalance │
    ├────────────────────────────────────────────────────────────────────┼─────────────┤
    │ 0x2f3799d094573b0958eef703b95996fe459bb00afc2d09866335c30cf480e522 │ 10000000000
    ╰────────────────────────────────────────────────────────────────────┴─────────────╯
  9. 使用sui client publish命令来发布包,与此同时要确保 gas-budget 设置为适当的值。控制台会返回发布的详细信息。您可以使用 sui client object <OBJECT-ID> 来检查该过程中的任何对象的详细信息。

    $ sui client publish --gas-budget 5000000

    INCLUDING DEPENDENCY Sui
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING MyFirstPackage
    Successfully verified dependencies on-chain against source.
    ----- Transaction Digest ----
    CUQ1zpA3huX4ihQFA6gP7csRkiWk6eWRcjTWmjjDPeYn
    ----- Transaction Data ----
    Transaction Signature: [Signature(Ed25519SuiSignature(Ed25519SuiSignature([0, 189, 223, 46, 165, 20, 213, 149, 2, 12, 79, 255, 17, 126, 202, 76, 195, 212, 99, 166, 254, 93, 190, 133, 204, 161, 25, 190, 69, 131, 195, 163, 93, 160, 72, 223, 134, 144, 114, 173, 221, 70, 170, 43, 131, 46, 102, 86, 145, 18, 14, 148, 51, 0, 55, 55, 187, 32, 146, 96, 78, 83, 31, 87, 12, 162, 66, 26, 47, 17, 241, 59, 37, 133, 135, 78, 216, 225, 200, 140, 142, 171, 110, 191, 173, 163, 87, 145, 250, 249, 78, 142, 40, 11, 99, 164, 151])))]
    Transaction Kind : Programmable
    Inputs: [Pure(SuiPureValue { value_type: Some(Address), value: "0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d" })]
    Commands: [
    Publish(<modules>,0x0000000000000000000000000000000000000000000000000000000000000001,0x0000000000000000000000000000000000000000000000000000000000000002),
    TransferObjects([Result(0)],Input(0)),
    ]

    Sender: 0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d
    Gas Payment: Object ID: 0x2f3799d094573b0958eef703b95996fe459bb00afc2d09866335c30cf480e522, version: 0x4, digest: 2fuBEeoR22HizJr9XXD3XdbHQ3JAvt8U3fcqnxvkgjnk
    Gas Owner: 0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d
    Gas Price: 1000
    Gas Budget: 50000000

    ----- Transaction Effects ----
    Status : Success
    Created Objects:
    - ID: 0x1197a4e9ff864f2f271d9e8765c38f3b5a5a7910a9efc7b0817fc6eb1be88397 , Owner: Immutable
    - ID: 0x5920fedb5e0b6e31af6e10355fdbef9e0f812d29c4f74635e13b950792e64098 , Owner: Account Address ( 0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d )
    - ID: 0xb9996e75239d7235e8e6cd8f77b04717639d7a3f061bbb818a6d3667967ae14f , Owner: Account Address ( 0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d )
    Mutated Objects:
    - ID: 0x2f3799d094573b0958eef703b95996fe459bb00afc2d09866335c30cf480e522 , Owner: Account Address ( 0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d )

    ----- Events ----
    Array []
    ----- Object changes ----
    Array [
    Object {
    "type": String("mutated"),
    "sender": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    "owner": Object {
    "AddressOwner": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    },
    "objectType": String("0x2::coin::Coin<0x2::sui::SUI>"),
    "objectId": String("0x2f3799d094573b0958eef703b95996fe459bb00afc2d09866335c30cf480e522"),
    "version": String("5"),
    "previousVersion": String("4"),
    "digest": String("7T2QvGtYh4ZZw7NgYeyTAey85t6G1zNTmd1G6S9ue6LS"),
    },
    Object {
    "type": String("published"),
    "packageId": String("0x1197a4e9ff864f2f271d9e8765c38f3b5a5a7910a9efc7b0817fc6eb1be88397"),
    "version": String("1"),
    "digest": String("772oquNYzS4n9X76dCuFroRufgGy1rUjxLYucnVSA7iV"),
    "modules": Array [
    String("my_module"),
    ],
    },
    Object {
    "type": String("created"),
    "sender": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    "owner": Object {
    "AddressOwner": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    },
    "objectType": String("0x1197a4e9ff864f2f271d9e8765c38f3b5a5a7910a9efc7b0817fc6eb1be88397::my_module::Forge"),
    "objectId": String("0x5920fedb5e0b6e31af6e10355fdbef9e0f812d29c4f74635e13b950792e64098"),
    "version": String("5"),
    "digest": String("9knQ6sKza7MZqpn98M2r4EdYiGifTBFJ41B8bTQnYGDs"),
    },
    Object {
    "type": String("created"),
    "sender": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    "owner": Object {
    "AddressOwner": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    },
    "objectType": String("0x2::package::UpgradeCap"),
    "objectId": String("0xb9996e75239d7235e8e6cd8f77b04717639d7a3f061bbb818a6d3667967ae14f"),
    "version": String("5"),
    "digest": String("zPz3XUKyrN1gL8TrnTcuXkdDfEseSpVcSykEjwuw6dc"),
    },
    ]
    ----- Balance changes ----
    Array [
    Object {
    "owner": Object {
    "AddressOwner": String("0x514692f08249c3e9957799ce29074695840422564bff85e424b56de462913e0d"),
    },
    "coinType": String("0x2::sui::SUI"),
    "amount": String("-10327480"),
    },
    ]

帮助

Sui CLI 中每一个命令都提供了相关帮助提示. 例如sui client call --help:

Call Move function

Usage: sui client call [OPTIONS] --package <PACKAGE> --module <MODULE> --function <FUNCTION> --gas-budget <GAS_BUDGET>

Options:
--package <PACKAGE> Object ID of the package, which contains the module
--module <MODULE> The name of the module in the package
--function <FUNCTION> Function name in module
--type-args <TYPE_ARGS>... Type arguments to the generic function being called. All must be specified, or the call will fail
--args <ARGS>... Simplified ordered args like in the function syntax ObjectIDs, Addresses must be hex strings
--gas <GAS> ID of the gas object for gas payment, in 20 bytes Hex string If not provided, a gas object with at least gas_budget value will be selected
--gas-budget <GAS_BUDGET> Gas budget for this call
--serialize-unsigned-transaction Instead of executing the transaction, serialize the bcs bytes of the unsigned transaction data (TransactionData) using base64 encoding, and print out
the string
--serialize-signed-transaction Instead of executing the transaction, serialize the bcs bytes of the signed transaction data (SenderSignedData) using base64 encoding, and print out the
string
--json Return command outputs in json format
-h, --help Print help