From c3952f2879542074c662270613515c5e46817ef3 Mon Sep 17 00:00:00 2001 From: vanhger Date: Tue, 27 Oct 2026 09:31:55 +0700 Subject: [PATCH] fix: validate BABE cut-and-choose inputs --- crates/bitvm-gc/src/babe_adapter.rs | 8 +++++++- node/src/handle.rs | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/crates/bitvm-gc/src/babe_adapter.rs b/crates/bitvm-gc/src/babe_adapter.rs index 25c512f2..ca9637e5 100644 --- a/crates/bitvm-gc/src/babe_adapter.rs +++ b/crates/bitvm-gc/src/babe_adapter.rs @@ -261,7 +261,7 @@ pub fn expand_compact_soldering_proof_payload( Ok((payload.opened, finalized, expand_compact_soldering_data(payload.soldering)?)) } -/// Derives finalized circuit indices using the real BABE/CAC Fiat-Shamir selection. +/// Randomly selects `m_cc` distinct finalized circuit indices for the cut-and-choose. pub fn derive_finalized_indices(package: &CACSetupPackage, m_cc: usize) -> Result> { let n_cc = package.commits.len(); if m_cc == 0 || m_cc > n_cc { @@ -595,6 +595,12 @@ fn recover_a_valid_finalized_messages( bail!("BABE prover state has no finalized instances"); } + if challenge_witness.witness.input_labels.len() != GC_INPUT_WIRES { + bail!( + "challenge witness has {} input labels; expected {GC_INPUT_WIRES}", + challenge_witness.witness.input_labels.len() + ); + } let base_input_labels: Vec = challenge_witness.witness.input_labels.iter().map(|&b| S(b)).collect(); let pi1_full_labels = base_input_labels[..2 * N_PADDED].to_vec(); diff --git a/node/src/handle.rs b/node/src/handle.rs index 670cbede..a4dba61e 100644 --- a/node/src/handle.rs +++ b/node/src/handle.rs @@ -2135,6 +2135,18 @@ async fn handle_cut_circuits_verifier( ); return Ok(()); } + // Reject a malformed cut before the expensive opening persists it: graph endorsement and + // challenge-assert both require exactly BABE_M_CC finalized instances. + if selected_circuit_indexes.len() != BABE_M_CC { + tracing::warn!( + instance_id = %instance_id, + graph_id = %graph_id, + selected = selected_circuit_indexes.len(), + expected = BABE_M_CC, + "Ignore CutCircuits with an invalid number of selected circuits" + ); + return Ok(()); + } if let Some(soldering_proof_ready) = verifier_state.soldering_proof_ready.clone() { if soldering_proof_ready.candidate_index != candidate_index {