0c529b8d52
## Issue Addressed Closes #2048 ## Proposed Changes * Broadcast slashings when the `--slasher-broadcast` flag is provided. * In the process of implementing this I refactored the slasher service into its own crate so that it could access the network code without creating a circular dependency. I moved the responsibility for putting slashings into the op pool into the service as well, as it makes sense for it to handle the whole slashing lifecycle.
90 lines
2.5 KiB
Rust
90 lines
2.5 KiB
Rust
use slasher::{
|
|
test_utils::{indexed_att, logger},
|
|
Config, Error, Slasher,
|
|
};
|
|
use tempdir::TempDir;
|
|
use types::Epoch;
|
|
|
|
#[test]
|
|
fn attestation_pruning_empty_wrap_around() {
|
|
let tempdir = TempDir::new("slasher").unwrap();
|
|
let mut config = Config::new(tempdir.path().into());
|
|
config.validator_chunk_size = 1;
|
|
config.chunk_size = 16;
|
|
config.history_length = 16;
|
|
|
|
let slasher = Slasher::open(config.clone(), logger()).unwrap();
|
|
|
|
let v = vec![0];
|
|
let history_length = config.history_length as u64;
|
|
|
|
let mut current_epoch = Epoch::new(history_length - 1);
|
|
|
|
slasher.accept_attestation(indexed_att(v.clone(), 0, history_length - 1, 0));
|
|
slasher.process_queued(current_epoch).unwrap();
|
|
slasher.prune_database(current_epoch).unwrap();
|
|
|
|
// Delete the previous attestation
|
|
current_epoch = Epoch::new(2 * history_length + 2);
|
|
slasher.prune_database(current_epoch).unwrap();
|
|
|
|
// Add an attestation that would be surrounded with the modulo considered
|
|
slasher.accept_attestation(indexed_att(
|
|
v.clone(),
|
|
2 * history_length - 3,
|
|
2 * history_length - 2,
|
|
1,
|
|
));
|
|
slasher.process_queued(current_epoch).unwrap();
|
|
}
|
|
|
|
// Test that pruning can recover from a `MapFull` error
|
|
#[test]
|
|
fn pruning_with_map_full() {
|
|
let tempdir = TempDir::new("slasher").unwrap();
|
|
let mut config = Config::new(tempdir.path().into());
|
|
config.validator_chunk_size = 1;
|
|
config.chunk_size = 16;
|
|
config.history_length = 1024;
|
|
config.max_db_size_mbs = 1;
|
|
|
|
let slasher = Slasher::open(config.clone(), logger()).unwrap();
|
|
|
|
let v = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
|
|
|
|
let mut current_epoch = Epoch::new(0);
|
|
|
|
loop {
|
|
slasher.accept_attestation(indexed_att(
|
|
v.clone(),
|
|
(current_epoch - 1).as_u64(),
|
|
current_epoch.as_u64(),
|
|
0,
|
|
));
|
|
if let Err(Error::DatabaseError(lmdb::Error::MapFull)) =
|
|
slasher.process_queued(current_epoch)
|
|
{
|
|
break;
|
|
}
|
|
current_epoch += 1;
|
|
}
|
|
|
|
loop {
|
|
slasher.prune_database(current_epoch).unwrap();
|
|
|
|
slasher.accept_attestation(indexed_att(
|
|
v.clone(),
|
|
(current_epoch - 1).as_u64(),
|
|
current_epoch.as_u64(),
|
|
0,
|
|
));
|
|
match slasher.process_queued(current_epoch) {
|
|
Ok(_) => break,
|
|
Err(Error::DatabaseError(lmdb::Error::MapFull)) => {
|
|
current_epoch += 1;
|
|
}
|
|
Err(e) => panic!("{:?}", e),
|
|
}
|
|
}
|
|
}
|