美文网首页
聚合证明解析

聚合证明解析

作者: 雪落无留痕 | 来源:发表于2021-07-10 16:44 被阅读0次

本文主要对Matter Labs 聚合证明理论和源代码进行解析,参考:

Github: https://github.com/matter-labs/recursive_aggregation_circuit

commit:30bbf42c81c08ba8a15dcad3eaca9e771c4d8c89

日期:2021-07-11

聚合证明

聚合证明与Plonk共用CRS。

应用相关设置

  1. 电路合成

    #[derive(Clone)]
    pub struct Assembly<E: Engine, P: PlonkConstraintSystemParams<E>, MG: MainGate<E>, S: SynthesisMode> {
        pub inputs_storage: PolynomialStorage<E>,
        pub aux_storage: PolynomialStorage<E>,
        pub num_input_gates: usize,
        pub num_aux_gates: usize,
        pub max_constraint_degree: usize,
        pub main_gate: MG,
        pub input_assingments: Vec<E::Fr>,
        pub aux_assingments: Vec<E::Fr>,
        pub num_inputs: usize,
        pub num_aux: usize,
        pub trace_step_for_batch: Option<usize>,
        pub is_finalized: bool,
    
        pub gates: std::collections::HashSet<Box<dyn GateInternal<E>>>,
        pub all_queried_polys_in_constraints: std::collections::HashSet<PolynomialInConstraint>,
        // pub sorted_setup_polynomial_ids: Vec<PolyIdentifier>,
        pub sorted_gates: Vec<Box<dyn GateInternal<E>>>,
        pub aux_gate_density: GateDensityStorage<E>,
        pub explicit_zero_variable: Option<Variable>,
        pub explicit_one_variable: Option<Variable>,
    
        pub tables: Vec<Arc<LookupTableApplication<E>>>,
        pub multitables: Vec<Arc<MultiTableApplication<E>>>,
        pub table_selectors: std::collections::HashMap<String, BitVec>,
        pub multitable_selectors: std::collections::HashMap<String, BitVec>,
        pub table_ids_poly: Vec<E::Fr>,
        pub total_length_of_all_tables: usize,
    
        pub individual_table_entries: std::collections::HashMap<String, Vec<Vec<E::Fr>>>,
        pub individual_multitable_entries: std::collections::HashMap<String, Vec<Vec<E::Fr>>>,
        pub known_table_ids: Vec<E::Fr>,
        pub num_table_lookups: usize,
        pub num_multitable_lookups: usize,
    
        _marker_p: std::marker::PhantomData<P>,
        _marker_s: std::marker::PhantomData<S>,
    }
    
  1. setup生成
#[derive(Clone, PartialEq, Eq)]
pub struct Setup<E: Engine, C: Circuit<E>> {
    pub n: usize,
    pub num_inputs: usize,
    pub state_width: usize,
    pub num_witness_polys: usize,

    pub gate_setup_monomials: Vec<Polynomial<E::Fr, Coefficients>>,
    pub gate_selectors_monomials: Vec<Polynomial<E::Fr, Coefficients>>,
    pub permutation_monomials: Vec<Polynomial<E::Fr, Coefficients>>,

    pub total_lookup_entries_length: usize,
    pub lookup_selector_monomial: Option<Polynomial<E::Fr, Coefficients>>,
    pub lookup_tables_monomials: Vec<Polynomial<E::Fr, Coefficients>>,
    pub lookup_table_type_monomial: Option<Polynomial<E::Fr, Coefficients>>,

    pub non_residues: Vec<E::Fr>,

    _marker: std::marker::PhantomData<C>
}
  1. 验证密钥生成
#[derive(Clone, PartialEq, Eq)]
pub struct VerificationKey<E: Engine, C: Circuit<E>> {
    pub n: usize,
    pub num_inputs: usize,
    pub state_width: usize,
    pub num_witness_polys: usize,

    pub gate_setup_commitments: Vec<E::G1Affine>,
    pub gate_selectors_commitments: Vec<E::G1Affine>,
    pub permutation_commitments: Vec<E::G1Affine>,

    pub total_lookup_entries_length: usize,
    pub lookup_selector_commitment: Option<E::G1Affine>,
    pub lookup_tables_commitments: Vec<E::G1Affine>,
    pub lookup_table_type_commitment: Option<E::G1Affine>,

    pub non_residues: Vec<E::Fr>,
    pub g2_elements: [E::G2Affine; 2],

    _marker: std::marker::PhantomData<C>
}

证明过程

生成的证明为:

#[derive(Clone, PartialEq, Eq)]
pub struct Proof<E: Engine, C: Circuit<E>> {
    pub n: usize,
    pub inputs: Vec<E::Fr>,
    pub state_polys_commitments: Vec<E::G1Affine>,
    pub witness_polys_commitments: Vec<E::G1Affine>,
    pub copy_permutation_grand_product_commitment: E::G1Affine,

    pub lookup_s_poly_commitment: Option<E::G1Affine>,
    pub lookup_grand_product_commitment: Option<E::G1Affine>,

    pub quotient_poly_parts_commitments: Vec<E::G1Affine>,

    pub state_polys_openings_at_z: Vec<E::Fr>,
    pub state_polys_openings_at_dilations: Vec<(usize, usize, E::Fr)>,
    pub witness_polys_openings_at_z: Vec<E::Fr>,
    pub witness_polys_openings_at_dilations: Vec<(usize, usize, E::Fr)>,

    pub gate_setup_openings_at_z: Vec<(usize, usize, E::Fr)>,
    pub gate_selectors_openings_at_z: Vec<(usize, E::Fr)>,

    pub copy_permutation_polys_openings_at_z: Vec<E::Fr>,
    pub copy_permutation_grand_product_opening_at_z_omega: E::Fr,

    pub lookup_s_poly_opening_at_z_omega: Option<E::Fr>,
    pub lookup_grand_product_opening_at_z_omega: Option<E::Fr>,

    pub lookup_t_poly_opening_at_z: Option<E::Fr>,
    pub lookup_t_poly_opening_at_z_omega: Option<E::Fr>,

    pub lookup_selector_poly_opening_at_z: Option<E::Fr>,
    pub lookup_table_type_poly_opening_at_z: Option<E::Fr>,

    pub quotient_poly_opening_at_z: E::Fr,

    pub linearization_poly_opening_at_z: E::Fr,

    pub opening_proof_at_z: E::G1Affine,
    pub opening_proof_at_z_omega: E::G1Affine,

    _marker: std::marker::PhantomData<C>
}

验证过程

采用双线性对进行校验。

参考

https://eprint.iacr.org/2019/953

https://vitalik.ca/general/2019/09/22/plonk.html

https://research.metastate.dev/plonk-by-hand-part-1/

https://github.com/matter-labs/proof_system_info_v1.0/blob/master/PlonkUnrolledForEthereum.pdf

相关文章

网友评论

      本文标题:聚合证明解析

      本文链接:https://www.haomeiwen.com/subject/mymxpltx.html