基本構文の章では、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モジュールを紹介する。

もっと読む