mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-10 04:01:51 +00:00
* Remove use of ethers_core::RlpStream
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into remove_use_of_ethers_core
* Remove old code
* Simplify keccak call
* Remove unused package
* Merge branch 'unstable' of https://github.com/ethDreamer/lighthouse into remove_use_of_ethers_core
* Merge branch 'unstable' into remove_use_of_ethers_core
* Run clippy
* Merge branch 'remove_use_of_ethers_core' of https://github.com/dospore/lighthouse into remove_use_of_ethers_core
* Check all cargo fmt
* migrate to alloy primitives init
* fix deps
* integrate alloy-primitives
* resolve dep issues
* more changes based on dep changes
* add TODOs
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into remove_use_of_ethers_core
* Revert lock
* Add BeaconBlocksByRange v3
* continue migration
* Revert "Add BeaconBlocksByRange v3"
This reverts commit e3ce7fc5ea.
* impl hash256 extended trait
* revert some uneeded diffs
* merge conflict resolved
* fix subnet id rshift calc
* rename to FixedBytesExtended
* debugging
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into migrate-to-alloy-primitives
* fix failed test
* fixing more tests
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into remove_use_of_ethers_core
* introduce a shim to convert between the two u256 types
* move alloy to wrokspace
* align alloy versions
* update
* update web3signer test certs
* refactor
* resolve failing tests
* linting
* fix graffiti string test
* fmt
* fix ef test
* resolve merge conflicts
* remove udep and revert cert
* cargo patch
* cyclic dep
* fix build error
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into migrate-to-alloy-primitives
* resolve conflicts, update deps
* merge unstable
* fmt
* fix deps
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into migrate-to-alloy-primitives
* resolve merge conflicts
* resolve conflicts, make necessary changes
* Remove patch
* fmt
* remove file
* merge conflicts
* sneaking in a smol change
* bump versions
* Merge remote-tracking branch 'origin/unstable' into migrate-to-alloy-primitives
* Updates for peerDAS
* Update ethereum_hashing to prevent dupe
* updated alloy-consensus, removed TODOs
* cargo update
* endianess fix
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into migrate-to-alloy-primitives
* fmt
* fix merge
* fix test
* fixed_bytes crate
* minor fixes
* convert u256 to i64
* panic free mixin to_low_u64_le
* from_str_radix
* computbe_subnet api and ensuring we use big-endian
* Merge branch 'unstable' of https://github.com/sigp/lighthouse into migrate-to-alloy-primitives
* fix test
* Simplify subnet_id test
* Simplify some more tests
* Add tests to fixed_bytes crate
* Merge branch 'unstable' into migrate-to-alloy-primitives
390 lines
11 KiB
Rust
390 lines
11 KiB
Rust
#![cfg(test)]
|
|
|
|
use crate::test_utils::*;
|
|
use crate::*;
|
|
use types::{AttestationData, Checkpoint, Epoch, FixedBytesExtended, Slot};
|
|
|
|
pub fn build_checkpoint(epoch_num: u64) -> Checkpoint {
|
|
Checkpoint {
|
|
epoch: Epoch::from(epoch_num),
|
|
root: Hash256::zero(),
|
|
}
|
|
}
|
|
|
|
pub fn attestation_data_builder(source: u64, target: u64) -> AttestationData {
|
|
let source = build_checkpoint(source);
|
|
let target = build_checkpoint(target);
|
|
let index = 0u64;
|
|
let slot = Slot::from(0u64);
|
|
|
|
AttestationData {
|
|
slot,
|
|
index,
|
|
beacon_block_root: Hash256::zero(),
|
|
source,
|
|
target,
|
|
}
|
|
}
|
|
|
|
/// Create a signed attestation from `attestation`, assuming the default domain.
|
|
fn signed_att(attestation: &AttestationData) -> SignedAttestation {
|
|
SignedAttestation::from_attestation(attestation, DEFAULT_DOMAIN)
|
|
}
|
|
|
|
#[test]
|
|
fn valid_empty_history() {
|
|
StreamTest {
|
|
cases: vec![Test::single(attestation_data_builder(2, 3))],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_genesis() {
|
|
StreamTest {
|
|
cases: vec![Test::single(attestation_data_builder(0, 0))],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_out_of_order_attestation() {
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(0, 3)),
|
|
Test::single(attestation_data_builder(2, 5)),
|
|
Test::single(attestation_data_builder(1, 4)),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_repeat_attestation() {
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(0, 1)),
|
|
Test::single(attestation_data_builder(0, 1)).expect_same_data(),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_source_from_first_entry() {
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(6, 7)),
|
|
Test::single(attestation_data_builder(6, 8)),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_multiple_validators_double_vote() {
|
|
StreamTest {
|
|
registered_validators: vec![pubkey(0), pubkey(1)],
|
|
cases: vec![
|
|
Test::with_pubkey(pubkey(0), attestation_data_builder(0, 1)),
|
|
Test::with_pubkey(pubkey(1), attestation_data_builder(0, 1)),
|
|
],
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_vote_chain_repeat_first() {
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(0, 1)),
|
|
Test::single(attestation_data_builder(1, 2)),
|
|
Test::single(attestation_data_builder(2, 3)),
|
|
Test::single(attestation_data_builder(0, 1)).expect_same_data(),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_vote_chain_repeat_middle() {
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(0, 1)),
|
|
Test::single(attestation_data_builder(1, 2)),
|
|
Test::single(attestation_data_builder(2, 3)),
|
|
Test::single(attestation_data_builder(1, 2)).expect_same_data(),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_vote_chain_repeat_last() {
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(0, 1)),
|
|
Test::single(attestation_data_builder(1, 2)),
|
|
Test::single(attestation_data_builder(2, 3)),
|
|
Test::single(attestation_data_builder(2, 3)).expect_same_data(),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_multiple_validators_not_surrounding() {
|
|
// Attestations that would be problematic if they came from the same validator, but are OK
|
|
// coming from different validators.
|
|
StreamTest {
|
|
registered_validators: vec![pubkey(0), pubkey(1)],
|
|
cases: vec![
|
|
Test::with_pubkey(pubkey(0), attestation_data_builder(0, 10)),
|
|
Test::with_pubkey(pubkey(0), attestation_data_builder(10, 20)),
|
|
Test::with_pubkey(pubkey(1), attestation_data_builder(1, 9)),
|
|
Test::with_pubkey(pubkey(1), attestation_data_builder(9, 21)),
|
|
],
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_source_exceeds_target() {
|
|
StreamTest {
|
|
cases: vec![Test::single(attestation_data_builder(1, 0))
|
|
.expect_invalid_att(InvalidAttestation::SourceExceedsTarget)],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_unregistered_validator() {
|
|
StreamTest {
|
|
registered_validators: vec![],
|
|
cases: vec![
|
|
Test::single(attestation_data_builder(2, 3)).expect_result(Err(
|
|
NotSafe::UnregisteredValidator(pubkey(DEFAULT_VALIDATOR_INDEX)),
|
|
)),
|
|
],
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_double_vote_diff_source() {
|
|
let first = attestation_data_builder(0, 2);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(attestation_data_builder(1, 2))
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(signed_att(&first))),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_double_vote_diff_target() {
|
|
let first = attestation_data_builder(0, 2);
|
|
let mut second = attestation_data_builder(0, 2);
|
|
second.target.root = Hash256::random();
|
|
assert_ne!(first, second);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(second)
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(signed_att(&first))),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_double_vote_diff_data() {
|
|
let first = attestation_data_builder(0, 2);
|
|
let mut second = attestation_data_builder(0, 2);
|
|
second.beacon_block_root = Hash256::random();
|
|
assert_ne!(first, second);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(second)
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(signed_att(&first))),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_double_vote_diff_domain() {
|
|
let first = attestation_data_builder(0, 2);
|
|
let domain1 = Hash256::from_low_u64_le(1);
|
|
let domain2 = Hash256::from_low_u64_le(2);
|
|
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()).with_domain(domain1),
|
|
Test::single(first.clone())
|
|
.with_domain(domain2)
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(
|
|
SignedAttestation::from_attestation(&first, domain1),
|
|
)),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_double_vote_diff_source_multi() {
|
|
let first = attestation_data_builder(0, 2);
|
|
let second = attestation_data_builder(1, 3);
|
|
let third = attestation_data_builder(2, 4);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(second.clone()),
|
|
Test::single(third.clone()),
|
|
Test::single(attestation_data_builder(1, 2))
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(signed_att(&first))),
|
|
Test::single(attestation_data_builder(2, 3))
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(signed_att(&second))),
|
|
Test::single(attestation_data_builder(3, 4))
|
|
.expect_invalid_att(InvalidAttestation::DoubleVote(signed_att(&third))),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_surrounding_single() {
|
|
let first = attestation_data_builder(2, 3);
|
|
let second = attestation_data_builder(4, 5);
|
|
let third = attestation_data_builder(6, 7);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(second.clone()),
|
|
Test::single(third.clone()),
|
|
Test::single(attestation_data_builder(1, 4)).expect_invalid_att(
|
|
InvalidAttestation::NewSurroundsPrev {
|
|
prev: signed_att(&first),
|
|
},
|
|
),
|
|
Test::single(attestation_data_builder(3, 6)).expect_invalid_att(
|
|
InvalidAttestation::NewSurroundsPrev {
|
|
prev: signed_att(&second),
|
|
},
|
|
),
|
|
Test::single(attestation_data_builder(5, 8)).expect_invalid_att(
|
|
InvalidAttestation::NewSurroundsPrev {
|
|
prev: signed_att(&third),
|
|
},
|
|
),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_surrounding_from_first_source() {
|
|
let first = attestation_data_builder(2, 3);
|
|
let second = attestation_data_builder(3, 4);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first),
|
|
Test::single(second.clone()),
|
|
Test::single(attestation_data_builder(2, 5)).expect_invalid_att(
|
|
InvalidAttestation::NewSurroundsPrev {
|
|
prev: signed_att(&second),
|
|
},
|
|
),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_surrounding_multiple_votes() {
|
|
let first = attestation_data_builder(0, 1);
|
|
let second = attestation_data_builder(1, 2);
|
|
let third = attestation_data_builder(2, 3);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first),
|
|
Test::single(second),
|
|
Test::single(third.clone()),
|
|
Test::single(attestation_data_builder(0, 4)).expect_invalid_att(
|
|
InvalidAttestation::NewSurroundsPrev {
|
|
prev: signed_att(&third),
|
|
},
|
|
),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_prev_surrounds_new() {
|
|
let first = attestation_data_builder(0, 7);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(attestation_data_builder(1, 6)).expect_invalid_att(
|
|
InvalidAttestation::PrevSurroundsNew {
|
|
prev: signed_att(&first),
|
|
},
|
|
),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_prev_surrounds_new_multiple() {
|
|
let first = attestation_data_builder(0, 4);
|
|
let second = attestation_data_builder(1, 7);
|
|
let third = attestation_data_builder(8, 10);
|
|
StreamTest {
|
|
cases: vec![
|
|
Test::single(first.clone()),
|
|
Test::single(second.clone()),
|
|
Test::single(third.clone()),
|
|
Test::single(attestation_data_builder(9, 9)).expect_invalid_att(
|
|
InvalidAttestation::PrevSurroundsNew {
|
|
prev: signed_att(&third),
|
|
},
|
|
),
|
|
Test::single(attestation_data_builder(2, 6)).expect_invalid_att(
|
|
InvalidAttestation::PrevSurroundsNew {
|
|
prev: signed_att(&second),
|
|
},
|
|
),
|
|
Test::single(attestation_data_builder(1, 2)).expect_invalid_att(
|
|
InvalidAttestation::PrevSurroundsNew {
|
|
prev: signed_att(&first),
|
|
},
|
|
),
|
|
],
|
|
..StreamTest::default()
|
|
}
|
|
.run()
|
|
}
|