2 个稳定版本
2.0.13 | 2024 年 3 月 12 日 |
---|---|
2.0.12 | 2024 年 1 月 21 日 |
每月下载量 53
1MB
17K SLoC
AxiomV2Core ZK 电路
生成和验证密钥
有关如何在以太坊主网上生产中使用确切的生成和验证密钥的说明,请参阅此处。
公共实例格式
任何 Snark
都有一个与之相关的 Vec<Fr>
公共实例。我们下面描述了与 AxiomV2Core
电路相关的格式。
EthBlockHeaderChainCircuit
pub struct EthBlockHeaderChainInput<F> {
header_rlp_encodings: Vec<Vec<u8>>,
num_blocks: u32, // num_blocks in [0, 2 ** max_depth)
max_depth: usize,
network: Network,
_marker: PhantomData<F>,
}
这取决于一个 max_depth
参数。公共实例是
prev_hash
:H256
作为 hi-lo 格式中的两个Fr
元素end_hash
:H256
作为 hi-lo 格式中的两个Fr
元素start_block_number . end_block_number
:我们假设这两个数字都是u32
类型,并将它们编码为单个Fr
元素,格式为start_block_number * 2^32 + end_block_number
merkle_mountain_range
:一个由max_depth + 1
个H256
元素组成的序列,每个元素都编码为两个 hi-lo 格式的Fr
元素
注意
prev_hash
是编号为start_block_number
的块的父哈希end_hash
是编号为end_block_number
的块的哈希end_block_number - start_block_number
被限制为<= 2^max_depth
- 这之前在
axiom-eth
v0.1.1
中被假设,但因为没有强制执行,因为块编号是公开实例,但现在我们为了安全起见强制执行它
- 这之前在
merkle_mountain_range
按从最大峰值(深度max_depth
)到最小峰值(深度0
)的顺序排列
EthBlockHeaderChainIntermediateAggregationCircuit
pub struct EthBlockHeaderChainIntermediateAggregationInput {
num_blocks: u32,
snarks: Vec<Snark>,
pub max_depth: usize,
pub initial_depth: usize,
}
该电路接受两个 EthBlockHeaderChainCircuit
,并将它们聚合起来。公开实例包括
4 * LIMBS = 12
个Fr
元素,用于表示 累加器 的两个 BN254G1
点,验证者使用这些点进行配对检查prev_hash
:H256
作为 hi-lo 格式中的两个Fr
元素end_hash
:H256
作为 hi-lo 格式中的两个Fr
元素start_block_number . end_block_number
:我们假设这两个数字都是u32
类型,并将它们编码为单个Fr
元素,格式为start_block_number * 2^32 + end_block_number
merkle_mountain_range
:一个由2^{max_depth - initial_depth} + initial_depth
个H256
元素组成的序列,每个元素都编码为两个 hi-lo 格式的Fr
元素
注意
- 与
EthBlockHeaderChainCircuit
相同的说明,但merkle_mountain_range
实际上不是一个 Merkle 山脉:我们通过从叶子节点merkle_mountain_range[..2^{max_depth - initial_depth}]
形成一个 Merkle 山脉,然后将其追加到末尾来恢复长度为max_depth + 1
的 Merkle 山脉- 原因是我们想延迟 Keccak
EthBlockHeaderChainRootAggregationCircuit
pub struct EthBlockHeaderChainRootAggregationInput {
/// See [EthBlockHeaderChainIntermediateAggregationInput]
pub inner: EthBlockHeaderChainIntermediateAggregationInput,
/// Succinct verifying key (generator of KZG trusted setup) should match `inner.snarks`
pub svk: Svk,
prev_acc_indices: Vec<Vec<usize>>,
}
本电路接受两个EthBlockHeaderChainIntermediateAggregationCircuit
,并将它们聚合。公开实例包括
4 * LIMBS = 12
个Fr
元素,用于表示 累加器 的两个 BN254G1
点,验证者使用这些点进行配对检查prev_hash
:H256
作为 hi-lo 格式中的两个Fr
元素end_hash
:H256
作为 hi-lo 格式中的两个Fr
元素start_block_number . end_block_number
:我们假设这两个数字都是u32
类型,并将它们编码为单个Fr
元素,格式为start_block_number * 2^32 + end_block_number
merkle_mountain_range
:一个由max_depth + 1
个H256
元素组成的序列,每个元素都编码为两个 hi-lo 格式的Fr
元素
注意
- 与
EthBlockHeaderChainCircuit
相同的说明 - 此电路与
EthBlockHeaderChainIntermediateAggregationCircuit
相同,但会进行最终的Keccak操作以形成完整的Merkle山脉
透传聚合电路
此代码来自axiom-eth
。
pub struct InputMerkleAggregation {
pub snarks: Vec<EnhancedSnark>,
}
我们仅在snarks
长度为1且由单个snark组成时使用此电路。在这种情况下,它是一个AggregationCircuit
,它仅通过snarks
中的单个snark的公开实例透传,并丢弃旧累积器(因为没有多个snark,所以没有Merkle根计算)。
如果我们想要进行多轮透传聚合,我们将使用此snark在EthBlockHeaderChainRootAggregationCircuit
或其自身上。公开实例与EthBlockHeaderChainRootAggregationCircuit
完全相同。
依赖关系
~31–49MB
~1M SLoC