본문으로 건너뛰기

Move에서 Sui 온체인 서명 검증하기

Sui의 Move contract는 여러 서명 방식(signature scheme)에 대한 on-chain 검증을 지원한다. on-chain 검증에서 지원되는 모든 signature가 사용자 signature 검증에서 지원되는 것은 아니다. transaction authorization에 유효한 서명 방식은 서명 섹션을 참조한다.

이 문서는 다음 내용을 다룬다:

  1. fastcrypto의 CLI tool을 사용해 주어진 scheme의 signature를 만드는 방법. 이는 testing과 debugging 전용이며, 프로덕션에서는 사용하지 않는다.
  2. signature, message, public key를 제출해 on-chain에서 Move method를 호출하여 검증하는 방법.

다루는 서명 방식은 다음과 같다:

  • Ed25519 signature (64 bytes)
  • Secp256k1 non-recoverable signature (64 bytes)
  • Secp256k1 recoverable signature (65 bytes)
  • Secp256r1 non-recoverable signature (64 bytes)
  • Secp256r1 recoverable signature (65 bytes)
  • BLS G1 signature (minSig setting)
  • BLS G2 signature (minPk setting)

Usage

Set up fastcrypto CLI binary

git@github.com:MystenLabs/fastcrypto.git
cd fastcrypto/
cargo build --bin sigs-cli

Sign with CLI and submit to on-chain Move method

Ed25519 signature (64 bytes)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme ed25519 --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme ed25519 --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 verify method를 호출한다. 모든 input은 hex format의 byte로 표현된다:
    use sui::ed25519;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
let verify = ed25519::ed25519_verify(&sig, &pk, &msg);
assert!(verify == true, 0);

Secp256k1 non-recoverable signature (64 bytes)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme secp256k1 --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme secp256k1 --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 verify method를 호출한다.
    use sui::ecdsa_k1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// 마지막 파라미터 1은 사용된 hash function이 SHA256임을 나타내며, 이는 CLI에서 서명할 때 사용하는 기본 hash function이다.
let verify = ecdsa_k1::secp256k1_verify(&sig, &pk, &msg, 1);
assert!(verify == true, 0);

Secp256k1 recoverable signature (65 bytes)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme secp256k1-rec --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme secp256k1-rec --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 ecrecover method를 호출하고 equality를 확인한다.
    use sui::ecdsa_k1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// 마지막 파라미터 1은 사용된 hash function이 SHA256임을 나타내며, 이는 CLI에서 서명할 때 사용하는 기본 hash function이다.
let recovered = ecdsa_k1::secp256k1_ecrecover(&sig, &msg, 1);
assert!(pk == recovered, 0);

Secp256r1 non-recoverable signature (64 bytes)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme secp256r1 --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme secp256r1 --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 verify method를 호출한다.
    use sui::ecdsa_r1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// 마지막 파라미터 1은 사용된 hash function이 SHA256임을 나타내며, 이는 CLI에서 서명할 때 사용하는 기본 hash function이다.
let verify = ecdsa_r1::secp256r1_verify(&sig, &pk, &msg, 1);
assert!(verify == true, 0);

Secp256r1 recoverable signature (65 bytes)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme secp256r1-rec --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme secp256r1-rec --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 ecrecover method를 호출하고 equality를 확인한다.
    use sui::ecdsa_r1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// 마지막 파라미터 1은 사용된 hash function이 SHA256임을 나타내며, 이는 CLI에서 서명할 때 사용하는 기본 hash function이다.
let recovered = ecdsa_r1::secp256r1_ecrecover(&sig, &msg, 1);
assert!(pk == recovered, 0);

BLS G1 signature (48 bytes, minSig setting)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme bls12381-minsig --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme bls12381-minsig --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 verify method를 호출한다.
    use sui::bls12381;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
let verified = bls12381::bls12381_min_sig_verify(&sig, &pk, &msg);
assert!(verified == true, 0);

BLS G1 signature (96 bytes, minPk setting)

  1. key를 생성하고 message에 서명한다.
target/debug/sigs-cli keygen --scheme bls12381-minpk --seed 0000000000000000000000000000000000000000000000000000000000000000                
Private key in hex: $SK
Public key in hex: $PK

target/debug/sigs-cli sign --scheme bls12381-minpk --msg $MSG --secret-key $SK

Signature in hex: $SIG
Public key in hex: $PK
  1. Move에서 verify method를 호출한다.
    use sui::bls12381;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
let verified = bls12381::bls12381_min_pk_verify(&sig, &pk, &msg);
assert!(verified == true, 0);