9 个版本 (4 个稳定)
新 2.0.0 | 2024 年 8 月 26 日 |
---|---|
1.0.3 | 2024 年 8 月 26 日 |
1.0.2 | 2024 年 5 月 8 日 |
1.0.0 | 2024 年 3 月 13 日 |
0.1.1 | 2023 年 9 月 28 日 |
#10 in #commitment
119,659 个月下载量
在 103 个 包(11 个直接)中使用
2MB
31K SLoC
C-KZG-4844
EIP-4844 和 EIP-7594 的多项式承诺 API 的最小实现,用 C 语言编写。
绑定
虽然核心实现是 C 语言,但提供了各种高级语言的绑定,为 C 函数提供方便的包装。这些绑定旨在供以太坊客户端使用,以避免重新实现关键的加密函数。
语言 | 链接 |
---|---|
C# | README |
Go | README |
Java | README |
Nim | README |
Node.js | README |
Python | README |
Rust | README |
接口函数
C-KZG-4844 库提供了多项式承诺规范中定义的公共 KZG 函数的实现。目标是尽可能与规范保持一致。
EIP-4844
blob_to_kzg_commitment
compute_kzg_proof
compute_blob_kzg_proof
verify_kzg_proof
verify_blob_kzg_proof
verify_blob_kzg_proof_batch
EIP-7594
compute_cells_and_kzg_proofs
recover_cells_and_kzg_proofs
verify_cell_kzg_proof_batch
此库还提供了加载和释放可信设置的函数,这些函数在规范中未定义。这些函数旨在在初始化过程中执行一次。正如其名所示,可信设置文件被认为是可信的。
load_trusted_setup
load_trusted_setup_file
free_trusted_setup
备注
测试
所有绑定都针对定义在 consensus-spec-tests 仓库中的 KZG 参考测试进行了测试。此外,内部 C 函数的单元测试套件位于 此处。
并行化
C-KZG-4844中的接口函数为了简单起见是单线程的,因为在多个平台上实现多线程可能会很复杂。虽然性能很重要,但这些函数已经相当快速和高效。例如,verify_blob_kzg_proof
预计在大多数系统上将在3毫秒内完成。
批量验证
在处理多个blob时,verify_blob_kzg_proof_batch
比逐个调用verify_blob_kzg_proof
更有效率。在CI测试中,批量验证64个blob比逐个验证快53%。对于单个blob,verify_blob_kzg_proof_batch
调用verify_blob_kzg_proof
,开销可以忽略不计。
基准测试
C-KZG-4844在Go绑定中提供了基准测试。在高级语言中编写基准测试更容易,而在绑定中进行基准测试可以提供更真实的性能概述,包括FFI开销。此外,预计C-KZG-4844不会在绑定之外使用。
安全审计
C-KZG-4844的源代码于2023年6月由Sigma Prime进行了审计。您可以在doc/audit/
目录中找到审计报告。值得注意的是,审计针对的是提交fd24cf8
以及为EIP-7594引入的代码尚未进行审计。
为什么是C?
选择C的主要原因是我们想要使用的BLS12-381签名库blst大部分是用C编写的。Rust是一个可行的替代方案,但它有一些缺点。C工具链无处不在,让所有绑定都依赖于另一个工具链(如Rust)会有些尴尬。与Rust相比,C提供了更轻量级的内存和二进制占用。此外,C是FFI的事实上的语言,所以我们无论如何也无法完全避免使用C。