55 个版本 (36 个稳定版)
13.0.0 | 2023 年 11 月 8 日 |
---|---|
12.0.0 | 2023 年 10 月 27 日 |
11.1.0 |
|
10.0.0 | 2023 年 5 月 24 日 |
0.5.3 | 2020 年 3 月 24 日 |
#33 在 密码学 中
53,818 每月下载量
在 54 个 crate 中使用 54 (直接使用 13 个)
5.5MB
7K SLoC
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
。
cuda
和opencl
特性可以单独使用或一起使用。如果同时使用cuda
和opencl
,您还可以通过NEPTUNE_GPU_FRAMEWORK
环境变量选择要使用哪个实现。
算术
启用cuda/opencl
特性时,CUDA/OpenCL内核会使用特定的算术。这些算术需要在编译时通过Rust特性标志指定。可用特性有arity2
、arity4
、arity8
、arity11
、arity16
、arity24
、arity36
。当启用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进行基准测试,用于长度为2
、4
、8
或11
的前像
cargo bench arity-<preimage len>
使用特定字段(bls
、pallas
或vesta
)和前像长度对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