UID型はsui::objectモジュールで定義されており、アドレスタイプをラップするIDのラッパーである。Sui上のUIDは一意であることが保証されており、オブジェクトが削除された後は再利用できない。

// File: sui-framework/sources/object.move
/// UID is a unique identifier of an object
public struct UID has store {
    id: ID
}

/// ID is a wrapper around an address
public struct ID has store, drop {
    bytes: address
}

新しいUID生成

新しいUIDはobject::new(ctx)関数で作成される。 それはTxContextへの可変参照を取り、新しいUIDを返す。

let ctx = &mut tx_context::dummy();
let uid = object::new(ctx);

Suiでは、UIDはオブジェクトの表現として機能し、オブジェクトの動作や機能を定義できる。UIDタイプが明確なおかげで、重要な機能の一つダイナミックフィールド(Dynamic Fields)が可能となる。さらに、それによって、後ほどこの章で説明するTransfer To Object (TTO)[TODO]も可能となる。

UIDライフサイクル

UID型はobject::new(ctx)関数で作成され、object::delete(uid)関数で破棄される。object::deleteはUIDを値で消費し、値がオブジェクトからアンパックされない限り、それを削除することはできない。

let ctx = &mut tx_context::dummy();

let char = Character {
    id: object::new(ctx)
};

let Character { id } = char;
id.delete();

UIDの保持

オブジェクト構造体がアンパックされた直後でUIDを削除する必要はない。 UIDは、ダイナミック・フィールド(Dynamic Fields)またはTransfer To Object[TODO]経由で転送されたオブジェクトを保持していることがある。 そのような場合、UIDが保持され、別のオブジェクトに保存されてもよい。

プルーフ・オブ・ディリーション(Proof of Deletion)

オブジェクトのUIDを返す機能は、プルーフ・オブ・ディリーション(proof of deletion)と呼ばれるパターンで利用されることがある。これはあまり使用されない技術だが、特定のケース、例えば、作成者やアプリケーションが、削除されたIDと引き換えに報酬を提供することでオブジェクトの削除を奨励する場合に役立つ。