在 Move 中进行 Sui On-Chain 签名验证
Sui 中的 Move 合约支持在链上对多种签名方案进行验证。并非所有在链上验证中支持的签名都支持作为用户签名验证。有关交易授权的有效签名方案,请参阅 Sui 签名。
本主题涵盖以下内容:
- 如何使用 fastcrypto 的 CLI 工具为给定方案创建签名。仅用于测试和调试,请勿在生产中使用。
- 在链上调用 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 字节)
- 生成密钥并对消息进行签名。
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
- 调用 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 字节)
- 生成密钥并对消息进行签名。
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
- 调用 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)
- 生成密钥并对消息进行签名。
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
- 在 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)
- 生成密钥并签署消息。
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
- 调用 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)
- 生成密钥并签署消息。
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
- 在 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)
- 生成密钥并签署消息。
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
- 调用 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, 最小峰值设置)
- 生成密钥并签署消息。
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
- 调用 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);