mirror of
https://github.com/sigp/lighthouse.git
synced 2026-04-16 20:39:10 +00:00
Implement Slashing Protection (#1116)
* Implement slashing protection Roll-up of #588 with some conflicts resolved * WIP improvements * Require slot uniqueness for blocks (rather than epochs) * Native DB support for Slot and Epoch * Simplify surrounding/surrounded-by queries * Implement unified slashing protection database A single SQL database saves on open file descriptors. * Make slashing protection concurrency safe. Revive tests, add parallel tests. * Some simplifications * Auto-registration, test clean-ups * More tests, clean-ups, hardening * Fix comments in BLS * Optimise bulk validator registration * Delete outdated tests * Use bundled SQLite in slashing protection * Auto-register validators in simulation * Use real signing_root in slashing protection * Update book for --auto-register * Refine log messages and help flags * Correct typo in Cargo.toml authors * Fix merge conflicts * Safer error handling in sqlite slot/epoch * Address review comments * Add attestation test mutating block root Co-authored-by: pscott <scottpiriou@gmail.com>
This commit is contained in:
124
validator_client/slashing_protection/src/block_tests.rs
Normal file
124
validator_client/slashing_protection/src/block_tests.rs
Normal file
@@ -0,0 +1,124 @@
|
||||
#![cfg(test)]
|
||||
|
||||
use super::*;
|
||||
use crate::test_utils::*;
|
||||
use types::{BeaconBlockHeader, Hash256, Slot};
|
||||
|
||||
pub fn block(slot: u64) -> BeaconBlockHeader {
|
||||
BeaconBlockHeader {
|
||||
slot: Slot::new(slot),
|
||||
proposer_index: 0,
|
||||
parent_root: Hash256::random(),
|
||||
state_root: Hash256::random(),
|
||||
body_root: Hash256::random(),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn valid_empty_history() {
|
||||
StreamTest {
|
||||
cases: vec![Test::single(block(1))],
|
||||
..StreamTest::default()
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn valid_blocks() {
|
||||
StreamTest {
|
||||
cases: vec![
|
||||
Test::single(block(1)),
|
||||
Test::single(block(2)),
|
||||
Test::single(block(3)),
|
||||
Test::single(block(4)),
|
||||
],
|
||||
..StreamTest::default()
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn valid_same_block() {
|
||||
let block = block(100);
|
||||
StreamTest {
|
||||
cases: vec![
|
||||
Test::single(block.clone()),
|
||||
Test::single(block).expect_same_data(),
|
||||
],
|
||||
..StreamTest::default()
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn valid_same_slot_different_validator() {
|
||||
StreamTest {
|
||||
registered_validators: vec![pubkey(0), pubkey(1)],
|
||||
cases: vec![
|
||||
Test::with_pubkey(pubkey(0), block(100)),
|
||||
Test::with_pubkey(pubkey(1), block(100)),
|
||||
],
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn valid_same_block_different_validator() {
|
||||
let block = block(100);
|
||||
StreamTest {
|
||||
registered_validators: vec![pubkey(0), pubkey(1)],
|
||||
cases: vec![
|
||||
Test::with_pubkey(pubkey(0), block.clone()),
|
||||
Test::with_pubkey(pubkey(1), block.clone()),
|
||||
],
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_double_block_proposal() {
|
||||
let first_block = block(1);
|
||||
StreamTest {
|
||||
cases: vec![
|
||||
Test::single(first_block.clone()),
|
||||
Test::single(block(1)).expect_invalid_block(InvalidBlock::DoubleBlockProposal(
|
||||
SignedBlock::from_header(&first_block, DEFAULT_DOMAIN),
|
||||
)),
|
||||
],
|
||||
..StreamTest::default()
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_double_block_proposal_diff_domain() {
|
||||
let first_block = block(1);
|
||||
let domain1 = Hash256::from_low_u64_be(1);
|
||||
let domain2 = Hash256::from_low_u64_be(2);
|
||||
StreamTest {
|
||||
cases: vec![
|
||||
Test::single(first_block.clone()).with_domain(domain1),
|
||||
Test::single(first_block.clone())
|
||||
.with_domain(domain2)
|
||||
.expect_invalid_block(InvalidBlock::DoubleBlockProposal(SignedBlock::from_header(
|
||||
&first_block,
|
||||
domain1,
|
||||
))),
|
||||
],
|
||||
..StreamTest::default()
|
||||
}
|
||||
.run()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn invalid_unregistered_validator() {
|
||||
StreamTest {
|
||||
registered_validators: vec![],
|
||||
cases: vec![
|
||||
Test::single(block(0)).expect_result(Err(NotSafe::UnregisteredValidator(pubkey(
|
||||
DEFAULT_VALIDATOR_INDEX,
|
||||
)))),
|
||||
],
|
||||
}
|
||||
.run()
|
||||
}
|
||||
Reference in New Issue
Block a user