From de5ff2357f3c41c3f7bfab47cf571b839455acca Mon Sep 17 00:00:00 2001 From: igneum-labs <337424239+igneum-labs@users.noreply.github.com> Date: Wed, 7 Oct 2026 07:59:23 +0000 Subject: [PATCH] fin-proof: a reveal rides with a key's first block in the table; a failed fold restores the ring Co-Authored-By: Claude Fable 5.1 --- proving/igneum-prove/fin/tests/harness.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/proving/igneum-prove/fin/tests/harness.rs b/proving/igneum-prove/fin/tests/harness.rs index c560dbecb..5af2e6b79 100644 --- a/proving/igneum-prove/fin/tests/harness.rs +++ b/proving/igneum-prove/fin/tests/harness.rs @@ -81,13 +81,25 @@ impl Sim { blues.push(BlueBlock { block_hash: hash_of(&format!("side-{j}"), n), key_hash: self.keys[k].hash, daa: n }); } let block = ChainBlockWitness { number: n, block_hash: hash_of("chain", n), daa: n, blues }; + // a key's reveal rides with its first block in the table (the node's W1 rule; the tracker re-supplies it + // whenever a key whose entry aged out mines again) + let mut witness = witness; + for b in &block.blues { + let known = igneum_fin_core::find_key(&self.state.keys, &b.key_hash).map(|i| self.state.keys[i].revealed()).unwrap_or(false); + if !known && !witness.reveals.iter().any(|r| vote_key_hash(&r.pubkey) == b.key_hash) { + let k = self.keys.iter().find(|k| k.hash == b.key_hash).unwrap(); + witness.reveals.push(reveal(k)); + } + } let before = self.state.clone(); + let ring_before = self.tracker.clone(); let r = fold_block(&mut self.state, &self.params, &block, &mut self.tracker, &witness, &self.bls); let witnesses = self.tracker.take_witnesses(); match r { Ok(_) => {} Err(e) => { self.state = before; + self.tracker = ring_before; return Err(e); } }