Skip to content
🎉 Welcome to the new Aptos Docs! Click here to submit an issue.

签名者(Signer)

signer 是 Move 语言内置的资源类型。 signer 是一种 能力, 允许持有者代表特定 address 进行操作。 可以将其原生实现理解为:

module 0x1::signer {
  struct signer has drop { a: address }
}

signer 类似于 Unix 系统中的UID,它代表通过 Move _外部_代码(例如验证加密签名或密码)认证的用户身份。

address 的比较

Move 程序可以使用地址字面量无需特殊权限创建任意 address 值:

script {
  fun example() {
    let a1 = @0x1;
    let a2 = @0x2;
    // 以及其他所有可能的地址...
  }
}

signer 值具有特殊性,因为它们不能通过字面量或指令创建——只能由 Move 虚拟机生成。 在虚拟机执行带有 signer 类型参数的脚本前,它会自动创建 signer 值并传入脚本:

script {
    use std::signer;
    fun main(s: signer) {
        assert!(signer::address_of(&s) == @0x42, 0);
    }
}

如果脚本不是从 0x42 地址发送的,该脚本将中止并返回代码 0

Move 脚本可以包含任意数量的 signer 参数,只要这些 signer 参数位于其他参数之前。 换句话说,所有 signer 参数必须排在前面:

script {
    use std::signer;
    fun main(s1: signer, s2: signer, x: u64, y: u8) {
        // ...
    }
}

这对于实现需要多方授权的 多签脚本 非常有用。 例如,上述脚本的扩展可以实现s1s2之间的原子货币交换。

signer 操作符

std::signer 标准库模块为 signer 值提供了两个实用函数:

函数描述
signer::address_of(&signer): address返回该 &signer 包装的 address
signer::borrow_address(&signer): &address返回该 &signer 包装的 address 的引用。

此外,move_to<T>(&signer, T) 全局存储操作符 需要 &signer 参数来在signer.address账户下发布资源 T。 这确保了只有经过认证的用户才能选择在其 address 下发布资源。

所有权

与简单的标量值不同,signer 值是不可复制的, 这意味着它们不能通过任何操作进行复制, 无论是通过显式的 copy 指令, 还是通过 解引用 * 操作。