2 个不稳定版本
0.100.0 | 2023 年 5 月 24 日 |
---|---|
0.3.4 | 2023 年 4 月 27 日 |
#6 in #blst
3MB
122K SLoC
blst
blst
包提供了 Rust 接口,用于访问 blst BLS12-381 签名库。
构建
bindgen 用于生成对 blst.h 的 FFI 绑定。然后 build.rs 调用 C 编译器将所有内容编译为 rust 目标构建区域的 libblst.a。在 Linux 上,可以通过设置 CC
环境变量来选择编译器。
可以使用典型的 cargo 命令构建和运行所有内容
cargo test
cargo bench
如果目标应用程序在复制到较旧的系统后崩溃并出现“非法指令”异常,则在构建 blst 时激活 portable
功能。相反,如果您在较旧的英特尔系统上编译,但将在较新的系统上执行二进制文件,则考虑激活 force-adx
功能。但请注意,cc 将 CFLAGS
环境变量的值传递给 C 编译器,并且如果设置了特定的标志,则可能会干扰功能选择。 -D__BLST_PORTABLE__
和 -D__ADX__
是这些功能的等效功能。
使用方法
可以根据声明路径选择两种主要的工作模式
对于最小公钥大小操作
use ckb_blst::min_pk::*
对于最小签名大小操作
use ckb_blst::min_sig::*
有五个结构体具有固有实现,提供 BLS12-381 签名功能。
SecretKey
PublicKey
AggregatePublicKey
Signature
AggregateSignature
生成密钥、签名消息和验证消息的简单示例
let mut ikm = [0u8; 32];
rng.fill_bytes(&mut ikm);
let sk = SecretKey::key_gen(&ikm, &[]).unwrap();
let pk = sk.sk_to_pk();
let dst = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_";
let msg = b"blst is such a blast";
let sig = sk.sign(msg, dst, &[]);
let err = sig.verify(msg, dst, &[], &pk);
assert_eq!(err, BLST_ERROR::BLST_SUCCESS);
有关使用示例的更多示例,请参阅 src/lib.rs 和 benches/blst_benches.rs 中的测试。