メインコンテンツまでスキップ

Moveスクリプト

このチュートリアルでは、Moveスクリプトの作成方法と実行方法について解説します。Moveスクリプトを使用すると、公開されたMoveモジュールインターフェイス全体で一連のコマンドを実行できます。

スクリプトの詳細は、Moveスクリプトドキュメントを御覧下さい。

使用例

以下の例は、aptos_coin.move モジュールの関数を呼び出して、宛先アカウントの残高がdesired_balance未満であることを確認し、desired_balance未満である場合はdesired_balanceまで補充します。

script {
use std::signer;
use aptos_framework::aptos_account;
use aptos_framework::aptos_coin;
use aptos_framework::coin;

fun main(src: &signer, dest: address, desired_balance: u64) {
let src_addr = signer::address_of(src);

addr::my_module::do_nothing();

let balance = coin::balance<aptos_coin::AptosCoin>(src_addr);
if (balance < desired_balance) {
aptos_account::transfer(src, dest, desired_balance - balance);
};
}
}

実行

何を達成したいかが分かったら、以下を決定する必要が有ります。

  • これらのファイルをどこへ置けば良いか?
  • 何という名前を付けるのか?
  • Move.tomlは必要か?
  • CLIを使用してスクリプトをどうやって実行するか?

Aptos CLIを使用して、Move スクリプトを実行する方法をステップバイステップの例で解説します。

  1. 作業用の新しいディレクトリを作成します。

    mkdir testing
    cd testing
  2. AptosCLIをセットアップしてアカウントを作成します:

    aptos init --network devnet

既存の秘密鍵( 0xbd944102bf5b5dfafa7fe865d8fa719da6a1f0eafa3cd600f93385482d2c37a4の様な)を再利用する事も、アカウント設定の一環として新しい秘密鍵を生成する事も出来ます。例えばアカウントが以下の例の様な場合。

---
profiles:
default:
private_key: "0xbd944102bf5b5dfafa7fe865d8fa719da6a1f0eafa3cd600f93385482d2c37a4"
public_key: "0x47673ec83bb254cc9a8bfdb31846daacd0c96fe41f81855462f5fc5306312b1b"
account: cb265645385819f3dbe71aac266e319e7f77aed252cacf2930b68102828bf615
rest_url: "https://api.devnet.aptoslabs.com"
faucet_url: "https://faucet.devnet.aptoslabs.com"
  1. 同じディレクトリから、新しいMoveプロジェクトを初期化します。

    aptos move init --name run_script
  2. 上記のサンプル スクリプトを含むmy_script.moveファイルをtesting/ディレクトリのsources/サブディレクトリに作成します。以下の例のようなmy_module.moveファイルも作成します。

    module addr::my_module {
    public entry fun do_nothing() { }
    }

    結果は、以下の様なファイル構造となります。

    testing/
    Move.toml
    sources/
    my_script.move
    my_module.move
  3. スクリプトをコンパイルします。

    $ aptos move compile --named-addresses addr=cb265645385819f3dbe71aac266e319e7f77aed252cacf2930b68102828bf615
    Compiling, may take a little while to download git dependencies...
    INCLUDING DEPENDENCY AptosFramework
    INCLUDING DEPENDENCY AptosStdlib
    INCLUDING DEPENDENCY MoveStdlib
    BUILDING run_script
    {
    "Result": [
    "cb265645385819f3dbe71aac266e319e7f77aed252cacf2930b68102828bf615::my_module"
    ]
    }

    注意:--named-addresses引数の使用方法。

    これが必要なのはコード内でaddrという名前付きアドレスを参照するためです。

    コンパイラーは、これが何を参照しているかを認識する必要があります。このCLI引数を使用する代わり、Move.tomlへこの様な引数を配置出来ます。

    [addresses]
    addr = "cb265645385819f3dbe71aac266e319e7f77aed252cacf2930b68102828bf615"
  4. コンパイルされたスクリプトを実行します。

    $ aptos move run-script --compiled-script-path build/my_script/bytecode_scripts/main.mv --args address:b078d693856a65401d492f99ca0d6a29a0c5c0e371bc2521570a86e40d95f823 --args u64:5
    Do you want to submit a transaction for a range of [17000 - 25500] Octas at a gas unit price of 100 Octas? [yes/no] >
    yes
    {
    "Result": {
    "transaction_hash": "0xa6ca6275c73f82638b88a830015ab81734a533aebd36cc4647b48ff342434cdf",
    "gas_used": 3,
    "gas_unit_price": 100,
    "sender": "cb265645385819f3dbe71aac266e319e7f77aed252cacf2930b68102828bf615",
    "sequence_number": 4,
    "success": true,
    "timestamp_us": 1683030933803632,
    "version": 3347495,
    "vm_status": "Executed successfully"
    }
    }

注意:コンパイルされたスクリプトのパスはbuild/my_script/ではなくbuild/run_script/下であること。これは、Move.tomlに含まれるプロジェクト名を使用しているためです。プロジェクト名はaptos move init --name run_scriptを実行した時からのrun_scriptです。

このドキュメントで使用されているコードを御覧下さい。完全な例が、ユーザーが作成したMoveモジュールに依存するMoveクリプトの使用方法についても解説しています。

Aptos開発者ディスカッションのAptos CLIのかわりにRust SDKを使用してこれを行う方法も御覧下さい。

高度な...

スクリプトをより効率的な方法で実行する事も出来ます。aptos move compileaptos move run-script --compiled-script-pathを別々で実行するのではなく、ただこれをやるだけです。

$ aptos move run-script --script-path sources/my_script.move --args address:b078d693856a65401d492f99ca0d6a29a0c5c0e371bc2521570a86e40d95f823 --args u64:5

これにより、両方の手順がひとつのCLIコマンドで行われますが、問題があります。このため、今のところは、前の2段階のアプローチを使用する事をお勧めします。