mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-10 20:22:02 +00:00
162 lines
4.5 KiB
Rust
162 lines
4.5 KiB
Rust
#![cfg(test)]
|
|
|
|
use node_test_rig::{
|
|
environment::{Environment, EnvironmentBuilder},
|
|
LocalBeaconNode,
|
|
};
|
|
use tree_hash::TreeHash;
|
|
use types::{
|
|
test_utils::generate_deterministic_keypair, Domain, EthSpec, MinimalEthSpec, Signature, Slot,
|
|
};
|
|
|
|
type E = MinimalEthSpec;
|
|
|
|
fn build_env() -> Environment<E> {
|
|
EnvironmentBuilder::minimal()
|
|
.null_logger()
|
|
.expect("should build env logger")
|
|
.single_thread_tokio_runtime()
|
|
.expect("should start tokio runtime")
|
|
.build()
|
|
.expect("environment should build")
|
|
}
|
|
|
|
#[test]
|
|
fn validator_block() {
|
|
let mut env = build_env();
|
|
|
|
let spec = E::default_spec();
|
|
|
|
let node = LocalBeaconNode::production(env.core_context());
|
|
let remote_node = node.remote_node().expect("should produce remote node");
|
|
|
|
let beacon_chain = node
|
|
.client
|
|
.beacon_chain()
|
|
.expect("client should have beacon chain");
|
|
|
|
let fork = beacon_chain.head().beacon_state.fork.clone();
|
|
|
|
let slot = Slot::new(1);
|
|
let randao_reveal = {
|
|
let proposer_index = beacon_chain
|
|
.block_proposer(slot)
|
|
.expect("should get proposer index");
|
|
let keypair = generate_deterministic_keypair(proposer_index);
|
|
let epoch = slot.epoch(E::slots_per_epoch());
|
|
let message = epoch.tree_hash_root();
|
|
let domain = spec.get_domain(epoch, Domain::Randao, &fork);
|
|
Signature::new(&message, domain, &keypair.sk)
|
|
};
|
|
|
|
let block = env
|
|
.runtime()
|
|
.block_on(
|
|
remote_node
|
|
.http
|
|
.validator()
|
|
.block(slot, randao_reveal.clone()),
|
|
)
|
|
.expect("should fetch block from http api");
|
|
|
|
let (expected_block, _state) = node
|
|
.client
|
|
.beacon_chain()
|
|
.expect("client should have beacon chain")
|
|
.produce_block(randao_reveal, slot)
|
|
.expect("should produce block");
|
|
|
|
assert_eq!(
|
|
block, expected_block,
|
|
"the block returned from the API should be as expected"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_state() {
|
|
let mut env = build_env();
|
|
|
|
let node = LocalBeaconNode::production(env.core_context());
|
|
let remote_node = node.remote_node().expect("should produce remote node");
|
|
|
|
let (state_by_slot, root) = env
|
|
.runtime()
|
|
.block_on(remote_node.http.beacon().state_by_slot(Slot::new(0)))
|
|
.expect("should fetch state from http api");
|
|
|
|
let (state_by_root, root_2) = env
|
|
.runtime()
|
|
.block_on(remote_node.http.beacon().state_by_root(root))
|
|
.expect("should fetch state from http api");
|
|
|
|
let mut db_state = node
|
|
.client
|
|
.beacon_chain()
|
|
.expect("client should have beacon chain")
|
|
.state_at_slot(Slot::new(0))
|
|
.expect("should find state");
|
|
db_state.drop_all_caches();
|
|
|
|
assert_eq!(
|
|
root, root_2,
|
|
"the two roots returned from the api should be identical"
|
|
);
|
|
assert_eq!(
|
|
root,
|
|
db_state.canonical_root(),
|
|
"root from database should match that from the API"
|
|
);
|
|
assert_eq!(
|
|
state_by_slot, db_state,
|
|
"genesis state by slot from api should match that from the DB"
|
|
);
|
|
assert_eq!(
|
|
state_by_root, db_state,
|
|
"genesis state by root from api should match that from the DB"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn beacon_block() {
|
|
let mut env = build_env();
|
|
|
|
let node = LocalBeaconNode::production(env.core_context());
|
|
let remote_node = node.remote_node().expect("should produce remote node");
|
|
|
|
let (block_by_slot, root) = env
|
|
.runtime()
|
|
.block_on(remote_node.http.beacon().block_by_slot(Slot::new(0)))
|
|
.expect("should fetch block from http api");
|
|
|
|
let (block_by_root, root_2) = env
|
|
.runtime()
|
|
.block_on(remote_node.http.beacon().block_by_root(root))
|
|
.expect("should fetch block from http api");
|
|
|
|
let db_block = node
|
|
.client
|
|
.beacon_chain()
|
|
.expect("client should have beacon chain")
|
|
.block_at_slot(Slot::new(0))
|
|
.expect("should find block")
|
|
.expect("block should not be none");
|
|
|
|
assert_eq!(
|
|
root, root_2,
|
|
"the two roots returned from the api should be identical"
|
|
);
|
|
assert_eq!(
|
|
root,
|
|
db_block.canonical_root(),
|
|
"root from database should match that from the API"
|
|
);
|
|
assert_eq!(
|
|
block_by_slot, db_block,
|
|
"genesis block by slot from api should match that from the DB"
|
|
);
|
|
assert_eq!(
|
|
block_by_root, db_block,
|
|
"genesis block by root from api should match that from the DB"
|
|
);
|
|
}
|