能力:鍵 (Ability: Key)
在 Move 基礎章節中,我們介紹了四種能力中的兩種: Drop 與 Copy。它們會影響值在作用域內的行為, 且與儲存無關。現在該介紹 key 能力了——它讓結構成為一個儲存單位。
在過去,建立 key 能力是為了將型別標示為全域儲存中的鍵。具有 key 能力的型別可以儲存在頂層,並可由帳戶或地址擁有。隨著 物件模型的導入,key 能力成為定義物件的能力。
在本書中,我們將任何具有 key 能力的結構稱為物件。
物件定義 (Object Definition)
具有 key 能力的結構就是物件,並且可用於 儲存函式。其定義須遵守兩層規則:
- Move 語言要求 key 結構的每個欄位都必須具有 store 能力——我們會在下一頁介紹 store;
- Sui 驗證器還要求結構的第一個欄位必須命名為 id,且型別必須為 UID。
/// An object: a struct with the `key` ability and an `id: UID` field.
public struct User has key {
id: UID, // required by the Sui Verifier, always the first field
name: String, // all other fields must have `store`
}
/// Creates a new `User` object. The fresh `UID` is derived from the
/// transaction context `ctx`.
public fun new(name: String, ctx: &mut TxContext): User {
User {
id: object::new(ctx),
name,
}
}
new 函式會建立物件。新的 UID 只能由 object::new 產生;此函式會 接受一個對交易內容的可變參考, 因此每個新建立的物件都會取得一個先前從未在網路上存在過的識別碼。我們會在 UID 與 ID章節中更深入探討 UID 型別及其保證。
與 copy 和 drop 的關係 (Relation to copy and drop)
UID 是一種既沒有 drop,也沒有 copy 的型別。由於每個物件都必須具有 UID 欄位,而結構只能具有其欄位所支援的能力, 這表示物件永遠不可能具有 drop 或 copy。依其設計,每個物件都不可捨棄且 不可複製——這正是資產屬性所要求的特性。
此特性可用於能力限制:要求 drop 或 copy 會自動排除物件; 反過來說,要求 key 會排除具有 drop 或 copy 的型別。
具有 key 能力的型別 (Types with the key Ability)
由於 UID 的要求,Move 中的任何原生型別都不能具有 key 能力, 標準函式庫中的任何型別也不能。key 能力只存在於部分 Sui 框架型別與自訂型別中。
總結 (Summary)
後續步驟 (Next Steps)
key 能力定義物件,並強制所有欄位具有 store。在下一節中,我們將介紹 store 能力本身,以及它對物件所扮演的第二個、較不明顯的角色。
延伸閱讀 (Further Reading)
- Move 參考文件中的型別能力。