Constantine是一个高性能密码学库,专注于区块链协议和零知识证明系统。它提供常数时间实现的密码学原语,支持多种椭圆曲线和协议,包括以太坊BLS签名、KZG承诺等,并提供Nim、C、Rust、Go等多种语言的接口。该库旨在提供快速、紧凑和强化的椭圆曲线密码学解决方案。
本文是 Constantine Github 的 Readme 的翻译
Constantine:用于证明系统和区块链协议的高性能密码学库
“一个密码系统应该是安全的,即使关于该系统的一切,除了密钥,都是公开知识。”\ — Auguste Kerckhoffs
该库提供了密码学原语的恒定时间实现,特别关注区块链和零知识证明系统中使用的密码学。
<!-- TOC -->
<!-- /TOC --> 该库旨在成为一个快速、紧凑且强化的椭圆曲线密码学库,特别适用于区块链协议和零知识证明系统。
该库专注于以下属性:
以此顺序排列。
协议是一组例程,专为特定目标或其组合而设计:
图例
Constantine 在其公共 API 中支持以下协议。
Nim | C | Rust | Go | |
---|---|---|---|---|
Ethereum BLS 签名 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
Ethereum KZG 对 EIP-4844 的承诺 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
Ethereum IPA 对 Verkle Tries 的承诺 | :building_construction: | :see_no_evil: | :see_no_evil: | :see_no_evil: |
Ethereum 虚拟机 BN254 预编译 ECADD, ECMUL, ECPAIRING | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
EVM BLS12-381 预编译 (EIP-2537) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
EVM Misc: SHA256, modexp | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
用于 Halo2 证明系统的 Zk 加速层 (实验性) | 不适用 | 不适用 | :white_check_mark: | 不适用 |
Constantine 在其公共 API 中支持以下曲线。
Nim | C | Rust | Go | |
---|---|---|---|---|
BN254-Snarks | :white_check_mark: | :white_check_mark: | :white_check_mark: | :see_no_evil: |
BLS12-381 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :see_no_evil: |
Pasta 曲线 (Pallas & Vesta) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :see_no_evil: |
对于所有椭圆曲线,支持以下算术
所有操作都是恒定时间的,除非明确提到 vartime。
对于配对友好的曲线,Fp2 算术也已公开。\ :building_construction: 配对和多重配对已实现但尚未公开。
Constantine 在其公共 API 中支持以下哈希函数和 CSPRNG。
Nim | C | Rust | Go | |
---|---|---|---|---|
SHA256 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
来自操作系统的密码安全 RNG (sysrand) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
Constantine 还为 Nim 公开了一个高性能线程池,它继承了以下性能和 API:
任务并行 API RFC:https://github.com/nim-lang/RFCs/issues/347
spawn
和 sync
parallelFor
和 syncScope
parallelFor
支持任意复杂的归约。
Constantine 将其广泛用于并行椭圆曲线和归约。isSpawned
和 isReady
CPU 拓扑 - 查询 OS/VM 级别可用于运行计算的线程数:
ctt_cpu_get_num_threads_os
getNumThreadsOS
constantine_core::hardware::get_num_threads_os
线程池支持嵌套并行性以利用高核心数,并且不受嵌套并行循环的 OpenMP 限制的影响。对于批量 KZG 验证,Constantine 并行执行 3 个多标量乘法,每个乘法使用至少 3 个嵌套并行循环。
有关线程池性能详细信息、设计和研究,请参阅以下文档:
[!IMPORTANT] Constantine 可以使用以下工具编译:
- Nim v2.2.0
安装clang
编译器,例如:
sudo apt update && sudo apt install build-essential clang
pacman -S base-devel clang
[!TIP] 我们需要 Clang,因为它在密码学代码方面比 GCC 性能更高,尤其是在 Constantine 没有汇编优化的 ARM 上。并且 Rust 和 Clang 都依赖于 LLVM。<br />可以通过删除这一行将其更改为任何 C 编译器。
安装 nim,它在大多数 Linux 发行版的软件包管理器和 MacOS 的 Homebrew 中可用 Windows 二进制文件位于官方网站上:https://nim-lang.org/install_unix.html
sudo apt install nim
pacman -S nim
测试两者:
git clone https://github.com/mratsim/constantine
cd constantine
cargo test
cargo bench
将 Constantine 添加为 Cargo.toml 中的依赖项
[dependencies]
constantine-halo2-zal = { git = 'https://github.com/mratsim/constantine' }
[dependencies]
constantine-ethereum-kzg = { git = 'https://github.com/mratsim/constantine' }
(可选)可以使用 Nim 和 Rust 之间的跨语言 LTO,请参阅 https://doc.rust-lang.org/rustc/linker-plugin-lto.html:
向你的项目添加一个带有以下内容的 .cargo/config.toml
:
## .cargo/config.toml
[build]
rustflags="-Clinker-plugin-lto -Clinker=clang -Clink-arg=-fuse-ld=lld"
并修改 Constantine 的 build.rs
以传递 CTT_LTO=1
Command::new("nimble")
.env("CC", "clang")
.env("CTT_LTO", "1") // <--
.arg("make_lib_rust")
.current_dir(root_dir)
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.status()
.expect("failed to execute process");
安装任何 C 编译器,建议使用 clang
,例如:
sudo apt update && sudo apt install build-essential clang
pacman -S base-devel clang
安装 nim,它在大多数 Linux 发行版的软件包管理器和 MacOS 的 Homebrew 中可用 Windows 二进制文件位于官方网站上:https://nim-lang.org/install_unix.html
sudo apt install nim
pacman -S nim
将 Constantine 编译为 ./include
中的静态(和共享)库
cd constantine
CC=clang nimble make_lib
测试 go API。
cd constantine-go
go test -modfile=../go_test.mod
[!IMPORTANT] Constantine 使用单独的 modfile 进行测试。<br />除了测试之外,它没有任何依赖项(避免供应链攻击的关键)。
安装 C 编译器,建议使用 clang
,例如:
sudo apt update && sudo apt install build-essential clang
pacman -S base-devel clang
安装 nim,它在大多数 Linux 发行版的软件包管理器和 MacOS 的 Homebrew 中可用 Windows 二进制文件位于官方网站上:https://nim-lang.org/install_unix.html
sudo apt install nim
pacman -S nim
编译动态和静态库。
CC=clang nimble make_lib
CTT_ASM=0 nimble make_lib
\
在没有汇编的情况下进行编译(否则它会自动检测支持)nimble make_lib
确保库可以工作
nimble test_lib
库位置
./lib/
文件夹中阅读 examples-c 中的示例:
你可以通过 nimble 使用以下命令安装该库的开发版本
nimble install https://github.com/mratsim/constantine@#master
为了提高速度,建议使用 Clang(请参阅编译器注意事项)。 特别是,GCC 生成的进位加法代码效率低下。
Constantine 至少需要:
-masm=intel
的支持。 \
\
在 MacOS 上,Apple Clang 不支持 Intel 汇编语法,请改用 Homebrew Clang 或在没有汇编的情况下进行编译。\
请注意,Apple 正在通过其产品线停止使用 Intel CPU,因此这将仅影响较旧的型号和 Mac Pro在 Windows 上,Constantine 使用 MinGW 进行测试。Microsoft Visual C++ 编译器未配置。
Constantine 没有 C、Nim、Rust、Go 依赖项,除了编译器之外,即使在 Nim 标准库中也是如此,除非:
本节内容过多,有自己的文件。\ 请参阅 ./README-PERFORMANCE.md
CTT_ASM=0
,否则在 x86 和 x86-64 上使用汇编。汇编解决了以下两个问题:
强化实施以抵御所有现有和即将到来的攻击媒介是一项极其复杂的任务。 该库按原样提供,没有任何保证,至少直到:
在尽最大努力的基础上提供针对常见攻击媒介的防御。 请注意,Constantine 没有外部软件包依赖项,因此它不易受到供应链攻击 (除非它们影响编译器或操作系统)。
攻击者可能会竭尽全力检索秘密数据,包括:
如果不提及硬件、操作系统和编译器,这将是不完整的 通过以下方式积极阻碍你:
越来越多的攻击媒介正在收集中,供你查看 在 https://github.com/mratsim/constantine/wiki/Constant-time-arithmetics
Constantine 的作者尽最大努力实施安全的密码库 特别是在针对远程攻击媒介(如时间攻击)方面。
请注意,Constantine 按原样提供,不提供任何保证。 使用风险自负。
强烈建议在将数据置于风险中之前,彻底评估你的威胁模型、你正在考虑的任何密码库的安全性, 以及你置于危险之中的秘密。 作者想提醒用户,最好的代码只能缓解 但不能防止人为失误,而人为失误是目前最薄弱的环节和最大的 秘密后门被利用。
你可以通过“安全”选项卡私下报告安全漏洞。
安全性 > 报告漏洞
Nim 语言为密码学提供了以下优势:
{.compile: "myasm.S".}
根据以下任一协议获得许可和分发:
MIT 许可证:LICENSE-MIT 或 http://opensource.org/licenses/MIT 或
Apache 许可证,版本 2.0,(LICENSE-APACHEv2 或 http://www.apache.org/licenses/LICENSE-2.0)
由你选择。除非按照这些条款,否则不得复制、修改或分发此文件。
该库没有外部依赖项。 特别是,GMP 仅用于测试和差异模糊测试 并且未链接到库中。
- 原文链接: github.com/mratsim/const...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!