Update slot clock to use genesis slot

This commit is contained in:
Paul Hauner 2019-03-26 15:44:28 +11:00
parent 0768d24ffc
commit 00b546e6b8
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6
5 changed files with 28 additions and 7 deletions

View File

@ -35,8 +35,12 @@ pub fn initialise_beacon_chain(
genesis_block.state_root = Hash256::from_slice(&genesis_state.hash_tree_root()); genesis_block.state_root = Hash256::from_slice(&genesis_state.hash_tree_root());
// Slot clock // Slot clock
let slot_clock = SystemTimeSlotClock::new(genesis_state.genesis_time, spec.seconds_per_slot) let slot_clock = SystemTimeSlotClock::new(
.expect("Unable to load SystemTimeSlotClock"); spec.genesis_slot,
genesis_state.genesis_time,
spec.seconds_per_slot,
)
.expect("Unable to load SystemTimeSlotClock");
// Choose the fork choice // Choose the fork choice
let fork_choice = BitwiseLMDGhost::new(block_store.clone(), state_store.clone()); let fork_choice = BitwiseLMDGhost::new(block_store.clone(), state_store.clone());
@ -72,8 +76,12 @@ pub fn initialise_test_beacon_chain(
genesis_block.state_root = Hash256::from_slice(&genesis_state.hash_tree_root()); genesis_block.state_root = Hash256::from_slice(&genesis_state.hash_tree_root());
// Slot clock // Slot clock
let slot_clock = SystemTimeSlotClock::new(genesis_state.genesis_time, spec.seconds_per_slot) let slot_clock = SystemTimeSlotClock::new(
.expect("Unable to load SystemTimeSlotClock"); spec.genesis_slot,
genesis_state.genesis_time,
spec.seconds_per_slot,
)
.expect("Unable to load SystemTimeSlotClock");
// Choose the fork choice // Choose the fork choice
let fork_choice = BitwiseLMDGhost::new(block_store.clone(), state_store.clone()); let fork_choice = BitwiseLMDGhost::new(block_store.clone(), state_store.clone());

View File

@ -34,6 +34,7 @@ impl BeaconNodeService for BeaconNodeServiceInstance {
node_info.set_fork(fork); node_info.set_fork(fork);
node_info.set_genesis_time(genesis_time); node_info.set_genesis_time(genesis_time);
node_info.set_genesis_slot(self.chain.get_spec().genesis_slot.as_u64());
node_info.set_chain_id(self.chain.get_spec().chain_id as u32); node_info.set_chain_id(self.chain.get_spec().chain_id as u32);
// send the node_info the requester // send the node_info the requester

View File

@ -13,6 +13,7 @@ pub enum Error {
/// Determines the present slot based upon the present system time. /// Determines the present slot based upon the present system time.
#[derive(Clone)] #[derive(Clone)]
pub struct SystemTimeSlotClock { pub struct SystemTimeSlotClock {
genesis_slot: Slot,
genesis_seconds: u64, genesis_seconds: u64,
slot_duration_seconds: u64, slot_duration_seconds: u64,
} }
@ -22,6 +23,7 @@ impl SystemTimeSlotClock {
/// ///
/// Returns an Error if `slot_duration_seconds == 0`. /// Returns an Error if `slot_duration_seconds == 0`.
pub fn new( pub fn new(
genesis_slot: Slot,
genesis_seconds: u64, genesis_seconds: u64,
slot_duration_seconds: u64, slot_duration_seconds: u64,
) -> Result<SystemTimeSlotClock, Error> { ) -> Result<SystemTimeSlotClock, Error> {
@ -29,6 +31,7 @@ impl SystemTimeSlotClock {
Err(Error::SlotDurationIsZero) Err(Error::SlotDurationIsZero)
} else { } else {
Ok(Self { Ok(Self {
genesis_slot,
genesis_seconds, genesis_seconds,
slot_duration_seconds, slot_duration_seconds,
}) })
@ -44,9 +47,11 @@ impl SlotClock for SystemTimeSlotClock {
let duration_since_epoch = syslot_time.duration_since(SystemTime::UNIX_EPOCH)?; let duration_since_epoch = syslot_time.duration_since(SystemTime::UNIX_EPOCH)?;
let duration_since_genesis = let duration_since_genesis =
duration_since_epoch.checked_sub(Duration::from_secs(self.genesis_seconds)); duration_since_epoch.checked_sub(Duration::from_secs(self.genesis_seconds));
match duration_since_genesis { match duration_since_genesis {
None => Ok(None), None => Ok(None),
Some(d) => Ok(slot_from_duration(self.slot_duration_seconds, d)), Some(d) => Ok(slot_from_duration(self.slot_duration_seconds, d)
.and_then(|s| Some(s + self.genesis_slot))),
} }
} }
} }
@ -74,6 +79,7 @@ mod tests {
#[test] #[test]
fn test_slot_now() { fn test_slot_now() {
let slot_time = 100; let slot_time = 100;
let genesis_slot = Slot::new(0);
let now = SystemTime::now(); let now = SystemTime::now();
let since_epoch = now.duration_since(SystemTime::UNIX_EPOCH).unwrap(); let since_epoch = now.duration_since(SystemTime::UNIX_EPOCH).unwrap();
@ -81,18 +87,21 @@ mod tests {
let genesis = since_epoch.as_secs() - slot_time * 89; let genesis = since_epoch.as_secs() - slot_time * 89;
let clock = SystemTimeSlotClock { let clock = SystemTimeSlotClock {
genesis_slot,
genesis_seconds: genesis, genesis_seconds: genesis,
slot_duration_seconds: slot_time, slot_duration_seconds: slot_time,
}; };
assert_eq!(clock.present_slot().unwrap(), Some(Slot::new(89))); assert_eq!(clock.present_slot().unwrap(), Some(Slot::new(89)));
let clock = SystemTimeSlotClock { let clock = SystemTimeSlotClock {
genesis_slot,
genesis_seconds: since_epoch.as_secs(), genesis_seconds: since_epoch.as_secs(),
slot_duration_seconds: slot_time, slot_duration_seconds: slot_time,
}; };
assert_eq!(clock.present_slot().unwrap(), Some(Slot::new(0))); assert_eq!(clock.present_slot().unwrap(), Some(Slot::new(0)));
let clock = SystemTimeSlotClock { let clock = SystemTimeSlotClock {
genesis_slot,
genesis_seconds: since_epoch.as_secs() - slot_time * 42 - 5, genesis_seconds: since_epoch.as_secs() - slot_time * 42 - 5,
slot_duration_seconds: slot_time, slot_duration_seconds: slot_time,
}; };

View File

@ -45,6 +45,7 @@ message NodeInfoResponse {
Fork fork = 2; Fork fork = 2;
uint32 chain_id = 3; uint32 chain_id = 3;
uint64 genesis_time = 4; uint64 genesis_time = 4;
uint64 genesis_slot = 5;
} }
message Fork { message Fork {

View File

@ -101,6 +101,7 @@ impl Service {
// build requisite objects to form Self // build requisite objects to form Self
let genesis_time = node_info.get_genesis_time(); let genesis_time = node_info.get_genesis_time();
let genesis_slot = Slot::from(node_info.get_genesis_slot());
info!(log,"Beacon node connected"; "Node Version" => node_info.version.clone(), "Chain ID" => node_info.chain_id, "Genesis time" => genesis_time); info!(log,"Beacon node connected"; "Node Version" => node_info.version.clone(), "Chain ID" => node_info.chain_id, "Genesis time" => genesis_time);
@ -117,8 +118,9 @@ impl Service {
// build the validator slot clock // build the validator slot clock
let slot_clock = { let slot_clock = {
let clock = SystemTimeSlotClock::new(genesis_time, config.spec.seconds_per_slot) let clock =
.expect("Unable to instantiate SystemTimeSlotClock."); SystemTimeSlotClock::new(genesis_slot, genesis_time, config.spec.seconds_per_slot)
.expect("Unable to instantiate SystemTimeSlotClock.");
Arc::new(clock) Arc::new(clock)
}; };