#block-header #circuit #block-hash #chain #instance #forms #aggregation

bin+lib axiom-core

此包含生成 AxiomV2Core 智能合约证明的 ZK 电路。这些电路读取一系列块的 RLP 编码块头,并验证块头是否形成链。它们输出链的块哈希的 Merkle 山脉。此软件包还包含聚合电路,用于聚合多个电路以证明更长的链。

2 个稳定版本

2.0.13 2024 年 3 月 12 日
2.0.12 2024 年 1 月 21 日

神奇豆

Download history 10/week @ 2024-03-16 17/week @ 2024-03-30 5/week @ 2024-04-06

每月下载量 53

MIT 许可证

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 + 1H256 元素组成的序列,每个元素都编码为两个 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 = 12Fr 元素,用于表示 累加器 的两个 BN254 G1 点,验证者使用这些点进行配对检查
  • 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_depthH256 元素组成的序列,每个元素都编码为两个 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 = 12Fr 元素,用于表示 累加器 的两个 BN254 G1 点,验证者使用这些点进行配对检查
  • 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 + 1H256 元素组成的序列,每个元素都编码为两个 hi-lo 格式的 Fr 元素

注意

透传聚合电路

此代码来自axiom-eth

pub struct InputMerkleAggregation {
    pub snarks: Vec<EnhancedSnark>,
}

我们仅在snarks长度为1且由单个snark组成时使用此电路。在这种情况下,它是一个AggregationCircuit,它仅通过snarks中的单个snark的公开实例透传,并丢弃旧累积器(因为没有多个snark,所以没有Merkle根计算)。

如果我们想要进行多轮透传聚合,我们将使用此snark在EthBlockHeaderChainRootAggregationCircuit或其自身上。公开实例与EthBlockHeaderChainRootAggregationCircuit完全相同。

依赖关系

~31–49MB
~1M SLoC