基本構文の章では、4つのアビリティの内のすでに2つ、ドロップ(Drop)とコピー(Copy)について説明した。これらはスコープ内の値の動作に影響を与えるものであり、ストレージには直接関係しない。そろそろ、構造体の保存を可能にするキー(key
)アビリティについて取り上げよう。
歴史的に、キーアビリティはストレージ内でタイプをキーとしてマークするために作成された。キーアビリティを持つタイプは、ストレージのトップレベルに保存され、アカウントやアドレスによって直接所有されることができた。オブジェクトモデルの導入により、キーアビリティは自然にオブジェクトを定義する能力となった。
キーアビリティを持つストラクトはオブジェクトと見なされ、ストレージ関数で使用できる。Sui Verifierは、構造体の最初のフィールドがネームドIDであり、かつUID型を持つことを要求する。
public struct Object has key {
id: UID, // required
name: String,
}
/// Creates a new Object with a Unique ID
public fun new(name: String, ctx: &mut TxContext): Object {
Object {
id: object::new(ctx), // creates a new UID
name,
}
}
キー(key
)アビリティを持つ構造体は依然として構造体であり、任意の数のフィールドや関連する関数を持つことができる。構造体のパッキング、アクセス、アンパッキングに特別な処理や構文はない。
しかし、オブジェクト構造体の最初のフィールドはUID型でなければならず、これはコピーもドロップもできないタイプである(これについてはすぐに説明する)。そのため、構造体は結果的にドロップ(drop
)およびコピー(copy
)アビリティを持つことができない。したがって、オブジェクトは設計上、破棄できない。
キーアビリティを持つタイプにはUID
が必要なため、Moveのネイティブタイプも標準ライブラリタイプもキーアビリティを持つことができない。キー(key
)アビリティはSuiフレームワークおよびカスタムタイプにのみ存在する。
キーアビリティはMoveにおけるオブジェクトを定義し、オブジェクトは保存されることを目的としている。次のセクションでは、オブジェクトのネイティブストレージ関数を提供するsui::transfer
モジュールを紹介する。