From 8eded60f286be0af73a3d4e95646363ea840504e Mon Sep 17 00:00:00 2001 From: ashpect Date: Sun, 22 Mar 2026 02:42:33 +0530 Subject: [PATCH] fix: bind evals to transcript --- provekit/prover/src/whir_r1cs.rs | 12 +++++-- provekit/verifier/src/whir_r1cs.rs | 51 +++++++++++++++++++----------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/provekit/prover/src/whir_r1cs.rs b/provekit/prover/src/whir_r1cs.rs index a2d55f84..642ab1b6 100644 --- a/provekit/prover/src/whir_r1cs.rs +++ b/provekit/prover/src/whir_r1cs.rs @@ -267,7 +267,9 @@ fn prove_from_alphas( let (mut weights, evals) = create_weights_and_evaluations::<3>(scheme.m, &commitment.polynomial, alphas); - merlin.prover_hint_ark(&evals); + for eval in &evals { + merlin.prover_message(eval); + } if !public_inputs.is_empty() { let public_eval = compute_public_weight_evaluation( @@ -323,8 +325,12 @@ fn prove_from_alphas( let evals_1 = compute_alpha_evals(&c1.polynomial, &alphas_1); let evals_2 = compute_alpha_evals(&c2.polynomial, &alphas_2); - merlin.prover_hint_ark(&evals_1); - merlin.prover_hint_ark(&evals_2); + for eval in &evals_1 { + merlin.prover_message(eval); + } + for eval in &evals_2 { + merlin.prover_message(eval); + } let public_1 = if !public_inputs.is_empty() { let p1 = compute_public_eval(x, public_inputs.len(), &c1.polynomial); diff --git a/provekit/verifier/src/whir_r1cs.rs b/provekit/verifier/src/whir_r1cs.rs index 84bd0c27..e1366523 100644 --- a/provekit/verifier/src/whir_r1cs.rs +++ b/provekit/verifier/src/whir_r1cs.rs @@ -118,18 +118,28 @@ impl WhirR1CSVerifier for WhirR1CSScheme { .try_into() .map_err(|_| anyhow::anyhow!("Expected 3 alpha vectors for commitment 2"))?; - let evals_1: Vec = arthur - .prover_hint_ark() - .map_err(|_| anyhow::anyhow!("Failed to read evals_1 hint"))?; - let evals_2: Vec = arthur - .prover_hint_ark() - .map_err(|_| anyhow::anyhow!("Failed to read evals_2 hint"))?; - let evals_1: [FieldElement; 3] = evals_1 - .try_into() - .map_err(|_| anyhow::anyhow!("Expected 3 evaluation values for commitment 1"))?; - let evals_2: [FieldElement; 3] = evals_2 - .try_into() - .map_err(|_| anyhow::anyhow!("Expected 3 evaluation values for commitment 2"))?; + let evals_1: [FieldElement; 3] = [ + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals_1[0]"))?, + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals_1[1]"))?, + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals_1[2]"))?, + ]; + let evals_2: [FieldElement; 3] = [ + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals_2[0]"))?, + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals_2[1]"))?, + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals_2[2]"))?, + ]; let mut weights_1 = build_prefix_covectors(self.m, alphas_1); let weights_2 = build_prefix_covectors(self.m, alphas_2); @@ -171,12 +181,17 @@ impl WhirR1CSVerifier for WhirR1CSScheme { evals_1[2] + evals_2[2], ) } else { - let evals: Vec = arthur - .prover_hint_ark() - .map_err(|_| anyhow::anyhow!("Failed to read evals hint"))?; - let evals: [FieldElement; 3] = evals - .try_into() - .map_err(|_| anyhow::anyhow!("Expected 3 evaluation values"))?; + let evals: [FieldElement; 3] = [ + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals[0]"))?, + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals[1]"))?, + arthur + .prover_message() + .map_err(|_| anyhow::anyhow!("Failed to read evals[2]"))?, + ]; let mut weights = build_prefix_covectors(self.m, alphas);