在之前的课程中,我们学习了如何创建、读取和修改SuiFren对象,这些对象在所有用户之间是共享的。

有两种类型的对象:

  1. 共享对象(Shared Objects)可以被任何用户读取和修改。我们之前将AdminCap设置为共享对象,允许任何用户创建Sui Frens。 这可能不是预期的行为。

  2. 归属对象(Owned Objects)是私有对象,只有拥有它们的用户才能读取和修改。所有权在执行Sui上的交易时会自动验证。

  3. 请注意,只允许直接所有权,因此如果用户A拥有对象B,而对象B拥有对象C,则用户A无法发送包含对象C的交易。

  4. 可以使用Receiving来绕过此限制,但我们稍后会讨论这一点。

让我们修改之前课程中的票务示例,创建真正的票据,这些票据只能分配给个别用户,而不是所有用户都可以访问:

module modules::ticket_module_11 {
  use sui::clock::{Self, Clock};
  use sui::object::{Self, UID};
  use sui::transfer;
  use sui::tx_context::{Self, TxContext};
 
  public struct Ticket has key {
      id: UID,
      expiration_time: u64,
  }
 
  public fun create_ticket(ctx: &mut TxContext, clock: &Clock) {
        let ticket = Ticket {
             id: object::new(ctx),
             expiration_time: clock::timestamp_ms(clock),
        };
        // tx_context::sender(ctx) returns the address of the user who sends this transaction.
        transfer::transfer(ticket, tx_context::sender(ctx));
  }
 
  public fun is_expired(ticket: &Ticket, clock: &Clock): bool {
     ticket.expiration_time >= clock::timestamp_ms(clock)
  }
}

为了使Ticket对象成为归属对象,我们只需要明确地将对象转移到一个地址,而不是像之前那样调用 transfer::share。 在这里,我们将新创建的票转移给发送调用create_ticket交易的用户。我们可以使用 tx_context::sender (ctx)来获取用户的地址。