Let's Move は、より多くの人々が Move 言語を学ぶことを奨励する SUI のインセンティブプログラムです。
学習ログ (alva-lin)
タスク 1 - hello move#
Sui CLI 基本操作#
参照文書 Sui CLI: Client
ネットワーク#
- 現在追加されているネットワークのリストを表示
sui client envs
出力は以下の通りで、alias はネットワークの別名、url はネットワークのアドレス、active は現在アクティブなネットワークです。
╭─────────┬─────────────────────────────────────┬────────╮
│ alias │ url │ active │
├─────────┼─────────────────────────────────────┼────────┤
│ devnet │ https://fullnode.devnet.sui.io:443 │ │
│ mainnet │ https://fullnode.mainnet.sui.io:443 │ │
│ testnet │ https://fullnode.testnet.sui.io:443 │ * │
╰─────────┴─────────────────────────────────────┴────────╯
- ネットワークを追加
前のネットワークにテストネット (testnet) がない場合は、自分で追加できます。
sui client new-env --alias=testnet --rpc https://fullnode.testnet.sui.io:443
出力は以下の通りです。
Added new Sui env [testnet] to config.
再度 sui client envs
を実行して、リストに追加されたか確認できます。
- 現在の環境のネットワークを切り替え
sui client switch --env testnet
出力は以下の通りです。
Active environment switched to [testnet]
切り替え成功のメッセージが表示され、再度 sui client envs
を実行して、現在のアクティブネットワークが testnet であるか確認できます。
アドレス#
- アドレスリストを表示
sui client addresses
コマンドは環境と似ており、実行後の出力は以下の通りです。
╭──────────────────┬───────────────────────┬────────────────╮
│ alias │ address │ active address │
├──────────────────┼───────────────────────┼────────────────┤
│ adoring-turquois │ 0xb31fc********c57f48 │ * │
╰──────────────────┴───────────────────────┴────────────────╯
- 現在アクティブなアドレスを切り替え
sui client active-address
出力は以下の通りで、現在アクティブなアドレスがすべて表示されます。
0xb31fc********c57f48
コンパイル & 発行 & 呼び出し#
- 新しいパッケージを作成
sui move new 03_hello_move
このコマンドは出力を行わず、現在のパスに sui package フォルダーを作成し、その内容は以下の通りです。
❯ tree 03_hello_move
03_hello_move
├── Move.toml
└── sources
1 directory, 1 file
コードファイルは sources フォルダーに置くだけです。
パッケージ命名の問題:
あなたも私と同様に、学習を記録するために各プロジェクトの前に数字を付けている場合、後続のコードコンパイル時にエラーが発生します。
❯ sui move build UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git INCLUDING DEPENDENCY Sui INCLUDING DEPENDENCY MoveStdlib BUILDING 03_hello_move error[E01002]: unexpected token ┌─ sources/hello_move.move:1:11 │ 1 │ module 03_hello_move::hello { │ ^^^ │ │ │ Unexpected 'hello_move' │ Expected '::' Failed to build Move modules: Compilation error.
解決策は 2 つあります。
(推奨) プロジェクト作成時に、番号なしのプロジェクト名を使用する:
sui move new hello_move
、その後フォルダー名を変更:mv hello_move 03_hello_move
通常通りプロジェクトを作成し、
Move.toml
ファイルの[addresses]
ブロックで03_hello_move
をhello_move
に変更します。また、コードを書く際には、パッケージ名はhello_move
であることに注意してください。もう一つの違いは、
Move.toml
ファイルの[package]
ブロックで、name
フィールドの名前はsui move new <package_name>
のパッケージ名に基づいて直接命名されます。
- コンパイル
まず、パッケージに対応するパスに移動し、次のコマンドを実行します。
sui move build
コードに基本的なエラーがなければ、出力は以下の通りです。
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING 03_hello_move
また、現在のパスに build フォルダーと Move.lock
ファイルが追加されていることに注意してください。
❯ tree -L 2
.
├── Move.lock
├── Move.toml
├── build
│ ├── 03_hello_move
│ └── locks
└── sources
└── hello_move.move
- 発行
発行前に、現在アクティブなネットワークとアドレスに注意が必要です。パッケージに対応するパスで、次のコマンドを実行し、パッケージを対応するネットワークに発行します。
sui client publish --gas-budget 100000000
ここでの gas-budget
は、モジュール初期化プログラムを実行する際のガス費用の予算を指します。
発行が成功すると、以下の内容が出力されます。注意:毎回実行時に出力内容の一部の値は異なる場合がありますが、内容の構造は大体同じです。
出力は複数のブロックに分かれています。
-
トランザクションデータ
-
トランザクション効果
-
トランザクションイベント
-
オブジェクトの変更
-
残高の変更
トランザクション効果
ブロックの 作成されたオブジェクト
出力情報を見つけます。ここで Owner
が Immutable
のオブジェクトが発行されたパッケージです。対応するパッケージ ID は 0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15
です。
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING 03_hello_move
Successfully verified dependencies on-chain against source.
Transaction Digest: FAGtpXnChnj2ZPxoZvt3kAuWY7esvPHGmpHbwAAUcdPX
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Data │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Sender: 0xb31fc********c57f48 │
│ Gas Owner: 0xb31fc********c57f48 │
│ Gas Budget: 100000000 MIST │
│ Gas Price: 1000 MIST │
│ Gas Payment: │
│ ┌── │
│ │ ID: 0x91cbd3fe3422844d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ Version: 920427 │
│ │ Digest: Gucz8kmhru994mu1SMfsrasg3YjsPkzscj5KKkEmxu4X │
│ └── │
│ │
│ Transaction Kind: Programmable │
│ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ Input Objects │ │
│ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 Pure Arg: Type: address, Value: "0xb31fc********c57f48 " │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────────────────────────────╮ │
│ │ Commands │ │
│ ├─────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 Publish: │ │
│ │ ┌ │ │
│ │ │ Dependencies: │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │
│ │ └ │ │
│ │ │ │
│ │ 1 TransferObjects: │ │
│ │ ┌ │ │
│ │ │ Arguments: │ │
│ │ │ Result 0 │ │
│ │ │ Address: Input 0 │ │
│ │ └ │ │
│ ╰─────────────────────────────────────────────────────────────────────────╯ │
│ │
│ Signatures: │
│ Hl+Chc7V72WhwKAwJ3T8PrhCibN9T27nZMNmVFpN7FqiTBPSVbxYfL+B5uyp3oRQ463WjGA8/oJ0cxmRfz92BA== │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Transaction Effects │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Digest: FAGtpXnChnj2ZPxoZvt3kAuWY7esvPHGmpHbwAAUcdPX │
│ Status: Success │
│ Executed Epoch: 318 │
│ │
│ Created Objects: │
│ ┌── │
│ │ ID: 0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15 │
│ │ Owner: Immutable │
│ │ Version: 1 │
│ │ Digest: 2iv1DT3ARdBDwowswWA87ucPubfbEXfYkrcM1R6QyxWd │
│ └── │
│ ┌── │
│ │ ID: 0xea782e392b95749ab43c20d9902f19b2976226391bdbd70e81f380f079932460 │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ Version: 920428 │
│ │ Digest: 6kC43pZb8YDZ9BDisXc3fmktSWt9PxP13N4QNa1sLank │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ID: 0x91cbd3fe342284d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ Version: 920428 │
│ │ Digest: CDN8E9EuPNgtwiLF77ZxAdx8BXMw27uQzcG1ADxuG9fZ │
│ └── │
│ Gas Object: │
│ ┌── │
│ │ ID: 0x91cbd3fe342284d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ Version: 920428 │
│ │ Digest: CDN8E9EuPNgtwiLF77ZxAdx8BXMw27uQzcG1ADxuG9fZ │
│ └── │
│ Gas Cost Summary: │
│ Storage Cost: 7539200 MIST │
│ Computation Cost: 1000000 MIST │
│ Storage Rebate: 978120 MIST │
│ Non-refundable Storage Fee: 9880 MIST │
│ │
│ Transaction Dependencies: │
│ 27si9MdVQzBrEzHWrbZJThtB7nVSHC1x14EuE5r3o2V2 │
│ GZcMfNx5jvGHsfSKEHJD7jZss7yCHqEGfhVk8Jx8a2N1 │
│ HuSWWnS6ZXZyyBpyoaWf7b8N961SPMUW7q9apQ5VkJTr │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────╮
│ No transaction block events │
╰─────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Object Changes │
├──────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0xea782e392b95749ab43c20d9902f19b2976226391bdbd70e81f380f079932460 │
│ │ Sender: 0xb31fc********c57f48 │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ ObjectType: 0x2::package::UpgradeCap │
│ │ Version: 920428 │
│ │ Digest: 6kC43pZb8YDZ9BDisXc3fmktSWt9PxP13N4QNa1sLank │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x91cbd3fe342284d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ Sender: 0xb31fc********c57f48 │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 920428 │
│ │ Digest: CDN8E9EuPNgtwiLF77ZxAdx8BXMw27uQzcG1ADxuG9fZ │
│ └── │
│ Published Objects: │
│ ┌── │
│ │ PackageID: 0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15 │
│ │ Version: 1 │
│ │ Digest: 2iv1DT3ARdBDwowswWA87ucPubfbEXfYkrcM1R6QyxWd │
│ │ Modules: hello │
│ └── │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Balance Changes │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ Amount: -7561080 │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
- 関数を呼び出す
先ほど発行したコントラクトの say_hello
関数を呼び出して、オブジェクトを取得できます。
まず、先ほどのパッケージ ID を変数に保存します。
export PACKAGE_ID=<package object ID>
次に関連コマンドを使用します。
sui client call --package $PACKAGE_ID --module hello --function say_hello --gas-budget 300000000
実行が正しければ、以下の内容が出力されます。
同様に、トランザクション効果
ブロックの 作成されたオブジェクト
を見つけます。今回は 1 つのオブジェクトが作成され、対応する ID 0xc3eb50f39ec09e4e2eed994fdf60f855f4841b3591c94ca85e54047ed105280d
を取得します。
Transaction Digest: 3Ys1pYtBSgUiXUYMsK37KPWftcXX5icbbPLgT1f1frPp
╭──────────────────────────────────────────────────────────╮
│ Transaction Data │
├──────────────────────────────────────────────────────────┤
│ Sender: 0xb31fc********c57f48 │
│ Gas Owner: 0xb31fc********c57f48 │
│ Gas Budget: 300000000 MIST │
│ Gas Price: 1000 MIST │
│ Gas Payment: │
│ ┌── │
│ │ ID: 0x91cbd3fe34228********cd26c54f2a5097a8679fc678b │
│ │ Version: 920429 │
│ │ Digest: BgNZWUPLdG1WNxupJjP8R1RbQdqHYmLYP8GXYHEX2bg │
│ └── │
│ │
│ Transaction Kind: Programmable │
│ No input objects for this transaction │
│ ╭────────────────────────────────────────────────────╮ │
│ │ Commands │ │
│ ├────────────────────────────────────────────────────┤ │
│ │ 0 MoveCall: │ │
│ │ ┌ │ │
│ │ │ Function: say_hello │ │
│ │ │ Module: hello │ │
│ │ │ Package: 0x96ad76ea3a055****a35350b83a76abd15 │ │
│ │ └ │ │
│ ╰────────────────────────────────────────────────────╯ │
│ │
│ Signatures: │
│ FlBbaPmrMt9DNKt9EMug********R8KcJes7dzem52d2CDkFcBA== │
│ │
╰──────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ Transaction Effects │
├──────────────────────────────────────────────────────────┤
│ Digest: 3Ys1pYtBSgUiXUYMsK37KPWftcXX5icbbPLgT1f1frPp │
│ Status: Success │
│ Executed Epoch: 318 │
│ │
│ Created Objects: │
│ ┌── │
│ │ ID: 0xc3eb50f39ec09e4e2e****91c94ca85e54047ed105280d │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ Version: 920430 │
│ │ Digest: ZmguJw2kjwwrFYUYuZ8xG4EZcHc6n2CjMibhc9CjYNr │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ID: 0x91cbd3fe342284d********c54f2a5097a8679fc678b │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ Version: 920430 │
│ │ Digest: 74GDCP91puviUXMmMFv7EEYSkuP7uMTt4MaPxGJi3JRj │
│ └── │
│ Gas Object: │
│ ┌── │
│ │ ID: 0x91cbd3fe342284d******2cd6c54f2a5097a8679fc678b │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ Version: 920430 │
│ │ Digest: 74GDCP91puviUXMmMFv7EEYSkuP7uMTt4MaPxGJi3JRj │
│ └── │
│ Gas Cost Summary: │
│ Storage Cost: 2340800 MIST │
│ Computation Cost: 1000000 MIST │
│ Storage Rebate: 978120 MIST │
│ Non-refundable Storage Fee: 9880 MIST │
│ │
│ Transaction Dependencies: │
│ 65HTDLBC9h1cTbdPcuDPRpL3ZJUGvgWZHaQSpVcnos2R │
│ FAGtpXnChnj2ZPxoZvt3kAuWY7esvPHGmpHbwAAUcdPX │
╰──────────────────────────────────────────────────────────╯
╭─────────────────────────────╮
│ No transaction block events │
╰─────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ Object Changes │
├──────────────────────────────────────────────────────────┤
│ Created Objects: │
│ ┌── │
│ │ ObjectID: 0xc3eb50****47ed105280d │
│ │ Sender: 0xb31fc********c57f48 │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ ObjectType: 0x96ad76****0b83a76abd15::hello::Hello │
│ │ Version: 920430 │
│ │ Digest: ZmguJw2kjwwrFYUYuZ8xG4EZcHc6n2CjMibhc9CjYNr │
│ └── │
│ Mutated Objects: │
│ ┌── │
│ │ ObjectID: 0x91cbd3fe342284****a5097a8679fc678b │
│ │ Sender: 0xb31fc********c57f48 │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ ObjectType: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ Version: 920430 │
│ │ Digest: 74GDCP91puviUXMmMFv7EEYSkuP7uMTt4MaPxGJi3JRj │
│ └── │
╰──────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ Balance Changes │
├──────────────────────────────────────────────────────────┤
│ ┌── │
│ │ Owner: Account Address ( 0xb31fc********c57f48 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ Amount: -2362680 │
│ └── │
╰──────────────────────────────────────────────────────────╯
Sui ブラウザウォレット#
これらのウォレットは現在、ブラウザ拡張機能のみです。
Sui Explorer & SuiScan#
Sui ブロックエクスプローラーでは、アドレスまたは ID を提供することで、チェーン上の任意の記録を確認できます。
suiscan を例にとると、前に使用した sui client call ...
で発行したコントラクトの関数を呼び出し、得られたオブジェクト ID を使用します。特定の形式 https://suiscan.xyz/<env>/object/<object ID>
に従って、新しく作成されたオブジェクトの情報を確認できます。また、パッケージ ID を渡すことでも関連情報を確認できます。
これはパッケージのリンクです:
https://suiscan.xyz/testnet/object/0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15
これは hello オブジェクトのリンクです:
https://suiscan.xyz/testnet/object/0xc3eb50f39ec09e4e2eed994fdf60f855f4841b3591c94ca85e54047ed105280d