55 个版本 (36 个稳定版)

13.0.0 2023 年 11 月 8 日
12.0.0 2023 年 10 月 27 日
11.1.0 2023 年 10 月 26 日
10.0.0 2023 年 5 月 24 日
0.5.3 2020 年 3 月 24 日

#33密码学

Download history 9084/week @ 2024-04-23 9301/week @ 2024-04-30 12534/week @ 2024-05-07 11875/week @ 2024-05-14 10743/week @ 2024-05-21 10958/week @ 2024-05-28 12753/week @ 2024-06-04 13188/week @ 2024-06-11 13097/week @ 2024-06-18 13590/week @ 2024-06-25 9700/week @ 2024-07-02 12388/week @ 2024-07-09 14532/week @ 2024-07-16 14001/week @ 2024-07-23 11612/week @ 2024-07-30 11333/week @ 2024-08-06

53,818 每月下载量
54 crate 中使用 54 (直接使用 13 个)

MIT/Apache

5.5MB
7K SLoC

Neptune crates.io neptune依赖状态

关于

Neptune 是针对 Poseidon 哈希函数 的 Rust 实现,专为 Filecoin 优化。

Neptune 已经通过 ADBK 咨询公司的审计,并被认为是完全符合论文 (Starkad 和 Poseidon:适用于零知识证明系统的新的哈希函数) 的。

Neptune 最初专门针对 BLS12-381 曲线。尽管 API 允许对其他域进行类型专化,但轮数、常量以及 s-box 选择可能不正确。只要备用域是约 256 位的素域,Neptune 旨在实现的 128 位安全性将适用。存在一个运行时断言,如果为没有 32 字节精确表示的域生成常量,则断言将失败。符合条件的 Pasta 曲线 由 Neptune 明确支持。

在 1.0.0 版本发布时,Neptune 在 RTX 2080Ti GPU 上可以构建 4GiB 输入的 8-ary Merkle 树,耗时 16 秒。

实现规范

Filecoin 的 Poseidon 规范发布在 Filecoin 规范文档 此处。此外,Markdown 和 PDF 版本已在本仓库的 spec 目录中镜像。

为规范做出贡献

PDF 渲染说明

规范PDF的渲染使用Typora。下载规范的Markdown文件此处,在Typora中打开文件,进行修改并保存,然后将文件导出为PDF。

确保规范文档保持同步

在修改neptune中的规范文档时,请确保规范PDF文件poseidon_spec.pdf是Markdown规范poseidon_spec.md的PDF渲染版本。

如果您在neptune中对规范进行了修改,您必须在此处对Filecoin规范进行相同的修改,从而确保三个文档(一个Markdown+Latex和另一个PDF在neptune中,以及一个Markdown+MathJax在filecoin-project/specs中)保持同步。

环境变量

  • EC_GPU_FRAMEWORK=<cuda | opencl>允许选择是否使用CUDA或OpenCL实现。如果没有设置,如果有可用,将使用cuda

  • EC_GPU_CUDA_NVCC_ARGS

默认情况下,CUDA内核为多个架构编译,这可能会花费很长时间。EC_GPU_CUDA_NVCC_ARGS可以用来覆盖这些参数。输入和输出文件仍会自动设置。

// Example for compiling the kernel for only the Turing architecture
EC_GPU_CUDA_NVCC_ARGS="--fatbin --gpu-architecture=sm_75 --generate-code=arch=compute_75,code=sm_75"

Rust特性标志

Neptune还支持批处理哈希和树构建,这些操作可以在GPU上执行。纯CUDA/OpenCL批处理哈希是通过内部的proteus模块实现的。要使用proteus,请使用opencl和/或cuda特性编译neptune

cudaopencl特性可以单独使用或一起使用。如果同时使用cudaopencl,您还可以通过NEPTUNE_GPU_FRAMEWORK环境变量选择要使用哪个实现。

算术

启用cuda/opencl特性时,CUDA/OpenCL内核会使用特定的算术。这些算术需要在编译时通过Rust特性标志指定。可用特性有arity2arity4arity8arity11arity16arity24arity36。当启用strengthened特性时,每种算术都会有一个额外的强化版本可用。

当使用cuda特性时,内核在编译时生成。使用的算术越多,编译时间越长。因此,默认情况下没有启用特定的算术。您需要至少设置一个。

字段

启用cuda/opencl特性时,CUDA/OpenCL内核为特定的字段生成。这些字段需要在编译时通过Rust特性标志指定。可用特性有bls(用于BLS12-381)和pasta(用于Pallas和Vesta曲线的标量字段)。

运行测试

由于内核的编译时间取决于使用的算术数量,因此默认情况下没有启用特定的算术。为了运行测试,必须显式启用所有算术。例如,要在CUDA实现上运行所有测试,请运行

cargo test --no-default-features --features cuda,bls,pasta,arity2,arity4,arity8,arity11,arity16,arity24,arity36

按字段和预像长度基准测试Poseidon

在BLS12-381、Pallas和Vesta标量字段上对Poseidon进行基准测试,用于长度为24811的前像

cargo bench arity-<preimage len>

使用特定字段(blspallasvesta)和前像长度对Poseidon进行基准测试

cargo bench arity-<preimage len>/<field name>

海绵API

Neptune实现了字段元素的加密海绵API并作为其参考实现。该SpongeAPI trait定义了相关的API方法。请参阅源代码中的API使用示例,包括电路无电路

历史

Neptune最初是从Dusk的参考实现启动的。

更改

更改日志

许可证

MIT或Apache 2.0

依赖关系

~5–13MB
~229K SLoC