24个版本

0.10.0 2024年2月19日
0.9.1 2023年7月12日
0.8.2 2022年12月16日
0.7.1 2022年5月6日
0.1.1 2020年7月29日

#1542 in 魔法豆

Download history 55/week @ 2024-03-14 63/week @ 2024-03-28 24/week @ 2024-04-04 78/week @ 2024-04-11 2459/week @ 2024-04-18 2300/week @ 2024-04-25 2768/week @ 2024-05-02 2641/week @ 2024-05-09 2530/week @ 2024-05-16 3178/week @ 2024-05-23 3794/week @ 2024-05-30 3315/week @ 2024-06-06 3363/week @ 2024-06-13 3028/week @ 2024-06-20 2405/week @ 2024-06-27

每月12,732次下载

0BSD 许可证

465KB
8K SLoC

SchnorrFun! crates_badge docs_badge

在secp256k1上生成和验证Schnorr签名。基于secp256kfun构建。

Schnorr签名由其同名者于《智能卡的高效签名生成》中提出(并直到2008年获得专利)。此实现基于BIP-340规范,但足够灵活,可以作为通用Schnorr签名方案使用。

使用

[dependencies]
schnorr_fun = "0.10"
sha2 = "0.10"

应该使用吗?

此库和secp256kfun是实验性的。

概要

use schnorr_fun::{
    fun::{marker::*, Scalar, nonce},
    Schnorr,
    Message
};
use sha2::Sha256;
use rand::rngs::ThreadRng;
// Use synthetic nonces
let nonce_gen = nonce::Synthetic::<Sha256, nonce::GlobalRng<ThreadRng>>::default();
let schnorr = Schnorr::<Sha256, _>::new(nonce_gen.clone());
// Generate your public/private key-pair
let keypair = schnorr.new_keypair(Scalar::random(&mut rand::thread_rng()));
// Sign a variable length message
let message = Message::<Public>::plain("the-times-of-london", b"Chancellor on brink of second bailout for banks");
// Sign the message with our keypair
let signature = schnorr.sign(&keypair, message);
// Get the verifier's key
let verification_key = keypair.public_key();
// Check it's valid 🍿
assert!(schnorr.verify(&verification_key, message, &signature));

特性

  • BIP-340 兼容的签名和验证
  • 适配器签名
  • rust-secp256k1 的 schnorr 签名类型兼容,通过 libsecp_compat 功能。
  • MuSig2 实现,与 规范 兼容。
  • WIP FROST 实现
  • 特性标志
    • serde:用于签名的 serde 实现
    • bincode:用于 bincode v2 的 Encode/Decode 实现
    • libsecp_compat:用于在 rust-secp256k1 的 Schnorr 签名之间的 From 实现。
    • proptest 用于启用 secp256kfun/proptest
    • share_backup 用于启用 FROST 秘密份额的 bech32 备份。

依赖项

~0.4–1.8MB
~29K SLoC