signer is a built-in Move resource type. A signer is a capability that allows the holder to act on behalf of a particular address. You can think of the native implementation as being:

resource struct signer { a: address }

A signer is somewhat similar to a Unix UID in that it represents a user authenticated by code outside of Move (e.g., by checking a cryptographic signature or password).

Comparison to address#

A Move program can create any address value without special permission using address literals:

let a1 = 0x1;let a2 = 0x2;// ... and so on for every other possible address

However, signer values are special because they cannot be created via literals or instructions--only by the Move VM. Before the VM runs a script with parameters of type &signer, it will automatically create signer values and pass them into the script:

script {    use 0x1::Signer;    fun main(s: signer) {        assert(Signer::address_of(&s) == 0x42, 0);    }}

This script will abort with code 0 if the script is sent from any address other than 0x42.

A transaction script can have an arbitrary number of signers as long as the signers are a prefix to any other arguments. In other words, all of the signer arguments must come first:

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

This is useful for implementing multi-signer scripts that atomically act with the authority of multiple parties. For example, an extension of the script above could perform an atomic currency swap between s1 and s2.

signer Operators#

The 0x1::Signer standard library module provides two utility functions over signer values:

Signer::address_of(&signer): addressReturn the address wrapped by this &signer.
Signer::borrow_address(&signer): &addressReturn a reference to the address wrapped by this &signer

In addition, the move_to<T>(&signer, T) global storage operator requires a &signer argument to publish a resource T under signer.address's account. This ensures that only an authenticated user can elect to publish a resource under their address.

Ask the community for support