在之前的课程中,我们学习了如何创建、读取和修改SuiFren对象,这些对象在所有用户之间是共享的。
有两种类型的对象:
-
共享对象(Shared Objects)可以被任何用户读取和修改。我们之前将AdminCap设置为共享对象,允许任何用户创建Sui Frens。 这可能不是预期的行为。
-
归属对象(Owned Objects)是私有对象,只有拥有它们的用户才能读取和修改。所有权在执行Sui上的交易时会自动验证。
-
请注意,只允许直接所有权,因此如果用户A拥有对象B,而对象B拥有对象C,则用户A无法发送包含对象C的交易。
-
可以使用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)来获取用户的地址。