From 1017850fd58def645bb5ff9110a3f705a2cac755 Mon Sep 17 00:00:00 2001 From: Luke Tchang Date: Fri, 15 Apr 2022 14:42:32 -0400 Subject: [PATCH] fix(updater): roll back ethers timelag patch and add in manual updater pause --- agents/updater/src/produce.rs | 28 ++++++++++++++++++++++++++++ agents/updater/src/updater.rs | 2 ++ nomad-base/src/settings/chains.rs | 4 ++++ 3 files changed, 34 insertions(+) diff --git a/agents/updater/src/produce.rs b/agents/updater/src/produce.rs index 90e4c740..045be2d1 100644 --- a/agents/updater/src/produce.rs +++ b/agents/updater/src/produce.rs @@ -13,6 +13,7 @@ pub(crate) struct UpdateProducer { home: Arc, db: NomadDB, signer: Arc, + update_pause_seconds: u64, interval_seconds: u64, signed_attestation_count: IntCounter, } @@ -22,6 +23,7 @@ impl UpdateProducer { home: Arc, db: NomadDB, signer: Arc, + update_pause_seconds: u64, interval_seconds: u64, signed_attestation_count: IntCounter, ) -> Self { @@ -29,6 +31,7 @@ impl UpdateProducer { home, db, signer, + update_pause_seconds, interval_seconds, signed_attestation_count, } @@ -109,6 +112,31 @@ impl UpdateProducer { continue; } + // Sleep for `update_pause` seconds so we can check for + // unwanted state changes afterwards + sleep(Duration::from_secs(self.update_pause_seconds)).await; + + // If HomeIndexer found new root from that doesn't + // match our most current root, continue + if self.find_latest_root()? != current_root { + continue; + } + + // Have home suggest an update again + if let Some(check_suggested) = self.home.produce_update().await? { + if check_suggested.previous_root != suggested.previous_root { + // If newly suggested update no longer builds on + // same previous root as original suggested, reorg + // occurred or home received new in flight update. + // Ignore and continue. + continue; + } + } else { + // If no longer a suggested update, reorg or new update + // was received during pause. Ignore and continue. + continue; + } + // If the suggested matches our local view, sign an update // and store it as locally produced let signed = suggested.sign_with(self.signer.as_ref()).await?; diff --git a/agents/updater/src/updater.rs b/agents/updater/src/updater.rs index 42209e15..8b1c8875 100644 --- a/agents/updater/src/updater.rs +++ b/agents/updater/src/updater.rs @@ -112,11 +112,13 @@ impl NomadAgent for Updater { let home = self.home(); let address = self.signer.address(); let db = NomadDB::new(self.home().name(), self.db()); + let update_pause = self.as_ref().settings.home.block_time; let produce = UpdateProducer::new( self.home(), db.clone(), self.signer.clone(), + update_pause, self.interval_seconds, self.signed_attestation_count.clone(), ); diff --git a/nomad-base/src/settings/chains.rs b/nomad-base/src/settings/chains.rs index 2ee0b4a2..97600c0e 100644 --- a/nomad-base/src/settings/chains.rs +++ b/nomad-base/src/settings/chains.rs @@ -54,6 +54,8 @@ pub struct ChainSetup { pub page_settings: PageSettings, /// Network specific finality in blocks pub finality: u8, + /// Network specific block time + pub block_time: u64, /// The chain connection details #[serde(flatten)] pub chain: ChainConf, @@ -82,6 +84,7 @@ impl ChainSetup { .expect("!domain"); let domain_number = domain.domain; let finality = domain.specs.finalization_blocks; + let block_time = domain.specs.block_time; let core = config.core().get(&resident_network).expect("!core"); let (address, page_settings) = match core { CoreContracts::Evm(core) => { @@ -117,6 +120,7 @@ impl ChainSetup { address, page_settings, finality, + block_time, chain, disabled: None, }