6个稳定版本
2.1.0 | 2023年1月23日 |
---|---|
2.0.1 | 2022年3月30日 |
1.2.1 | 2022年5月3日 |
1.2.0 | 2021年12月8日 |
1.0.0 | 2021年9月16日 |
#1304 in 神奇豆子
119,121 下载/每月
用于 164 个crate (12直接)
32KB
466 行
Ed25519用于共识关键环境
此库提供了一个针对共识关键环境设计的Ed25519实现,包括验证规则。
ed25519-consensus = "1"
Ed25519签名在共识关键环境中广泛使用(例如,区块链),其中不同的节点必须同意某个签名是否有效。然而,Ed25519没有明确定义签名有效性的标准,即使符合标准实现的实现也不需要就签名是否有效达成一致。
不同的Ed25519实现可能在细微的边缘情况下不同意验证标准。这给Ed25519在共识关键环境中的应用带来了双重风险。首先,存在多个Ed25519实现可能会打开共识分歧的可能性。其次,即使使用单个实现,该协议隐式地将特定版本的验证标准作为共识规则的一部分。但是,如果实现不是为了在共识关键环境中使用,它可能在版本之间更改验证标准。
例如,zcashd 中 Zcash 共识的初始实现继承了当时版本(1.0.15)libsodium 的有效性标准。由于 libsodium 中存在一个错误,这与 Zcash 协议规范 3(在规范版本 2020.1.2 中改为与 libsodium 1.0.15 匹配之前)中记录的预期标准不同。此外,libsodium 从未保证稳定性标准,并在后续的版本中更改了行为。这迫使 zcashd 在最终修复较新版本的库以具有一致性标准之前,必须使用库的较旧版本。为了兼容性,Zebra 必须实现一个特殊的库,ed25519-zebra
,以提供具有 Zcash 风格的 Ed25519,试图与 libsodium 1.0.15 完全匹配。而且,实现 ed25519-zebra
的初始尝试也是不兼容的,因为它精确地匹配了错误的编译时配置。
此问题通过 ZIP215 得以解决,这是一个精确验证标准集的规范。尽管最初是为 Zcash 开发的,但这些规则具有普遍兴趣,因为它们精确指定并确保批量验证和单个验证将产生相同的结果。此库实现了这些规则;它是移除了 Zcash 特定部分的 ed25519-zebra
的分支。
有关此问题和其解决方案的更多详细信息,请参阅 It's 255:19AM. Do you know what your validation criteria are?
示例
use std::convert::TryFrom;
use rand::thread_rng;
use ed25519_consensus::*;
let msg = b"ed25519-consensus";
// Signer's context
let (vk_bytes, sig_bytes) = {
// Generate a signing key and sign the message
let sk = SigningKey::new(thread_rng());
let sig = sk.sign(msg);
// Types can be converted to raw byte arrays with From/Into
let sig_bytes: [u8; 64] = sig.into();
let vk_bytes: [u8; 32] = VerificationKey::from(&sk).into();
(vk_bytes, sig_bytes)
};
// Verify the signature
assert!(
VerificationKey::try_from(vk_bytes)
.and_then(|vk| vk.verify(&sig_bytes.into(), msg))
.is_ok()
);
依赖关系
~2–2.7MB
~62K SLoC