引介 Constantine - 用于证明系统和区块链协议的高性能密码学开源库
Constantine是一个高性能密码学库,专注于区块链协议和零知识证明系统。它提供常数时间实现的密码学原语,支持多种椭圆曲线和协议,包括以太坊BLS签名、KZG承诺等,并提供Nim、C、Rust、Go等多种语言的接口。该库旨在提供快速、紧凑和强化的椭圆曲线密码学解决方案。
本文是 Constantine Github 的 Readme 的翻译
Constantine
Constantine:用于证明系统和区块链协议的高性能密码学库
“一个密码系统应该是安全的,即使关于该系统的一切,除了密钥,都是公开知识。”
— Auguste Kerckhoffs
该库提供了密码学原语的恒定时间实现,特别关注区块链和零知识证明系统中使用的密码学。
<!-- TOC -->
<!-- /TOC --> 该库旨在成为一个快速、紧凑且强化的椭圆曲线密码学库,特别适用于区块链协议和零知识证明系统。
该库专注于以下属性:
- 恒定时间(不通过侧信道泄露秘密数据)
- 性能
- 生成的代码大小、数据类型大小和堆栈使用量
以此顺序排列。
公共 API:曲线 & 协议
协议是一组例程,专为特定目标或其组合而设计:
- 机密性:只有消息的预期接收者才能读取它
- 身份验证:通信中的另一方是预期的部分
- 完整性:收到的消息未被篡改
- 不可否认性:消息的发送者不能否认它
图例
- :white_check_mark:: 完全支持
- :building_construction:: 部分支持:
- 在 C 中,未提供某些 API。
- 在 Rust 中,只有低级 constantine-sys API 可用,但没有高级包装器。
- :see_no_evil:: 缺少支持
协议
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: |
对于所有椭圆曲线,支持以下算术
- 域算术
- 在 Fr 上(即模 255 位曲线阶)
- 在 Fp 上(即模 381 位素数模数)
- 椭圆曲线算术:
- 在 Fp 上的椭圆曲线 (EC ?₁) 上,具有仿射、雅可比和齐次射影坐标
- 在 Fp2 上的椭圆曲线 (EC ?₂) 上,具有仿射、雅可比和齐次射影坐标
- 包括标量乘法,多标量乘法 (MSM) 和并行 MSM
所有操作都是恒定时间的,除非明确提到 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
- Weave 数据并行 API:
spawn和syncparallelFor和syncScopeparallelFor支持任意复杂的归约。 Constantine 将其广泛用于并行椭圆曲线和归约。
isSpawned和isReady
- Weave 数据并行 API:
-
CPU 拓扑 - 查询 OS/VM 级别可用于运行计算的线程数:
- C 中的
ctt_cpu_get_num_threads_os - Nim 中的
getNumThreadsOS - Rust 中的
constantine_core::hardware::get_num_threads_os
- C 中的
线程池支持嵌套并行性以利用高核心数,并且不受嵌套并行循环的 OpenMP 限制的影响。对于批量 KZG 验证,Constantine 并行执行 3 个多标量乘法,每个乘法使用至少 3 个嵌套并行循环。
有关线程池性能详细信息、设计和研究,请参阅以下文档:
- ./README-PERFORMANCE.md#parallelism
- ./docs/threadpool-design.md
- https://github.com/mratsim/weave/tree/7682784/research
安装
[!IMPORTANT] Constantine 可以使用以下工具编译:
- Nim v2.2.0
从 Rust 安装
-
安装
clang编译器,例如:- Debian/Ubuntu
sudo apt update && sudo apt install build-essential clang - Archlinux
pacman -S base-devel clang
[!TIP] 我们需要 Clang,因为它在密码学代码方面比 GCC 性能更高,尤其是在 Constantine 没有汇编优化的 ARM 上。并且 Rust 和 Clang 都依赖于 LLVM。<br />可以通过删除这一行将其更改为任何 C 编译器。
- Debian/Ubuntu
-
安装 nim,它在大多数 Linux 发行版的软件包管理器和 MacOS 的 Homebrew 中可用 Windows 二进制文件位于官方网站上:https://nim-lang.org/install_unix.html
- Debian/Ubuntu
sudo apt install nim - Archlinux
pacman -S nim
- Debian/Ubuntu
-
测试两者:
- 用于 Halo2-KZG 的实验性 ZK 加速 API (ZAL)
- Ethereum EIP4844 KZG 多项式承诺
git clone https://github.com/mratsim/constantine cd constantine cargo test cargo bench -
将 Constantine 添加为 Cargo.toml 中的依赖项
- 对于 Halo2-KZG Zk 加速层
[dependencies] constantine-halo2-zal = { git = 'https://github.com/mratsim/constantine' } - 对于 Ethereum EIP-4844 KZG 多项式承诺
[dependencies] constantine-ethereum-kzg = { git = 'https://github.com/mratsim/constantine' }
- 对于 Halo2-KZG Zk 加速层
(可选)可以使用 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");
从 Go 安装
-
安装任何 C 编译器,建议使用
clang,例如:- Debian/Ubuntu
sudo apt update && sudo apt install build-essential clang - Archlinux
pacman -S base-devel clang
- Debian/Ubuntu
-
安装 nim,它在大多数 Linux 发行版的软件包管理器和 MacOS 的 Homebrew 中可用 Windows 二进制文件位于官方网站上:https://nim-lang.org/install_unix.html
- Debian/Ubuntu
sudo apt install nim - Archlinux
pacman -S nim
- Debian/Ubuntu
-
将 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 安装
-
安装 C 编译器,建议使用
clang,例如:- Debian/Ubuntu
sudo apt update && sudo apt install build-essential clang - Archlinux
pacman -S base-devel clang
- Debian/Ubuntu
-
安装 nim,它在大多数 Linux 发行版的软件包管理器和 MacOS 的 Homebrew 中可用 Windows 二进制文件位于官方网站上:https://nim-lang.org/install_unix.html
- Debian/Ubuntu
sudo apt install nim - Archlinux
pacman -S nim
- Debian/Ubuntu
-
编译动态和静态库。
- 推荐:
CC=clang nimble make_lib - 或
CTT_ASM=0 nimble make_lib
在没有汇编的情况下进行编译(否则它会自动检测支持) - 或使用默认编译器
nimble make_lib
- 推荐:
-
确保库可以工作
nimble test_lib
-
库位置
- 这些库放在
./lib/文件夹中 - 标头位于./include/ 中,例如 Ethereum BLS 签名
- 这些库放在
-
阅读 examples-c 中的示例:
- 从 C 使用 Ethereum BLS 签名绑定
- 测试 Constantine BLS12-381 与 GMP ./examples-c/t_libctt_bls12_381.c
从 Nim 安装
你可以通过 nimble 使用以下命令安装该库的开发版本
nimble install https://github.com/mratsim/constantine@#master
依赖项 & 要求
为了提高速度,建议使用 Clang(请参阅编译器注意事项)。 特别是,GCC 生成的进位加法代码效率低下。
Constantine 至少需要:
- GCC 7
以前的版本生成了不正确的进位加法代码。 - Clang 14
在 x86-64 上,内联汇编用于解决编译器在优化大整数算术时遇到的问题, 并确保恒定时间代码。
Constantine 使用 intel 汇编语法来解决默认 AT&T 语法和 Clang 中传播的常量的问题。
Clang 14 增加了对-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 标准库中也是如此,除非:
- 用于测试和基准测试
- 经过测试的语言 json 和 yaml 解析器,用于测试向量
- 经过测试的语言标准库,用于测试、计时和消息格式化。
- GMP 用于针对 GMP 进行测试
- 对于 Nvidia GPU 后端:
- LLVM 运行时(不需要带有标头的“dev”版本)
- CUDA 运行时(不需要带有标头的“dev”版本)
- 在编译时
- 我们需要 std/macros 库来生成 Nim 代码。
性能
本节内容过多,有自己的文件。
请参阅 ./README-PERFORMANCE.md
汇编 & 硬件加速
- 除非传递
CTT_ASM=0,否则在 x86 和 x86-64 上使用汇编。 - 计划用于 ARM 的汇编。
- 计划进行 GPU 加速。
汇编解决了以下两个问题:
- 安全性:为恒定时间代码与编译器作斗争
- 性能:编译器注意事项
安全性
强化实施以抵御所有现有和即将到来的攻击媒介是一项极其复杂的任务。 该库按原样提供,没有任何保证,至少直到:
- 它经过审核
- 生成了正确的形式证明
- 恒定时间实施的形式验证是可能的
在尽最大努力的基础上提供针对常见攻击媒介的防御。 请注意,Constantine 没有外部软件包依赖项,因此它不易受到供应链攻击 (除非它们影响编译器或操作系统)。
攻击者可能会竭尽全力检索秘密数据,包括:
- 计时在椭圆曲线上相乘所花费的时间
- 分析嵌入式设备的功耗
- 在使用查找表时检测缓存未命中
- 内存攻击,如页面错误、分配器、内存保留攻击
如果不提及硬件、操作系统和编译器,这将是不完整的 通过以下方式积极阻碍你:
- 硬件:有时不以恒定时间实现乘法。
- 操作系统:不提供防止内存分页到磁盘、核心转储、调试器附加到你的进程或上下文切换(协程)泄漏寄存器数据的方法。
- 编译器:优化掉你精心制作的无分支代码并泄漏服务器机密,或者优化掉你认为“无用”的安全擦除例程,因为在该函数结束时不再使用该数据。
越来越多的攻击媒介正在收集中,供你查看 在 https://github.com/mratsim/constantine/wiki/Constant-time-arithmetics
免责声明
Constantine 的作者尽最大努力实施安全的密码库 特别是在针对远程攻击媒介(如时间攻击)方面。
请注意,Constantine 按原样提供,不提供任何保证。 使用风险自负。
强烈建议在将数据置于风险中之前,彻底评估你的威胁模型、你正在考虑的任何密码库的安全性, 以及你置于危险之中的秘密。 作者想提醒用户,最好的代码只能缓解 但不能防止人为失误,而人为失误是目前最薄弱的环节和最大的 秘密后门被利用。
安全披露
你可以通过“安全”选项卡私下报告安全漏洞。
安全性 > 报告漏洞
为什么选择 Nim
Nim 语言为密码学提供了以下优势:
- 通过 C 或 C++ 编译为机器代码,或者选择编译为 Javascript。轻松与这些语言进行 FFI。
- 可以定位具有专有 C 编译器的模糊嵌入式设备。
- 可以定位 WASM。
- 在 Nim 中可以轻松实现 C 中的性能。
- 丰富的类型系统:泛型、依赖类型、可变性跟踪和副作用分析、借用检查、编译器强制执行的不同类型(Miles != Meters, SecretBool != bool 和 SecretWord != uint64)。
- 编译时评估,包括解析十六进制字符串,将它们转换为 BigInt 或有限域元素并执行 bigInt 运算。
- 汇编支持,可以是内联的,也可以是简单的
{.compile: "myasm.S".} - 如果未使用 GC 类型,则没有 GC(自动内存管理在类型级别设置,默认情况下针对延迟/软实时进行优化,并且可以完全停用)。
- 直接在 AST 上工作的过程宏
- 创建通用曲线配置,
- 派生常量
- 编写一个大小独立的内联汇编代码生成器
- 即将推出的通过 Z3 进行形式验证的证明系统 (DrNim, 通过构造 RFC 进行更正)
许可证
根据以下任一协议获得许可和分发:
-
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~