Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file main_protocol.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287(*****************************************************************************)(* *)(* MIT License *)(* Copyright (c) 2022 Nomadic Labs <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)openPlonk.BlsopenPlonk.UtilsmoduleSMap=Plonk.SMapmoduletypeS=sigmodulePP:Polynomial_protocol.SincludePlonk.Main_protocol.SmoduleGates:Plonk.Custom_gates.SmodulePerm:Plonk.Permutation_gate.SwithmodulePP:=PP(** Returns (g, n), where n is the size of the circuit padded to the next
power of two & g is a primitive n-th root of unity
*)valget_gen_n_prover:prover_public_parameters->scalar*int(** Returns (g, n), where n is the size of the circuit padded to the next
power of two & g is a primitive n-th root of unity
*)valget_gen_n_verifier:verifier_public_parameters->scalar*intvalfilter_prv_pp_circuits:prover_public_parameters->'aSMap.t->prover_public_parametersvalfilter_vrf_pp_circuits:verifier_public_parameters->'aSMap.t->verifier_public_parameters(** Auxiliary information needed by the prover for the meta-verification in
aPlonK *)typeprover_aux={answers:scalarSMap.tSMap.tlist;batch:scalarSMap.tlist;alpha:scalar;beta:scalar;gamma:scalar;delta:scalar;x:scalar;r:scalar;cms_answers:PP.Answers_commitment.tSMap.t;cms_pi:PP.Answers_commitment.tSMap.t;ids_batch:(scalar*int)SMap.t;t_answers:scalarlist;}(** Auxiliary information needed by the verifier for the meta-verification in
aPlonK *)typeverifier_aux={alpha:scalar;beta:scalar;gamma:scalar;delta:scalar;x:scalar;r:scalar;}typeinput_commit_info={nb_max_answers:int;nb_max_pi:int;func:?size:int->?shift:int->scalararray->PP.Answers_commitment.t;}valprove_list:prover_public_parameters->input_commit_infos:input_commit_infoSMap.t->inputs:prover_inputs->proof*prover_auxvalverify_list:verifier_public_parameters->proof*scalarSMap.tlist*PP.Answers_commitment.publicSMap.t*PP.Answers_commitment.publicSMap.t*scalarlist*(scalar*int)SMap.t->bool*verifier_auxendmoduleMake_impl(Super_PP:Polynomial_protocol.S)=structincludePlonk.Main_protocol.Make_impl(Super_PP)moduleInput_commitment=Input_commitmentmodulePP=Super_PPtypeprover_aux={answers:scalarSMap.tSMap.tlist;batch:scalarSMap.tlist;alpha:scalar;beta:scalar;gamma:scalar;delta:scalar;x:scalar;r:scalar;cms_answers:PP.Answers_commitment.tSMap.t;cms_pi:PP.Answers_commitment.tSMap.t;ids_batch:(scalar*int)SMap.t;t_answers:scalarlist;}typeverifier_aux={alpha:scalar;beta:scalar;gamma:scalar;delta:scalar;x:scalar;r:scalar;}typeinput_commit_info={nb_max_answers:int;nb_max_pi:int;func:?size:int->?shift:int->scalararray->Super_PP.Answers_commitment.t;}lethash_pi(pp:prover_public_parameters)ic_infosinputs=(* TODO: can we commit only to the hidden pi?*)letpi_infos=SMap.mapi(funcircuit_nameinputs_list->letic_info=SMap.findcircuit_nameic_infosinletc=SMap.findcircuit_namepp.circuits_mapinletic_size=List.fold_left(+)0c.input_com_sizesinletpi=List.map(funs->Array.subs.witnessic_sizec.public_input_size)inputs_listin(pi,ic_info.func~size:ic_info.nb_max_pi@@Array.concatpi))inputsin(SMap.mapfstpi_infos,SMap.mapsndpi_infos)letcompute_ids_batch(pp:prover_public_parameters)rdalphaxpublic_inputs_mapanswerscms_answers=letn_gen=(pp.common_pp.n,Domain.getpp.common_pp.domain1)inletidentities=Verifier.build_identities(SMap.mapVerifier.circuit_verifier_pp_of_circuit_prover_pppp.circuits_map)n_genrdpublic_inputs_mapinletmerged_answers=letf_keym1m2=Some(SMap.union_disjointm1m2)inList.fold_left(SMap.unionf)SMap.emptyanswersinletevaluated_ids=identitiesxmerged_answersinSMap.mapi(funcircuit_name_->letids=SMap.Aggregation.filter_by_circuit_namecircuit_nameevaluated_idsin(Fr_generation.batchalpha(SMap.valuesids),SMap.cardinalids))(* we use cms_answers cause it contains the circuit_names *)cms_answersletupdate_transcript_with_pitranscriptcms_pi=SMap.fold(fun_cm_pitranscript->PP.Answers_commitment.(Transcript.expandpublic_tcm_pi)transcript)cms_pitranscriptletupdate_prv_pp_transcript_with_pi(pp:prover_public_parameters)cms_pi={ppwithtranscript=update_transcript_with_pipp.transcript(SMap.mapPP.Answers_commitment.(funa->a.public)cms_pi);}letcommit_to_answers_map=SMap.map(funic_info->ic_info.func~shift:ic_info.nb_max_pi~size:ic_info.nb_max_answers)letprove_list(pp:prover_public_parameters)~input_commit_infos~inputs=letpublic_inputs_map,cms_pi=hash_pippinput_commit_infosinputsin(* add the PI in the transcript *)letpp=update_prv_pp_transcript_with_pippcms_piinletcommit_to_answers_map=commit_to_answers_mapinput_commit_infosinlet((pp_proof,Super_PP.{answers;batch;alpha;x;r;cms_answers;t_answers}),(perm_and_plook,wires_cm,rd))=Prover.prove_parameters~pp_prove:(Super_PP.prove_super_aggregation~commit_to_answers_map)pp~inputs_map:inputsinletids_batch=compute_ids_batchpprdalphaxpublic_inputs_mapanswerscms_answersin({perm_and_plook;wires_cm;pp_proof},{answers;batch;alpha;beta=rd.beta_perm;gamma=rd.gamma_perm;delta=rd.delta;x;r;cms_answers;cms_pi;ids_batch;t_answers;})letverify_listpp(proof,s_list,cms_answers,cms_pi,t_answers,ids_batch)=(* add the PI in the transcript *)lettranscript=update_transcript_with_pipp.transcriptcms_piinlettranscript,_,rd,commitments,eval_points=(* Note that we don’t care about inputs here, because verify_parameters
only cares about input_coms & identities that we don’t have here *)Verifier.verify_parameters((pp.common_pp,pp.circuits_map),transcript)SMap.emptyproofinlet(kzg_verif,Super_PP.{alpha;x;r}),_transcript=Super_PP.verify_super_aggregationpp.common_pp.pp_public_parameterstranscript~n:pp.common_pp.n~generator:pp.common_pp.generator~commitments~eval_points~s_list~cms_answers~t_answers~ids_batchproof.pp_proofin(kzg_verif,{alpha;beta=rd.beta_perm;gamma=rd.gamma_perm;delta=rd.delta;x;r;})letget_gen_n_prover(prover_public_params:prover_public_parameters)=(Domain.getprover_public_params.common_pp.domain1,prover_public_params.common_pp.n)letget_gen_n_verifier(verifier_public_params:verifier_public_parameters)=(verifier_public_params.common_pp.generator,verifier_public_params.common_pp.n)endmoduleMake:functor(PP:Polynomial_protocol.S)->SwithmodulePP=PPandtypepublic_inputs=Scalar.tarraylist=Make_implincludeMake(Polynomial_protocol)