在之前的课程中,我们熟悉了共享对象和归属对象:
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
来共享它,这将失败!