使用旧的 Rust 2015
0.2.0 |
|
---|---|
0.1.0 |
|
在 #ed25519-key 中排名 #32
每月下载次数 29
在 22 个 crate 中使用(通过 solana)
75KB
775 行代码(不包括注释)
ed25519-dalek
在 Rust 中实现 ed25519 密钥生成、签名和验证的快速且高效的 Rust 实现。
文档
文档可在此处获取 此处。
基准测试
在运行于 3.30 GHz 的 Intel Skylake i9-7900X 处理器上(无 TurboBoost),此代码达到以下性能基准
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ cargo bench
Compiling ed25519-dalek v0.7.0 (file:///home/isis/code/rust/ed25519-dalek)
Finished release [optimized] target(s) in 3.11s
Running target/release/deps/ed25519_benchmarks-721332beed423bce
Ed25519 signing time: [15.617 us 15.630 us 15.647 us]
Ed25519 signature verification time: [45.930 us 45.968 us 46.011 us]
Ed25519 keypair generation time: [15.440 us 15.465 us 15.492 us]
通过启用 avx2 后端(在兼容的微架构的机器上),签名验证的性能得到了极大提升
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ export RUSTFLAGS=-Ctarget_cpu=native
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ cargo bench --features=avx2_backend
Compiling ed25519-dalek v0.7.0 (file:///home/isis/code/rust/ed25519-dalek)
Finished release [optimized] target(s) in 4.28s
Running target/release/deps/ed25519_benchmarks-e4866664de39c84d
Ed25519 signing time: [15.923 us 15.945 us 15.967 us]
Ed25519 signature verification time: [33.382 us 33.411 us 33.445 us]
Ed25519 keypair generation time: [15.246 us 15.260 us 15.275 us]
相比之下,Golang 中的等效包性能如下
∃!isisⒶmistakenot:(master *=)~/code/go/src/github.com/agl/ed25519 ∴ go test -bench .
BenchmarkKeyGeneration 30000 47007 ns/op
BenchmarkSigning 30000 48820 ns/op
BenchmarkVerification 10000 119701 ns/op
ok github.com/agl/ed25519 5.775s
将密钥生成和签名速度提高约 2 倍,验证速度提高 2.5-3 倍(取决于 avx2 的可用性)。当然,这只是我的机器,这些结果——远非严谨——应该以少量盐分对待。
将其转换为粗略的周期数:我们在 3300 MHz 的 CPU 上将纳秒转换为每秒周期数时乘以 3.3 的因子,验证为 110256 个周期,签名为 52618 个周期,这与手动优化的汇编实现具有竞争力。
此外,如果您使用的是 rand
crate 中的 CSPRNG,则 nightly
功能将启用那里的 u128
/i128
功能,从而可能提高性能。
如果您的协议或应用程序能够批量签名进行验证,则 verify_batch()
函数的性能得到了显著提升。在上述英特尔Skylake i9-7900X上,验证96个签名需要1.7673毫秒。这是每个签名验证18.4094微秒,大约60750个周期,比原始论文中给出的批量验证速度快了一倍以上(这很可能不是一个公平的比较,因为那是Nehalem机器)。测试名称中 /
之后的数字指的是批量的大小
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ export RUSTFLAGS=-Ctarget_cpu=native
∃!isisⒶmistakenot:(master *=)~/code/rust/ed25519-dalek ∴ cargo bench --features=avx2_backend batch
Compiling ed25519-dalek v0.8.0 (file:///home/isis/code/rust/ed25519-dalek)
Finished release [optimized] target(s) in 34.16s
Running target/release/deps/ed25519_benchmarks-cf0daf7d68fc71b6
Ed25519 batch signature verification/4 time: [105.20 us 106.04 us 106.99 us]
Ed25519 batch signature verification/8 time: [178.66 us 179.01 us 179.39 us]
Ed25519 batch signature verification/16 time: [325.65 us 326.67 us 327.90 us]
Ed25519 batch signature verification/32 time: [617.96 us 620.74 us 624.12 us]
Ed25519 batch signature verification/64 time: [1.1862 ms 1.1900 ms 1.1943 ms]
Ed25519 batch signature verification/96 time: [1.7611 ms 1.7673 ms 1.7742 ms]
Ed25519 batch signature verification/128 time: [2.3320 ms 2.3376 ms 2.3446 ms]
Ed25519 batch signature verification/256 time: [5.0124 ms 5.0290 ms 5.0491 ms]
如您所见,每个机器都有一个最佳批量大小,因此您可能希望在自己的目标CPU上运行基准测试以发现最佳大小。对于这台机器,大约每批100个签名是最佳选择
此外,得益于Rust,此实现既具有类型安全,也具有内存安全。它比那些能读懂qhasm的人更容易被更多的人阅读,使其更容易审计。我们认为,最终,这些特性——结合速度——比仅仅周期计数更有价值。
关于签名可变形性的说明
此库生成的签名是可变形的,如原文档 中所讨论的
我们可以通过乘以曲线共因子来消除可变形属性,但这会使我们的实现不匹配现有其他任何实现的行为。截至本文写作时,RFC 8032,“爱德华曲线数字签名算法(EdDSA)”,建议进行更强的检查。虽然我们同意应该进行更强的检查,但我们认为不应该在十年后更改“ed25519验证”的定义,从而与所有其他实现不兼容。
简而言之,如果可变形签名对您的协议有害,则不要使用它们。考虑使用基于curve25519的可验证随机函数(VRF),如Trevor Perrin的VXEdDSA。我们计划最终在curve25519-dalek中支持VXEdDSA。
安装
要安装,请将以下内容添加到您的项目的 Cargo.toml
[dependencies.ed25519-dalek]
version = "1"
然后,在您的库或可执行源代码中添加
extern crate ed25519_dalek;
功能
要使您的应用程序默认启用夜间功能构建 ed25519-dalek
,则执行以下操作
[dependencies.ed25519-dalek]
version = "1"
features = ["nightly"]
要使您的应用程序在有人使用 cargo build --features="nightly"
构建时启用夜间功能,请将以下内容添加到 Cargo.toml
[features]
nightly = ["ed25519-dalek/nightly"]
要启用 serde 支持,请使用以下方式构建 ed25519-dalek
[dependencies.ed25519-dalek]
version = "1"
features = ["serde"]
默认情况下,ed25519-dalek
会与 curve25519-dalek
的 u64_backend
功能一起构建,该功能使用 Rust 的 i128
功能,其速度大约是 u32_backend
功能的两倍。然而,当针对 32 位系统时,你可能需要使用以下命令进行编译:cargo build --no-default-features --features="u32_backend"
。如果你正在为具有 avx2 指令的机器构建,还有实验性的 avx2_backend
。要使用它,请使用以下命令编译:RUSTFLAGS="-C target_cpu=native" cargo build --no-default-features --features="avx2_backend"
依赖关系
约 3MB
约 59K SLoC