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:
parent
38da44d15f
commit
de5ff2357f
1 changed files with 12 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue