Skip to main content

物件是什麼?(What is an Object?)

物件(object) 是 Sui 上儲存的單位。原始 Move 將資料儲存於帳戶之下,而 Sui 則將物件直接儲存在全域狀態中,每個物件都有由系統記錄的自身身分(identity)、型別(type)與擁有者(owner)。物件支援原生的儲存操作,例如 轉移(transfer)共享(share),其設計目的是讓 前面章節 提到的資產特性——所有權(ownership)、不可複製性(non-copyability)、不可捨棄性(non-discardability)——在實務上可以運作。

在 Move 程式碼中,物件並不是一種新的值——它其實是一個普通的 struct,具有 key 能力(ability)與一個特殊的 id 欄位:

/// 一個遊戲角色;一個和其他 struct 一樣的 struct,
/// 透過 `key` 能力與 `id: UID` 欄位而成為物件。
public struct Hero has key {
id: UID,
level: u8,
}

你對 struct 已知的一切依然適用。物件所增加的,是儲存層附加在其上的系統層級中介資料(metadata)。我們會在 使用物件 章節中詳細說明定義規則;這裡我們專注於每個物件都具備的特性:

  • 型別(Type): 每個物件都有一個型別,定義了該物件的結構與行為。不同型別的物件無法混用或互換使用,確保物件依照其型別系統被正確使用。

  • 唯一識別碼(Unique ID): 每個物件都有一個唯一識別碼,用以與其他物件區分。這個 ID 在物件建立時產生,且不可變更,因此物件可以在交易與擁有者之間被追蹤與參考。這就是上方定義中的 id: UID 欄位。

  • 擁有者(Owner): 每個物件都關聯一個擁有者,該擁有者對物件的變更擁有控制權。 一個物件可以被單一帳戶獨佔擁有、被另一個物件擁有、與整個網路共享、設為不可變,或處於 party 狀態——介於獨佔與 共享所有權之間的中間狀態。我們會在 所有權 章節中詳細討論這五種所有權狀態。

    請注意,所有權並不控制物件的機密性 — 從 Move 之外一律可以讀取鏈上物件的內容。你絕對不應該在物件中儲存未加密的機密資料。

  • 資料(Data): 物件封裝了自身的資料,簡化了管理與操作。資料結構與操作是由物件的型別——也就是 struct 的欄位——所定義。

  • 版本(Version): 每個物件都帶有一個版本編號,系統會在每次交易修改該物件時遞增此編號。版本可防止 重播(replay):一筆交易參考其輸入物件時是指向特定版本,因此同一筆交易——或是對已變更物件的過期參考——無法被執行兩次。它扮演的角色相當於帳戶型區塊鏈中的 nonce,但作用範圍是每個物件而非每個帳戶。

  • 摘要(Digest): 每個物件都有一個摘要,是該物件資料的雜湊值。摘要用於以密碼學方式驗證物件資料的完整性,並確保其未被竄改。每當物件的資料發生變化時,摘要就會重新計算。

總結 (Summary)

  • 物件是 Sui 上儲存的單位:型別化的值儲存於全域狀態中,並由系統追蹤其身分與所有權。
  • 在 Move 程式碼中,物件是一個具有 key 能力與 id: UID 欄位的 struct。
  • 每個物件都有型別、唯一識別碼、擁有者、資料、版本與摘要。

延伸閱讀 (Further Reading)