警告
该箱子已存档。开发已转移到 zksync-crypto 存储库。请改用它。
zkSync Era 是第 2 层汇总,它使用零知识证明来扩展以太坊,而不会影响安全性或去中心化。由于它与 EVM 兼容(Solidity/Vyper),因此 99% 的以太坊项目可以重新部署,而无需重构或重新审核一行代码。 zkSync Era 还使用基于 LLVM 的编译器,最终让开发人员可以用 C++、Rust 和其他流行语言编写智能合约。
该库的目的是使用非常具体的算术运算以及有关字段大小的附加假设。粗略地说,我们期望有一个带有 |F| 的字段F
~ 64 位(机器字的大小)(关于字段大小的假设对于算术和门布局策略并不重要,但在依赖于特定字段大小的特定函数的小工具实现中断言)。
该系统具有逻辑功能(小工具)的层次结构 - 门(可以将自身记录到跟踪中的实体) - 和求值器(多项式之间的关系)。评估器以特征的形式编写,允许我们稍后自动编写函数来检查可满足性和计算证明,以及合成普通验证器和递归验证器。门附加了额外的工具,允许门本身跟踪它们应该放置在迹线中的位置的逻辑。请注意,我们依靠 Plonk 的复制约束并处理“变量”的可复制逻辑实体来组成最终的可证明语句。该系统不适用于 AIR 算术,并且不允许表达跨越跟踪的多行的约束。
一般来说,痕迹包含很少种类的柱。主要区别在于:
此外,跟踪允许您添加查找参数,该参数还可以使用专用列来容纳查找表的条目,或者仅使用通用列。目前,表仅被编码为一组多项式,因此跟踪的总长度必须大于表中的条目总数。
请注意,每个“门”(作为 Rust 类型)都是唯一的,因此门只能放置在专用列或通用列中,但不能同时放置在两者中。如果需要这样的功能,那么可以制作一个新类型包装器。
更高级别的逻辑函数(如布尔分解、范围检查、零检查等)用于使电路以不同的方式在内部记录自己,具体取决于 CS 的特定实例中是否允许某些门。从 Rust 的角度来看,具有不同门集的 CS 实例被认为是不同的类型,我们依靠一些内联/常量 prop/编译器工作来减少静态跳转的分支。
|F|
,因此我们必须重复参数),但这将被更改,以便我们移动到扩展字段,如下所示提交给见证人后尽可能快地避免分母为零的相当“大”的机会。证明中计算费用的影响可以忽略不计我们使用通过关系sum_i selector(x_i) / (witness(x_i) + beta) == sum_i multiplicity(x_i) / (table(x_i) + beta)
执行的查找参数,其中对专用列selector(x_i)
的查找selector(x_i)
只是一个身份。我们也不将表编码为较小次数的多项式以消除额外的次数边界检查,而是用零填充它们。请注意,表条目永远不会包含(0,0,...,0)
元素,因为在多个表的情况下(即使只使用一个表),我们对表类型使用单独的 ID 列,并且使用 ID就像这样从1开始。
像这样的查找参数的一个很好的功能是,由于其附加性质,如果我们在同一个表中查找多个witness
多项式,而不是对每个多项式(元组)重复该参数(这将需要一个单独的多重性列,以及稍后的一些中间多项式),我们可以“添加”多重性并将参数转换为类似sum_i selector_0(x_i) / (witness_0(x_i) + beta) + sum_i selector_1(x_i) / (witness_1(x_i) + beta) == sum_i total_multiplicity(x_i) / (table(x_i) + beta)
,这样查找的总成本只是 1 个多重性列和 2 个(与见证相关的)+ 1 个(与表相关的)中间多项式来编码 lhs和rhs关系在统一的根源上。
这个论点的正确性是显而易见的。为了合理性,我们使用“快速查找的缓存商”论文引理 2.4 中的原始参数。我们需要证明,提交total_multiplicity
就足够了,而不是分别提交witness_0
和witness_1
的多重性。
假设方程sum_i selector_0(x_i) / (witness_0(x_i) + X) + sum_i selector_1(x_i) / (witness_1(x_i) + X) == sum_i total_multiplicity(x_i) / (table(x_i) + X)
成立。我们需要证明witness_0
和witness_1
包含在表t
中。令f = (witness_0 | witness_1)
,值的串联。上面的等式意味着sum_i selector_i / (f_i + X) == sum_i total_multiplicity_i / (t_i + X)
(注意 LHS 上i
的区间长度是上面的两倍)。根据引理 2.4,我们得到f subset t
:“子集”,即向量f
的每个坐标都是t
的坐标。特别是, witness_0, witness_1 subset f subset t
。
请注意,该论点也适用于多个witness_i
。对于所选的beta
,其余的稳健性论证直接遵循上述工作。
2^-40
机会在分母中获得0
相比,这种权衡是可以接受的有 8kB SHA256 的基准,使用我们认为是 SHA256 电路的门 + 表的最佳配置。请注意,尽管证明器速度有点快,但我们没有正确优化 FFT,并且仍然使用 Poseidon(而不是 Poseidon2)进行我们希望将证明用于递归的配置。两个脚本sha256_bench_recursive.sh
和sha256_bench_non_recursive.sh
允许您运行相应的测试(是否预计将在递归中使用证明),并且您应该查找一行Proving is done, taken ...
以查看证明时间,因为在它之后运行的验证程序非常冗长。这些基准测试使用 LDE 因子 8,尽管我们所有的约束都是 4 级或更小 - 然而,它是一些其他公共基准测试中使用的参数。我们也不在这些证明中使用 PoW,因为 20 位的 PoW 可以忽略不计(30 毫秒),而且我们还不支持代数哈希上的 PoW(然而,这些仅慢约 2 倍,所以也可以忽略不计)。安全级别大约为100
位,但可以通过增加查询数量来提高 FRI 健全性,并且查询数量的增加不会增加证明时间(不要与更改 FRI 速率相混淆)。跟踪长度为2^16
,它使用 60 个通用列和 8 个宽度为 4 的查找参数。
注意:基准测试只是尝试编译为本机架构,目前通常仅对 AArch64(读取 Apple M1)架构进行端到端测试。 x86-64 算术实现进行了有效性测试,但未进行端到端的完整证明。请注意,除了cpu = native
之外,最大性能 x86-64 还需要额外的编译器功能标志(即使在本机 CPU 上,Rust 编译器也不使用 AVX512 集)
Boojum 证明者根据以下任一条款进行分发
由您选择。
zkSync Era 已经通过了大量的测试和审核。虽然它已经上线,但仍处于 alpha 状态,并将接受更多审核和错误赏金计划。我们很乐意听到社区对此的想法和建议!需要指出的是,现在分叉可能会导致丢失重要的安全更新、关键功能和性能改进。
该软件包含来自第三方的组件。有关这些组件及其许可证的完整列表,请参阅第三方声明文件。