From d845af5d1da42f7ac956dded3de4c4ea33bdabf6 Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 08:06:59 +0000 Subject: [PATCH] fin-proof: fin-synth takes a DAA base when the fixture carries none Co-Authored-By: Claude Fable 5.1 --- proving/igneum-prove/host/src/fin.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/proving/igneum-prove/host/src/fin.rs b/proving/igneum-prove/host/src/fin.rs index ec5630451..86cf98438 100644 --- a/proving/igneum-prove/host/src/fin.rs +++ b/proving/igneum-prove/host/src/fin.rs @@ -172,7 +172,10 @@ fn synth_hash(tag: &str, n: u64) -> H { /// certificate verification touched (for the report). pub fn synth(fixtures: &[Fixture], keys: usize, voters: usize, window_blocks: u64, cert_back: usize) -> Result { let first = fixtures.first().ok_or_else(|| anyhow!("no fixtures"))?; - let first_daa = first.block.env.daa_score.max(1); + // a fixture written before the DAA field existed carries 0; the guest never checks the DAA against the shard + // statement, so the synthetic run takes a base of its own then (the real chain's DAA is what the node feeds) + let daa_base = if first.block.env.daa_score == 0 { 100_000 } else { first.block.env.daa_score }; + let first_daa = daa_base; // the window of the root state: W spans the synthetic history; min_daa under the first DAA so certificates pass C5 let params = FinParams { chain_id: "igneum-fin-synth".into(), weight_window: window_blocks.max(16) * 2, dust: 1, min_daa: 1, leave_delay: 3_600, equivocation_ban: window_blocks.max(16) * 2 }; let synth_keys: Vec = (0..keys.max(1)).map(synth_key).collect(); @@ -204,7 +207,7 @@ pub fn synth(fixtures: &[Fixture], keys: usize, voters: usize, window_blocks: u6 let mut blocks = Vec::new(); for (i, f) in fixtures.iter().enumerate() { let n = f.block.env.number; - let daa = f.block.env.daa_score.max(state.end_daa); + let daa = (daa_base + i as u64).max(state.end_daa); let k = &synth_keys[i % synth_keys.len()]; let k2 = &synth_keys[(i * 5 + 1) % synth_keys.len()]; let block = ChainBlockWitness { number: n, block_hash: f.block.env.hash.0, daa, blues: vec![BlueBlock { block_hash: f.block.env.hash.0, key_hash: k.hash, daa }, BlueBlock { block_hash: synth_hash("side", n), key_hash: k2.hash, daa }] };