Skip to main content

在 Move 中进行 Sui On-Chain 签名验证

Sui 中的 Move 合约支持在链上对多种签名方案进行验证。并非所有在链上验证中支持的签名都支持作为用户签名验证。有关交易授权的有效签名方案,请参阅 Sui 签名

本主题涵盖以下内容:

  1. 如何使用 fastcrypto 的 CLI 工具为给定方案创建签名。仅用于测试和调试,请勿在生产中使用。
  2. 在链上调用 Move 方法进行验证,提交签名、消息和公钥。

支持的签名方案:

  • Ed25519 签名(64 字节)
  • Secp256k1 不可恢复签名(64 字节)
  • Secp256k1 可恢复签名(65 字节)
  • Secp256r1 不可恢复签名(64 字节)
  • Secp256r1 可恢复签名(65 字节)
  • BLS G1 签名(minSig 设置)
  • BLS G2 签名(minPk 设置)

使用方法

设置 fastcrypto CLI 二进制文件

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

使用 CLI 进行签名并提交至链上 Move 方法

Ed25519 签名(64 字节)

  1. 生成密钥并对消息进行签名。
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 方法。所有输入都以十六进制格式的字节表示:
    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 不可恢复签名(64 字节)

  1. 生成密钥并对消息进行签名。
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 方法。
    use sui::ecdsa_k1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// The last param 1 represents the hash function used is SHA256, the default hash function used when signing in CLI.
let verify = ecdsa_k1::secp256k1_verify(&sig, &pk, &msg, 1);
assert!(verify == true, 0);

Secp256k1 可恢复签名 (65 bytes)

  1. 生成密钥并对消息进行签名。
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 方法并检查相等性。
    use sui::ecdsa_k1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// The last param 1 represents the hash function used is SHA256, the default hash function used when signing in CLI.
let recovered = ecdsa_k1::secp256k1_ecrecover(&sig, &msg, 1);
assert!(pk == recovered, 0);

Secp256r1 不可恢复的签名 (64 bytes)

  1. 生成密钥并签署消息。
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 方法。
    use sui::ecdsa_r1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// The last param 1 represents the hash function used is SHA256, the default hash function used when signing in CLI.
let verify = ecdsa_r1::secp256r1_verify(&sig, &pk, &msg, 1);
assert!(verify == true, 0);

Secp256r1 可恢复的签名 (65 bytes)

  1. 生成密钥并签署消息。
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 方法并检查相等性。
    use sui::ecdsa_r1;

let msg = x"$MSG";
let pk = x"$PK";
let sig = x"$SIG";
// The last param 1 represents the hash function used is SHA256, the default hash function used when signing in CLI.
let recovered = ecdsa_r1::secp256r1_ecrecover(&sig, &msg, 1);
assert!(pk == recovered, 0);

BLS G1 signature (48 bytes, minSig setting)

  1. 生成密钥并签署消息。
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. 调用 Mov 中的 verify 方法。
    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 签名 (96 bytes, 最小峰值设置)

  1. 生成密钥并签署消息。
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 方法。
    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);