Skip to main content

能力:儲存 (Ability: Store)

key 能力要求所有欄位都具有 store,而這項要求是理解 store 意義的最佳方式:它是可被儲存的能力——最終可存在於區塊鏈狀態中的物件內。具有 copy 或 drop、但不具有 store 的結構只能在建立它的交易期間存在;它永遠無法被持久化。

定義 (Definition)​

store 能力允許型別作為具有 key 能力之結構的欄位使用——可直接使用,或巢狀於任意深度。與其他能力相同,此規則會遞迴套用:只有當結構的所有欄位都具有 store 時,該結構才能具有 store。

/// Extra metadata with `store`; all of its fields must have `store` as well!
public struct Metadata has store {
bio: String,
}

/// An object for a single user record.
public struct User has key {
id: UID,
name: String, // `String` has `store`
age: u8, // all integers have `store`
metadata: Metadata, // another type with the `store` ability
}

與 copy 和 drop 的關係 (Relation to copy and drop)​

store 與 copy 和 drop 彼此獨立:三種非 key 能力可自由組合,且沒有任何一種意味著另一種。型別可以可複製但不可儲存、可儲存但既不可複製也不可丟棄,依此類推——每種組合都有效且各有用途。

與 key 的關係 (Relation to key)​

物件也可以具有 store 能力,對物件而言,它扮演雙重角色:

  • 具有 store 的物件可被包裝:作為另一個物件的欄位使用。沒有 store 的物件受限於必須始終位於儲存空間的最上層。
  • store 會作為物件的公開修飾詞:它允許從任何模組呼叫公開的儲存函式——public_transfer、public_share_object 和 public_freeze_object。若沒有 store,物件的儲存操作將保留給其定義模組,使該模組能完全控制物件的移動方式。

第二個角色不是語言功能,而是 Sui Framework 的慣例,透過內部限制強制執行——這是下一節的主題。是否為物件賦予 store,是 Sui 應用程式中影響最深遠的設計決策之一;我們會在儲存函式中再次討論它。

具有 store 能力的型別 (Types with the store Ability)​

Move 中所有原生型別(參考除外)都具有 store 能力。包括:

標準函式庫中定義的所有型別也都具有 store 能力。包括:

總結 (Summary)​

  • store 允許型別被持久化——作為物件的欄位使用,且可位於任意巢狀深度。
  • 對物件而言,store 另外啟用包裝與公開儲存函式。
  • store 與 copy 和 drop 彼此獨立;容器型別是否具有它取決於其內容。

延伸閱讀 (Further Reading)​