Skip to content

Commit 9570d62

Browse files
add failing nullification check
1 parent 539818e commit 9570d62

2 files changed

Lines changed: 32 additions & 3 deletions

File tree

consensus/src/threshold_simplex/mocks/supervisor.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ pub struct Supervisor<P: Array, D: Digest> {
4242
nullify_namespace: Vec<u8>,
4343
finalize_namespace: Vec<u8>,
4444

45+
pub leaders: Arc<Mutex<HashMap<View, P>>>,
4546
pub notarizes: Arc<Mutex<Participation<D, P>>>,
4647
pub nullifies: Arc<Mutex<HashMap<View, HashSet<P>>>>,
4748
pub finalizes: Arc<Mutex<Participation<D, P>>>,
@@ -68,6 +69,7 @@ impl<P: Array, D: Digest> Supervisor<P, D> {
6869
notarize_namespace: notarize_namespace(&cfg.namespace),
6970
nullify_namespace: nullify_namespace(&cfg.namespace),
7071
finalize_namespace: finalize_namespace(&cfg.namespace),
72+
leaders: Arc::new(Mutex::new(HashMap::new())),
7173
notarizes: Arc::new(Mutex::new(HashMap::new())),
7274
nullifies: Arc::new(Mutex::new(HashMap::new())),
7375
finalizes: Arc::new(Mutex::new(HashMap::new())),
@@ -121,7 +123,13 @@ impl<P: Array, D: Digest> TSu for Supervisor<P, D> {
121123
};
122124
let seed = seed.serialize();
123125
let index = modulo(&seed, closest.len() as u64);
124-
Some(closest[index as usize].clone())
126+
let leader = closest[index as usize].clone();
127+
self.leaders
128+
.lock()
129+
.unwrap()
130+
.entry(index)
131+
.or_insert(leader.clone());
132+
Some(leader)
125133
}
126134

127135
fn identity(&self, index: Self::Index) -> Option<&Self::Identity> {

consensus/src/threshold_simplex/mod.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,8 @@ pub mod mocks;
164164

165165
#[cfg(test)]
166166
mod tests {
167-
use crate::Monitor;
168-
169167
use super::*;
168+
use crate::Monitor;
170169
use commonware_cryptography::{bls12381::dkg::ops, Ed25519, Sha256, Signer};
171170
use commonware_macros::{select, test_traced};
172171
use commonware_p2p::simulated::{Config, Link, Network, Oracle, Receiver, Sender};
@@ -1070,6 +1069,28 @@ mod tests {
10701069
}
10711070
}
10721071
}
1072+
1073+
// Identify offline views
1074+
let mut offline_views = Vec::new();
1075+
{
1076+
let leaders = supervisor.leaders.lock().unwrap();
1077+
for (view, leader) in leaders.iter() {
1078+
if leader == offline {
1079+
offline_views.push(*view);
1080+
}
1081+
}
1082+
}
1083+
1084+
// Ensure nullifies collected for offline node
1085+
{
1086+
let nullifies = supervisor.nullifies.lock().unwrap();
1087+
for view in offline_views.iter() {
1088+
let nullifies = nullifies.get(view).unwrap();
1089+
if nullifies.len() < threshold as usize {
1090+
panic!("view: {}", view);
1091+
}
1092+
}
1093+
}
10731094
}
10741095
});
10751096
}

0 commit comments

Comments
 (0)