4 个版本
0.2.0 | 2024 年 2 月 15 日 |
---|---|
0.1.26 | 2023 年 12 月 6 日 |
0.1.25 | 2023 年 9 月 1 日 |
0.1.23 | 2023 年 8 月 3 日 |
#149 在 文件系统
每月 103 次下载
用于 3 个 Crates(其中 2 个直接使用)
120KB
2K SLoC
WNFS 名称累加器
此库实现了 WNFS 需要的加密原语,以便证明其写入是有效的,并且第三方可以在不读取访问的情况下进行验证。
具体来说,它实现了 2048 位 RSA 累加器和来自论文 "Accumulators with Batching Techniques and Applications to IOPs and Stateless Blockchains" 的 PoKE* 和 PoKCR 算法,以及一些 WNFS 特定的接口和它们的序列化表示。
使用方法
RSA 累加器需要可信设置。任何可以访问可信设置的人都可以创建任意有效的证明,这在实践中会让仅被赋予了部分访问权限的恶意行为者获得对文件系统其余部分的访问权。因此,可信设置在创建新的 WNFS 时由根作者运行一次。根作者有动力扔掉可信设置的有毒废物。
use wnfs_nameaccumulator::{AccumulatorSetup, BatchedProofPart, BatchedProofVerification, Name, NameSegment};
use rand::thread_rng;
// Run the trutsed setup.
let rng = &mut thread_rng();
let setup = &AccumulatorSetup::trusted(rng);
// We want to prove the names for two files at
// /Docs/Note and /Pics/Image respectively
let mut name_note = Name::empty(setup);
let mut name_image = Name::empty(setup);
// Each segment is represented by a random 256-bit prime number
let root_dir_segment = NameSegment::new(rng);
let docs_dir_segment = NameSegment::new(rng);
let pics_dir_segment = NameSegment::new(rng);
let note_file_segment = NameSegment::new(rng);
let image_file_segment = NameSegment::new(rng);
name_note.add_segments([root_dir_segment.clone(), docs_dir_segment, note_file_segment]);
name_image.add_segments([root_dir_segment, pics_dir_segment, image_file_segment]);
// We can collapse these arrays of primes that represent paths into 2048-bit RSA accumulators
// with a proof that they were derived from the same "base" name, in this case the `Name::empty` above.
let (accum_note, proof_note) = name_note.as_proven_accumulator(setup);
let (accum_image, proof_image) = name_image.as_proven_accumulator(setup);
// Knowing the proofs, we can batch at least parts of the proofs together.
// This results in a single 2048-bit batched proof part and ~17-20 bytes of unbatched proof per element.
let mut batched_proof = BatchedProofPart::new();
batched_proof.add(&proof_note);
batched_proof.add(&proof_image);
// Without read access, but given the accumulated base name and the proofs,
// we can verify that the accumulated names are related to the same base name.
let name_base = Name::empty(setup).as_accumulator(setup).clone();
let mut verification = BatchedProofVerification::new(setup);
verification.add(&name_base, &accum_note, &proof_note.part)?;
verification.add(&name_base, &accum_image, &proof_image.part)?;
verification.verify(&batched_proof)?;
特征 rug
这启用了一个基于 rug crate(该 crate 基于 GNU 多精度库,也简称为 GMP)的大无符号整数算术的不同后端。
在构建发布版时,它比 num-bigint-dig
实现快约 2 倍,而且由于 rug 包含了 GMP 的静态链接发布构建,所以在调试构建(例如测试期间)也很快。
然而,它不适用于 Wasm,并且请注意 GMP 的许可证是 LGPLv3。
如果您依赖 wnfs
crate,但希望使用 rug
后端来构建您的应用程序,那么只需添加一个 wnfs-nameaccumulator
作为依赖项,并启用其 rug
功能。这将使 wnfs
使用具有 rug
功能的 wnfs-nameaccumulator
版本。
wnfs-nameaccumulator = { version = "*", default-features = false, features = ["rug"] }
依赖项
~8–19MB
~287K SLoC