[Sui Object] #1. Object Model

이 글은 Sui Object 시리즈의 1번째 글입니다.

1.png

개요

Sui에서 Object는 네트워크의 기본 저장 단위입니다. 온체인의 모든 Resource, Asset, 데이터는 Object로 표현됩니다.

많은 블록체인은 계정(Account) 중심의 키-값 저장소(key-value store) 구조를 사용합니다. 반면 Sui는 고유한 ID로 식별되는 Object를 중심으로 스토리지를 구성합니다. 이 차이는 Sui의 병렬 트랜잭션 처리와 소유권 모델을 가능하게 하는 핵심 설계입니다.

모든 Sui Object는 아래의 구성 요소를 공통으로 포함합니다.

  • 고유 ID: 네트워크 전체에서 Object를 식별하는 전역 고유 식별자
  • 소유자(Owner): Object의 소유자로 Address 정보나 다른 Object
  • 버전(Version): Object가 수정될 때마다 증가하는 숫자
  • 메타데이터(Metadata): 이 Object를 마지막으로 수정한 트랜잭션의 해시 같은 것들

Object 종류

Sui의 Object는 세 가지 타입으로 구분됩니다.

Sui Object는 가장 기본적인 개념으로, 트랜잭션이 상호작용하는 모든 Resource, Asset, 데이터를 의미합니다. 온체인 상태를 구성하는 모든 것이 Sui Object입니다.

Sui Move Object는 Move 언어로 정의된 데이터 Object입니다. Sui Move Object를 정의하려면 두 가지 조건을 만족해야 합니다.

  • struct가 key ability를 가져야 합니다
  • struct의 첫 번째 필드가 반드시 id: UID이어야 합니다

UID는 Sui 프레임워크가 제공하는 전역 고유 ID 타입입니다. Sui Move Object는 sui::object::new를 호출해 struct를 생성할 때 UID를 발급받습니다.

public struct Sword has key {
    id: UID,
    damage: u64,
}

Sui Move Object는 정수, 주소 같은 primitive 타입뿐만 아니라 다른 Object나 non-object struct도 필드로 포함할 수 있습니다. 이렇게 만들어지는 struct는 온체인 상에 Sui Object로 저장될 수 있습니다.

Sui Move Package는 다른 Object를 조작하는 스마트 컨트랙트입니다. 하나 이상의 Move 바이트코드 Module의 묶음으로 구성되며, Package의 온체인 ID와 Module 이름의 조합으로 각 Module을 고유하게 식별합니다. 한 번 배포된 Package Object는 불변(Immutable)이며 수정하거나 삭제할 수 없습니다. 단, 이전에 배포된 다른 Package Object에 의존하는 것은 허용됩니다.


Object Metadata

모든 Sui Object는 공통적으로 아래 Metadata 필드를 포함합니다.

  • 32-byte globally unique ID: Object를 생성한 트랜잭션의 Digest와 해당 트랜잭션이 생성한 ID의 수를 나타내는 카운터로부터 만들어집니다.
  • 8-byte unsigned integer Version: Object를 수정하는 트랜잭션마다 일정하게 증가하는 정수입니다.
  • 32-byte transaction Digest: 이 Object를 마지막으로 output으로 포함한 트랜잭션을 나타냅니다.
  • 32-byte Owner: 이 Object에 어떻게 접근할 수 있는지를 나타내는 필드입니다. Owner의 값에 따라 Object의 소유권 유형이 결정됩니다.

Object 참조 방식

Sui에서 Object를 가리키는 방법은 세 가지가 있습니다. 각각의 참조 방식은 정확도와 활용 목적이 다릅니다.

ID 기반 참조는 가장 단순한 방식입니다. Object의 전역 고유 ID만을 사용해 Object를 식별합니다. ID는 Object가 생성된 이후 변하지 않으므로 안정적인 식별자 역할을 합니다. Object의 현재 상태를 조회할 때 주로 사용됩니다.

Versioned ID는 (ID, Version) 쌍으로 Object의 특정 시점 상태를 나타냅니다. Object는 수정될 때마다 Version이 증가하므로, Versioned ID를 사용하면 현재 상태가 아닌 과거 특정 시점의 Object를 가리킬 수 있습니다.

Object Reference는 (ID, Version, Object Digest) 세 값의 조합입니다. Object Digest는 Object의 내용을 해시한 값으로, 해당 Version의 Object가 변조되지 않았음을 검증할 수 있습니다. 트랜잭션이 Object를 입력으로 받을 때는 반드시 Object Reference를 사용합니다. 이를 통해 트랜잭션이 의도한 정확한 Object를 참조하고 있음을 보장합니다.


Object Ownership

Sui Object는 각자 소유권 유형을 가집니다. Object의 소유권 유형은 Object Metadata의 Owner 필드 값으로 결정됩니다. 소유권 유형에 따라 어떤 트랜잭션이 해당 Object를 사용할 수 있는지가 달라집니다.

Address-owned Object

  • 특정 주소(Address)가 소유하는 Object입니다. 해당 주소의 서명이 있는 트랜잭션만 이 Object를 사용할 수 있습니다.
  • Address-owned Object는 단일 소유자가 독점적으로 제어하므로, 다른 트랜잭션과 충돌이 발생하지 않습니다.
  • Sui는 이 특성을 활용해 Address-owned Object만 다루는 트랜잭션을 합의(Consensus) 없이 처리합니다.
  • 덕분에 Shared Object를 사용하는 트랜잭션보다 훨씬 빠른 완결성(finality)을 가집니다.

Immutable Object

  • 누구도 소유하지 않는 Object입니다. 한 번 Immutable 상태가 되면 수정, 전송, 삭제가 불가능합니다.
  • 어떤 트랜잭션이든 Immutable Object를 읽기 전용으로 참조할 수 있습니다.
  • 변경이 불가능하므로 여러 트랜잭션이 동시에 참조해도 충돌이 발생하지 않습니다.
  • Sui Move Package가 대표적인 Immutable Object입니다.

Party Object

  • sui::transfer::party_transfer 또는 sui::transfer::public_party_transfer 함수를 통해 전송된 Object입니다.
  • 전송된 Party만 해당 Object에 접근할 수 있습니다.
  • Address-owned Object와 유사하게 특정 대상만 접근할 수 있지만, 한 가지 차이점이 있습니다.
  • Address-owned Object는 합의 없이 처리되는 반면, Party Object는 합의(Consensus)를 통해 버전이 관리됩니다.

Shared Object

  • sui::transfer::share_object를 호출해 공유 상태로 전환된 Object입니다.
  • 특정 소유자가 없으며 누구든 읽고 쓸 수 있습니다.
  • 여러 트랜잭션이 동시에 Shared Object를 수정하려 하면 충돌이 발생할 수 있습니다.
  • 따라서 Shared Object를 사용하는 트랜잭션은 합의(Consensus) 과정을 거쳐 순서를 결정합니다.
  • 이로 인해 Address-owned Object만 사용하는 트랜잭션보다 처리 비용이 높습니다.

Wrapped Object

  • 다른 Object의 필드 안에 포함된 Object입니다.
  • Wrapped Object는 글로벌 Object 저장소에 독립적으로 등록되지 않으므로, ID로 직접 조회하거나 트랜잭션의 입력으로 전달할 수 없습니다.
  • 상위 Object를 통해 꺼내는(unwrap) 방식으로만 접근이 가능합니다.

Transaction과 Object의 관계

Sui에서 트랜잭션은 Object를 입력으로 받아 읽거나 수정한 뒤, 결과 Object를 출력합니다. 이 입출력 관계를 이어나가면 트랜잭션과 Object가 방향성 비순환 그래프(DAG, Directed Acyclic Graph)를 형성합니다. 그래프의 노드는 트랜잭션이고, 엣지는 한 트랜잭션의 출력 Object가 다음 트랜잭션의 입력으로 연결되는 관계를 나타냅니다.

이 그래프의 시작점은 Genesis 트랜잭션입니다. Genesis 트랜잭션은 초기 Object들을 생성하며, 이후 모든 트랜잭션의 근원이 됩니다.

트랜잭션의 출력 Object 중 아직 소비되지 않은 것을 Live Object라고 합니다. Live Object는 미래 트랜잭션의 입력으로 사용될 수 있습니다. Address-owned Object와 Shared/Immutable Object 모두 Live Object가 될 수 있습니다.


References


전체 목차:

  1. [Sui Object] #1. Object Model
  2. [Sui Object] #2. Address-Owned Objects
  3. [Sui Object] #3. Shared Objects
  4. [Sui Object] #4. Immutable Objects
  5. [Sui Object] #5. Wrapped Objects
  6. [Sui Object] #6. Party Objects