본문으로 건너뛰기

Party 객체

Party object는 address-owned objects와 shared objects의 properties를 결합한다. Address-owned objects처럼 party objects는 single address가 소유할 수 있다. Shared objects처럼 consensus에 의해 versioned된다. Shared objects와 달리 다른 ownership types로 transfer하거나 다른 ownership types에서 transfer 받을 수 있고, wrapped될 수도 있다.

Party objects는 sui::transfer::party_transfer 또는 sui::transfer::public_party_transfer function을 사용해 transfer된다. Transfer 대상 Party가 접근할 수 있다.

정보

Party objects에는 single ownership만 지원된다.

party object 생성

Party objects를 만들려면 다음 transfer module functions를 사용한다:

public fun party_transfer<T: key>(obj: T, party: sui::party::Party)
public fun public_party_transfer<T: key + store>(obj: T, party: sui::party::Party)

Party object의 ownership은 lifetime 동안 변경될 수 있다. 예를 들어 dynamic object field로 추가하거나, 다른 address 또는 ownership type으로 transfer하거나, immutable로 만들 수 있다. 하지만 object를 만들고 ownership을 설정한 뒤에는 shared될 수 없다.

public fun create_party(value: u64, recipient: address, ctx: &mut TxContext) {
let party = party::single_owner(recipient);
transfer::public_party_transfer(
Object { id: object::new(ctx), value },
party,
)
}

party object 사용 시점

Operational convenience처럼 consensus에 의해 object가 versioned되기를 원할 때 party objects를 사용한다. Object가 다른 party 또는 shared objects와만 사용된다면, party object로 변환해도 추가 performance cost가 없다.

Party objects는 동시에 여러 inflight transactions에서 사용할 수 있다. 이는 single inflight transaction만 허용하는 address-owned objects와 대비된다. 많은 applications는 같은 party object에서 여러 transactions를 pipeline할 수 있는 능력으로 이점을 얻을 수 있다.

정보

Coin<SUI>를 포함한 Coins도 party objects가 될 수 있다. 하지만 party object Coin<SUI> gas payment에 사용할 수 없다. Gas에 party object Coin<SUI>를 사용하려면 먼저 address-owned로 다시 transfer해야 한다.

party object와 상호 작용

Shared objects와 같은 방식으로 party objects를 transaction input으로 지정할 수 있다. Sui validators는 transaction sender가 object에 access할 수 있는지 보장한다. 이전 conflicting transaction 때문에 input party object의 owner가 변경된 경우 validator는 execution time에 transaction을 abort할 수 있다.

Owning address가 object ID에 해당하는 party objects는 transfer to object mechanism을 통한 access를 지원하지 않는다. Account address가 소유한 party object를 transfer하려면:

public fun party_transfer_single_owner(o: Object, recipient: address) {
let party = party::single_owner(recipient);
transfer::public_party_transfer(o, party)
}