You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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能力的对象,而非直接转移给地址。具体操作如下:

  1. 确保接收对象(即要拥有新对象的目标对象)是带有key能力的结构体——只有带key的对象才能拥有其他对象。
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:05:12