メインコンテンツまでスキップ

signer(署名者)

signerは組み込みのMoveリソース型です。signerは、所有者が特定のaddressに代わって動作出来ようにする機能です 。ネイティブ実装は以下のように考える事が出来ます。

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

signerは、Move外部のコードによって認証されたユーザー(暗号署名やパスワードの確認など)を表すという点でUnix UIDと似ています。

addressと比較する

Moveプログラムは、アドレスリテラルを使用して、特別な許可無しに任意のaddress値を作成出来ます。

script {
fun example() {
let a1 = @0x1;
let a2 = @0x2;
// ... 他の全ての可能なアドレスも同様
}
}

ただし、signer値はリテラルや命令では作成出来ず、MoveVMのみによって作成出来るため、特別です。 VMはsigner型のパラメータを使用してスクリプトを実行する前にsigner値を自動的に作成し、スクリプトへ渡します。

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

このスクリプトは、0x42以外のアドレスから送信された場合、0コードで中止されます。

Moveスクリプトは、signersが他の任意の引数の接頭辞である限り、任意の数のsignersを持つ事が出来ます。言い換えると、全てのsigner引数が最初に来る必要が有ります。

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

これは、複数の当事者の権限で原始的に動作する 複数署名スクリプト を実装する場合便利です。例えば、上記スクリプトの拡張では、s1s2の間でアトミック(原始的)通貨スワップを実行出来ます。

signer演算子

std::signer標準ライブラリモジュールはsigner値に対する2つのユーティリティー関数を提供します。

関数説明
signer::address_of(&signer): addressこの&signerでラップしたaddressを返す
signer::borrow_address(&signer): &addressこの&signerでラップしたaddressへの参照を返す

更に、move_to<T>(&signer, T)グローバルストレージオペレータは、signer.addressのアカウントでリソースTを公開するための&signer引数が必要です。これにより、認証されたユーザーだけが、自分のaddressでリソースを公開する事を選択可能となります。

所有権

単純なスカラー値とは異なり、signer値はコピー可能ではありません。即ち、明示的なコピー命令を介しても、逆参照 *を介しても、どの操作からもコピーする事は出来ません。