better measuring (#295)

This commit is contained in:
Eduard S. 2025-06-18 17:23:32 +02:00 committed by GitHub
parent 0541817116
commit df8fce76d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 40 additions and 21 deletions

View file

@ -152,7 +152,7 @@ impl OperationVerifyGadget {
merkle_claims: &[MerkleClaimTarget], merkle_claims: &[MerkleClaimTarget],
custom_predicate_verification_table: &[HashOutTarget], custom_predicate_verification_table: &[HashOutTarget],
) -> Result<()> { ) -> Result<()> {
let measure = measure_gates_begin!(builder, "OperationVerify"); let measure = measure_gates_begin!(builder, "OpVerify");
let _true = builder._true(); let _true = builder._true();
let _false = builder._false(); let _false = builder._false();
@ -861,7 +861,7 @@ impl CustomOperationVerifyGadget {
st_tmpl: &StatementTmplTarget, st_tmpl: &StatementTmplTarget,
args: &[ValueTarget], args: &[ValueTarget],
) -> StatementTarget { ) -> StatementTarget {
let measure = measure_gates_begin!(builder, "StatementArgFromTemplate"); let measure = measure_gates_begin!(builder, "StArgFromTmpl");
let args = st_tmpl let args = st_tmpl
.args .args
.iter() .iter()
@ -886,7 +886,7 @@ impl CustomOperationVerifyGadget {
op_args: &[StatementTarget], op_args: &[StatementTarget],
args: &[ValueTarget], // arguments to the custom predicate, public and private args: &[ValueTarget], // arguments to the custom predicate, public and private
) -> Result<(StatementTarget, OperationTypeTarget)> { ) -> Result<(StatementTarget, OperationTypeTarget)> {
let measure = measure_gates_begin!(builder, "CustomOperationVerify"); let measure = measure_gates_begin!(builder, "CustomOpVerify");
// Some sanity checks // Some sanity checks
assert_eq!(self.params.max_operation_args, op_args.len()); assert_eq!(self.params.max_operation_args, op_args.len());
assert_eq!(self.params.max_custom_predicate_wildcards, args.len()); assert_eq!(self.params.max_custom_predicate_wildcards, args.len());
@ -1100,7 +1100,7 @@ impl MainPodVerifyGadget {
&self, &self,
builder: &mut CircuitBuilder, builder: &mut CircuitBuilder,
) -> Result<(Vec<HashOutTarget>, Vec<CustomPredicateBatchTarget>)> { ) -> Result<(Vec<HashOutTarget>, Vec<CustomPredicateBatchTarget>)> {
let measure = measure_gates_begin!(builder, "BuildCustomPredicateTable"); let measure = measure_gates_begin!(builder, "BuildCustomPredTbl");
let params = &self.params; let params = &self.params;
let mut custom_predicate_table = let mut custom_predicate_table =
Vec::with_capacity(params.max_custom_predicate_batches * params.max_custom_batch_size); Vec::with_capacity(params.max_custom_predicate_batches * params.max_custom_batch_size);
@ -1142,7 +1142,7 @@ impl MainPodVerifyGadget {
builder: &mut CircuitBuilder, builder: &mut CircuitBuilder,
custom_predicate_table: &[HashOutTarget], custom_predicate_table: &[HashOutTarget],
) -> Result<(Vec<HashOutTarget>, Vec<CustomPredicateVerifyEntryTarget>)> { ) -> Result<(Vec<HashOutTarget>, Vec<CustomPredicateVerifyEntryTarget>)> {
let measure = measure_gates_begin!(builder, "BuildCustomPredicateVerificationTable"); let measure = measure_gates_begin!(builder, "BuildCustomPredVerifyTbl");
let params = &self.params; let params = &self.params;
let mut custom_predicate_verifications = let mut custom_predicate_verifications =
Vec::with_capacity(params.max_custom_predicate_verifications); Vec::with_capacity(params.max_custom_predicate_verifications);
@ -1200,7 +1200,7 @@ impl MainPodVerifyGadget {
let measure = measure_gates_begin!(builder, "MainPodVerify"); let measure = measure_gates_begin!(builder, "MainPodVerify");
let params = &self.params; let params = &self.params;
// 1. Verify all input signed pods // 1a. Verify all input signed pods
let mut signed_pods = Vec::new(); let mut signed_pods = Vec::new();
for _ in 0..params.max_input_signed_pods { for _ in 0..params.max_input_signed_pods {
let signed_pod = SignedPodVerifyGadget { let signed_pod = SignedPodVerifyGadget {
@ -1226,14 +1226,23 @@ impl MainPodVerifyGadget {
1 + self.params.max_input_signed_pods * self.params.max_signed_pod_values 1 + self.params.max_input_signed_pods * self.params.max_signed_pod_values
); );
// 1b. Verify all input recursive pods
let id_gadget = CalculateIdGadget { let id_gadget = CalculateIdGadget {
params: params.clone(), params: params.clone(),
}; };
let mut input_pods_self_statements: Vec<Vec<StatementTarget>> = Vec::new();
let normalize_statement_gadget = NormalizeStatementGadget { let normalize_statement_gadget = NormalizeStatementGadget {
params: self.params.clone(), params: self.params.clone(),
}; };
let vds_root = builder.add_virtual_hash();
let mut input_pods_self_statements: Vec<Vec<StatementTarget>> = Vec::new();
let mut vd_mt_proofs: Vec<MerkleClaimAndProofTarget> = Vec::new();
for verified_proof in verified_proofs { for verified_proof in verified_proofs {
let measure_in_pod = measure_gates_begin!(builder, "VerifyInPod");
//
// Verify id from the statements
//
let expected_id = HashOutTarget::try_from( let expected_id = HashOutTarget::try_from(
&verified_proof.public_inputs[PI_OFFSET_ID..PI_OFFSET_ID + HASH_SIZE], &verified_proof.public_inputs[PI_OFFSET_ID..PI_OFFSET_ID + HASH_SIZE],
) )
@ -1252,14 +1261,12 @@ impl MainPodVerifyGadget {
let id = id_gadget.eval(builder, &input_pod_self_statements); let id = id_gadget.eval(builder, &input_pod_self_statements);
builder.connect_hashes(expected_id, id); builder.connect_hashes(expected_id, id);
input_pods_self_statements.push(input_pod_self_statements); input_pods_self_statements.push(input_pod_self_statements);
}
let vds_root = builder.add_virtual_hash(); //
// Verify that all input pod proofs use verifier data from the public input VD
// array. This requires merkle proofs
//
// verify that all input pod proofs use verifier data from the public input VD array This
// requires merkle proofs
let mut vd_mt_proofs: Vec<MerkleClaimAndProofTarget> = vec![];
for verified_proof in verified_proofs {
// add target for the vd_mt_proof // add target for the vd_mt_proof
let vd_mt_proof = MerkleProofGadget { let vd_mt_proof = MerkleProofGadget {
max_depth: params.max_depth_mt_vds, max_depth: params.max_depth_mt_vds,
@ -1277,17 +1284,18 @@ impl MainPodVerifyGadget {
verified_proof.verifier_data_hash, verified_proof.verifier_data_hash,
HashOutTarget::from_vec(vd_mt_proof.value.elements.to_vec()), HashOutTarget::from_vec(vd_mt_proof.value.elements.to_vec()),
); );
vd_mt_proofs.push(vd_mt_proof); vd_mt_proofs.push(vd_mt_proof);
}
//
// Verify that VD array that input pod uses is the same we use now. // Verify that VD array that input pod uses is the same we use now.
for verified_proof in verified_proofs { //
let verified_proof_vds_root = HashOutTarget::try_from( let verified_proof_vds_root = HashOutTarget::try_from(
&verified_proof.public_inputs[PI_OFFSET_VDSROOT..PI_OFFSET_VDSROOT + HASH_SIZE], &verified_proof.public_inputs[PI_OFFSET_VDSROOT..PI_OFFSET_VDSROOT + HASH_SIZE],
) )
.expect("4 elements"); .expect("4 elements");
builder.connect_hashes(vds_root, verified_proof_vds_root); builder.connect_hashes(vds_root, verified_proof_vds_root);
measure_gates_end!(builder, measure_in_pod);
} }
// Add the input (private and public) statements and corresponding operations // Add the input (private and public) statements and corresponding operations

View file

@ -30,6 +30,7 @@ use crate::{
Hash, MainPodInputs, NativeOperation, OperationType, Params, Pod, PodId, PodProver, Hash, MainPodInputs, NativeOperation, OperationType, Params, Pod, PodId, PodProver,
PodType, RecursivePod, StatementArg, ToFields, VDSet, F, KEY_TYPE, SELF, PodType, RecursivePod, StatementArg, ToFields, VDSet, F, KEY_TYPE, SELF,
}, },
timed,
}; };
/// Hash a list of public statements to derive the PodId. To make circuits with different number /// Hash a list of public statements to derive the PodId. To make circuits with different number
@ -540,7 +541,10 @@ impl Prover {
custom_predicate_batches, custom_predicate_batches,
custom_predicate_verifications, custom_predicate_verifications,
}; };
let proof_with_pis = main_pod.prove(&input, proofs, verifier_datas)?; let proof_with_pis = timed!(
"MainPod::prove",
main_pod.prove(&input, proofs, verifier_datas)?
);
Ok(MainPod { Ok(MainPod {
params: params.clone(), params: params.clone(),
@ -873,6 +877,7 @@ pub mod tests {
let dist_1 = helper let dist_1 = helper
.dist_1(&alice_attestation)? .dist_1(&alice_attestation)?
.prove(&mut prover, &params)?; .prove(&mut prover, &params)?;
crate::measure_gates_print!();
dist_1.pod.verify()?; dist_1.pod.verify()?;
let dist_2 = helper let dist_2 = helper
.dist_n_plus_1(&dist_1, &bob_attestation)? .dist_n_plus_1(&dist_1, &bob_attestation)?

View file

@ -224,8 +224,7 @@ pub struct MerkleProofExistenceTarget {
impl MerkleProofExistenceGadget { impl MerkleProofExistenceGadget {
/// creates the targets and defines the logic of the circuit /// creates the targets and defines the logic of the circuit
pub fn eval(&self, builder: &mut CircuitBuilder<F, D>) -> Result<MerkleProofExistenceTarget> { pub fn eval(&self, builder: &mut CircuitBuilder<F, D>) -> Result<MerkleProofExistenceTarget> {
let measure = let measure = measure_gates_begin!(builder, format!("MerkleProofExist_{}", self.max_depth));
measure_gates_begin!(builder, format!("MerkleProofExistence_{}", self.max_depth));
let enabled = builder.add_virtual_bool_target_safe(); let enabled = builder.add_virtual_bool_target_safe();
let root = builder.add_virtual_hash(); let root = builder.add_virtual_hash();
let key = builder.add_virtual_value(); let key = builder.add_virtual_value();

View file

@ -41,6 +41,7 @@ use crate::{
curve::ECAddHomogOffset, field::NNFMulSimple, generic::GateAdapter, curve::ECAddHomogOffset, field::NNFMulSimple, generic::GateAdapter,
}, },
}, },
measure_gates_begin, measure_gates_end,
middleware::F, middleware::F,
timed, timed,
}; };
@ -190,14 +191,17 @@ impl<I: InnerCircuit> RecursiveCircuit<I> {
common_data: &CommonCircuitData<F, D>, common_data: &CommonCircuitData<F, D>,
inner_params: &I::Params, inner_params: &I::Params,
) -> Result<RecursiveCircuitTarget<I>> { ) -> Result<RecursiveCircuitTarget<I>> {
let measure = measure_gates_begin!(builder, "RecCircuit");
// proof verification // proof verification
let verifier_datas_targ: Vec<VerifierCircuitTarget> = (0..arity) let verifier_datas_targ: Vec<VerifierCircuitTarget> = (0..arity)
.map(|_| builder.add_virtual_verifier_data(builder.config.fri_config.cap_height)) .map(|_| builder.add_virtual_verifier_data(builder.config.fri_config.cap_height))
.collect(); .collect();
let proofs_targ: Vec<ProofWithPublicInputsTarget<D>> = (0..arity) let proofs_targ: Vec<ProofWithPublicInputsTarget<D>> = (0..arity)
.map(|i| { .map(|i| {
let measure_verify = measure_gates_begin!(builder, "VerifyProof");
let proof_targ = builder.add_virtual_proof_with_pis(common_data); let proof_targ = builder.add_virtual_proof_with_pis(common_data);
builder.verify_proof::<C>(&proof_targ, &verifier_datas_targ[i], common_data); builder.verify_proof::<C>(&proof_targ, &verifier_datas_targ[i], common_data);
measure_gates_end!(builder, measure_verify);
proof_targ proof_targ
}) })
.collect(); .collect();
@ -223,6 +227,8 @@ impl<I: InnerCircuit> RecursiveCircuit<I> {
// Build the InnerCircuit logic // Build the InnerCircuit logic
let innercircuit_targ: I = I::build(builder, inner_params, &verified_proofs)?; let innercircuit_targ: I = I::build(builder, inner_params, &verified_proofs)?;
measure_gates_end!(builder, measure);
pad_circuit(builder, common_data); pad_circuit(builder, common_data);
Ok(RecursiveCircuitTarget { Ok(RecursiveCircuitTarget {

View file

@ -23,6 +23,7 @@ use crate::{
containers::Dictionary, AnchoredKey, DynError, Hash, Key, Params, Pod, PodId, PodSigner, containers::Dictionary, AnchoredKey, DynError, Hash, Key, Params, Pod, PodId, PodSigner,
PodType, RawValue, Statement, Value, KEY_SIGNER, KEY_TYPE, SELF, PodType, RawValue, Statement, Value, KEY_SIGNER, KEY_TYPE, SELF,
}, },
timed,
}; };
pub struct Signer(pub SecretKey); pub struct Signer(pub SecretKey);
@ -42,7 +43,7 @@ impl Signer {
let dict = Dictionary::new(params.max_depth_mt_containers, kvs)?; let dict = Dictionary::new(params.max_depth_mt_containers, kvs)?;
let id = RawValue::from(dict.commitment()); // PodId as Value let id = RawValue::from(dict.commitment()); // PodId as Value
let signature: Signature = self.0.sign(id, &nonce); let signature: Signature = timed!("SignedPod::sign", self.0.sign(id, &nonce));
Ok(SignedPod { Ok(SignedPod {
id: PodId(Hash::from(id)), id: PodId(Hash::from(id)),
signature, signature,