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 <noreply@anthropic.com>
This commit is contained in:
igneum-labs 2026-10-07 07:59:23 +00:00
parent 38da44d15f
commit de5ff2357f

View file

@ -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);
}
}