事务上下文 - Transaction Context

正如我们在之前关于对象和更高级Move的课程中所看到的,事务上下文(tx_context)在许多方面都非常有用:

  1. 创建新对象。这需要一个可变的tx_context。
  2. 访问事务的发送者。

tx_context被认为是一种特殊的系统对象,会自动传递给函数:

public fun my_function(ctx: &mut TxContext) {
    let sender = ctx.sender();
    let new_object = object::new(ctx);
}

在调用 my_function 时,发送者不需要显式传递 tx_context。它会在交易执行时由虚拟机自动附加。这也是为什么交易上下文应该始终是函数签名中的最后一个参数的原因。

public fun my_function(arg1: u64, arg2: u64, ctx: &mut TxContext) {
    // ...
}

你可能会看到一些库函数或依赖的其他合约函数需要交易上下文。在大多数情况下,这是为了在这些函数内部创建对象。还有一些有用的交易上下文函数你可以使用:

  • ctx.epoch() 返回当前的 epoch 编号
let epoch = tx_context::epoch(ctx);

Sui 区块链被组织成不重叠的 epoch,每个 epoch 长度为 24 小时。

  • ctx.epoch_timestamp_ms() 返回当前 epoch 的开始时间(自 Unix epoch 以来的毫秒数)
let epoch_start = tx_context::epoch_timestamp_ms(ctx);
  • ctx.fresh_object_address() 返回一个新的、唯一的对象地址。这对于创建新对象非常有用。
let new_object = object::new(ctx);

请注意,这个唯一的对象地址甚至可以用作不是对象的项目的唯一 ID。这些 ID 保证在所有交易和所有对象中都是唯一的。

  • ctx.digest() 返回当前交易的哈希值。这对于创建确定性的随机数非常有用。
let random_number = std::hash::digest(ctx.digest());