在之前的课程中,我们熟悉了共享对象和归属对象:

public struct SharedObject has key {
   id: UID,
}


public struct OwnedObject has key {
   id: UID,
}


public fun create_shared_object(ctx: &mut TxContext) {
     let shared_object = SharedObject {
         id: object::new(ctx),
     };
     transfer::share_object(shared_object);
}


public fun create_owned_object(ctx: &mut TxContext) {
     let owned_object = OwnedObject {
         id: object::new(ctx),
     };
     transfer::transfer(owned_object, tx_context::sender(ctx));
}

使用归属对象的一个关键好处是,它们可以并行处理,因为涉及到它们的交易不会重叠(不读取或修改相同的数据)。 然而,如果共享对象被修改,则无法并行处理,并且需要经过更严格的执行过程,这会更慢且不可扩展。 另一个需要注意的重要事项是,共享对象只能在创建它们的同一交易中被设为共享。以下情况是不可行的:

public struct SharedObject has key {
   id: UID,
}


public fun create_object(tx_context: &mut TxContext) {
     let object = SharedObject {
         id: object::new(ctx),
     };
     transfer::transfer(object, tx_context::sender(ctx));
}


public fun share_object(object: SharedObject) {
 transfer::share_object(object);
}

如果我们在第一笔交易中调用create_object创建了一个最初是归属对象的对象,然后在第二笔交易中尝试用 share_object 来共享它,这将失败!