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 神奇豆子

Download history 32199/week @ 2024-03-14 29812/week @ 2024-03-21 26162/week @ 2024-03-28 25384/week @ 2024-04-04 26187/week @ 2024-04-11 28412/week @ 2024-04-18 27503/week @ 2024-04-25 27886/week @ 2024-05-02 28422/week @ 2024-05-09 26463/week @ 2024-05-16 25969/week @ 2024-05-23 28578/week @ 2024-05-30 29775/week @ 2024-06-06 29458/week @ 2024-06-13 30127/week @ 2024-06-20 23982/week @ 2024-06-27

119,121 下载/每月
用于 164 个crate (12直接)

MIT/Apache

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