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
}
tx_hash
と、新しいUIDごとに増加するインデックス(index
)から導き出される。derive_id
関数はsui::tx_context
モジュールに実装されている。そのため、UID生成にはTxContextが必要である。新しい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
型は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は、ダイナミック・フィールド(Dynamic Fields)またはTransfer To Object[TODO]経由で転送されたオブジェクトを保持していることがある。 そのような場合、UIDが保持され、別のオブジェクトに保存されてもよい。
オブジェクトのUIDを返す機能は、プルーフ・オブ・ディリーション(proof of deletion)と呼ばれるパターンで利用されることがある。これはあまり使用されない技術だが、特定のケース、例えば、作成者やアプリケーションが、削除されたIDと引き換えに報酬を提供することでオブジェクトの削除を奨励する場合に役立つ。