#零知识证明 #零知识 #zk #no-std #crypto

no-std arcturus

阿图鲁斯零知识证明实现,用于保密交易

7 个不稳定版本 (3 个破坏性更改)

0.4.0 2021 年 5 月 4 日
0.3.1 2021 年 2 月 13 日
0.2.1 2021 年 1 月 30 日
0.1.1 2020 年 9 月 17 日

#2241加密学

每月 25 次下载

自定义许可证

79KB
1.5K SLoC

⚠️ 安全警告

在 Arcutur 论文中描述的安全假设中已发现一个漏洞。该项目仅用于研究和历史背景,绝不应在任何实际应用中使用。有关漏洞的更多信息,请参阅此处:https://github.com/cargodog/arcturus/issues/43

arcturus

阿图鲁斯零知识证明系统的纯 Rust、轻量级且性能优异的实现 [链接].

阿图鲁斯能够高效地证明和验证具有非常大的匿名集的保密交易。正确的证明提供了以下保证

  1. 签名者拥有环形中每个已花费输出的签名密钥。
  2. 已花费输入的总和与新铸造输出的总和相匹配。1
  3. 每个已花费输入都伴随一个唯一、确定性的链接标签,用于检测双花。2
  4. 交易输入和输出值是隐藏的(即保密的)。
  5. 交易输入和签名密钥在一个大型匿名集中隐藏。3

文档

详细文档可以在 此处 找到。

使用和功能

最新版本可以在 git 标签或 crates.io 上找到。将最新版本添加到项目的 Cargo.toml 中。

arcturus = "x.y.z"

默认情况下,启用了 stdserde 功能。要在没有 std 或没有 serde 实现的情况下构建,请在构建时使用 --no-default-features 选项。注意,如果禁用默认功能,必须指定后端。可用后端包括

  • simd_backend
  • u64_backend
  • u32_backend

以下示例在没有 std 的情况下构建,但仍实现了 serde

cargo build --no-default-features --features "serde simd_backend"

在构建围绕此库的项目时,请注意以下事项

  1. 该库不包含范围证明。为确保输入或输出值不可能是负数,每个输入和输出承诺都应附有范围证明,例如 bulletproofs。未能防止负输入或输出可能导致攻击者创建新的货币(例如通货膨胀漏洞)。

  2. 为了防止双花,应检查每个输入的链接标记的唯一性并将其记录在已花费输出列表中。如果某个标记被看到两次,这意味着相应的输入已经被花费。

  3. 该库将匿名集的选择留给了用户。选择一个良好的未使用交易输出(UTXO)环对于为签名人及其交易输入提供匿名性至关重要。

示例

use arcturus::*;
use curve25519_dalek::ristretto::RistrettoPoint;
use curve25519_dalek::scalar::Scalar;
use merlin::Transcript;
use rand::rngs::OsRng; // You should use a more secure RNG

// Set up proof generators for 5 bit binary proofs with up to 2 spends in a proof.
let gens = ArcturusGens::new(2, 5, 2).unwrap();

// Given a ring of UTXOs, assume the signer controls outputs at indices 13 & 14 (signer knows spend
// key, amount, and blinding factor for each of his inputs) and wishes to spend those inputs in a
// transaction which mints a new output whose value balances against the inputs:
let ring: Vec<Arcturus::Output> = ...;

// Indices of UTXOs to spend as transaction inputs
let idxs = vec![13, 14];

// Secret data to spend each input UTXO
let spends = vec![ // Secret data to spend each input UTXO
    SpendSecret::new(spend_key_13, spend_amt_13, spend_blind_13),
    SpendSecret::new(spend_key_14, spend_amt_14, spend_blind_14)
];

// Secret data for new minted outputs (Total mint ammounts must balance total input ammounts).
let mints = vec![MintSecret::new(mint_pubkey, mint_amt, mint_blind)];

// Signer computes the transaction proof
let mut t = Transcript::new(b"Test proof");
let proof = gens.prove(&mut t, &ring[..], &idxs[..], &spends[..], &mints[..]).unwrap();

// The verifier my verify the proof as follows:
let mut t = Transcript::new(b"Test proof");
let proofs = vec![proof];
assert!(gens.verify(&mut t, &ring[..], &proofs[..]).is_ok());

性能

使用 criterion.rs 运行基准测试。

export RUSTFLAGS="-C target_cpu=native"
cargo bench --no-default-features --features "std simd_backend serde"

贡献

请参阅 CONTRIBUTING.md

依赖关系

~4MB
~84K SLoC