Moveには、モジュールとスクリプトの2種類のプログラムのタイプがあります。モジュールは、構造体のデータ型を定義し、構造体の型に作用する関数を含むライブラリです。構造体はMoveのグローバルストレージのスキーマを定義し、モジュール関数はストレージの更新ルールを定義します。モジュール自体もグローバルストレージに格納されます。スクリプトは、従来の言語のmain
関数に似た、実行可能なエントリーポイントです。スクリプトは通常、公開されたモジュールの関数を呼び出し、グローバルストレージへの更新を行います。スクリプトはグローバルストレージに公開されない一時的なコードスニペットです。
Moveのソースファイル(またはコンパイルユニット)には、複数のモジュールとスクリプトが含まれる場合があります。しかし、モジュールを公開することと、スクリプトを実行することは、VMの動作としては別途行われます。
<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宣言(モジュール間の特権的なアクセス許可)、構造体の宣言、またはグローバルストレージへのアクセスを行うことができません。その主な目的は、モジュール関数を呼び出すことです。
モジュールは以下の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)
}
}