如何在Sui Move中创建ObjectOwner类型对象(非AddressOwner)
在Sui Move中创建ObjectOwner类型对象的方法
原代码
// Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 /// This example demonstrates a basic use of a shared object. /// Rules: /// - anyone can create and share a counter /// - everyone can increment a counter by 1 /// - the owner of the counter can reset it to any value module counter::counter { /// A shared counter. public struct Counter has key, store { id: UID, owner: address, value: u64 } public fun create_and_transfer_counter(contract_address: address, ctx: &mut TxContext) { let counter = Counter { id: object::new(ctx), owner: ctx.sender(), value: 0 }; // 使用 transfer::transfer_to_address 将计数器的所有者设置为当前合约地址 transfer::public_transfer(counter, contract_address); } }
问题
当前的create_and_transfer_counter函数在传入合约地址作为对象接收方时,创建的是AddressOwner类型对象。请问如何在Sui Move中创建ObjectOwner类型对象?
解决方案
要创建ObjectOwner类型对象,核心是将新对象转移给另一个带有key能力的对象,而非直接转移给地址。具体操作如下:
- 确保接收对象(即要拥有新对象的目标对象)是带有
key能力的结构体——只有带key的对象才能拥有其他对象。 - 使用
transfer::transfer_to_object函数替代transfer::public_transfer,将新对象转移给目标对象。
修改后的代码示例
// Copyright (c) Mysten Labs, Inc. // SPDX-License-Identifier: Apache-2.0 module counter::counter { use sui::object::{Self, UID}; use sui::transfer; use sui::tx_context::{Self, TxContext}; /// 用于拥有Counter的合约对象(必须带key能力) public struct ContractOwner has key { id: UID, admin: address, } /// A shared counter. public struct Counter has key, store { id: UID, owner: address, value: u64 } // 初始化合约时创建ContractOwner对象 fun init(ctx: &mut TxContext) { let owner = ContractOwner { id: object::new(ctx), admin: ctx.sender(), }; transfer::transfer(owner, ctx.sender()); } /// 创建Counter并转移给ContractOwner对象(ObjectOwner类型) public fun create_and_transfer_to_object(owner_obj: &mut ContractOwner, ctx: &mut TxContext) { let counter = Counter { id: object::new(ctx), owner: ctx.sender(), value: 0 }; // 使用transfer_to_object将Counter转移给ContractOwner对象 transfer::transfer_to_object(counter, owner_obj); } }
关键说明
ContractOwner结构体带有key能力,满足作为对象所有者的要求。transfer::transfer_to_object函数接收两个参数:要转移的Counter对象,以及接收它的ContractOwner可变引用。- 调用
create_and_transfer_to_object时,必须传入ContractOwner对象的可变引用,确保交易能正确修改该对象的所有权关系。
内容的提问来源于stack exchange,提问作者xie cui
相关产品推荐
相关产品推荐

