https://aptos.dev/img/meta/og-aptos-docs-default.png

Moveには、モジュールスクリプトの2種類のプログラムのタイプがあります。モジュールは、構造体のデータ型を定義し、構造体の型に作用する関数を含むライブラリです。構造体はMoveのグローバルストレージのスキーマを定義し、モジュール関数はストレージの更新ルールを定義します。モジュール自体もグローバルストレージに格納されます。スクリプトは、従来の言語のmain関数に似た、実行可能なエントリーポイントです。スクリプトは通常、公開されたモジュールの関数を呼び出し、グローバルストレージへの更新を行います。スクリプトはグローバルストレージに公開されない一時的なコードスニペットです。

Moveのソースファイル(またはコンパイルユニット)には、複数のモジュールとスクリプトが含まれる場合があります。しかし、モジュールを公開することと、スクリプトを実行することは、VMの動作としては別途行われます。

Syntax

Scripts

<aside> 💡 Tutorial Moveスクリプトを公開して実行する方法を学ぶには、Moveスクリプトの例に従ってください。

</aside>

スクリプトは以下のSyntaxを持ちます:

script {    
				<use>*   
				<constants>*    
				fun <identifier><[type parameters: constraint]*>([identifier: type]*) <function_body>
}

script ブロックは、すべての use 宣言で始まり、その後に任意の定数と(最後に)メイン関数宣言が続きます。メイン関数は任意の名前を持つことができ(つまり、mainと呼ばれる必要はありません)、スクリプトブロック内の唯一の関数であり、任意の数の引数を持つことができ、値を返してはなりません。以下は、各コンポーネントを持つ例です:

script {
    //stdに公開されているdebugモジュールをインポートします。
    use std::debug;

    const ONE: u64 = 1;

    fun main(x: u64) {
        let sum = x + ONE;
        debug::print(&sum)
    }
}

スクリプトは非常に限定された権限を持ちます ― それらはfriend宣言(モジュール間の特権的なアクセス許可)、構造体の宣言、またはグローバルストレージへのアクセスを行うことができません。その主な目的は、モジュール関数を呼び出すことです。

Modules

モジュールは以下のSyntaxを持ちます:

module <address>::<identifier> {
    (<use> | <friend> | <type> | <function> | <constant>)*
}

ここで <address> は有効な 名前付きアドレスです。

例:

module 0x42::example {
    struct Example has copy, drop { i: u64 }

    use std::debug;
    friend 0x42::another_example;

    const ONE: u64 = 1;

    public fun print(x: u64) {
        let sum = x + ONE;
        let example = Example { i: sum };
        debug::print(&sum)
    }
}

この module 0x42::example の部分は、モジュールexampleがグローバルストレージ内のアカウントアドレス0x42の下に公開されることを指定します。

モジュールは名前付きアドレスを使用して宣言することもできます。例えば:

module example_addr::example {
    struct Example has copy, drop { a: address }

    use std::debug;
    friend example_addr::another_example;

    public fun print() {
        let example = Example { a: @example_addr };
        debug::print(&example)
    }
}