From dcda92f3eb5ff10ccaf9bb4c91cf08ca6fd2c9d8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 14 Nov 2023 21:50:41 +0100 Subject: [PATCH 001/166] moved minimum_gas_price from EthEngine to Engine and wired it in hbbft_engine. --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 4 ++++ crates/ethcore/src/engines/mod.rs | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 3540a6915..e08f1f239 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1286,6 +1286,10 @@ impl Engine for HoneyBadgerBFT { &self.machine } + fn minimum_gas_price(&self) -> Option { + self.current_minimum_gas_price.lock().clone() + } + fn fork_choice(&self, new: &ExtendedHeader, current: &ExtendedHeader) -> ForkChoice { crate::engines::total_difficulty_fork_choice(new, current) } diff --git a/crates/ethcore/src/engines/mod.rs b/crates/ethcore/src/engines/mod.rs index dec95fe63..a21b9498a 100644 --- a/crates/ethcore/src/engines/mod.rs +++ b/crates/ethcore/src/engines/mod.rs @@ -492,6 +492,12 @@ pub trait Engine: Sync + Send { true } + /// Some Engine might define the minimum gas price by themselve. + /// (for example: contract) + fn minimum_gas_price(&self) -> Option { + None + } + /// Sign using the EngineSigner, to be used for consensus tx signing. fn sign(&self, _hash: H256) -> Result { unimplemented!() @@ -709,12 +715,6 @@ pub trait EthEngine: Engine<::machine::EthereumMachine> { fn allow_non_eoa_sender(&self, best_block_number: BlockNumber) -> bool { self.params().eip3607_transition > best_block_number } - - /// Some Engine might define the minimum gas price by themselve. - /// (for example: contract) - fn minimum_gas_price(&self) -> Option { - None - } } // convenience wrappers for existing functions. From 0c435429deaad0d146ae6d5226a6c9c92b97b5c5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 19 Nov 2023 09:24:03 +0100 Subject: [PATCH 002/166] early epoch end manager struct --- .../hbbft/hbbft_early_epoch_end_manager.rs | 19 +++++++++++++++++++ crates/ethcore/src/engines/hbbft/mod.rs | 1 + 2 files changed, 20 insertions(+) create mode 100644 crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs new file mode 100644 index 000000000..683687d41 --- /dev/null +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -0,0 +1,19 @@ +use std::time::{Instant, Duration}; +use super::NodeId; + + +pub(crate) struct EarlyEpochEndManager { + + /// The current epoch number. + current_tracked_epoch_number: u64, + + /// epoch manager start up time. + start_time: Instant, + + /// allowed devp2p warmup time. + allowed_devp2p_warmup_time: Duration, + + /// public keys of all validators for this epoch. + validators: Vec, + +} \ No newline at end of file diff --git a/crates/ethcore/src/engines/hbbft/mod.rs b/crates/ethcore/src/engines/hbbft/mod.rs index aebeb69ff..99aad0602 100644 --- a/crates/ethcore/src/engines/hbbft/mod.rs +++ b/crates/ethcore/src/engines/hbbft/mod.rs @@ -1,6 +1,7 @@ mod block_reward_hbbft; mod contracts; mod contribution; +mod hbbft_early_epoch_end_manager; mod hbbft_engine; mod hbbft_message_memorium; mod hbbft_peers_management; From 9b9d3b9a01d38db41814131842f9f4893bf0d483 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 19 Nov 2023 21:40:09 +0100 Subject: [PATCH 003/166] EarlyEpochEndManager Impl --- .../hbbft/hbbft_early_epoch_end_manager.rs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 683687d41..016d1a836 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -16,4 +16,26 @@ pub(crate) struct EarlyEpochEndManager { /// public keys of all validators for this epoch. validators: Vec, +} + + +impl EarlyEpochEndManager { + + // new + pub fn new(allowed_devp2p_warmup_time: Duration) -> Self { + Self { + current_tracked_epoch_number: 0, + start_time: Instant::now(), + allowed_devp2p_warmup_time: allowed_devp2p_warmup_time, + validators: Vec::new(), + } + } + + pub fn notify_new_epoch(&mut self, epoch: u64, validators: Vec ) { + + self.current_tracked_epoch_number = epoch; + self.validators = validators; + self.start_time = Instant::now(); + } + } \ No newline at end of file From 1b8732cb75e4d451dcc263f5ae484d00b9585982 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 Nov 2023 16:59:56 +0100 Subject: [PATCH 004/166] early epoch end manager skeleton --- .../hbbft/hbbft_early_epoch_end_manager.rs | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 016d1a836..ff3eb01cb 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -1,5 +1,7 @@ use std::time::{Instant, Duration}; -use super::NodeId; +use crate::client::BlockChainClient; + +use super::{NodeId, hbbft_message_memorium::HbbftMessageMemorium}; pub(crate) struct EarlyEpochEndManager { @@ -16,21 +18,51 @@ pub(crate) struct EarlyEpochEndManager { /// public keys of all validators for this epoch. validators: Vec, + /// current flagged validators + flagged_validators: Vec, } impl EarlyEpochEndManager { - // new - pub fn new(allowed_devp2p_warmup_time: Duration) -> Self { - Self { + /// creates a new EarlyEpochEndManager, + /// if conditions are matching to create one. + /// It is expected that this function is only called if the node is a validator. + /// This prerequesite will be checked and if not met, panics. + pub fn create_early_epoch_end_manager(allowed_devp2p_warmup_time: Duration, client: &dyn BlockChainClient) -> Option { + + + if client.is_syncing() { + // if we are syncing, we do not need to create an early epoch end manager yet. + // if we are syncing as a validator, and it is really this epoch, + // this way the creation of the early epoch end manager is created in a subsequent call, + // when we are at the tip of the chain, and get the correct state for + // - flagged validators + // - start_time + // The whole window for the devp2p warmup time is granted in this case, + // therefore this node won't flag anyone in the near future. + return None; + } + + // figure out if we have to retrieve the data from the smart contracts. + // if the epoch start did just happen, + // we do not have to retrieve the data from the smart contracts. + + + let result = Self { current_tracked_epoch_number: 0, start_time: Instant::now(), - allowed_devp2p_warmup_time: allowed_devp2p_warmup_time, + allowed_devp2p_warmup_time, validators: Vec::new(), - } + flagged_validators: Vec::new(), + }; + + return Some(result); + } + /// notifies about a new epoch. + /// This (re)inits the Manager, no early epoch end happened. pub fn notify_new_epoch(&mut self, epoch: u64, validators: Vec ) { self.current_tracked_epoch_number = epoch; @@ -38,4 +70,25 @@ impl EarlyEpochEndManager { self.start_time = Instant::now(); } + /// retrieves the information from smart contracts which validators are currently flagged. + fn get_current_flagged_validators_from_contracts() -> Vec { + + // todo: call smart contract. + return Vec::new(); + } + + fn notify_about_missing_validator(&mut self, validator: NodeId, full_client: &dyn BlockChainClient) { + + // todo: send transaction to smart contract about missing validator. + } + + /// decides on the memorium data if we should update to contract data. + pub fn decide(memorium: &HbbftMessageMemorium) { + + + // note: We do not take care if hbbft message memorium might not have processed some of the messages yet, + // since it is not important to do the decision based on the latest data, since the decide method will be called + // again. + } + } \ No newline at end of file From ab40f4d78aa5f17accdad5cf505a752eb1e5db8a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 Nov 2023 18:14:41 +0100 Subject: [PATCH 005/166] refactored hbbft_message_memorium, so it allows read access from not mut references. --- .../engines/hbbft/hbbft_message_memorium.rs | 103 ++++++++++++++---- 1 file changed, 80 insertions(+), 23 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs index adad6a4c7..fa8e95118 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs @@ -221,6 +221,14 @@ impl NodeStakingEpochHistory { + self.get_total_error_sealing_messages() } + pub fn get_sealing_message(&self) -> u64 { + u64::max(self.last_late_sealing_message, self.last_good_sealing_message) + } + + pub fn get_last_late_sealing_message(&self) -> u64 { + self.last_late_sealing_message + } + pub fn get_last_good_sealing_message(&self) -> u64 { self.last_good_sealing_message } @@ -423,7 +431,23 @@ impl StakingEpochHistory { } } - fn get_history_for_node(&mut self, node_id: &NodeId) -> &mut NodeStakingEpochHistory { + pub fn get_history_for_node(&self, node_id: &NodeId) -> Option<&NodeStakingEpochHistory> { + let index_result = self + .node_staking_epoch_histories + .iter() + .position(|x| &x.get_node_id() == node_id); + + match index_result { + Some(index) => { + return Some(&self.node_staking_epoch_histories[index]); + } + None => { + return None; + } + }; + } + + pub fn ensure_history_for_node(&mut self, node_id: &NodeId) -> &mut NodeStakingEpochHistory { let index_result = self .node_staking_epoch_histories .iter_mut() @@ -441,38 +465,39 @@ impl StakingEpochHistory { }; } + pub fn on_seal_good(&mut self, event: &SealEventGood) { let staking_epoch_start_block = self.staking_epoch_start_block; if event.block_num > self.highest_block_num { self.highest_block_num = event.block_num; } - let node_staking_epoch_history = self.get_history_for_node(&event.node_id); + let node_staking_epoch_history = self.ensure_history_for_node(&event.node_id); node_staking_epoch_history.add_good_seal_event(event, staking_epoch_start_block); self.exported = false; } pub fn on_seal_late(&mut self, event: &SealEventLate) { let staking_epoch_start_block = self.staking_epoch_start_block; - let node_staking_epoch_history = self.get_history_for_node(&event.node_id); + let node_staking_epoch_history = self.ensure_history_for_node(&event.node_id); node_staking_epoch_history.add_seal_event_late(event, staking_epoch_start_block); self.exported = false; } pub fn on_seal_bad(&mut self, event: &SealEventBad) { let staking_epoch_start_block = self.staking_epoch_start_block; - let node_staking_epoch_history = self.get_history_for_node(&event.node_id); + let node_staking_epoch_history = self.ensure_history_for_node(&event.node_id); node_staking_epoch_history.add_bad_seal_event(event, staking_epoch_start_block); self.exported = false; } pub fn on_message_faulty(&mut self, event: &MessageEventFaulty) { - let node_staking_epoch_history = self.get_history_for_node(&event.node_id); + let node_staking_epoch_history = self.ensure_history_for_node(&event.node_id); node_staking_epoch_history.add_message_event_faulty(event); self.exported = false; } pub fn on_message_good(&mut self, event: &MessageEventGood) { - let node_staking_epoch_history = self.get_history_for_node(&event.node_id); + let node_staking_epoch_history = self.ensure_history_for_node(&event.node_id); node_staking_epoch_history.add_message_event_good(event); self.exported = false; } @@ -846,7 +871,7 @@ impl HbbftMessageMemorium { fn on_seal_good(&mut self, seal: &SealEventGood) -> bool { debug!(target: "hbbft_message_memorium", "working on good seal!: {:?}", seal); let block_num = seal.block_num; - if let Some(epoch_history) = self.get_staking_epoch_history(block_num) { + if let Some(epoch_history) = self.get_staking_epoch_history_mut(block_num) { epoch_history.on_seal_good(seal); return true; } else { @@ -873,7 +898,7 @@ impl HbbftMessageMemorium { fn on_seal_late(&mut self, seal: &SealEventLate) -> bool { debug!(target: "hbbft_message_memorium", "working on good seal!: {:?}", seal); let block_num = seal.block_num; - if let Some(epoch_history) = self.get_staking_epoch_history(block_num) { + if let Some(epoch_history) = self.get_staking_epoch_history_mut(block_num) { epoch_history.on_seal_late(seal); return true; } else { @@ -884,7 +909,7 @@ impl HbbftMessageMemorium { fn on_seal_bad(&mut self, seal: &SealEventBad) -> bool { debug!(target: "hbbft_message_memorium", "working on good seal!: {:?}", seal); let block_num = seal.block_num; - if let Some(epoch_history) = self.get_staking_epoch_history(block_num) { + if let Some(epoch_history) = self.get_staking_epoch_history_mut(block_num) { epoch_history.on_seal_bad(seal); return true; } else { @@ -895,7 +920,7 @@ impl HbbftMessageMemorium { fn on_message_faulty(&mut self, event: &MessageEventFaulty) -> bool { debug!(target: "hbbft_message_memorium", "working on faulty message event!: {:?}", event); let block_num = event.block_num; - if let Some(epoch_history) = self.get_staking_epoch_history(block_num) { + if let Some(epoch_history) = self.get_staking_epoch_history_mut(block_num) { epoch_history.on_message_faulty(event); return true; } else { @@ -905,12 +930,26 @@ impl HbbftMessageMemorium { fn on_message_good(&mut self, event: &MessageEventGood) -> bool { debug!(target: "hbbft_message_memorium", "working on good message event!: {:?}", event); - if let Some(epoch_history) = self.get_staking_epoch_history(event.block_num) { + if let Some(epoch_history) = self.get_staking_epoch_history_mut(event.block_num) { epoch_history.on_message_good(event); return true; } else { return self.event_handle_history_not_set_up(event.block_num); } + } + + pub fn get_validator_data(&self, block_num: u64, node_id: &NodeId) -> Option<&Vec>{ + + if let Some(epoch_history) = self.get_staking_epoch_history(block_num) { + return Some(&epoch_history.node_staking_epoch_histories) + } + None + } + + pub fn get_validator_last_late_block(&self, hbbft_epoch_number: u64) { + + + } // report that hbbft has switched to a new staking epoch @@ -950,20 +989,38 @@ impl HbbftMessageMemorium { } } - fn get_staking_epoch_history(&mut self, block_num: u64) -> Option<&mut StakingEpochHistory> { - { - //let histories = &mut self.staking_epoch_history; - - // self.staking_epoch_history.get_mut(index) - for i in 0..self.staking_epoch_history.len() { - let e = &self.staking_epoch_history[i]; - if block_num >= e.staking_epoch_start_block - && (e.staking_epoch_end_block == 0 || block_num <= e.staking_epoch_end_block) - { - return Some(&mut self.staking_epoch_history[i]); - } + + pub fn get_staking_epoch_history(&self, block_num: u64) -> Option<&StakingEpochHistory> { + + //let histories = &mut self.staking_epoch_history; + + // self.staking_epoch_history.get_mut(index) + for i in 0..self.staking_epoch_history.len() { + let e = &self.staking_epoch_history[i]; + if block_num >= e.staking_epoch_start_block + && (e.staking_epoch_end_block == 0 || block_num <= e.staking_epoch_end_block) + { + return Some(&self.staking_epoch_history[i]); + } + } + + None + } + + fn get_staking_epoch_history_mut(&mut self, block_num: u64) -> Option<&mut StakingEpochHistory> { + + //let histories = &mut self.staking_epoch_history; + + // self.staking_epoch_history.get_mut(index) + for i in 0..self.staking_epoch_history.len() { + let e = &self.staking_epoch_history[i]; + if block_num >= e.staking_epoch_start_block + && (e.staking_epoch_end_block == 0 || block_num <= e.staking_epoch_end_block) + { + return Some(&mut self.staking_epoch_history[i]); } } + // if we have not found a staking epoch, we add it if possible. // this can happen during timings, where new messages get's process, From 151caf813702dda1f4a3fcfdc3ef571db6661f33 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 Nov 2023 18:15:24 +0100 Subject: [PATCH 006/166] cargo fmt --all -- --config imports_granularity=Crate --- .../engines/hbbft/hbbft_message_memorium.rs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs index fa8e95118..ef2067a42 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs @@ -222,7 +222,10 @@ impl NodeStakingEpochHistory { } pub fn get_sealing_message(&self) -> u64 { - u64::max(self.last_late_sealing_message, self.last_good_sealing_message) + u64::max( + self.last_late_sealing_message, + self.last_good_sealing_message, + ) } pub fn get_last_late_sealing_message(&self) -> u64 { @@ -465,7 +468,6 @@ impl StakingEpochHistory { }; } - pub fn on_seal_good(&mut self, event: &SealEventGood) { let staking_epoch_start_block = self.staking_epoch_start_block; if event.block_num > self.highest_block_num { @@ -938,20 +940,19 @@ impl HbbftMessageMemorium { } } - pub fn get_validator_data(&self, block_num: u64, node_id: &NodeId) -> Option<&Vec>{ - + pub fn get_validator_data( + &self, + block_num: u64, + node_id: &NodeId, + ) -> Option<&Vec> { if let Some(epoch_history) = self.get_staking_epoch_history(block_num) { - return Some(&epoch_history.node_staking_epoch_histories) + return Some(&epoch_history.node_staking_epoch_histories); } None - } - - pub fn get_validator_last_late_block(&self, hbbft_epoch_number: u64) { - - - } + pub fn get_validator_last_late_block(&self, hbbft_epoch_number: u64) {} + // report that hbbft has switched to a new staking epoch pub fn report_new_epoch(&mut self, staking_epoch: u64, staking_epoch_start_block: u64) { warn!(target: "hbbft_message_memorium", "report new epoch: {}", staking_epoch); @@ -989,9 +990,7 @@ impl HbbftMessageMemorium { } } - pub fn get_staking_epoch_history(&self, block_num: u64) -> Option<&StakingEpochHistory> { - //let histories = &mut self.staking_epoch_history; // self.staking_epoch_history.get_mut(index) @@ -1007,8 +1006,10 @@ impl HbbftMessageMemorium { None } - fn get_staking_epoch_history_mut(&mut self, block_num: u64) -> Option<&mut StakingEpochHistory> { - + fn get_staking_epoch_history_mut( + &mut self, + block_num: u64, + ) -> Option<&mut StakingEpochHistory> { //let histories = &mut self.staking_epoch_history; // self.staking_epoch_history.get_mut(index) @@ -1020,7 +1021,6 @@ impl HbbftMessageMemorium { return Some(&mut self.staking_epoch_history[i]); } } - // if we have not found a staking epoch, we add it if possible. // this can happen during timings, where new messages get's process, From 0d3ea6dcf2b8c3bb1e9bfaf83af6d8f022cc1125 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 Nov 2023 18:15:48 +0100 Subject: [PATCH 007/166] decision implementation --- .../hbbft/hbbft_early_epoch_end_manager.rs | 81 +++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index ff3eb01cb..1a76e716e 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -1,17 +1,17 @@ -use std::time::{Instant, Duration}; use crate::client::BlockChainClient; +use std::time::{Duration, Instant}; -use super::{NodeId, hbbft_message_memorium::HbbftMessageMemorium}; - +use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId}; pub(crate) struct EarlyEpochEndManager { - /// The current epoch number. current_tracked_epoch_number: u64, /// epoch manager start up time. start_time: Instant, + start_block: u64, + /// allowed devp2p warmup time. allowed_devp2p_warmup_time: Duration, @@ -22,21 +22,22 @@ pub(crate) struct EarlyEpochEndManager { flagged_validators: Vec, } - -impl EarlyEpochEndManager { - +impl EarlyEpochEndManager { /// creates a new EarlyEpochEndManager, /// if conditions are matching to create one. /// It is expected that this function is only called if the node is a validator. /// This prerequesite will be checked and if not met, panics. - pub fn create_early_epoch_end_manager(allowed_devp2p_warmup_time: Duration, client: &dyn BlockChainClient) -> Option { - - + pub fn create_early_epoch_end_manager( + allowed_devp2p_warmup_time: Duration, + client: &dyn BlockChainClient, + epoch_number: u64, + epoch_start_block: u64, + ) -> Option { if client.is_syncing() { // if we are syncing, we do not need to create an early epoch end manager yet. // if we are syncing as a validator, and it is really this epoch, // this way the creation of the early epoch end manager is created in a subsequent call, - // when we are at the tip of the chain, and get the correct state for + // when we are at the tip of the chain, and get the correct state for // - flagged validators // - start_time // The whole window for the devp2p warmup time is granted in this case, @@ -45,26 +46,24 @@ impl EarlyEpochEndManager { } // figure out if we have to retrieve the data from the smart contracts. - // if the epoch start did just happen, + // if the epoch start did just happen, // we do not have to retrieve the data from the smart contracts. - let result = Self { - current_tracked_epoch_number: 0, + current_tracked_epoch_number: epoch_number, start_time: Instant::now(), + start_block: epoch_start_block, allowed_devp2p_warmup_time, validators: Vec::new(), flagged_validators: Vec::new(), }; return Some(result); - } /// notifies about a new epoch. /// This (re)inits the Manager, no early epoch end happened. - pub fn notify_new_epoch(&mut self, epoch: u64, validators: Vec ) { - + pub fn notify_new_epoch(&mut self, epoch: u64, validators: Vec) { self.current_tracked_epoch_number = epoch; self.validators = validators; self.start_time = Instant::now(); @@ -72,23 +71,59 @@ impl EarlyEpochEndManager { /// retrieves the information from smart contracts which validators are currently flagged. fn get_current_flagged_validators_from_contracts() -> Vec { - // todo: call smart contract. return Vec::new(); } - fn notify_about_missing_validator(&mut self, validator: NodeId, full_client: &dyn BlockChainClient) { - + fn notify_about_missing_validator( + &mut self, + validator: &NodeId, + full_client: &dyn BlockChainClient, + ) /* -> result of contract call errr */ + { // todo: send transaction to smart contract about missing validator. + + warn!(target: "engine", "early-epoch-end: notify about missing validator: {:?}", validator); } /// decides on the memorium data if we should update to contract data. - pub fn decide(memorium: &HbbftMessageMemorium) { + pub fn decide( + &mut self, + memorium: &HbbftMessageMemorium, + block_num: u64, + full_client: &dyn BlockChainClient, + ) { + // if devp2p warmup time is not over yet, we do not have to do anything. + if self.start_time.elapsed() < self.allowed_devp2p_warmup_time { + return; + } + let treshold: u64 = 10; + + if self.start_block + treshold < block_num { + // not enought blocks have passed this epoch, + // to judge other nodes. + return; + } + + //full_client.best_block_header() + // get current state of missing validators from hbbftMemorium. + if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { + for validator in &self.validators.clone() { + if let Some(node_history) = epoch_history.get_history_for_node(validator) { + let last_sealing_message = node_history.get_sealing_message(); + + if last_sealing_message < block_num - treshold { + self.notify_about_missing_validator(&validator, full_client); + } + } + // todo: if the systems switched from block based measurement to time based measurement. + } + } + // nothing to do: no history yet. // note: We do not take care if hbbft message memorium might not have processed some of the messages yet, // since it is not important to do the decision based on the latest data, since the decide method will be called // again. } - -} \ No newline at end of file +} From fc798ee6b990b72826f930fc7a5f3a1981b335da Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 Nov 2023 18:22:24 +0100 Subject: [PATCH 008/166] if we are syncing, we wont do any blaming. --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 1a76e716e..b75f08845 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -98,6 +98,11 @@ impl EarlyEpochEndManager { return; } + if full_client.is_syncing() { + // if we are syncing, we wont do any blaming. + return; + } + let treshold: u64 = 10; if self.start_block + treshold < block_num { From b2d1f3697b98380c94f40fd897b78de0bfa1c64a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 22 Nov 2023 13:20:02 +0100 Subject: [PATCH 009/166] renamed EarlyEpochEndManager to HbbftEarlyEpochEndManager data interation in hbbt engine --- .../hbbft/hbbft_early_epoch_end_manager.rs | 19 ++++++++++++++++--- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 4 +++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index b75f08845..4564d715f 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -3,7 +3,7 @@ use std::time::{Duration, Instant}; use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId}; -pub(crate) struct EarlyEpochEndManager { +pub(crate) struct HbbftEarlyEpochEndManager { /// The current epoch number. current_tracked_epoch_number: u64, @@ -22,7 +22,7 @@ pub(crate) struct EarlyEpochEndManager { flagged_validators: Vec, } -impl EarlyEpochEndManager { +impl HbbftEarlyEpochEndManager { /// creates a new EarlyEpochEndManager, /// if conditions are matching to create one. /// It is expected that this function is only called if the node is a validator. @@ -32,7 +32,7 @@ impl EarlyEpochEndManager { client: &dyn BlockChainClient, epoch_number: u64, epoch_start_block: u64, - ) -> Option { + ) -> Option { if client.is_syncing() { // if we are syncing, we do not need to create an early epoch end manager yet. // if we are syncing as a validator, and it is really this epoch, @@ -132,3 +132,16 @@ impl EarlyEpochEndManager { // again. } } + + + +/// testing early epoch stop manager. +#[cfg(test)] +mod tests { + + #[test] + fn test_early_epoch_end() { + + // should + } +} \ No newline at end of file diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index e08f1f239..db87e14e2 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1,4 +1,4 @@ -use super::block_reward_hbbft::BlockRewardContract; +use super::{block_reward_hbbft::BlockRewardContract, hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager}; use crate::{ client::BlockChainClient, engines::hbbft::{ @@ -88,6 +88,7 @@ pub struct HoneyBadgerBFT { has_connected_to_validator_set: AtomicBool, peers_management: Mutex, current_minimum_gas_price: Mutex>, + early_epoch_manager: Mutex>, } struct TransitionHandler { @@ -445,6 +446,7 @@ impl HoneyBadgerBFT { has_connected_to_validator_set: AtomicBool::new(false), peers_management: Mutex::new(HbbftPeersManagement::new()), current_minimum_gas_price: Mutex::new(None), + early_epoch_manager: Mutex::new(None), }); if !engine.params.is_unit_test.unwrap_or(false) { From da36579d77dd58f32f3b85c4b34981126d4ee36a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 23 Nov 2023 13:17:50 +0100 Subject: [PATCH 010/166] dispatchers allows to access the memorium data now. --- crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs index ef2067a42..ef6a01ff2 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs @@ -719,6 +719,10 @@ impl HbbftMessageDispatcher { .write() .report_new_epoch(staking_epoch, staking_epoch_start_block); } + + pub fn get_memorium(&self) -> &std::sync::Arc> { + return &self.memorial; + } } pub(crate) struct HbbftMessageMemorium { From a8bc7adf8a15afc66ac55f9ff68a2382651979f5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 23 Nov 2023 13:30:17 +0100 Subject: [PATCH 011/166] comments for hbbft_early_epoch_end_manager --- .../hbbft/hbbft_early_epoch_end_manager.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 4564d715f..f0267b590 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -81,12 +81,23 @@ impl HbbftEarlyEpochEndManager { full_client: &dyn BlockChainClient, ) /* -> result of contract call errr */ { + // let mining_address = match self.signer.read().as_ref() { + // Some(signer) => signer.address(), + // None => { + // // we do not have a signer on Full and RPC nodes. + // // here is a possible performance improvement: + // // this won't change during the lifetime of the application ?! + // return Ok(()); + // } + // }; + // todo: send transaction to smart contract about missing validator. warn!(target: "engine", "early-epoch-end: notify about missing validator: {:?}", validator); } /// decides on the memorium data if we should update to contract data. + /// end executes them. pub fn decide( &mut self, memorium: &HbbftMessageMemorium, @@ -133,8 +144,6 @@ impl HbbftEarlyEpochEndManager { } } - - /// testing early epoch stop manager. #[cfg(test)] mod tests { @@ -142,6 +151,6 @@ mod tests { #[test] fn test_early_epoch_end() { - // should + // should } -} \ No newline at end of file +} From 0c11c4c9a2f378be58953519c3be956b51016191 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 23 Nov 2023 13:31:45 +0100 Subject: [PATCH 012/166] first integration of hbbft_early_epoch_end_manager into the hbbft_engine. TODO: get correct numbers for epoch_num and block_num. --- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index db87e14e2..5be1d78e8 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1,4 +1,7 @@ -use super::{block_reward_hbbft::BlockRewardContract, hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager}; +use super::{ + block_reward_hbbft::BlockRewardContract, + hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, +}; use crate::{ client::BlockChainClient, engines::hbbft::{ @@ -970,6 +973,53 @@ impl HoneyBadgerBFT { let should_connect_to_validator_set = self.should_connect_to_validator_set(); + if let Some(memorium) = self + .hbbft_message_dispatcher + .get_memorium() + .try_read_for(Duration::from_millis(300)) + { + let epoch_num = 0; + let block_num = 0; + + // this is currently the only location where we lock early epoch manager - + // so this should never cause a deadlock, and we do not have to try_lock_for + let mut lock_guard = self.early_epoch_manager.lock(); + + match lock_guard.as_mut() { + Some(ealry_epoch_end_manager) => { + ealry_epoch_end_manager.decide( + &memorium, + block_num, + block_chain_client, + ); + } + None => { + warn!(target: "engine", "no Early Epoch END Manager configured found yet."); + + let allowed_devp2p_warmup_time = Duration::from_secs(120); + + // todo: get epoch start block + let epoch_start_block = 0; + + // let ealry_epoch_manager + *lock_guard = + HbbftEarlyEpochEndManager::create_early_epoch_end_manager( + allowed_devp2p_warmup_time, + block_chain_client, + epoch_num, + epoch_start_block, + ); + + if let Some(manager) = lock_guard.as_mut() { + + manager.decide(&memorium, block_num, block_chain_client); + } + } + } + } else { + warn!(target: "engine", "could not acquire read lock for memorium to decide on ealry_epoch_end_manager in do_validator_engine_actions."); + } + // if we do not have to do anything, we can return early. if !(should_handle_availability_announcements || should_handle_internet_address_announcements @@ -982,7 +1032,7 @@ impl HoneyBadgerBFT { // staking by mining address could be cached. // but it COULD also get changed in the contracts, during the time the node is running. // most likely since a Node can get staked, and than it becomes a mining address. - // a good solution for this is not to do this that fequently. + // a good solution for this is not to do this expensive operation that fequently. let staking_address = match staking_by_mining_address( engine_client, &mining_address, @@ -1052,6 +1102,7 @@ impl HoneyBadgerBFT { } } } + return Ok(()); } From ac0946c2e0a45993c85a2e662bbff42a8089b134 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 23 Nov 2023 14:23:36 +0100 Subject: [PATCH 013/166] cache for flagged validators and respecting of that cache in the decide function. --- .../hbbft/hbbft_early_epoch_end_manager.rs | 40 +++++++++++++++++-- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 18 ++++----- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index f0267b590..08b55f233 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -18,7 +18,8 @@ pub(crate) struct HbbftEarlyEpochEndManager { /// public keys of all validators for this epoch. validators: Vec, - /// current flagged validators + /// current flagged validators, unordered list - no performance issue, since this can + /// only grow up to 7 elements for a usual set of 25 nodes. flagged_validators: Vec, } @@ -70,7 +71,9 @@ impl HbbftEarlyEpochEndManager { } /// retrieves the information from smart contracts which validators are currently flagged. - fn get_current_flagged_validators_from_contracts() -> Vec { + fn get_current_flagged_validators_from_contracts( + full_client: &dyn BlockChainClient, + ) -> Vec { // todo: call smart contract. return Vec::new(); } @@ -93,7 +96,21 @@ impl HbbftEarlyEpochEndManager { // todo: send transaction to smart contract about missing validator. - warn!(target: "engine", "early-epoch-end: notify about missing validator: {:?}", validator); + self.flagged_validators.push(validator.clone()); + warn!(target: "engine", "TODO: early-epoch-end: notify about missing validator: {:?}", validator); + } + + fn notify_about_validator_reconnect( + &mut self, + validator: &NodeId, + full_client: &dyn BlockChainClient, + ) { + if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) { + self.flagged_validators.remove(index); + warn!(target: "engine", "TODO: early-epoch-end: notify about reconnected validator: {:?}", validator); + } else { + error!(target: "engine", " Could not find reconnected validator in flagged validators."); + } } /// decides on the memorium data if we should update to contract data. @@ -122,6 +139,9 @@ impl HbbftEarlyEpochEndManager { return; } + let current_flagged_validators = + Self::get_current_flagged_validators_from_contracts(full_client); + //full_client.best_block_header() // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { @@ -130,7 +150,19 @@ impl HbbftEarlyEpochEndManager { let last_sealing_message = node_history.get_sealing_message(); if last_sealing_message < block_num - treshold { - self.notify_about_missing_validator(&validator, full_client); + // we do not have to send notification, if we already did so. + + if !current_flagged_validators.contains(validator) { + // this function will also add the validator to the list of flagged validators. + self.notify_about_missing_validator(&validator, full_client); + } + } else { + // this validator is OK. + // maybe it was flagged and we need to unflag it ? + + if current_flagged_validators.contains(validator) { + self.notify_about_validator_reconnect(&validator, full_client); + } } } // todo: if the systems switched from block based measurement to time based measurement. diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 5be1d78e8..41881f1cc 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -981,7 +981,7 @@ impl HoneyBadgerBFT { let epoch_num = 0; let block_num = 0; - // this is currently the only location where we lock early epoch manager - + // this is currently the only location where we lock early epoch manager - // so this should never cause a deadlock, and we do not have to try_lock_for let mut lock_guard = self.early_epoch_manager.lock(); @@ -1002,16 +1002,14 @@ impl HoneyBadgerBFT { let epoch_start_block = 0; // let ealry_epoch_manager - *lock_guard = - HbbftEarlyEpochEndManager::create_early_epoch_end_manager( - allowed_devp2p_warmup_time, - block_chain_client, - epoch_num, - epoch_start_block, - ); - - if let Some(manager) = lock_guard.as_mut() { + *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( + allowed_devp2p_warmup_time, + block_chain_client, + epoch_num, + epoch_start_block, + ); + if let Some(manager) = lock_guard.as_mut() { manager.decide(&memorium, block_num, block_chain_client); } } From 4d07709fee020c413a8ddc01b53e117d5cceb2c1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 23 Nov 2023 14:35:22 +0100 Subject: [PATCH 014/166] fixed: do not query current validators - use cached values. retrieve cached values from contracts. --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 08b55f233..5a99dde2f 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -56,7 +56,7 @@ impl HbbftEarlyEpochEndManager { start_block: epoch_start_block, allowed_devp2p_warmup_time, validators: Vec::new(), - flagged_validators: Vec::new(), + flagged_validators: Self::get_current_flagged_validators_from_contracts(client), }; return Some(result); @@ -139,9 +139,6 @@ impl HbbftEarlyEpochEndManager { return; } - let current_flagged_validators = - Self::get_current_flagged_validators_from_contracts(full_client); - //full_client.best_block_header() // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { @@ -152,7 +149,7 @@ impl HbbftEarlyEpochEndManager { if last_sealing_message < block_num - treshold { // we do not have to send notification, if we already did so. - if !current_flagged_validators.contains(validator) { + if !self.flagged_validators.contains(validator) { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator(&validator, full_client); } @@ -160,7 +157,7 @@ impl HbbftEarlyEpochEndManager { // this validator is OK. // maybe it was flagged and we need to unflag it ? - if current_flagged_validators.contains(validator) { + if self.flagged_validators.contains(validator) { self.notify_about_validator_reconnect(&validator, full_client); } } From 082f2a53d3e127ae827c01f8371f2da8a84a9d5c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 24 Nov 2023 07:26:07 +0100 Subject: [PATCH 015/166] refactored ealry epoch end into new function handle_early_epoch_end . now gathering epoch number and epoch start block from hbbft state --- .../hbbft/hbbft_early_epoch_end_manager.rs | 13 ++- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 102 ++++++++++-------- 2 files changed, 69 insertions(+), 46 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 5a99dde2f..cbaed64fd 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -1,3 +1,5 @@ +use types::ids::BlockId; + use crate::client::BlockChainClient; use std::time::{Duration, Instant}; @@ -118,7 +120,6 @@ impl HbbftEarlyEpochEndManager { pub fn decide( &mut self, memorium: &HbbftMessageMemorium, - block_num: u64, full_client: &dyn BlockChainClient, ) { // if devp2p warmup time is not over yet, we do not have to do anything. @@ -131,6 +132,16 @@ impl HbbftEarlyEpochEndManager { return; } + //full_client. + + + let block_num = if let Some(block) = full_client.block(BlockId::Latest) { + block.number() + } else { + error!(target:"engine", "could not retrieve latest block."); + return; + }; + let treshold: u64 = 10; if self.start_block + treshold < block_num { diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 41881f1cc..3fd47a1b0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -932,6 +932,61 @@ impl HoneyBadgerBFT { false } + fn handle_early_epoch_end( + &self, + block_chain_client: &dyn BlockChainClient, + mining_address: Address, + ) { + if let Some(memorium) = self + .hbbft_message_dispatcher + .get_memorium() + .try_read_for(Duration::from_millis(300)) + { + // this is currently the only location where we lock early epoch manager - + // so this should never cause a deadlock, and we do not have to try_lock_for + let mut lock_guard = self.early_epoch_manager.lock(); + + match lock_guard.as_mut() { + Some(ealry_epoch_end_manager) => { + ealry_epoch_end_manager.decide(&memorium, block_chain_client); + } + None => { + + // todo: acquire allowed devp2p warmup time from contracts ?! + let allowed_devp2p_warmup_time = Duration::from_secs(120); + + let hbbft_state = if let Some(s) = + self.hbbft_state.try_read_for(Duration::from_millis(300)) + { + s + } else { + warn!(target: "engine", "early-epoch-end: could not acquire read lock for hbbft state."); + return; + }; + + let epoch_num = hbbft_state.get_current_posdao_epoch(); + let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); + + // we got everything we need from hbbft_state - drop lock ASAP. + std::mem::drop(hbbft_state); + + *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( + allowed_devp2p_warmup_time, + block_chain_client, + epoch_num, + epoch_start_block, + ); + + if let Some(manager) = lock_guard.as_mut() { + manager.decide(&memorium, block_chain_client); + } + } + } + } else { + warn!(target: "engine", "could not acquire read lock for memorium to decide on ealry_epoch_end_manager in do_validator_engine_actions."); + } + } + // some actions are required for hbbft nodes. // this functions figures out what kind of actions are required and executes them. // this will lock the client and some deeper layers. @@ -966,6 +1021,8 @@ impl HoneyBadgerBFT { } }; + self.handle_early_epoch_end(block_chain_client, mining_address); + let should_handle_availability_announcements = self.should_handle_availability_announcements(); let should_handle_internet_address_announcements = @@ -973,51 +1030,6 @@ impl HoneyBadgerBFT { let should_connect_to_validator_set = self.should_connect_to_validator_set(); - if let Some(memorium) = self - .hbbft_message_dispatcher - .get_memorium() - .try_read_for(Duration::from_millis(300)) - { - let epoch_num = 0; - let block_num = 0; - - // this is currently the only location where we lock early epoch manager - - // so this should never cause a deadlock, and we do not have to try_lock_for - let mut lock_guard = self.early_epoch_manager.lock(); - - match lock_guard.as_mut() { - Some(ealry_epoch_end_manager) => { - ealry_epoch_end_manager.decide( - &memorium, - block_num, - block_chain_client, - ); - } - None => { - warn!(target: "engine", "no Early Epoch END Manager configured found yet."); - - let allowed_devp2p_warmup_time = Duration::from_secs(120); - - // todo: get epoch start block - let epoch_start_block = 0; - - // let ealry_epoch_manager - *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( - allowed_devp2p_warmup_time, - block_chain_client, - epoch_num, - epoch_start_block, - ); - - if let Some(manager) = lock_guard.as_mut() { - manager.decide(&memorium, block_num, block_chain_client); - } - } - } - } else { - warn!(target: "engine", "could not acquire read lock for memorium to decide on ealry_epoch_end_manager in do_validator_engine_actions."); - } - // if we do not have to do anything, we can return early. if !(should_handle_availability_announcements || should_handle_internet_address_announcements From 4df26324ab599ab7e4b48c12d548666651bdd155 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 24 Nov 2023 13:03:15 +0100 Subject: [PATCH 016/166] made locks linear where possible instead of nested. passed through mining address for early epoch switch --- .../hbbft/hbbft_early_epoch_end_manager.rs | 19 ++++++-- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 44 +++++++++---------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index cbaed64fd..385747dcc 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -1,3 +1,4 @@ +use ethereum_types::Address; use types::ids::BlockId; use crate::client::BlockChainClient; @@ -84,6 +85,7 @@ impl HbbftEarlyEpochEndManager { &mut self, validator: &NodeId, full_client: &dyn BlockChainClient, + mining_address: &Address, ) /* -> result of contract call errr */ { // let mining_address = match self.signer.read().as_ref() { @@ -106,6 +108,7 @@ impl HbbftEarlyEpochEndManager { &mut self, validator: &NodeId, full_client: &dyn BlockChainClient, + mining_address: &Address, ) { if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) { self.flagged_validators.remove(index); @@ -121,6 +124,7 @@ impl HbbftEarlyEpochEndManager { &mut self, memorium: &HbbftMessageMemorium, full_client: &dyn BlockChainClient, + mining_address: &Address, ) { // if devp2p warmup time is not over yet, we do not have to do anything. if self.start_time.elapsed() < self.allowed_devp2p_warmup_time { @@ -133,9 +137,8 @@ impl HbbftEarlyEpochEndManager { } //full_client. - - let block_num = if let Some(block) = full_client.block(BlockId::Latest) { + let block_num = if let Some(block) = full_client.block(BlockId::Latest) { block.number() } else { error!(target:"engine", "could not retrieve latest block."); @@ -162,14 +165,22 @@ impl HbbftEarlyEpochEndManager { if !self.flagged_validators.contains(validator) { // this function will also add the validator to the list of flagged validators. - self.notify_about_missing_validator(&validator, full_client); + self.notify_about_missing_validator( + &validator, + full_client, + mining_address, + ); } } else { // this validator is OK. // maybe it was flagged and we need to unflag it ? if self.flagged_validators.contains(validator) { - self.notify_about_validator_reconnect(&validator, full_client); + self.notify_about_validator_reconnect( + &validator, + full_client, + mining_address, + ); } } } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 3fd47a1b0..6f2357689 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -935,8 +935,25 @@ impl HoneyBadgerBFT { fn handle_early_epoch_end( &self, block_chain_client: &dyn BlockChainClient, - mining_address: Address, + mining_address: &Address, ) { + // todo: acquire allowed devp2p warmup time from contracts ?! + let allowed_devp2p_warmup_time = Duration::from_secs(120); + + let hbbft_state = if let Some(s) = self.hbbft_state.try_read_for(Duration::from_millis(300)) + { + s + } else { + warn!(target: "engine", "early-epoch-end: could not acquire read lock for hbbft state."); + return; + }; + + let epoch_num = hbbft_state.get_current_posdao_epoch(); + let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); + + // we got everything we need from hbbft_state - drop lock ASAP. + std::mem::drop(hbbft_state); + if let Some(memorium) = self .hbbft_message_dispatcher .get_memorium() @@ -948,28 +965,9 @@ impl HoneyBadgerBFT { match lock_guard.as_mut() { Some(ealry_epoch_end_manager) => { - ealry_epoch_end_manager.decide(&memorium, block_chain_client); + ealry_epoch_end_manager.decide(&memorium, block_chain_client, mining_address); } None => { - - // todo: acquire allowed devp2p warmup time from contracts ?! - let allowed_devp2p_warmup_time = Duration::from_secs(120); - - let hbbft_state = if let Some(s) = - self.hbbft_state.try_read_for(Duration::from_millis(300)) - { - s - } else { - warn!(target: "engine", "early-epoch-end: could not acquire read lock for hbbft state."); - return; - }; - - let epoch_num = hbbft_state.get_current_posdao_epoch(); - let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); - - // we got everything we need from hbbft_state - drop lock ASAP. - std::mem::drop(hbbft_state); - *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( allowed_devp2p_warmup_time, block_chain_client, @@ -978,7 +976,7 @@ impl HoneyBadgerBFT { ); if let Some(manager) = lock_guard.as_mut() { - manager.decide(&memorium, block_chain_client); + manager.decide(&memorium, block_chain_client, mining_address); } } } @@ -1021,7 +1019,7 @@ impl HoneyBadgerBFT { } }; - self.handle_early_epoch_end(block_chain_client, mining_address); + self.handle_early_epoch_end(block_chain_client, &mining_address); let should_handle_availability_announcements = self.should_handle_availability_announcements(); From 3a336abcb68dea3004b60a2d1be2681e25077f3c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 24 Nov 2023 13:07:21 +0100 Subject: [PATCH 017/166] comment for linking github issue --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 6f2357689..00ab1f7c0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -932,6 +932,8 @@ impl HoneyBadgerBFT { false } + /// early epoch ends + /// https://github.com/DMDcoin/diamond-node/issues/87 fn handle_early_epoch_end( &self, block_chain_client: &dyn BlockChainClient, From ae869434b224d52108ee76a6fde882e9426fc29e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 24 Nov 2023 14:54:56 +0100 Subject: [PATCH 018/166] initializing early epoch end manager with the validator set collection on instantiation. --- .../hbbft/hbbft_early_epoch_end_manager.rs | 5 ++- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 18 +++++++--- .../engines/hbbft/hbbft_peers_management.rs | 8 ++--- .../ethcore/src/engines/hbbft/hbbft_state.rs | 35 +++++++++++++++++-- 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 385747dcc..4bc8121fd 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -36,6 +36,7 @@ impl HbbftEarlyEpochEndManager { client: &dyn BlockChainClient, epoch_number: u64, epoch_start_block: u64, + validator_set: Vec, ) -> Option { if client.is_syncing() { // if we are syncing, we do not need to create an early epoch end manager yet. @@ -58,7 +59,7 @@ impl HbbftEarlyEpochEndManager { start_time: Instant::now(), start_block: epoch_start_block, allowed_devp2p_warmup_time, - validators: Vec::new(), + validators: validator_set, flagged_validators: Self::get_current_flagged_validators_from_contracts(client), }; @@ -136,8 +137,6 @@ impl HbbftEarlyEpochEndManager { return; } - //full_client. - let block_num = if let Some(block) = full_client.block(BlockId::Latest) { block.number() } else { diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 00ab1f7c0..1770cc185 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -952,7 +952,7 @@ impl HoneyBadgerBFT { let epoch_num = hbbft_state.get_current_posdao_epoch(); let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); - + let validator_set = hbbft_state.get_validator_set(); // we got everything we need from hbbft_state - drop lock ASAP. std::mem::drop(hbbft_state); @@ -966,8 +966,9 @@ impl HoneyBadgerBFT { let mut lock_guard = self.early_epoch_manager.lock(); match lock_guard.as_mut() { - Some(ealry_epoch_end_manager) => { - ealry_epoch_end_manager.decide(&memorium, block_chain_client, mining_address); + Some(early_epoch_end_manager) => { + // should we check here if the epoch number has changed ? + early_epoch_end_manager.decide(&memorium, block_chain_client, mining_address); } None => { *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( @@ -975,6 +976,7 @@ impl HoneyBadgerBFT { block_chain_client, epoch_num, epoch_start_block, + validator_set, ); if let Some(manager) = lock_guard.as_mut() { @@ -1093,8 +1095,11 @@ impl HoneyBadgerBFT { } if should_connect_to_validator_set { - let network_info_o = if let Some(hbbft_state) = self.hbbft_state.try_read() { - hbbft_state.get_current_network_info() + // we + let network_info_o = if let Some(hbbft_state) = + self.hbbft_state.try_read_for(Duration::from_millis(50)) + { + Some(hbbft_state.get_validator_set()) } else { None }; @@ -1414,6 +1419,7 @@ impl Engine for HoneyBadgerBFT { client, &self.signer, &self.peers_management, + &self.early_epoch_manager, &self.current_minimum_gas_price, BlockId::Latest, true, @@ -1455,6 +1461,7 @@ impl Engine for HoneyBadgerBFT { client, &self.signer, &self.peers_management, + &self.early_epoch_manager, &self.current_minimum_gas_price, BlockId::Latest, true, @@ -1676,6 +1683,7 @@ impl Engine for HoneyBadgerBFT { client.clone(), &self.signer, &self.peers_management, + &self.early_epoch_manager, &self.current_minimum_gas_price, BlockId::Hash(block_hash.clone()), false, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index a67438847..29f2ee6ce 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -158,10 +158,10 @@ impl HbbftPeersManagement { // a current validator. pub fn connect_to_current_validators( &mut self, - network_info: &NetworkInfo, + validator_set: &Vec, client_arc: &Arc, ) { - warn!(target: "Engine", "adding current validators as reserved peers: {}", network_info.validator_set().all_ids().count()); + info!(target: "Engine", "adding current validators as reserved peers: {}", validator_set.len()); // todo: iterate over NodeIds, extract the address // we do not need to connect to ourself. // figure out the IP and port from the contracts @@ -181,8 +181,6 @@ impl HbbftPeersManagement { return; } - let ids: Vec<&NodeId> = network_info.validator_set().all_ids().collect(); - // let mut validators_to_remove: BTreeSet = BTreeSet::new(); let mut validators_to_remove: BTreeSet
= self @@ -194,7 +192,7 @@ impl HbbftPeersManagement { // validators_to_remove let mut current_validator_connections: Vec = Vec::new(); - for node in ids.iter() { + for node in validator_set.iter() { let address = public_key_to_address(&node.0); if address == self.own_validator_address { diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 3671ac001..401351bed 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -12,6 +12,7 @@ use rand::seq::IteratorRandom; use std::{ collections::{BTreeMap, HashMap}, sync::Arc, + time::Duration, }; use types::{header::Header, ids::BlockId}; @@ -24,6 +25,7 @@ use super::{ validator_set::ValidatorType, }, contribution::Contribution, + hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, hbbft_peers_management::HbbftPeersManagement, NodeId, }; @@ -73,6 +75,7 @@ impl HbbftState { client: Arc, signer: &Arc>>>, peers_management_mutex: &Mutex, + early_epoch_end_manager_mutex: &Mutex>, current_minimum_gas_price: &Mutex>, block_id: BlockId, force: bool, @@ -159,7 +162,7 @@ impl HbbftState { if let Some(mut peers_management) = peers_management_mutex.try_lock_for(std::time::Duration::from_millis(250)) { - peers_management.connect_to_current_validators(&network_info, &client); + peers_management.connect_to_current_validators(&self.get_validator_set(), &client); } else { // maybe we should work with signals that signals that connect_to_current_validators should happen // instead of trying to achieve a lock here. @@ -170,6 +173,19 @@ impl HbbftState { warn!(target: "engine", "could not acquire to connect to current validators on switching to new validator set for staking epoch {}.", self.current_posdao_epoch); } + let allowed_devp2p_warmup_time = Duration::from_secs(120); + + if let Some(full_client) = client.as_full_client() { + *early_epoch_end_manager_mutex.lock() = + HbbftEarlyEpochEndManager::create_early_epoch_end_manager( + allowed_devp2p_warmup_time, + full_client, + self.current_posdao_epoch, + self.current_posdao_epoch_start_block, + self.get_validator_set(), + ); + } + Some(()) } @@ -542,8 +558,21 @@ impl HbbftState { self.network_info.clone() } - pub fn get_current_network_info(&self) -> Option> { - return self.network_info.clone(); + // pub fn get_current_network_info(&self) -> &Option> { + // return &self.network_info; + // } + + pub fn get_validator_set(&self) -> Vec { + if let Some(network_info) = &self.network_info { + let result: Vec = network_info + .validator_set() + .all_ids() + .map(|n| n.clone()) + .collect(); + return result; + } + + return Vec::new(); } pub fn get_current_posdao_epoch(&self) -> u64 { From 63f8a959798deaa4bacf91f636af9124eb14a1be Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 24 Nov 2023 15:00:40 +0100 Subject: [PATCH 019/166] early epoch end manager: removed notify_new_epoch --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 4bc8121fd..4c35def5b 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -66,14 +66,6 @@ impl HbbftEarlyEpochEndManager { return Some(result); } - /// notifies about a new epoch. - /// This (re)inits the Manager, no early epoch end happened. - pub fn notify_new_epoch(&mut self, epoch: u64, validators: Vec) { - self.current_tracked_epoch_number = epoch; - self.validators = validators; - self.start_time = Instant::now(); - } - /// retrieves the information from smart contracts which validators are currently flagged. fn get_current_flagged_validators_from_contracts( full_client: &dyn BlockChainClient, From ebef9de2a505857367ba4338372f73729735e485 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 25 Nov 2023 09:41:56 +0100 Subject: [PATCH 020/166] early epoch end: also notify about missing validator if there is no memorium info at all. --- .../engines/hbbft/hbbft_early_epoch_end_manager.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 4c35def5b..fe9eca7c3 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -148,6 +148,7 @@ impl HbbftEarlyEpochEndManager { // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { for validator in &self.validators.clone() { + // we need to exclude ourself. if let Some(node_history) = epoch_history.get_history_for_node(validator) { let last_sealing_message = node_history.get_sealing_message(); @@ -174,6 +175,16 @@ impl HbbftEarlyEpochEndManager { ); } } + } else { + // we do not have any history for this node. + if !self.flagged_validators.contains(validator) { + // this function will also add the validator to the list of flagged validators. + self.notify_about_missing_validator( + &validator, + full_client, + mining_address, + ); + } } // todo: if the systems switched from block based measurement to time based measurement. } From 437c289ba748ce5ea05f12223d46e404e957a410 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 26 Nov 2023 23:36:07 +0100 Subject: [PATCH 021/166] hint for not banned self --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 1770cc185..51a87677b 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -952,7 +952,10 @@ impl HoneyBadgerBFT { let epoch_num = hbbft_state.get_current_posdao_epoch(); let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); - let validator_set = hbbft_state.get_validator_set(); + let mut validator_set = hbbft_state.get_validator_set(); + // todo: remove own node from validator set. + + // we got everything we need from hbbft_state - drop lock ASAP. std::mem::drop(hbbft_state); From b5bd4c3e9e3608b2fea7a09742a9c2dd313634e4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 27 Nov 2023 23:21:34 +0100 Subject: [PATCH 022/166] skipping self for checking in hbbft early epoch end manager --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 8 +++++++- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index fe9eca7c3..4f7b1f900 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -1,7 +1,7 @@ use ethereum_types::Address; use types::ids::BlockId; -use crate::client::BlockChainClient; +use crate::{client::BlockChainClient, ethereum::public_key_to_address::public_key_to_address}; use std::time::{Duration, Instant}; use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId}; @@ -148,6 +148,12 @@ impl HbbftEarlyEpochEndManager { // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { for validator in &self.validators.clone() { + let validator_eth_address = public_key_to_address(&validator.0); + // we do not have to check ourself. + if validator_eth_address == *mining_address { + continue; + } + // we need to exclude ourself. if let Some(node_history) = epoch_history.get_history_for_node(validator) { let last_sealing_message = node_history.get_sealing_message(); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 51a87677b..4eebe1dd8 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -954,8 +954,7 @@ impl HoneyBadgerBFT { let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); let mut validator_set = hbbft_state.get_validator_set(); // todo: remove own node from validator set. - - + // we got everything we need from hbbft_state - drop lock ASAP. std::mem::drop(hbbft_state); From f71345f5865c115d059e5208a000fc2e23488896 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 16:40:01 +0100 Subject: [PATCH 023/166] reverted back default ports for hbbft configuration since we currently only have 1 alpha network. --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index cd7e94bea..64c32e3b7 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -112,9 +112,9 @@ fn to_toml( base_metrics_port: Option, metrics_interface: Option<&str>, ) -> Value { - let base_port = 31300i64; - let base_rpc_port = 18540i64; - let base_ws_port = 19540i64; + let base_port = 30300i64; + let base_rpc_port = 8540i64; + let base_ws_port = 9540i64; let mut parity = Map::new(); match config_type { From 54ff378a746414fb4d7299f8ec11479aa3b8a7a9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 16:49:38 +0100 Subject: [PATCH 024/166] hbbft_config_generator: fixed wrong peer id --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 64c32e3b7..d5c456aa3 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -46,7 +46,7 @@ impl ToString for Enode { fn to_string(&self) -> String { // Example: // enode://30ccdeb8c31972f570e4eea0673cd08cbe7cefc5de1d70119b39c63b1cba33b48e494e9916c0d1eab7d296774f3573da46025d1accdef2f3690bc9e6659a34b4@192.168.0.101:30300 - let port = 31300usize + self.idx; + let port = 30300usize + self.idx; format!("enode://{:x}@{}:{}", self.public, self.ip, port) } } From 9f7f68af8f00786deea9e2688273e1e9fe0ab96b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 22:21:38 +0100 Subject: [PATCH 025/166] NodeId now has a as_8_byte_string() method for convinient printing the first 8 bytes of the public key. --- .../engines/hbbft/hbbft_message_memorium.rs | 18 +++--------------- crates/ethcore/src/engines/hbbft/mod.rs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs index ef6a01ff2..6662c42ba 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs @@ -282,21 +282,9 @@ impl NodeStakingEpochHistory { //let metric: Metric = Metric::new(); //r.registry().register(c) - //let label = self.get_node_id().0.to_hex(); - - let node_id = self.get_node_id().0 .0; - - let other_node = std::format!( - "{:x}{:x}{:x}{:x}{:x}{:x}{:x}{:x}", - node_id[0], - node_id[1], - node_id[2], - node_id[3], - node_id[4], - node_id[5], - node_id[6], - node_id[7] - ); + //let node_id = self.get_node_id().0 .0; + + let other_node = self.get_node_id().as_8_byte_string(); //r.register_gauge_with_label(name, help, label, value) r.register_gauge_with_other_node_label( diff --git a/crates/ethcore/src/engines/hbbft/mod.rs b/crates/ethcore/src/engines/hbbft/mod.rs index 99aad0602..39ddaf09d 100644 --- a/crates/ethcore/src/engines/hbbft/mod.rs +++ b/crates/ethcore/src/engines/hbbft/mod.rs @@ -31,3 +31,19 @@ impl fmt::Display for NodeId { write!(f, "NodeId({})", self.0) } } + +impl NodeId { + pub fn as_8_byte_string(&self) -> String { + std::format!( + "{:x}{:x}{:x}{:x}{:x}{:x}{:x}{:x}", + self.0[0], + self.0[1], + self.0[2], + self.0[3], + self.0[4], + self.0[5], + self.0[6], + self.0[7] + ) + } +} From 9b90c4b5a9b01b18a4168f4c8ff932092ae66f33 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 22:22:13 +0100 Subject: [PATCH 026/166] prometheus metrics implementation for exporting node flag status. --- .../hbbft/hbbft_early_epoch_end_manager.rs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 4f7b1f900..e55813948 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -1,4 +1,5 @@ use ethereum_types::Address; +use stats::PrometheusMetrics; use types::ids::BlockId; use crate::{client::BlockChainClient, ethereum::public_key_to_address::public_key_to_address}; @@ -203,6 +204,26 @@ impl HbbftEarlyEpochEndManager { } } +impl PrometheusMetrics for HbbftEarlyEpochEndManager { + fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { + registry.register_gauge( + "early_epoch_end_flagged_validators", + "number of validators flagged for missing communication", + self.flagged_validators.len() as i64, + ); + + for v in self.validators.iter() { + let is_flagged = self.flagged_validators.contains(v); + let label_value = v.as_8_byte_string(); + registry.register_gauge_with_other_node_label( + "early_epoch_end_flag", + "node has flagged other_node [0-1]", + label_value.as_str(), + is_flagged as i64, + ); + } + } +} /// testing early epoch stop manager. #[cfg(test)] mod tests { From 6388d488c9abb3c46e7fb48670da6b0248c386ef Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 22:35:50 +0100 Subject: [PATCH 027/166] integrated prometheus metrics for early epoch end --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 4eebe1dd8..3e8178e63 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1715,6 +1715,14 @@ impl Engine for HoneyBadgerBFT { fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { self.hbbft_message_dispatcher.prometheus_metrics(registry); + if let Some(early_epoch_manager_option) = self + .early_epoch_manager + .try_lock_for(Duration::from_millis(250)) + { + if let Some(early_epoch_manager) = early_epoch_manager_option.as_ref() { + early_epoch_manager.prometheus_metrics(registry); + } + } } /// hbbft protects the start of the current posdao epoch start from being pruned. From 98a2a495c56a3dd91109b1cc13aa72d0c287c520 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 22:54:26 +0100 Subject: [PATCH 028/166] moved HoneyBadgerBFT prometheus_metrics to PrometheusMetrics trait implementation --- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 3e8178e63..fa2d51225 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1713,18 +1713,6 @@ impl Engine for HoneyBadgerBFT { } } - fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { - self.hbbft_message_dispatcher.prometheus_metrics(registry); - if let Some(early_epoch_manager_option) = self - .early_epoch_manager - .try_lock_for(Duration::from_millis(250)) - { - if let Some(early_epoch_manager) = early_epoch_manager_option.as_ref() { - early_epoch_manager.prometheus_metrics(registry); - } - } - } - /// hbbft protects the start of the current posdao epoch start from being pruned. fn pruning_protection_block_number(&self) -> Option { // we try to get a read lock for 500 ms. @@ -1745,6 +1733,21 @@ impl Engine for HoneyBadgerBFT { } } +impl PrometheusMetrics for HoneyBadgerBFT { + + fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { + self.hbbft_message_dispatcher.prometheus_metrics(registry); + if let Some(early_epoch_manager_option) = self + .early_epoch_manager + .try_lock_for(Duration::from_millis(250)) + { + if let Some(early_epoch_manager) = early_epoch_manager_option.as_ref() { + early_epoch_manager.prometheus_metrics(registry); + } + } + } +} + #[cfg(test)] mod tests { use super::super::{contribution::Contribution, test::create_transactions::create_transaction}; From ca895d34957a2a799383c1fd4a51daa29033598f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Nov 2023 22:57:34 +0100 Subject: [PATCH 029/166] showing tracked staking epoch in prometheus interface for early epoch manager. --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 8 +++++++- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index e55813948..f71145529 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -207,7 +207,13 @@ impl HbbftEarlyEpochEndManager { impl PrometheusMetrics for HbbftEarlyEpochEndManager { fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { registry.register_gauge( - "early_epoch_end_flagged_validators", + "early_epoch_end_staking_epoch", + "staking epoch information for early epoch end manager", + self.current_tracked_epoch_number as i64, + ); + + registry.register_gauge( + "early_epoch_end_num_flagged_validators", "number of validators flagged for missing communication", self.flagged_validators.len() as i64, ); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index fa2d51225..6fef9a442 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1734,7 +1734,6 @@ impl Engine for HoneyBadgerBFT { } impl PrometheusMetrics for HoneyBadgerBFT { - fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { self.hbbft_message_dispatcher.prometheus_metrics(registry); if let Some(early_epoch_manager_option) = self From 56a6ede611cbcd79d8d47b97f75e4e49d4b76ef0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 29 Nov 2023 10:58:22 +0100 Subject: [PATCH 030/166] removed log entry for good and faulty message log in memorium, probabably more than one message can happen per block.. add_message_event_good: ! event.block_num {block_num} > last_message_good {last_message_good} --- .../engines/hbbft/hbbft_message_memorium.rs | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs index 6662c42ba..ebe87422b 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs @@ -182,9 +182,10 @@ impl NodeStakingEpochHistory { if block_num > last_message_faulty { self.last_message_faulty = block_num; - } else { - warn!(target: "hbbft_message_memorium", "add_message_event_faulty: event.block_num {block_num} <= last_message_faulty {last_message_faulty}"); - } + } // else { + // this log entry is trigering often, probably there are more than 1 good messages able per block.// this log entry is trigering often, probably there are more than 1 good messages able per block. + // warn!(target: "hbbft_message_memorium", "add_message_event_faulty: event.block_num {block_num} <= last_message_faulty {last_message_faulty}"); + // } self.num_faulty_messages += 1; } @@ -195,9 +196,10 @@ impl NodeStakingEpochHistory { if block_num > last_message_good { self.last_message_good = block_num; - } else { - warn!(target: "hbbft_message_memorium", "add_message_event_good: event.block_num {block_num} <= last_message_good {last_message_good}"); - } + } // else { + // this log entry is trigering often, probably there are more than 1 good messages able per block. + // warn!(target: "hbbft_message_memorium", "add_message_event_good: ! event.block_num {block_num} > last_message_good {last_message_good}"); + // } self.num_good_messages += 1; } @@ -1243,6 +1245,17 @@ impl PrometheusMetrics for HbbftMessageMemorium { fn prometheus_metrics(&self, r: &mut stats::PrometheusRegistry) { //let epoch_history_len = self.staking_epoch_history.len() as i64; + // r.register_gauge( + // "HbbftMessageMemorium_dispatched_message_event_faulty", + // "dispatched_message_event_faulty", + // self.dispatched_message_event_faulty.len() as i64, + // ); + // r.register_gauge( + // "HbbftMessageMemorium_dispatched_message_event_good", + // "dispatched_message_event_good", + // self.dispatched_message_event_good.len() as i64, + // ); + if let Some(history) = self.staking_epoch_history.iter().last() { history.prometheus_metrics(r); } From c7b55fd60de3cfa928254ee6c51e84e5bb072b81 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 29 Nov 2023 10:58:40 +0100 Subject: [PATCH 031/166] disconnect_all_validators comment --- .../ethcore/src/engines/hbbft/hbbft_peers_management.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index 29f2ee6ce..42e0b3042 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -245,10 +245,10 @@ impl HbbftPeersManagement { self.connected_current_validators = current_validator_connections; } - // if we drop out as a current validator, - // as well a pending validator, we should drop - // all reserved connections. - // in later addition, we will keep the Partner Node Connections here. (upcomming feature) + /// if we drop out as a current validator, + /// as well a pending validator, we should drop + /// all reserved connections. + /// in later addition, we will keep the Partner Node Connections here. (upcomming feature) pub fn disconnect_all_validators(&mut self, client_arc: &Arc) { // we safely can disconnect even in situation where we are syncing. From c8dd02cf5750efaa81f3bc32fa0d59366eda1556 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 29 Nov 2023 11:28:20 +0100 Subject: [PATCH 032/166] improved logging for send_keygen_transactions --- .../src/engines/hbbft/keygen_transactions.rs | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index 507cabca4..8faf742d4 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -107,7 +107,7 @@ impl KeygenTransactionSender { let address = match signer.read().as_ref() { Some(signer) => signer.address(), None => { - trace!(target: "engine", "Could not send keygen transactions, because signer module could not be retrieved"); + warn!(target: "engine", "Could not send keygen transactions, because signer module could not be retrieved"); return Err(CallError::ReturnValueInvalid); } }; @@ -131,12 +131,18 @@ impl KeygenTransactionSender { // if synckeygen creation fails then either signer or validator pub keys are problematic. // Todo: We should expect up to f clients to write invalid pub keys. Report and re-start pending validator set selection. let (mut synckeygen, part) = engine_signer_to_synckeygen(signer, Arc::new(pub_keys)) - .map_err(|_| CallError::ReturnValueInvalid)?; + .map_err(|e| { + warn!(target:"engine", "engine_signer_to_synckeygen error {:?}", e); + CallError::ReturnValueInvalid + })?; // If there is no part then we are not part of the pending validator set and there is nothing for us to do. let part_data = match part { Some(part) => part, - None => return Err(CallError::ReturnValueInvalid), + None => { + warn!(target:"engine", "no part to write."); + return Err(CallError::ReturnValueInvalid); + } }; let upcoming_epoch = get_posdao_epoch(client, BlockId::Latest)? + 1; @@ -147,7 +153,10 @@ impl KeygenTransactionSender { ShouldSendKeyAnswer::Yes => { let serialized_part = match bincode::serialize(&part_data) { Ok(part) => part, - Err(_) => return Err(CallError::ReturnValueInvalid), + Err(e) => { + warn!(target:"engine", "could not serialize part: {:?}", e); + return Err(CallError::ReturnValueInvalid); + } }; let serialized_part_len = serialized_part.len(); let current_round = get_current_key_gen_round(client)?; @@ -171,7 +180,10 @@ impl KeygenTransactionSender { .gas_price(U256::from(10000000000u64)); full_client .transact_silently(part_transaction) - .map_err(|_| CallError::ReturnValueInvalid)?; + .map_err(|e| { + warn!(target:"engine", "could not transact_silently: {:?}", e); + CallError::ReturnValueInvalid + })?; trace!(target:"engine", "PART Transaction send."); return Ok(()); From 35df6811ce24a400f6a57fd69c6560a8d6c6262b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 29 Nov 2023 21:58:52 +0100 Subject: [PATCH 033/166] move prometheus_metrics from own trait to the Engine Impl, so it get's called again. --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 6fef9a442..098ce60cf 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1731,9 +1731,9 @@ impl Engine for HoneyBadgerBFT { return None; } } -} -impl PrometheusMetrics for HoneyBadgerBFT { + // note: this is by design not part of the PrometheusMetrics trait, + // it is part of the Engine trait and does nothing by default. fn prometheus_metrics(&self, registry: &mut stats::PrometheusRegistry) { self.hbbft_message_dispatcher.prometheus_metrics(registry); if let Some(early_epoch_manager_option) = self From 9de2603daa2af3aa265dbe0b331d94e59f12aac2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 1 Dec 2023 14:55:02 +0100 Subject: [PATCH 034/166] early epoch manager: filtering of own node moved from decide to the construction of the early epoch manager. --- .../hbbft/hbbft_early_epoch_end_manager.rs | 15 ++++++++------- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 1 + crates/ethcore/src/engines/hbbft/hbbft_state.rs | 8 ++++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index f71145529..eab81fdce 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -38,6 +38,7 @@ impl HbbftEarlyEpochEndManager { epoch_number: u64, epoch_start_block: u64, validator_set: Vec, + signing_address: &Address, ) -> Option { if client.is_syncing() { // if we are syncing, we do not need to create an early epoch end manager yet. @@ -51,6 +52,12 @@ impl HbbftEarlyEpochEndManager { return None; } + let validators: Vec = validator_set + .iter() + .filter(|n| public_key_to_address(&n.0) != *signing_address) + .cloned() + .collect(); + // figure out if we have to retrieve the data from the smart contracts. // if the epoch start did just happen, // we do not have to retrieve the data from the smart contracts. @@ -60,7 +67,7 @@ impl HbbftEarlyEpochEndManager { start_time: Instant::now(), start_block: epoch_start_block, allowed_devp2p_warmup_time, - validators: validator_set, + validators: validators, flagged_validators: Self::get_current_flagged_validators_from_contracts(client), }; @@ -149,12 +156,6 @@ impl HbbftEarlyEpochEndManager { // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { for validator in &self.validators.clone() { - let validator_eth_address = public_key_to_address(&validator.0); - // we do not have to check ourself. - if validator_eth_address == *mining_address { - continue; - } - // we need to exclude ourself. if let Some(node_history) = epoch_history.get_history_for_node(validator) { let last_sealing_message = node_history.get_sealing_message(); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 098ce60cf..59fc091f3 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -979,6 +979,7 @@ impl HoneyBadgerBFT { epoch_num, epoch_start_block, validator_set, + mining_address, ); if let Some(manager) = lock_guard.as_mut() { diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 401351bed..966a6587a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -176,6 +176,13 @@ impl HbbftState { let allowed_devp2p_warmup_time = Duration::from_secs(120); if let Some(full_client) = client.as_full_client() { + let signing_address = if let Some(s) = signer.read().as_ref() { + s.address() + } else { + error!(target: "engine", "early epoch manager: signer is not set!"); + ethereum_types::Address::zero() + }; + *early_epoch_end_manager_mutex.lock() = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( allowed_devp2p_warmup_time, @@ -183,6 +190,7 @@ impl HbbftState { self.current_posdao_epoch, self.current_posdao_epoch_start_block, self.get_validator_set(), + &signing_address, ); } From a94cc8ce8f515a80c20c4aded70b2dd314d24823 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 10 Dec 2023 13:56:56 +0100 Subject: [PATCH 035/166] report new epoch is now a info instead of a warning --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 59fc091f3..7099f6268 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1432,7 +1432,7 @@ impl Engine for HoneyBadgerBFT { let epoch_start_block = state.get_current_posdao_epoch_start_block(); // we got all infos from the state, we can drop the lock. std::mem::drop(state); - warn!(target: "engine", "report new epoch: {} at block: {}", posdao_epoch, epoch_start_block); + info!(target: "engine", "report new epoch: {} at block: {}", posdao_epoch, epoch_start_block); self.hbbft_message_dispatcher .report_new_epoch(posdao_epoch, epoch_start_block); } From 42109770fd61fc9763c953a7d0de29ce828a6671 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 10 Dec 2023 14:00:19 +0100 Subject: [PATCH 036/166] info logging for early-epoch-end: HbbftEarlyEpochEndManager created. --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index eab81fdce..4d28620bf 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -62,15 +62,19 @@ impl HbbftEarlyEpochEndManager { // if the epoch start did just happen, // we do not have to retrieve the data from the smart contracts. + let now = Instant::now(); + let result = Self { current_tracked_epoch_number: epoch_number, - start_time: Instant::now(), + start_time: now, start_block: epoch_start_block, allowed_devp2p_warmup_time, validators: validators, flagged_validators: Self::get_current_flagged_validators_from_contracts(client), }; + info!(target: "engine", "early-epoch-end: HbbftEarlyEpochEndManager created. start_time {now:?}, start_block: {epoch_start_block}"); + return Some(result); } From c94fa8809ecb20a11d5ad51d92e6f4c8d98e3aad Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 10 Dec 2023 14:22:23 +0100 Subject: [PATCH 037/166] debug logging for early epoch end manager --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 4d28620bf..fd27bb3a6 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -133,11 +133,14 @@ impl HbbftEarlyEpochEndManager { ) { // if devp2p warmup time is not over yet, we do not have to do anything. if self.start_time.elapsed() < self.allowed_devp2p_warmup_time { + debug!(target: "engine", "early-epoch-end: no decision: Devp2p warmup time"); + } else { return; } if full_client.is_syncing() { // if we are syncing, we wont do any blaming. + debug!(target: "engine", "early-epoch-end: no decision: syncing"); return; } @@ -153,6 +156,7 @@ impl HbbftEarlyEpochEndManager { if self.start_block + treshold < block_num { // not enought blocks have passed this epoch, // to judge other nodes. + debug!(target: "engine", "early-epoch-end: no decision: not enough blocks."); return; } @@ -166,7 +170,6 @@ impl HbbftEarlyEpochEndManager { if last_sealing_message < block_num - treshold { // we do not have to send notification, if we already did so. - if !self.flagged_validators.contains(validator) { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator( @@ -188,6 +191,7 @@ impl HbbftEarlyEpochEndManager { } } } else { + debug!(target: "engine", "early-epoch-end: no history info for validator {validator}"); // we do not have any history for this node. if !self.flagged_validators.contains(validator) { // this function will also add the validator to the list of flagged validators. From 1fcd0d2029dffa82ad0af8ff6ea3f3a5d307977b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 10 Dec 2023 15:08:57 +0100 Subject: [PATCH 038/166] fixed mut warn. --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 7099f6268..754f106d6 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -952,8 +952,7 @@ impl HoneyBadgerBFT { let epoch_num = hbbft_state.get_current_posdao_epoch(); let epoch_start_block = hbbft_state.get_current_posdao_epoch_start_block(); - let mut validator_set = hbbft_state.get_validator_set(); - // todo: remove own node from validator set. + let validator_set = hbbft_state.get_validator_set(); // we got everything we need from hbbft_state - drop lock ASAP. std::mem::drop(hbbft_state); @@ -988,7 +987,7 @@ impl HoneyBadgerBFT { } } } else { - warn!(target: "engine", "could not acquire read lock for memorium to decide on ealry_epoch_end_manager in do_validator_engine_actions."); + warn!(target: "engine", "early-epoch-end: could not acquire read lock for memorium to decide on ealry_epoch_end_manager in do_validator_engine_actions."); } } @@ -1014,7 +1013,7 @@ impl HoneyBadgerBFT { // here is a possible performance improvement: // this won't change during the lifetime of the application ?! return Ok(()); - } + } }; let engine_client = client_arc.deref(); From 101e24ea275dc055fb9b3a76d8da53a7c6fbecfb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Dec 2023 10:22:57 +0100 Subject: [PATCH 039/166] fixed: early-epoch-end: no decision: Devp2p warmup time --- .../ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index fd27bb3a6..566cec97a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -134,7 +134,6 @@ impl HbbftEarlyEpochEndManager { // if devp2p warmup time is not over yet, we do not have to do anything. if self.start_time.elapsed() < self.allowed_devp2p_warmup_time { debug!(target: "engine", "early-epoch-end: no decision: Devp2p warmup time"); - } else { return; } From e17346b161320c96a54fbc1357ef1d6e3168f113 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Dec 2023 10:31:00 +0100 Subject: [PATCH 040/166] error tagging: early-epoch-end: could not retrieve latest block --- .../ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 566cec97a..6cffb02e0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -146,7 +146,7 @@ impl HbbftEarlyEpochEndManager { let block_num = if let Some(block) = full_client.block(BlockId::Latest) { block.number() } else { - error!(target:"engine", "could not retrieve latest block."); + error!(target:"engine", "early-epoch-end: could not retrieve latest block."); return; }; From 377878ee3ccd4dcdcb62e6ba4d17d821bffe1de1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Dec 2023 11:04:49 +0100 Subject: [PATCH 041/166] fixed: early-epoch-end: no decision: not enough blocks --- .../ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 6cffb02e0..bfcec7a7a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -152,7 +152,7 @@ impl HbbftEarlyEpochEndManager { let treshold: u64 = 10; - if self.start_block + treshold < block_num { + if block_num < self.start_block + treshold { // not enought blocks have passed this epoch, // to judge other nodes. debug!(target: "engine", "early-epoch-end: no decision: not enough blocks."); From 18dab956e7746138c9c356e3698e7cea374f9d26 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Dec 2023 11:20:55 +0100 Subject: [PATCH 042/166] "could not retrieve part for" is Ok, do not report ReturnValueInvalid --- crates/ethcore/src/engines/hbbft/keygen_transactions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index 8faf742d4..e0d6ee567 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -207,7 +207,7 @@ impl KeygenTransactionSender { Some(ack) => ack, None => { trace!(target:"engine", "could not retrieve part for {}", *v); - return Err(CallError::ReturnValueInvalid); + return Ok(()); } } } From 6512eb74c94e413ad33b333e46da43bc17811403 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Dec 2023 23:26:07 +0100 Subject: [PATCH 043/166] abi for hbbft_connectivity_tracker crates/ethcore/res/contracts/hbbft_connectivity_tracker.json 4ba1b6b88a9b45949651a4e0ef79afbf0ab79412 --- .../contracts/hbbft_connectivity_tracker.json | 538 ++++++++++++++++++ 1 file changed, 538 insertions(+) create mode 100644 crates/ethcore/res/contracts/hbbft_connectivity_tracker.json diff --git a/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json b/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json new file mode 100644 index 000000000..c890642ac --- /dev/null +++ b/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json @@ -0,0 +1,538 @@ +[ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "AlreadyReported", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "reporter", + "type": "address" + } + ], + "name": "CannotReportByFlaggedValidator", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidAddress", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidBlock", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyValidator", + "type": "error" + }, + { + "inputs": [], + "name": "ReportTooEarly", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "UnknownReconnectReporter", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "ReportMissingConnectivity", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "reporter", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "ReportReconnect", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_level", + "type": "uint256" + } + ], + "name": "SetEarlyEpochEndToleranceLevel", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_minReportAge", + "type": "uint256" + } + ], + "name": "SetMinReportAgeBlocks", + "type": "event" + }, + { + "inputs": [], + "name": "blockRewardContract", + "outputs": [ + { + "internalType": "contract IBlockRewardHbbft", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + } + ], + "name": "checkReportMissingConnectivityCallable", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + } + ], + "name": "checkReportReconnectCallable", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentEpoch", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "earlyEpochEndThreshold", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "earlyEpochEndToleranceLevel", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "getCurrentConnectionStatus", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getFlaggedValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_contractOwner", + "type": "address" + }, + { + "internalType": "address", + "name": "_validatorSetContract", + "type": "address" + }, + { + "internalType": "address", + "name": "_stakingContract", + "type": "address" + }, + { + "internalType": "address", + "name": "_blockRewardContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_minReportAgeBlocks", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "isEarlyEpochEnd", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minReportAgeBlocks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + } + ], + "name": "reportMissingConnectivity", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + } + ], + "name": "reportReconnect", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_level", + "type": "uint256" + } + ], + "name": "setEarlyEpochEndToleranceLevel", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minReportAge", + "type": "uint256" + } + ], + "name": "setMinReportAge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakingContract", + "outputs": [ + { + "internalType": "contract IStakingHbbft", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "validatorConnectivityScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "validatorSetContract", + "outputs": [ + { + "internalType": "contract IValidatorSetHbbft", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] \ No newline at end of file From 6ea68645b2d9b952233f18e58a3040307abd8158 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 00:09:48 +0100 Subject: [PATCH 044/166] fixed hbbft_connectivity_tracker.json --- .../contracts/hbbft_connectivity_tracker.json | 354 ------------------ 1 file changed, 354 deletions(-) diff --git a/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json b/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json index c890642ac..65e1dbbf3 100644 --- a/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json +++ b/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json @@ -1,221 +1,4 @@ [ - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "reporter", - "type": "address" - }, - { - "internalType": "address", - "name": "validator", - "type": "address" - } - ], - "name": "AlreadyReported", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "reporter", - "type": "address" - } - ], - "name": "CannotReportByFlaggedValidator", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidAddress", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidBlock", - "type": "error" - }, - { - "inputs": [], - "name": "OnlyValidator", - "type": "error" - }, - { - "inputs": [], - "name": "ReportTooEarly", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "reporter", - "type": "address" - }, - { - "internalType": "address", - "name": "validator", - "type": "address" - } - ], - "name": "UnknownReconnectReporter", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "reporter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validator", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "ReportMissingConnectivity", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "reporter", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "validator", - "type": "address" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - } - ], - "name": "ReportReconnect", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_level", - "type": "uint256" - } - ], - "name": "SetEarlyEpochEndToleranceLevel", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "_minReportAge", - "type": "uint256" - } - ], - "name": "SetMinReportAgeBlocks", - "type": "event" - }, - { - "inputs": [], - "name": "blockRewardContract", - "outputs": [ - { - "internalType": "contract IBlockRewardHbbft", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "caller", - "type": "address" - }, - { - "internalType": "address", - "name": "validator", - "type": "address" - }, - { - "internalType": "uint256", - "name": "blockNumber", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "blockHash", - "type": "bytes32" - } - ], - "name": "checkReportMissingConnectivityCallable", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -315,58 +98,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "_contractOwner", - "type": "address" - }, - { - "internalType": "address", - "name": "_validatorSetContract", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakingContract", - "type": "address" - }, - { - "internalType": "address", - "name": "_blockRewardContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_minReportAgeBlocks", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "name": "isEarlyEpochEnd", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "minReportAgeBlocks", @@ -380,26 +111,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -446,58 +157,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_level", - "type": "uint256" - } - ], - "name": "setEarlyEpochEndToleranceLevel", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_minReportAge", - "type": "uint256" - } - ], - "name": "setMinReportAge", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "stakingContract", - "outputs": [ - { - "internalType": "contract IStakingHbbft", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { @@ -521,18 +180,5 @@ ], "stateMutability": "view", "type": "function" - }, - { - "inputs": [], - "name": "validatorSetContract", - "outputs": [ - { - "internalType": "contract IValidatorSetHbbft", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" } ] \ No newline at end of file From d4c638da91d816805b9ea9669a32e985f4de1b4d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 00:46:58 +0100 Subject: [PATCH 045/166] implemented get_current_flagged_validators_from_contract --- .../contracts/connectivity_tracker_hbbft.rs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs new file mode 100644 index 000000000..f9f08602c --- /dev/null +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -0,0 +1,28 @@ +use ethereum_types::{Address, U256}; +use std::str::FromStr; +use client::EngineClient; +use types::ids::BlockId; + +use crate::engines::hbbft::utils::bound_contract::{CallError, BoundContract}; + +use_contract!(connectivity_tracker_hbbft_contract, "res/contracts//hbbft_connectivity_tracker.json"); + +lazy_static! { + static ref CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS: Address = + Address::from_str("0x1200000000000000000000000000000000000001").unwrap(); +} + +macro_rules! call_const_connectivity_tracker_hbbft { + ($c:ident, $x:ident $(, $a:expr )*) => { + $c.call_const(connectivity_tracker_hbbft_contract::functions::$x::call($($a),*)) + }; +} + + +pub fn get_current_flagged_validators_from_contract( + client: &dyn EngineClient, + block_id: BlockId, +) -> Result, CallError> { + let c = BoundContract::bind(client, block_id, *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS); + return Ok(call_const_connectivity_tracker_hbbft!(c, get_flagged_validators)?); +} \ No newline at end of file From 4bbc1a978dba8d4fbd8fd10be99010e7e8e6f80e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 00:59:51 +0100 Subject: [PATCH 046/166] connectivity_tracker_hbbft module inclusion --- crates/ethcore/src/engines/hbbft/contracts/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/contracts/mod.rs b/crates/ethcore/src/engines/hbbft/contracts/mod.rs index 691d0cc50..07f652a0b 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/mod.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/mod.rs @@ -3,3 +3,4 @@ pub mod permission; pub mod random_hbbft; pub mod staking; pub mod validator_set; +pub mod connectivity_tracker_hbbft; From 39ccb31b737ad7730fb980df5947541738a81891 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 11:15:25 +0100 Subject: [PATCH 047/166] hbbft_early_epoch_end_manager - introduced address <> nodeID cache. - calling for contract function. - requiring now EngineClient in addition to BlockchainClient --- .../hbbft/hbbft_early_epoch_end_manager.rs | 69 +++++++++++++++---- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 4 +- .../ethcore/src/engines/hbbft/hbbft_state.rs | 1 + 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index bfcec7a7a..4650dd8df 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -2,10 +2,10 @@ use ethereum_types::Address; use stats::PrometheusMetrics; use types::ids::BlockId; -use crate::{client::BlockChainClient, ethereum::public_key_to_address::public_key_to_address}; -use std::time::{Duration, Instant}; +use crate::{client::{BlockChainClient, EngineClient}, ethereum::public_key_to_address::public_key_to_address}; +use std::{time::{Duration, Instant}, collections::BTreeMap}; -use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId}; +use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId, contracts::connectivity_tracker_hbbft::get_current_flagged_validators_from_contract}; pub(crate) struct HbbftEarlyEpochEndManager { /// The current epoch number. @@ -25,6 +25,12 @@ pub(crate) struct HbbftEarlyEpochEndManager { /// current flagged validators, unordered list - no performance issue, since this can /// only grow up to 7 elements for a usual set of 25 nodes. flagged_validators: Vec, + + + node_id_to_address: BTreeMap, + + + address_to_node_id: BTreeMap, } impl HbbftEarlyEpochEndManager { @@ -35,11 +41,13 @@ impl HbbftEarlyEpochEndManager { pub fn create_early_epoch_end_manager( allowed_devp2p_warmup_time: Duration, client: &dyn BlockChainClient, + engine_client: &dyn EngineClient, epoch_number: u64, epoch_start_block: u64, validator_set: Vec, signing_address: &Address, ) -> Option { + if client.is_syncing() { // if we are syncing, we do not need to create an early epoch end manager yet. // if we are syncing as a validator, and it is really this epoch, @@ -52,16 +60,27 @@ impl HbbftEarlyEpochEndManager { return None; } - let validators: Vec = validator_set - .iter() - .filter(|n| public_key_to_address(&n.0) != *signing_address) - .cloned() - .collect(); + let mut node_id_to_address: BTreeMap = BTreeMap::new(); + let mut address_to_node_id: BTreeMap = BTreeMap::new(); + + let mut validators: Vec = Vec::new(); + + for validator in validator_set.iter() { + + let address = public_key_to_address(&validator.0); + node_id_to_address.insert(validator.clone(), address); + address_to_node_id.insert(address, validator.clone()); + + if address == *signing_address { + continue; + } + + validators.push(validator.clone()); + }; // figure out if we have to retrieve the data from the smart contracts. // if the epoch start did just happen, // we do not have to retrieve the data from the smart contracts. - let now = Instant::now(); let result = Self { @@ -70,7 +89,9 @@ impl HbbftEarlyEpochEndManager { start_block: epoch_start_block, allowed_devp2p_warmup_time, validators: validators, - flagged_validators: Self::get_current_flagged_validators_from_contracts(client), + flagged_validators: Self::get_current_flagged_validators_from_contracts(engine_client, BlockId::Latest, &address_to_node_id), + node_id_to_address, + address_to_node_id, }; info!(target: "engine", "early-epoch-end: HbbftEarlyEpochEndManager created. start_time {now:?}, start_block: {epoch_start_block}"); @@ -80,10 +101,34 @@ impl HbbftEarlyEpochEndManager { /// retrieves the information from smart contracts which validators are currently flagged. fn get_current_flagged_validators_from_contracts( - full_client: &dyn BlockChainClient, + client: &dyn EngineClient, + block_id: BlockId, + address_to_node_id: &BTreeMap ) -> Vec { // todo: call smart contract. - return Vec::new(); + + match get_current_flagged_validators_from_contract(client, block_id) { + Ok(v) => { + let mut result : Vec = Vec::new(); + + for a in v.iter() { + if let Some(node_id) = address_to_node_id.get(a) { + result.push(node_id.clone()); + } else { + error!(target: "engine","early-epoch-end: could not find validator in address cache: {a:?}"); + } + } + + return result; + // address_to_node_id.get(key) + }, + Err(e) => { + error!(target: "engine","early-epoch-end: could not get_current_flagged_validators_from_contracts {e:?}" ); + Vec::new() + }, + } + + } fn notify_about_missing_validator( diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 754f106d6..57f15ad90 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -937,6 +937,7 @@ impl HoneyBadgerBFT { fn handle_early_epoch_end( &self, block_chain_client: &dyn BlockChainClient, + engine_client: &dyn EngineClient, mining_address: &Address, ) { // todo: acquire allowed devp2p warmup time from contracts ?! @@ -975,6 +976,7 @@ impl HoneyBadgerBFT { *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( allowed_devp2p_warmup_time, block_chain_client, + engine_client, epoch_num, epoch_start_block, validator_set, @@ -1025,7 +1027,7 @@ impl HoneyBadgerBFT { } }; - self.handle_early_epoch_end(block_chain_client, &mining_address); + self.handle_early_epoch_end(block_chain_client, engine_client, &mining_address); let should_handle_availability_announcements = self.should_handle_availability_announcements(); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 966a6587a..9138a7bc3 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -187,6 +187,7 @@ impl HbbftState { HbbftEarlyEpochEndManager::create_early_epoch_end_manager( allowed_devp2p_warmup_time, full_client, + client.as_ref(), self.current_posdao_epoch, self.current_posdao_epoch_start_block, self.get_validator_set(), From 91648405ca8f5acdc23de812c49398dec175b720 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 12:23:28 +0100 Subject: [PATCH 048/166] report missin connectivity contract call implementation --- .../contracts/connectivity_tracker_hbbft.rs | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index f9f08602c..3a712c39c 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -3,7 +3,7 @@ use std::str::FromStr; use client::EngineClient; use types::ids::BlockId; -use crate::engines::hbbft::utils::bound_contract::{CallError, BoundContract}; +use crate::{engines::hbbft::utils::bound_contract::{CallError, BoundContract}, client::{traits::TransactionRequest, BlockChainClient}}; use_contract!(connectivity_tracker_hbbft_contract, "res/contracts//hbbft_connectivity_tracker.json"); @@ -25,4 +25,47 @@ pub fn get_current_flagged_validators_from_contract( ) -> Result, CallError> { let c = BoundContract::bind(client, block_id, *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS); return Ok(call_const_connectivity_tracker_hbbft!(c, get_flagged_validators)?); +} + + +pub fn report_missing_connectivity( + client: &dyn EngineClient, + full_client: &dyn BlockChainClient, + missing_validator: &Address, + signing_address: &Address, +) -> bool { + + let (block_number, block_hash) = + if let Some(block_number) = client.block_number(BlockId::Latest) { + if let Some(header) = client.block_header(BlockId::Number(block_number)) { + let hash = header.hash(); + (block_number, hash) + } else { + warn!(target:"engine", "could not get block number for block: {block_number}"); + return false; + } + } else { + warn!(target:"engine", "report_missing_connectivity: could not get latest block."); + return false; + }; + + let send_data = connectivity_tracker_hbbft_contract::functions::report_missing_connectivity::call( + *missing_validator, + block_number, + block_hash + ); + + let nonce = full_client.next_nonce(signing_address); + + let transaction = TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) + .gas(U256::from(200_000)) + .nonce(nonce); + + info!(target:"consensus", "sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", missing_validator); + if let Err(e) = full_client.transact_silently(transaction) { + warn!(target:"consensus", "could not report_missing_connectivity {e:?}"); + return false; + } + return true; + } \ No newline at end of file From dcfbb544a2dc63865d91455fb67d7b24869f98e6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 13:02:17 +0100 Subject: [PATCH 049/166] implementation: notify_about_missing_validator --- .../hbbft/hbbft_early_epoch_end_manager.rs | 46 +++++++++---------- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 4 +- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 4650dd8df..8999124aa 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -2,7 +2,7 @@ use ethereum_types::Address; use stats::PrometheusMetrics; use types::ids::BlockId; -use crate::{client::{BlockChainClient, EngineClient}, ethereum::public_key_to_address::public_key_to_address}; +use crate::{client::{BlockChainClient, EngineClient}, ethereum::public_key_to_address::public_key_to_address, engines::hbbft::contracts::connectivity_tracker_hbbft::report_missing_connectivity}; use std::{time::{Duration, Instant}, collections::BTreeMap}; use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId, contracts::connectivity_tracker_hbbft::get_current_flagged_validators_from_contract}; @@ -31,6 +31,8 @@ pub(crate) struct HbbftEarlyEpochEndManager { address_to_node_id: BTreeMap, + + signing_address: Address } impl HbbftEarlyEpochEndManager { @@ -92,6 +94,7 @@ impl HbbftEarlyEpochEndManager { flagged_validators: Self::get_current_flagged_validators_from_contracts(engine_client, BlockId::Latest, &address_to_node_id), node_id_to_address, address_to_node_id, + signing_address: signing_address.clone(), }; info!(target: "engine", "early-epoch-end: HbbftEarlyEpochEndManager created. start_time {now:?}, start_block: {epoch_start_block}"); @@ -134,31 +137,25 @@ impl HbbftEarlyEpochEndManager { fn notify_about_missing_validator( &mut self, validator: &NodeId, - full_client: &dyn BlockChainClient, - mining_address: &Address, - ) /* -> result of contract call errr */ + client: &dyn EngineClient, + full_client: &dyn BlockChainClient) { - // let mining_address = match self.signer.read().as_ref() { - // Some(signer) => signer.address(), - // None => { - // // we do not have a signer on Full and RPC nodes. - // // here is a possible performance improvement: - // // this won't change during the lifetime of the application ?! - // return Ok(()); - // } - // }; - - // todo: send transaction to smart contract about missing validator. - - self.flagged_validators.push(validator.clone()); - warn!(target: "engine", "TODO: early-epoch-end: notify about missing validator: {:?}", validator); + + if let Some(validator_address) = self.node_id_to_address.get(validator) { + if report_missing_connectivity(client, full_client, validator_address, &self.signing_address) { + self.flagged_validators.push(validator.clone()); + } + } else { + warn!("Could not find validator_address for node id in cache: {validator:?}"); + return; + } + } fn notify_about_validator_reconnect( &mut self, validator: &NodeId, full_client: &dyn BlockChainClient, - mining_address: &Address, ) { if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) { self.flagged_validators.remove(index); @@ -174,7 +171,7 @@ impl HbbftEarlyEpochEndManager { &mut self, memorium: &HbbftMessageMemorium, full_client: &dyn BlockChainClient, - mining_address: &Address, + client: &dyn EngineClient, ) { // if devp2p warmup time is not over yet, we do not have to do anything. if self.start_time.elapsed() < self.allowed_devp2p_warmup_time { @@ -218,8 +215,8 @@ impl HbbftEarlyEpochEndManager { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator( &validator, - full_client, - mining_address, + client, + full_client ); } } else { @@ -230,7 +227,6 @@ impl HbbftEarlyEpochEndManager { self.notify_about_validator_reconnect( &validator, full_client, - mining_address, ); } } @@ -241,8 +237,8 @@ impl HbbftEarlyEpochEndManager { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator( &validator, - full_client, - mining_address, + client, + full_client ); } } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 57f15ad90..90798ea37 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -970,7 +970,7 @@ impl HoneyBadgerBFT { match lock_guard.as_mut() { Some(early_epoch_end_manager) => { // should we check here if the epoch number has changed ? - early_epoch_end_manager.decide(&memorium, block_chain_client, mining_address); + early_epoch_end_manager.decide(&memorium, block_chain_client, engine_client); } None => { *lock_guard = HbbftEarlyEpochEndManager::create_early_epoch_end_manager( @@ -984,7 +984,7 @@ impl HoneyBadgerBFT { ); if let Some(manager) = lock_guard.as_mut() { - manager.decide(&memorium, block_chain_client, mining_address); + manager.decide(&memorium, block_chain_client, engine_client); } } } From 4ac62b02eac9e11ab602602f2581a37d0a37d977 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 13:14:31 +0100 Subject: [PATCH 050/166] refactured contract calls for connectivity_tracker_hbbft: function reusability --- .../contracts/connectivity_tracker_hbbft.rs | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index 3a712c39c..e9798b27c 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -1,4 +1,4 @@ -use ethereum_types::{Address, U256}; +use ethereum_types::{Address, U256, H256}; use std::str::FromStr; use client::EngineClient; use types::ids::BlockId; @@ -28,26 +28,33 @@ pub fn get_current_flagged_validators_from_contract( } -pub fn report_missing_connectivity( - client: &dyn EngineClient, - full_client: &dyn BlockChainClient, - missing_validator: &Address, - signing_address: &Address, -) -> bool { +fn get_block_data(client: &dyn EngineClient) -> (u64, H256) { - let (block_number, block_hash) = if let Some(block_number) = client.block_number(BlockId::Latest) { if let Some(header) = client.block_header(BlockId::Number(block_number)) { let hash = header.hash(); - (block_number, hash) + return (block_number, hash); } else { warn!(target:"engine", "could not get block number for block: {block_number}"); - return false; + return (0, H256::zero()); } } else { - warn!(target:"engine", "report_missing_connectivity: could not get latest block."); - return false; + warn!(target:"engine", "could not get latest block."); + return (0, H256::zero()); }; +} + +pub fn report_missing_connectivity( + client: &dyn EngineClient, + full_client: &dyn BlockChainClient, + missing_validator: &Address, + signing_address: &Address, +) -> bool { + + let (block_number, block_hash) = get_block_data(client); + if block_number == 0 { + return false; + } let send_data = connectivity_tracker_hbbft_contract::functions::report_missing_connectivity::call( *missing_validator, @@ -68,4 +75,5 @@ pub fn report_missing_connectivity( } return true; -} \ No newline at end of file +} + From cda75043698b45557b278cc62f74023ec8939c75 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 13:42:11 +0100 Subject: [PATCH 051/166] early-epoch-end: report_reconnect --- .../contracts/connectivity_tracker_hbbft.rs | 32 +++++++++++++++++++ .../hbbft/hbbft_early_epoch_end_manager.rs | 22 ++++++++++--- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index e9798b27c..ca623859c 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -77,3 +77,35 @@ pub fn report_missing_connectivity( } + +pub fn report_reconnect( + client: &dyn EngineClient, + full_client: &dyn BlockChainClient, + reconnected_validator: &Address, + signing_address: &Address, +) -> bool { + + let (block_number, block_hash) = get_block_data(client); + if block_number == 0 { + return false; + } + + let send_data = connectivity_tracker_hbbft_contract::functions::report_reconnect::call( + *reconnected_validator, + block_number, + block_hash + ); + + let nonce = full_client.next_nonce(signing_address); + + let transaction = TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) + .gas(U256::from(200_000)) + .nonce(nonce); + + info!(target:"consensus", "early-epoch-end: sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", reconnected_validator); + if let Err(e) = full_client.transact_silently(transaction) { + warn!(target:"consensus", "early-epoch-end: could not report_missing_connectivity {e:?}"); + return false; + } + return true; +} \ No newline at end of file diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 8999124aa..b68b62dda 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -5,7 +5,7 @@ use types::ids::BlockId; use crate::{client::{BlockChainClient, EngineClient}, ethereum::public_key_to_address::public_key_to_address, engines::hbbft::contracts::connectivity_tracker_hbbft::report_missing_connectivity}; use std::{time::{Duration, Instant}, collections::BTreeMap}; -use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId, contracts::connectivity_tracker_hbbft::get_current_flagged_validators_from_contract}; +use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId, contracts::connectivity_tracker_hbbft::{get_current_flagged_validators_from_contract, report_reconnect}}; pub(crate) struct HbbftEarlyEpochEndManager { /// The current epoch number. @@ -156,12 +156,23 @@ impl HbbftEarlyEpochEndManager { &mut self, validator: &NodeId, full_client: &dyn BlockChainClient, + engine_client: &dyn EngineClient ) { - if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) { - self.flagged_validators.remove(index); - warn!(target: "engine", "TODO: early-epoch-end: notify about reconnected validator: {:?}", validator); + + let index = if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) { + index } else { - error!(target: "engine", " Could not find reconnected validator in flagged validators."); + error!(target: "engine", "early-epoch-end: notify_about_validator_reconnect Could not find reconnected validator in flagged validators."); + return; + }; + + if let Some(validator_address) = self.node_id_to_address.get(validator) { + if report_reconnect(engine_client, full_client, validator_address, &self.signing_address) { + self.flagged_validators.remove(index); + } + } else { + warn!("Could not find validator_address for node id in cache: {validator:?}"); + return; } } @@ -227,6 +238,7 @@ impl HbbftEarlyEpochEndManager { self.notify_about_validator_reconnect( &validator, full_client, + client ); } } From 007768272f733ff9594155faa1e58118ae46376a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 12 Dec 2023 14:20:42 +0100 Subject: [PATCH 052/166] cargo fmt --all -- --config imports_granularity=Crate --- .../contracts/connectivity_tracker_hbbft.rs | 65 +++++++------ .../src/engines/hbbft/contracts/mod.rs | 2 +- .../hbbft/hbbft_early_epoch_end_manager.rs | 93 ++++++++++--------- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 2 +- 4 files changed, 89 insertions(+), 73 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index ca623859c..16715b35d 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -1,11 +1,17 @@ -use ethereum_types::{Address, U256, H256}; -use std::str::FromStr; use client::EngineClient; +use ethereum_types::{Address, H256, U256}; +use std::str::FromStr; use types::ids::BlockId; -use crate::{engines::hbbft::utils::bound_contract::{CallError, BoundContract}, client::{traits::TransactionRequest, BlockChainClient}}; +use crate::{ + client::{traits::TransactionRequest, BlockChainClient}, + engines::hbbft::utils::bound_contract::{BoundContract, CallError}, +}; -use_contract!(connectivity_tracker_hbbft_contract, "res/contracts//hbbft_connectivity_tracker.json"); +use_contract!( + connectivity_tracker_hbbft_contract, + "res/contracts//hbbft_connectivity_tracker.json" +); lazy_static! { static ref CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS: Address = @@ -18,18 +24,22 @@ macro_rules! call_const_connectivity_tracker_hbbft { }; } - pub fn get_current_flagged_validators_from_contract( client: &dyn EngineClient, block_id: BlockId, ) -> Result, CallError> { - let c = BoundContract::bind(client, block_id, *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS); - return Ok(call_const_connectivity_tracker_hbbft!(c, get_flagged_validators)?); + let c = BoundContract::bind( + client, + block_id, + *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, + ); + return Ok(call_const_connectivity_tracker_hbbft!( + c, + get_flagged_validators + )?); } - fn get_block_data(client: &dyn EngineClient) -> (u64, H256) { - if let Some(block_number) = client.block_number(BlockId::Latest) { if let Some(header) = client.block_header(BlockId::Number(block_number)) { let hash = header.hash(); @@ -49,24 +59,25 @@ pub fn report_missing_connectivity( full_client: &dyn BlockChainClient, missing_validator: &Address, signing_address: &Address, -) -> bool { - +) -> bool { let (block_number, block_hash) = get_block_data(client); if block_number == 0 { return false; } - let send_data = connectivity_tracker_hbbft_contract::functions::report_missing_connectivity::call( - *missing_validator, - block_number, - block_hash - ); + let send_data = + connectivity_tracker_hbbft_contract::functions::report_missing_connectivity::call( + *missing_validator, + block_number, + block_hash, + ); let nonce = full_client.next_nonce(signing_address); - let transaction = TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) - .gas(U256::from(200_000)) - .nonce(nonce); + let transaction = + TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) + .gas(U256::from(200_000)) + .nonce(nonce); info!(target:"consensus", "sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", missing_validator); if let Err(e) = full_client.transact_silently(transaction) { @@ -74,17 +85,14 @@ pub fn report_missing_connectivity( return false; } return true; - } - pub fn report_reconnect( client: &dyn EngineClient, full_client: &dyn BlockChainClient, reconnected_validator: &Address, signing_address: &Address, -) -> bool { - +) -> bool { let (block_number, block_hash) = get_block_data(client); if block_number == 0 { return false; @@ -93,14 +101,15 @@ pub fn report_reconnect( let send_data = connectivity_tracker_hbbft_contract::functions::report_reconnect::call( *reconnected_validator, block_number, - block_hash + block_hash, ); let nonce = full_client.next_nonce(signing_address); - let transaction = TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) - .gas(U256::from(200_000)) - .nonce(nonce); + let transaction = + TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) + .gas(U256::from(200_000)) + .nonce(nonce); info!(target:"consensus", "early-epoch-end: sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", reconnected_validator); if let Err(e) = full_client.transact_silently(transaction) { @@ -108,4 +117,4 @@ pub fn report_reconnect( return false; } return true; -} \ No newline at end of file +} diff --git a/crates/ethcore/src/engines/hbbft/contracts/mod.rs b/crates/ethcore/src/engines/hbbft/contracts/mod.rs index 07f652a0b..95253501f 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/mod.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/mod.rs @@ -1,6 +1,6 @@ +pub mod connectivity_tracker_hbbft; pub mod keygen_history; pub mod permission; pub mod random_hbbft; pub mod staking; pub mod validator_set; -pub mod connectivity_tracker_hbbft; diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index b68b62dda..f35a28fea 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -2,10 +2,23 @@ use ethereum_types::Address; use stats::PrometheusMetrics; use types::ids::BlockId; -use crate::{client::{BlockChainClient, EngineClient}, ethereum::public_key_to_address::public_key_to_address, engines::hbbft::contracts::connectivity_tracker_hbbft::report_missing_connectivity}; -use std::{time::{Duration, Instant}, collections::BTreeMap}; - -use super::{hbbft_message_memorium::HbbftMessageMemorium, NodeId, contracts::connectivity_tracker_hbbft::{get_current_flagged_validators_from_contract, report_reconnect}}; +use crate::{ + client::{BlockChainClient, EngineClient}, + engines::hbbft::contracts::connectivity_tracker_hbbft::report_missing_connectivity, + ethereum::public_key_to_address::public_key_to_address, +}; +use std::{ + collections::BTreeMap, + time::{Duration, Instant}, +}; + +use super::{ + contracts::connectivity_tracker_hbbft::{ + get_current_flagged_validators_from_contract, report_reconnect, + }, + hbbft_message_memorium::HbbftMessageMemorium, + NodeId, +}; pub(crate) struct HbbftEarlyEpochEndManager { /// The current epoch number. @@ -26,13 +39,11 @@ pub(crate) struct HbbftEarlyEpochEndManager { /// only grow up to 7 elements for a usual set of 25 nodes. flagged_validators: Vec, - node_id_to_address: BTreeMap, - address_to_node_id: BTreeMap, - signing_address: Address + signing_address: Address, } impl HbbftEarlyEpochEndManager { @@ -49,7 +60,6 @@ impl HbbftEarlyEpochEndManager { validator_set: Vec, signing_address: &Address, ) -> Option { - if client.is_syncing() { // if we are syncing, we do not need to create an early epoch end manager yet. // if we are syncing as a validator, and it is really this epoch, @@ -62,13 +72,12 @@ impl HbbftEarlyEpochEndManager { return None; } - let mut node_id_to_address: BTreeMap = BTreeMap::new(); + let mut node_id_to_address: BTreeMap = BTreeMap::new(); let mut address_to_node_id: BTreeMap = BTreeMap::new(); let mut validators: Vec = Vec::new(); for validator in validator_set.iter() { - let address = public_key_to_address(&validator.0); node_id_to_address.insert(validator.clone(), address); address_to_node_id.insert(address, validator.clone()); @@ -78,7 +87,7 @@ impl HbbftEarlyEpochEndManager { } validators.push(validator.clone()); - }; + } // figure out if we have to retrieve the data from the smart contracts. // if the epoch start did just happen, @@ -91,7 +100,11 @@ impl HbbftEarlyEpochEndManager { start_block: epoch_start_block, allowed_devp2p_warmup_time, validators: validators, - flagged_validators: Self::get_current_flagged_validators_from_contracts(engine_client, BlockId::Latest, &address_to_node_id), + flagged_validators: Self::get_current_flagged_validators_from_contracts( + engine_client, + BlockId::Latest, + &address_to_node_id, + ), node_id_to_address, address_to_node_id, signing_address: signing_address.clone(), @@ -106,16 +119,16 @@ impl HbbftEarlyEpochEndManager { fn get_current_flagged_validators_from_contracts( client: &dyn EngineClient, block_id: BlockId, - address_to_node_id: &BTreeMap + address_to_node_id: &BTreeMap, ) -> Vec { // todo: call smart contract. match get_current_flagged_validators_from_contract(client, block_id) { Ok(v) => { - let mut result : Vec = Vec::new(); + let mut result: Vec = Vec::new(); for a in v.iter() { - if let Some(node_id) = address_to_node_id.get(a) { + if let Some(node_id) = address_to_node_id.get(a) { result.push(node_id.clone()); } else { error!(target: "engine","early-epoch-end: could not find validator in address cache: {a:?}"); @@ -124,42 +137,43 @@ impl HbbftEarlyEpochEndManager { return result; // address_to_node_id.get(key) - }, + } Err(e) => { error!(target: "engine","early-epoch-end: could not get_current_flagged_validators_from_contracts {e:?}" ); Vec::new() - }, + } } - - } fn notify_about_missing_validator( &mut self, validator: &NodeId, client: &dyn EngineClient, - full_client: &dyn BlockChainClient) - { - + full_client: &dyn BlockChainClient, + ) { if let Some(validator_address) = self.node_id_to_address.get(validator) { - if report_missing_connectivity(client, full_client, validator_address, &self.signing_address) { + if report_missing_connectivity( + client, + full_client, + validator_address, + &self.signing_address, + ) { self.flagged_validators.push(validator.clone()); } } else { warn!("Could not find validator_address for node id in cache: {validator:?}"); return; } - } fn notify_about_validator_reconnect( &mut self, validator: &NodeId, full_client: &dyn BlockChainClient, - engine_client: &dyn EngineClient + engine_client: &dyn EngineClient, ) { - - let index = if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) { + let index = if let Some(index) = self.flagged_validators.iter().position(|x| x == validator) + { index } else { error!(target: "engine", "early-epoch-end: notify_about_validator_reconnect Could not find reconnected validator in flagged validators."); @@ -167,7 +181,12 @@ impl HbbftEarlyEpochEndManager { }; if let Some(validator_address) = self.node_id_to_address.get(validator) { - if report_reconnect(engine_client, full_client, validator_address, &self.signing_address) { + if report_reconnect( + engine_client, + full_client, + validator_address, + &self.signing_address, + ) { self.flagged_validators.remove(index); } } else { @@ -224,22 +243,14 @@ impl HbbftEarlyEpochEndManager { // we do not have to send notification, if we already did so. if !self.flagged_validators.contains(validator) { // this function will also add the validator to the list of flagged validators. - self.notify_about_missing_validator( - &validator, - client, - full_client - ); + self.notify_about_missing_validator(&validator, client, full_client); } } else { // this validator is OK. // maybe it was flagged and we need to unflag it ? if self.flagged_validators.contains(validator) { - self.notify_about_validator_reconnect( - &validator, - full_client, - client - ); + self.notify_about_validator_reconnect(&validator, full_client, client); } } } else { @@ -247,11 +258,7 @@ impl HbbftEarlyEpochEndManager { // we do not have any history for this node. if !self.flagged_validators.contains(validator) { // this function will also add the validator to the list of flagged validators. - self.notify_about_missing_validator( - &validator, - client, - full_client - ); + self.notify_about_missing_validator(&validator, client, full_client); } } // todo: if the systems switched from block based measurement to time based measurement. diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 90798ea37..bbf04151c 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1015,7 +1015,7 @@ impl HoneyBadgerBFT { // here is a possible performance improvement: // this won't change during the lifetime of the application ?! return Ok(()); - } + } }; let engine_client = client_arc.deref(); From c245354d9ae8fedf344d36ad69016804a5287d7f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 13 Dec 2023 13:51:21 +0100 Subject: [PATCH 053/166] panic hook now reports to diamond-node --- crates/util/panic-hook/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/util/panic-hook/src/lib.rs b/crates/util/panic-hook/src/lib.rs index f30f9ac99..ca23bb0f4 100644 --- a/crates/util/panic-hook/src/lib.rs +++ b/crates/util/panic-hook/src/lib.rs @@ -51,7 +51,7 @@ where static ABOUT_PANIC: &str = " This is a bug. Please report it at: - https://github.com/openethereum/openethereum/issues/new + https://github.com/dmdcoin/diamond-node/issues/new "; fn gen_panic_msg(info: &PanicInfo) -> String { From bfe58d06e744230b185cacaf0943500cbea276d7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 00:27:01 +0100 Subject: [PATCH 054/166] fixed bug with accessing the connectivity tracker --- .../src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index 16715b35d..3e15bc0dc 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -15,7 +15,7 @@ use_contract!( lazy_static! { static ref CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS: Address = - Address::from_str("0x1200000000000000000000000000000000000001").unwrap(); + Address::from_str("1200000000000000000000000000000000000001").unwrap(); } macro_rules! call_const_connectivity_tracker_hbbft { From eab3156e8cefa0933c0c5ef08e0317c1501c2806 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 00:28:50 +0100 Subject: [PATCH 055/166] streamlined logging in connectivity_tracker_hbbft to early-epoch-end --- .../engines/hbbft/contracts/connectivity_tracker_hbbft.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index 3e15bc0dc..d549ed667 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -45,11 +45,11 @@ fn get_block_data(client: &dyn EngineClient) -> (u64, H256) { let hash = header.hash(); return (block_number, hash); } else { - warn!(target:"engine", "could not get block number for block: {block_number}"); + warn!(target:"engine", "early-epoch-end: could not get block number for block: {block_number}"); return (0, H256::zero()); } } else { - warn!(target:"engine", "could not get latest block."); + warn!(target:"engine", "early-epoch-end: could not get latest block."); return (0, H256::zero()); }; } @@ -79,9 +79,9 @@ pub fn report_missing_connectivity( .gas(U256::from(200_000)) .nonce(nonce); - info!(target:"consensus", "sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", missing_validator); + info!(target:"engine", "early-epoch-end: sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", missing_validator); if let Err(e) = full_client.transact_silently(transaction) { - warn!(target:"consensus", "could not report_missing_connectivity {e:?}"); + warn!(target:"engine", "early-epoch-end: could not report_missing_connectivity {e:?}"); return false; } return true; From 62b191c73205996145ce53a9026371e72c99bcd8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 00:30:19 +0100 Subject: [PATCH 056/166] reduced default log levels for hbbft testnetworks. --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index d5c456aa3..685faf374 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -241,7 +241,7 @@ fn to_toml( let mut misc = Map::new(); misc.insert( "logging".into(), - Value::String("txqueue=trace,consensus=trace,engine=trace".into()), + Value::String("txqueue=info,consensus=debug,engine=trace".into()), ); misc.insert("log_file".into(), Value::String("parity.log".into())); From c92e98caa28b6096beb0faf04839b650f25094d0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 10:56:51 +0100 Subject: [PATCH 057/166] default logging to diamond-node.log instead of parity.log --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 685faf374..aa6cd242a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -243,7 +243,7 @@ fn to_toml( "logging".into(), Value::String("txqueue=info,consensus=debug,engine=trace".into()), ); - misc.insert("log_file".into(), Value::String("parity.log".into())); + misc.insert("log_file".into(), Value::String("diamond-node.log".into())); // metrics.insert(""); From 4d058477afcd185ac21dd121e0ad4e3bc2092656 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 11:01:29 +0100 Subject: [PATCH 058/166] improved logging --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index bbf04151c..01cfe3555 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -943,6 +943,8 @@ impl HoneyBadgerBFT { // todo: acquire allowed devp2p warmup time from contracts ?! let allowed_devp2p_warmup_time = Duration::from_secs(120); + debug!(target: "engine", "early-epoch-end: handle_early_epoch_end."); + let hbbft_state = if let Some(s) = self.hbbft_state.try_read_for(Duration::from_millis(300)) { s @@ -999,7 +1001,7 @@ impl HoneyBadgerBFT { fn do_validator_engine_actions(&self) -> Result<(), String> { // here we need to differentiate the different engine functions, // that requre different levels of access to the client. - + debug!(target: "engine", "do_validator_engine_actions."); match self.client_arc() { Some(client_arc) => { if self.is_syncing(&client_arc) { @@ -1314,8 +1316,7 @@ impl HoneyBadgerBFT { return Ok(stake_amount.ge(&min_stake)); } Err(err) => { - warn!(target: "consensus", "Error get candidate_min_stake: ! {:?}", err); - warn!(target: "consensus", "stake amount: {}", stake_amount); + error!(target: "consensus", "Error get candidate_min_stake: ! {:?}", err); } } } From 2e33f333c53e1131bf2f2e6a8a42f959f714a162 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 11:03:17 +0100 Subject: [PATCH 059/166] reduced logging levels in hbbft_peers_management --- crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index 42e0b3042..27c7ff684 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -369,7 +369,7 @@ impl HbbftPeersManagement { // we do not need to do a special handling for 0.0.0.0, because // our IP is always different to that. - warn!(target: "engine", "checking if internet address needs to be updated."); + trace!(target: "engine", "checking if internet address needs to be updated."); let current_endpoint = if let Some(peers_management) = block_chain_client .reserved_peers_management() @@ -388,14 +388,14 @@ impl HbbftPeersManagement { }; //let peers_management = - warn!(target: "engine", "current Endpoint: {:?}", current_endpoint); + trace!(target: "engine", "current Endpoint: {:?}", current_endpoint); // todo: we can improve performance, // by assuming that we are the only one who writes the internet address. // so we have to query this data only once, and then we can cache it. match get_validator_internet_address(engine_client, &staking_address) { Ok(validator_internet_address) => { - warn!(target: "engine", "stored validator address{:?}", validator_internet_address); + trace!(target: "engine", "stored validator address{:?}", validator_internet_address); if validator_internet_address.eq(¤t_endpoint) { // if the current stored endpoint is the same as the current endpoint, // we don't need to do anything. From dda50e1f77e70be1e5ac15a14b8994955385623e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 14:25:03 +0100 Subject: [PATCH 060/166] improved logging for hbbft_peers_management for identifying the problem with could not add pending validator to reserved peers: --- crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index 27c7ff684..c42bfa0cd 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -534,6 +534,7 @@ fn connect_to_validator_core( }; if socket_addr.port() == 0 { + error!(target: "engine", "connect_to_validator_core: no port specified for Node ( Public (NodeId): {:?} , staking address: {}, socket_addr: {:?}", node_id, staking_address, socket_addr); // we interprate port 0 as NULL. return None; } From ecfe2efb7e1e8e066fd59149084f02ad06e2014b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 14:25:39 +0100 Subject: [PATCH 061/166] improved logging about own_tx cancelled transactions. --- crates/concensus/miner/src/pool/local_transactions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/concensus/miner/src/pool/local_transactions.rs b/crates/concensus/miner/src/pool/local_transactions.rs index bb86f76f9..c9309a9bb 100644 --- a/crates/concensus/miner/src/pool/local_transactions.rs +++ b/crates/concensus/miner/src/pool/local_transactions.rs @@ -225,7 +225,7 @@ impl txpool::Listener for LocalTransactionsList { return; } - warn!(target: "own_tx", "Transaction canceled (hash {:?})", tx.hash()); + warn!(target: "own_tx", "Transaction canceled (hash {:?}), zero gas price: {}, nonce: {} data: {} ", tx.hash(), tx.has_zero_gas_price(), tx.nonce(), rustc_hex::ToHex::to_hex(tx.transaction.tx().data.as_slice())); self.insert(*tx.hash(), Status::Canceled(tx.clone())); self.clear_old(); } From b8c658469fa6be100b687fa38934ca166eb6b1e9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 14:27:07 +0100 Subject: [PATCH 062/166] improved logging about own_tx cancelled transactions. --- crates/concensus/miner/Cargo.toml | 1 + crates/concensus/miner/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/concensus/miner/Cargo.toml b/crates/concensus/miner/Cargo.toml index 10f0de5a1..309aa1663 100644 --- a/crates/concensus/miner/Cargo.toml +++ b/crates/concensus/miner/Cargo.toml @@ -37,6 +37,7 @@ serde_derive = "1.0" serde_json = "1.0" trace-time = "0.1" txpool = { path = "../../transaction-pool" } +rustc-hex = "1.0" [dev-dependencies] env_logger = "0.5" diff --git a/crates/concensus/miner/src/lib.rs b/crates/concensus/miner/src/lib.rs index bdd0ad67e..5aa617dfe 100644 --- a/crates/concensus/miner/src/lib.rs +++ b/crates/concensus/miner/src/lib.rs @@ -35,6 +35,7 @@ extern crate parking_lot; #[cfg(feature = "price-info")] extern crate price_info; extern crate rlp; +extern crate rustc_hex; extern crate txpool; #[macro_use] @@ -52,8 +53,7 @@ extern crate trace_time; extern crate env_logger; #[cfg(test)] extern crate ethkey; -#[cfg(test)] -extern crate rustc_hex; + pub mod external; #[cfg(feature = "price-info")] From 5699d5a8bb0274e501c946fad9bf3d531b111994 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 15:09:28 +0100 Subject: [PATCH 063/166] reduced logging for HBBFT block creation transactions. --- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 9138a7bc3..05f0df11d 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -445,13 +445,13 @@ impl HbbftState { if tx.nonce() >= min_nonce { transactions_subset.push(tx); } else { - info!(target: "consensus", "Block creation: Pending transaction with nonce too low, got {}, expected at least {}", tx.nonce(), min_nonce); + debug!(target: "consensus", "Block creation: Pending transaction with nonce too low, got {}, expected at least {}", tx.nonce(), min_nonce); } } } } - info!(target: "consensus", "Block creation: Honeybadger epoch {}, Transactions subset target size: {}, actual size: {}, from available {}.", honey_badger.epoch(), transactions_subset_size, transactions_subset.len(), max_transactions_for_block.len()); + trace!(target: "consensus", "Block creation: Honeybadger epoch {}, Transactions subset target size: {}, actual size: {}, from available {}.", honey_badger.epoch(), transactions_subset_size, transactions_subset.len(), max_transactions_for_block.len()); let signed_transactions = transactions_subset .iter() From dd1f837e59c587741476a8d7d55d065adb1dee03 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Dec 2023 15:09:51 +0100 Subject: [PATCH 064/166] cargo fmt --all -- --config imports_granularity=Crate --- crates/concensus/miner/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/concensus/miner/src/lib.rs b/crates/concensus/miner/src/lib.rs index 5aa617dfe..062da7f37 100644 --- a/crates/concensus/miner/src/lib.rs +++ b/crates/concensus/miner/src/lib.rs @@ -54,7 +54,6 @@ extern crate env_logger; #[cfg(test)] extern crate ethkey; - pub mod external; #[cfg(feature = "price-info")] pub mod gas_price_calibrator; From 7b3e4e372439c57ed5ded0a15203340b9b72e9aa Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 15 Dec 2023 00:58:47 +0100 Subject: [PATCH 065/166] early-epoich-end improved logging --- .../ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index f35a28fea..a6524f4d8 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -231,6 +231,8 @@ impl HbbftEarlyEpochEndManager { return; } + trace!(target: "engine", "checking epoch history for {} validators", &self.validators.len()); + //full_client.best_block_header() // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { From 246bf272d4d6e2405b95bb7ecc67742f31ce2350 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 16 Dec 2023 23:51:42 +0100 Subject: [PATCH 066/166] gas_price for connectivity tracker --- .../src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index d549ed667..b4513b7f5 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -77,6 +77,7 @@ pub fn report_missing_connectivity( let transaction = TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) .gas(U256::from(200_000)) + .gas_price(U256::from(10000000000u64)) .nonce(nonce); info!(target:"engine", "early-epoch-end: sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", missing_validator); From 6d8360a0fe0af27612f1fe5e087b6384219f91e5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 18 Dec 2023 21:44:46 +0100 Subject: [PATCH 067/166] possible solution:: detected attempt to break because of is_major_syncing() instead of is_synincg()no decision: syncing --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index a6524f4d8..12e6bf010 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -209,12 +209,18 @@ impl HbbftEarlyEpochEndManager { return; } - if full_client.is_syncing() { + if full_client.is_major_syncing() { // if we are syncing, we wont do any blaming. debug!(target: "engine", "early-epoch-end: no decision: syncing"); return; } + + if full_client.is_syncing() { + // if we are syncing, we wont do any blaming. + debug!(target: "engine", "early-epoch-end: detected attempt to break because of is_major_syncing() instead of is_synincg()no decision: syncing"); + } + let block_num = if let Some(block) = full_client.block(BlockId::Latest) { block.number() } else { From 2b62c2c826b3b8ef3aa7ef1476ca7e51eb63aaea Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 18 Dec 2023 23:02:10 +0100 Subject: [PATCH 068/166] don't cache flagged validators --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 12e6bf010..040b3bf4e 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -263,8 +263,11 @@ impl HbbftEarlyEpochEndManager { } } else { debug!(target: "engine", "early-epoch-end: no history info for validator {validator}"); + + let current_flagged = Self::get_current_flagged_validators_from_contracts(client, BlockId::Latest, &self.address_to_node_id); + // we do not have any history for this node. - if !self.flagged_validators.contains(validator) { + if !current_flagged.contains(validator) { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator(&validator, client, full_client); } From b6cfbac3a7bbb8ee817456b699d2bdb43f99789c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 18 Dec 2023 23:02:39 +0100 Subject: [PATCH 069/166] added more gas for testing --- .../src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index b4513b7f5..b379caf30 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -76,7 +76,7 @@ pub fn report_missing_connectivity( let transaction = TransactionRequest::call(*CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, send_data.0) - .gas(U256::from(200_000)) + .gas(U256::from(500_000)) .gas_price(U256::from(10000000000u64)) .nonce(nonce); From cf7b1033d37c5bdc50ec77d26e40b301602a3592 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 28 Dec 2023 20:12:41 +0100 Subject: [PATCH 070/166] config generator: show trace information for own transactions --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index aa6cd242a..5c1895b52 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -241,7 +241,7 @@ fn to_toml( let mut misc = Map::new(); misc.insert( "logging".into(), - Value::String("txqueue=info,consensus=debug,engine=trace".into()), + Value::String("txqueue=info,consensus=debug,engine=trace,tx_own=trace".into()), ); misc.insert("log_file".into(), Value::String("diamond-node.log".into())); From be99f6ff0906304109b6c4bbab91e55b47727be8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 12 Jan 2024 13:13:09 +0100 Subject: [PATCH 071/166] using "is_connectivity_loss_reported", instead of watching "flagged validators" --- .../contracts/connectivity_tracker_hbbft.rs | 22 ++++ .../hbbft/hbbft_early_epoch_end_manager.rs | 117 +++++++++++++----- 2 files changed, 108 insertions(+), 31 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index b379caf30..c7123dc21 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -24,6 +24,28 @@ macro_rules! call_const_connectivity_tracker_hbbft { }; } +pub fn is_connectivity_loss_reported( + client: &dyn EngineClient, + block_id: BlockId, + reporter: &Address, + epoch: u64, + validator: &Address, +) -> Result { + let c = BoundContract::bind( + client, + block_id, + *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, + ); + return Ok(call_const_connectivity_tracker_hbbft!( + c, + is_reported, + epoch, + *validator, + *reporter + )?); +} + + pub fn get_current_flagged_validators_from_contract( client: &dyn EngineClient, block_id: BlockId, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 040b3bf4e..70b29f6c9 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -14,7 +14,7 @@ use std::{ use super::{ contracts::connectivity_tracker_hbbft::{ - get_current_flagged_validators_from_contract, report_reconnect, + report_reconnect, is_connectivity_loss_reported, }, hbbft_message_memorium::HbbftMessageMemorium, NodeId, @@ -94,17 +94,22 @@ impl HbbftEarlyEpochEndManager { // we do not have to retrieve the data from the smart contracts. let now = Instant::now(); + let flagged_validators = Self::get_current_reported_validators_from_contracts( + engine_client, + BlockId::Latest, + &node_id_to_address, + &validators, + signing_address, + epoch_number, + ); + let result = Self { current_tracked_epoch_number: epoch_number, start_time: now, start_block: epoch_start_block, allowed_devp2p_warmup_time, validators: validators, - flagged_validators: Self::get_current_flagged_validators_from_contracts( - engine_client, - BlockId::Latest, - &address_to_node_id, - ), + flagged_validators: flagged_validators, node_id_to_address, address_to_node_id, signing_address: signing_address.clone(), @@ -116,33 +121,60 @@ impl HbbftEarlyEpochEndManager { } /// retrieves the information from smart contracts which validators are currently flagged. - fn get_current_flagged_validators_from_contracts( + fn get_current_reported_validators_from_contracts( client: &dyn EngineClient, block_id: BlockId, - address_to_node_id: &BTreeMap, + node_id_to_address: &BTreeMap, + validators: &Vec, + signing_address: &Address, + epoch: u64, ) -> Vec { - // todo: call smart contract. - match get_current_flagged_validators_from_contract(client, block_id) { - Ok(v) => { - let mut result: Vec = Vec::new(); + let mut result = Vec::::new(); - for a in v.iter() { - if let Some(node_id) = address_to_node_id.get(a) { - result.push(node_id.clone()); - } else { - error!(target: "engine","early-epoch-end: could not find validator in address cache: {a:?}"); - } - } + for validator in validators.iter() { - return result; - // address_to_node_id.get(key) - } - Err(e) => { - error!(target: "engine","early-epoch-end: could not get_current_flagged_validators_from_contracts {e:?}" ); - Vec::new() + let validator_address = if let Some(a) = node_id_to_address.get(validator) { + a + } else { + error!(target: "engine", "early-epoch-end: could not find address for validator in node_id_to_address cache."); + continue; + }; + + if let Ok(reported) = is_connectivity_loss_reported(client, block_id, signing_address, epoch, validator_address) { + if reported { + result.push(validator.clone()); + } + } else { + error!(target: "engine", "early-epoch-end: could not get reported status for validator {validator:?}"); } } + + return result; + // match is_connectivity_loss_reported(client, block_id, signing_address, ) { + + // } + + // match get_current_flagged_validators_from_contract(client, block_id) { + // Ok(v) => { + // let mut result: Vec = Vec::new(); + + // for a in v.iter() { + // if let Some(node_id) = address_to_node_id.get(a) { + // result.push(node_id.clone()); + // } else { + // error!(target: "engine","early-epoch-end: could not find validator in address cache: {a:?}"); + // } + // } + + // return result; + // // address_to_node_id.get(key) + // } + // Err(e) => { + // error!(target: "engine","early-epoch-end: could not get_current_flagged_validators_from_contracts {e:?}" ); + // Vec::new() + // } + // } } fn notify_about_missing_validator( @@ -195,6 +227,18 @@ impl HbbftEarlyEpochEndManager { } } + pub fn is_reported(&self, client: &dyn EngineClient, other_validator_address: &Address) -> bool { + + let result = is_connectivity_loss_reported(client, BlockId::Latest, &self.signing_address, self.current_tracked_epoch_number, other_validator_address); + + if let Ok(r) = result { + return r; + } else { + error!(target: "engine", "early-epoch-end: could not get reported status for validator {other_validator_address:?}"); + return false; + } + } + /// decides on the memorium data if we should update to contract data. /// end executes them. pub fn decide( @@ -243,31 +287,42 @@ impl HbbftEarlyEpochEndManager { // get current state of missing validators from hbbftMemorium. if let Some(epoch_history) = memorium.get_staking_epoch_history(block_num) { for validator in &self.validators.clone() { - // we need to exclude ourself. + let validator_address = match self.node_id_to_address.get(validator) { + Some(a) => a, + None => { + error!(target: "engine", "early-epoch-end: could not find validator_address for node id in cache: {validator:?}"); + continue; + } + }; + if let Some(node_history) = epoch_history.get_history_for_node(validator) { let last_sealing_message = node_history.get_sealing_message(); if last_sealing_message < block_num - treshold { // we do not have to send notification, if we already did so. - if !self.flagged_validators.contains(validator) { + + if !self.is_reported(client, validator_address) { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator(&validator, client, full_client); } + } else { // this validator is OK. // maybe it was flagged and we need to unflag it ? - if self.flagged_validators.contains(validator) { + + + if self.is_reported(client, validator_address) { self.notify_about_validator_reconnect(&validator, full_client, client); } } } else { + debug!(target: "engine", "early-epoch-end: no history info for validator {validator}"); - let current_flagged = Self::get_current_flagged_validators_from_contracts(client, BlockId::Latest, &self.address_to_node_id); // we do not have any history for this node. - if !current_flagged.contains(validator) { + if !self.is_reported(client, validator_address) { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator(&validator, client, full_client); } @@ -275,7 +330,7 @@ impl HbbftEarlyEpochEndManager { // todo: if the systems switched from block based measurement to time based measurement. } } - // nothing to do: no history yet. + // else: nothing to do: no history yet. // note: We do not take care if hbbft message memorium might not have processed some of the messages yet, // since it is not important to do the decision based on the latest data, since the decide method will be called From c07ead77c9eadc2f102f2030fcb17164ea39ebf1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 12 Jan 2024 23:22:48 +0100 Subject: [PATCH 072/166] contract abi change: hbbft_connectivity_tracker: isReported --- .../contracts/hbbft_connectivity_tracker.json | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json b/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json index 65e1dbbf3..c67daf202 100644 --- a/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json +++ b/crates/ethcore/res/contracts/hbbft_connectivity_tracker.json @@ -180,5 +180,34 @@ ], "stateMutability": "view", "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "internalType": "address", + "name": "reporter", + "type": "address" + } + ], + "name": "isReported", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" } ] \ No newline at end of file From a3eca051db5cc20f34f28d51ff7227b04a5a0196 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 12 Jan 2024 23:24:01 +0100 Subject: [PATCH 073/166] connectivity tracker: get_block_data() now retrieves the previous block number and hash to avoid timing issues with txPermission contract validations on import own_tx into the transaction queue --- .../engines/hbbft/contracts/connectivity_tracker_hbbft.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index c7123dc21..8b3e7e5ba 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -63,9 +63,8 @@ pub fn get_current_flagged_validators_from_contract( fn get_block_data(client: &dyn EngineClient) -> (u64, H256) { if let Some(block_number) = client.block_number(BlockId::Latest) { - if let Some(header) = client.block_header(BlockId::Number(block_number)) { - let hash = header.hash(); - return (block_number, hash); + if let Some(header) = client.block_header(BlockId::Number(block_number - 1)) { + return (header.number(), header.hash()); } else { warn!(target:"engine", "early-epoch-end: could not get block number for block: {block_number}"); return (0, H256::zero()); From 95ed607f4ae65e18763b6e34805289590a2301b5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 13 Jan 2024 10:32:33 +0100 Subject: [PATCH 074/166] hbbft config generator: hints for more detailed logs --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 5c1895b52..305c20897 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -239,6 +239,9 @@ fn to_toml( } let mut misc = Map::new(); + + // example for a more verbose logging. + // Value::String("txqueue=trace,consensus=debug,engine=trace,own_tx=trace,miner=trace,tx_filter=trace".into()) misc.insert( "logging".into(), Value::String("txqueue=info,consensus=debug,engine=trace,tx_own=trace".into()), From b3d21363cc111b9950bde11acf59e2b8894dade8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 2 Feb 2024 19:23:49 +0100 Subject: [PATCH 075/166] fork manager: further drafts for creating the fork. --- .../hbbft/hbbft_network_fork_manager.rs | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs new file mode 100644 index 000000000..1ec795af4 --- /dev/null +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -0,0 +1,48 @@ +use std::collections::VecDeque; + +use ethereum_types::Address; + + +struct HbbftFork { + start_timestamp: u64, + start_block: u64, + is_finished: bool, + end_timestamp: u64, + end_block: u64, + validator_set: Vec
, +} + + +/// Hbbft network fork manager. +/// This manager is responsible for managing the forks. +/// It allows cheap queries to see if a Fork is pending, +/// and stores information about a fork that is finished. +pub struct HbbftNetworkForkManager { + + /// If a fork is currently in progress, this is true. + is_currently_forking: bool, + + /// a ordered list with upcomming forks. + finished_forks: VecDeque, + + /// a ordered list with upcomming forks, including a fork that is in progress. + /// see @is_currently_forking for more information. + pending_forks: VecDeque, +} + + +impl HbbftNetworkForkManager { + + + + /// Returns None if not forking + /// Returns a List of Addresses that become the new validator set and + /// declares the fork as active, + pub fn should_fork(&mut self,last_block_number: u64, last_block_time_stamp: u64) -> Option> { + // fields omitted + + + None + } + +} \ No newline at end of file From afa8bae4a4f79464f4e221f500a77b1bcf42df7d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 3 Feb 2024 23:27:46 +0100 Subject: [PATCH 076/166] module hbbft fork manager --- crates/ethcore/src/engines/hbbft/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/mod.rs b/crates/ethcore/src/engines/hbbft/mod.rs index 39ddaf09d..25883f6ba 100644 --- a/crates/ethcore/src/engines/hbbft/mod.rs +++ b/crates/ethcore/src/engines/hbbft/mod.rs @@ -3,6 +3,7 @@ mod contracts; mod contribution; mod hbbft_early_epoch_end_manager; mod hbbft_engine; +mod hbbft_network_fork_manager; mod hbbft_message_memorium; mod hbbft_peers_management; mod hbbft_state; @@ -17,6 +18,7 @@ pub use self::hbbft_engine::HoneyBadgerBFT; use crypto::publickey::Public; use std::fmt; + #[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)] pub struct NodeId(pub Public); From 761ef3b3ad87142f59ef09f0690bb50720ca317c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 4 Feb 2024 23:51:41 +0100 Subject: [PATCH 077/166] fork params --- crates/ethjson/src/spec/hbbft.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 10c6a88e7..cd033917d 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -32,6 +32,21 @@ pub struct HbbftParamsSkipBlockReward { pub to_block: Option, } +#[derive(Debug, PartialEq, Deserialize)] +#[serde(deny_unknown_fields)] +#[serde(rename_all = "camelCase")] +pub struct HbbftNetworkForks { + + +} + +pub struct HbbftNetworkFork { + /// Block number at which the fork starts. + pub block_number_start: u64, + /// Validator set at the fork. + pub validator_set: Vec
, +} + /// Hbbft parameters. #[derive(Debug, PartialEq, Deserialize)] #[serde(deny_unknown_fields)] @@ -54,6 +69,12 @@ pub struct HbbftParams { /// Directory where to store the Hbbft Messages. /// Usually only the latest HBBFT messages are interesting for Debug, Analytics or Evidence. pub blocks_to_keep_directory: Option, + /// Hbbft network forks. + /// A Fork defines a new Validator Set. + /// This validator set is becomming pending so it can write it's PARTs and ACKS. + /// From beginning of the fork trigger block until the finality of the key gen transactions, + /// no block verifications are done. + pub forks: HbbftNetworkForks, } /// Hbbft engine config. From af0176f2563287706f858d53134e3221b2ab75e5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 5 Feb 2024 23:52:57 +0100 Subject: [PATCH 078/166] concept for initiating fork with multiple nodes --- .../src/engines/hbbft/hbbft_network_fork_manager.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 1ec795af4..9f12d7a6a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,7 +1,14 @@ use std::collections::VecDeque; use ethereum_types::Address; +use hbbft::sync_key_gen::Ack; +use hbbft::sync_key_gen::Part; +struct HbbftForkKeys { + validators: Vec
, + parts: Vec, + acks: Vec, +} struct HbbftFork { start_timestamp: u64, @@ -9,7 +16,7 @@ struct HbbftFork { is_finished: bool, end_timestamp: u64, end_block: u64, - validator_set: Vec
, + validator_set: HbbftForkKeys, } From 8c84383269cf6d7c586d6008f4d9dd6597a26239 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 7 Feb 2024 22:55:25 +0100 Subject: [PATCH 079/166] serde_with for upcomming PART and ACKS support in the spec.json --- Cargo.lock | 308 +++++++++++++++++++++++++++++++++----- crates/ethjson/Cargo.toml | 1 + 2 files changed, 275 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f9ef996c4..4ed683e86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,6 +194,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "beef" version = "0.5.1" @@ -343,6 +349,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + [[package]] name = "byte-slice-cast" version = "0.3.5" @@ -415,14 +427,17 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.9" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8493056968583b0193c1bb04d6f7684586f3726992d6c573261941a895dbd68" +checksum = "6127248204b9aba09a362f6c930ef6a78f2c1b2215f8a7b398c06e1083f17af0" dependencies = [ - "libc", + "js-sys", "num-integer", "num-traits 0.2.15", - "time", + "serde", + "time 0.1.45", + "wasm-bindgen", + "winapi 0.3.8", ] [[package]] @@ -711,7 +726,7 @@ checksum = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d" dependencies = [ "bstr", "csv-core", - "itoa", + "itoa 0.4.4", "ryu", "serde", ] @@ -754,6 +769,50 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "darling" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.58", + "quote 1.0.27", + "strsim 0.10.0", + "syn 2.0.16", +] + +[[package]] +name = "darling_macro" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" +dependencies = [ + "darling_core", + "quote 1.0.27", + "syn 2.0.16", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "serde", +] + [[package]] name = "derivative" version = "2.2.0" @@ -921,7 +980,7 @@ version = "0.1.0" dependencies = [ "ethabi 12.0.0", "ethereum-types 0.9.2", - "indexmap", + "indexmap 1.9.3", "itertools 0.7.11", "keccak-hash", "lazy_static", @@ -986,6 +1045,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "error-chain" version = "0.12.1" @@ -1330,7 +1395,7 @@ dependencies = [ "num_cpus", "parking_lot 0.11.1", "slab 0.4.2", - "time", + "time 0.1.45", "timer", "tokio", ] @@ -1347,7 +1412,7 @@ dependencies = [ "log", "parking_lot 0.11.1", "regex", - "time", + "time 0.1.45", ] [[package]] @@ -1571,6 +1636,7 @@ dependencies = [ "serde", "serde_derive", "serde_json", + "serde_with", ] [[package]] @@ -1630,7 +1696,7 @@ dependencies = [ "serde_json", "smallvec 0.6.14", "tempdir", - "time", + "time 0.1.45", ] [[package]] @@ -1835,9 +1901,9 @@ checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d" [[package]] name = "fnv" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fs-swap" @@ -1926,7 +1992,7 @@ checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ "cfg-if 1.0.0", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi 0.10.0+wasi-snapshot-preview1", ] [[package]] @@ -1970,7 +2036,7 @@ dependencies = [ "fnv", "futures", "http", - "indexmap", + "indexmap 1.9.3", "log", "slab 0.4.2", "string", @@ -2033,6 +2099,18 @@ dependencies = [ "autocfg 1.0.0", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "hbbft" version = "0.1.1" @@ -2184,7 +2262,7 @@ checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" dependencies = [ "bytes", "fnv", - "itoa", + "itoa 0.4.4", ] [[package]] @@ -2228,11 +2306,11 @@ dependencies = [ "http-body", "httparse", "iovec", - "itoa", + "itoa 0.4.4", "log", "net2", "rustc_version", - "time", + "time 0.1.45", "tokio", "tokio-buf", "tokio-executor", @@ -2261,6 +2339,12 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.1.5" @@ -2350,11 +2434,24 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.3.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712d7b3ea5827fcb9d4fda14bf4da5f136f0db2ae9c8f4bd4e2d1c6fde4e6db2" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "autocfg 0.1.7", + "autocfg 1.0.0", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", ] [[package]] @@ -2444,6 +2541,12 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + [[package]] name = "journaldb" version = "0.2.0" @@ -2465,6 +2568,15 @@ dependencies = [ "rlp", ] +[[package]] +name = "js-sys" +version = "0.3.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "jsonrpc-core" version = "15.0.0" @@ -3704,7 +3816,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 1.9.3", ] [[package]] @@ -4522,31 +4634,31 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.144" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.144" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2 1.0.58", "quote 1.0.27", - "syn 1.0.94", + "syn 2.0.16", ] [[package]] name = "serde_json" -version = "1.0.41" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" +checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" dependencies = [ - "itoa", + "itoa 1.0.10", "ryu", "serde", ] @@ -4562,6 +4674,35 @@ dependencies = [ "syn 1.0.94", ] +[[package]] +name = "serde_with" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b0ed1662c5a68664f45b76d18deb0e234aff37207086803165c961eb695e981" +dependencies = [ + "base64 0.21.7", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.2", + "serde", + "serde_json", + "serde_with_macros", + "time 0.3.26", +] + +[[package]] +name = "serde_with_macros" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "568577ff0ef47b879f736cd66740e022f3672788cdf002a05a4e609ea5a6fb15" +dependencies = [ + "darling", + "proc-macro2 1.0.58", + "quote 1.0.27", + "syn 2.0.16", +] + [[package]] name = "sha-1" version = "0.8.1" @@ -4719,6 +4860,12 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "032c03039aae92b350aad2e3779c352e104d919cb192ba2fabbd7b831ce4f0f6" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "subtle" version = "1.0.0" @@ -4764,6 +4911,17 @@ dependencies = [ "unicode-xid 0.2.0", ] +[[package]] +name = "syn" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +dependencies = [ + "proc-macro2 1.0.58", + "quote 1.0.27", + "unicode-ident", +] + [[package]] name = "synom" version = "0.11.3" @@ -4923,15 +5081,43 @@ dependencies = [ [[package]] name = "time" -version = "0.1.42" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", - "redox_syscall 0.1.56", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi 0.3.8", ] +[[package]] +name = "time" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a79d09ac6b08c1ab3906a2f7cc2e81a0e27c7ae89c63812df75e52bef0751e07" +dependencies = [ + "deranged", + "itoa 1.0.10", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c65469ed6b3a4809d987a41eb1dc918e9bc1d92211cbad7ae82931846f7451" +dependencies = [ + "time-core", +] + [[package]] name = "time-utils" version = "0.1.0" @@ -5466,7 +5652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3365f36c57e5df714a34be40902b27a992eeddb9996eca52d0584611cf885d" dependencies = [ "bitflags 0.7.0", - "time", + "time 0.1.45", ] [[package]] @@ -5526,9 +5712,9 @@ checksum = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm" @@ -5545,6 +5731,60 @@ dependencies = [ "wasmi", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2 1.0.58", + "quote 1.0.27", + "syn 1.0.94", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +dependencies = [ + "quote 1.0.27", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +dependencies = [ + "proc-macro2 1.0.58", + "quote 1.0.27", + "syn 1.0.94", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" + [[package]] name = "wasmi" version = "0.3.0" diff --git a/crates/ethjson/Cargo.toml b/crates/ethjson/Cargo.toml index 436bfef02..b0d321fe0 100644 --- a/crates/ethjson/Cargo.toml +++ b/crates/ethjson/Cargo.toml @@ -16,6 +16,7 @@ rustc-hex = "1.0" serde = "1.0" serde_json = "1.0" serde_derive = "1.0" +serde_with = { version = "3.6", features = [ "hex", "std", "macros" ] } [dev-dependencies] macros = { path = "../util/macros" } From 2698fb703374d8bb3e7debc70bee3b250ce5f3aa Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 7 Feb 2024 22:55:47 +0100 Subject: [PATCH 080/166] first working version with ACKS and PARTS from the spec file --- crates/ethjson/src/spec/hbbft.rs | 68 ++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index cd033917d..3c7b9babf 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -17,6 +17,7 @@ //! Hbbft parameter deserialization. use ethereum_types::Address; +use serde_with::serde_as; /// Skip block reward parameter. /// Defines one (potential open) range about skips @@ -32,21 +33,23 @@ pub struct HbbftParamsSkipBlockReward { pub to_block: Option, } +#[serde_as] #[derive(Debug, PartialEq, Deserialize)] #[serde(deny_unknown_fields)] #[serde(rename_all = "camelCase")] -pub struct HbbftNetworkForks { - - -} - pub struct HbbftNetworkFork { /// Block number at which the fork starts. pub block_number_start: u64, /// Validator set at the fork. - pub validator_set: Vec
, + + pub validators: Vec
, + #[serde_as(as = "serde_with::hex::Hex")] + pub parts: Vec, + #[serde_as(as = "serde_with::hex::Hex")] + pub acks: Vec, } + /// Hbbft parameters. #[derive(Debug, PartialEq, Deserialize)] #[serde(deny_unknown_fields)] @@ -74,7 +77,8 @@ pub struct HbbftParams { /// This validator set is becomming pending so it can write it's PARTs and ACKS. /// From beginning of the fork trigger block until the finality of the key gen transactions, /// no block verifications are done. - pub forks: HbbftNetworkForks, + #[serde(default)] + pub forks: Vec, } /// Hbbft engine config. @@ -113,6 +117,56 @@ mod tests { use ethereum_types::Address; use std::str::FromStr; + #[test] + fn hbbft_deserialization_forks() { + // let s = r#"{ + // "params": { + // "forks": { + // { + // "blockNumberStart" : 777, + // "validators": [ + // "0xfe163fc225f3863cef09f1f68ead173f30300d13" + // ], + // "parts": [ + // "0x19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9" + // ], + // "acks": [ + // "0x19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9" + // ] + // } + // } + // } + // }"#; + + let s = r#"{ + "params": { + "minimumBlockTime": 0, + "maximumBlockTime": 600, + "transactionQueueSizeTrigger": 1, + "isUnitTest": true, + "blockRewardContractAddress": "0x2000000000000000000000000000000000000002", + "forks": [ + { + "blockNumberStart" : 777, + "validators": [ + "0xfe163fc225f3863cef09f1f68ead173f30300d13" + ], + "parts": "19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9", + "acks": "19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9" + } + ] + } + }"#; + + let deserialized: Hbbft = serde_json::from_str(s).unwrap(); + assert_eq!(deserialized.params.forks.len() , 1); + assert_eq!(deserialized.params.forks.get(0).expect("").block_number_start , 777); + assert_eq!(deserialized.params.forks.get(0).expect("").parts.len() , 64); + assert_eq!(deserialized.params.forks.get(0).expect("").acks.len() , 64); + + + } + #[test] fn hbbft_deserialization() { let s = r#"{ From 1b82825bea04c78246961bd32b9e93af765f7f4f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 8 Feb 2024 10:05:51 +0100 Subject: [PATCH 081/166] spec: support for multiple parts&acks --- crates/ethjson/src/spec/hbbft.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 3c7b9babf..8d1ab76f2 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -43,10 +43,10 @@ pub struct HbbftNetworkFork { /// Validator set at the fork. pub validators: Vec
, - #[serde_as(as = "serde_with::hex::Hex")] - pub parts: Vec, - #[serde_as(as = "serde_with::hex::Hex")] - pub acks: Vec, + #[serde_as(as = "Vec")] + pub parts: Vec>, + #[serde_as(as = "Vec")] + pub acks: Vec>, } @@ -151,8 +151,8 @@ mod tests { "validators": [ "0xfe163fc225f3863cef09f1f68ead173f30300d13" ], - "parts": "19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9", - "acks": "19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9" + "parts": ["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"], + "acks": ["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"] } ] } @@ -161,8 +161,8 @@ mod tests { let deserialized: Hbbft = serde_json::from_str(s).unwrap(); assert_eq!(deserialized.params.forks.len() , 1); assert_eq!(deserialized.params.forks.get(0).expect("").block_number_start , 777); - assert_eq!(deserialized.params.forks.get(0).expect("").parts.len() , 64); - assert_eq!(deserialized.params.forks.get(0).expect("").acks.len() , 64); + assert_eq!(deserialized.params.forks.get(0).expect("").parts.len() , 1); + assert_eq!(deserialized.params.forks.get(0).expect("").acks.len() , 1); } From a7fb83ed81241ee511bc8521c2610ca5081ebf43 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 8 Feb 2024 10:22:03 +0100 Subject: [PATCH 082/166] cargo fmt --all -- --config imports_granularity=Crate --- .../contracts/connectivity_tracker_hbbft.rs | 1 - .../hbbft/hbbft_config_generator/src/main.rs | 2 +- .../hbbft/hbbft_early_epoch_end_manager.rs | 37 +++++++++++-------- .../hbbft/hbbft_network_fork_manager.rs | 21 ++++------- crates/ethcore/src/engines/hbbft/mod.rs | 3 +- crates/ethjson/src/spec/hbbft.rs | 30 ++++++++------- 6 files changed, 48 insertions(+), 46 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index 8b3e7e5ba..b99958f17 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -45,7 +45,6 @@ pub fn is_connectivity_loss_reported( )?); } - pub fn get_current_flagged_validators_from_contract( client: &dyn EngineClient, block_id: BlockId, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 305c20897..4eaf58315 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -239,7 +239,7 @@ fn to_toml( } let mut misc = Map::new(); - + // example for a more verbose logging. // Value::String("txqueue=trace,consensus=debug,engine=trace,own_tx=trace,miner=trace,tx_filter=trace".into()) misc.insert( diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 70b29f6c9..5646fa578 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -13,9 +13,7 @@ use std::{ }; use super::{ - contracts::connectivity_tracker_hbbft::{ - report_reconnect, is_connectivity_loss_reported, - }, + contracts::connectivity_tracker_hbbft::{is_connectivity_loss_reported, report_reconnect}, hbbft_message_memorium::HbbftMessageMemorium, NodeId, }; @@ -129,11 +127,9 @@ impl HbbftEarlyEpochEndManager { signing_address: &Address, epoch: u64, ) -> Vec { - let mut result = Vec::::new(); for validator in validators.iter() { - let validator_address = if let Some(a) = node_id_to_address.get(validator) { a } else { @@ -141,7 +137,13 @@ impl HbbftEarlyEpochEndManager { continue; }; - if let Ok(reported) = is_connectivity_loss_reported(client, block_id, signing_address, epoch, validator_address) { + if let Ok(reported) = is_connectivity_loss_reported( + client, + block_id, + signing_address, + epoch, + validator_address, + ) { if reported { result.push(validator.clone()); } @@ -227,9 +229,18 @@ impl HbbftEarlyEpochEndManager { } } - pub fn is_reported(&self, client: &dyn EngineClient, other_validator_address: &Address) -> bool { - - let result = is_connectivity_loss_reported(client, BlockId::Latest, &self.signing_address, self.current_tracked_epoch_number, other_validator_address); + pub fn is_reported( + &self, + client: &dyn EngineClient, + other_validator_address: &Address, + ) -> bool { + let result = is_connectivity_loss_reported( + client, + BlockId::Latest, + &self.signing_address, + self.current_tracked_epoch_number, + other_validator_address, + ); if let Ok(r) = result { return r; @@ -259,7 +270,6 @@ impl HbbftEarlyEpochEndManager { return; } - if full_client.is_syncing() { // if we are syncing, we wont do any blaming. debug!(target: "engine", "early-epoch-end: detected attempt to break because of is_major_syncing() instead of is_synincg()no decision: syncing"); @@ -294,7 +304,7 @@ impl HbbftEarlyEpochEndManager { continue; } }; - + if let Some(node_history) = epoch_history.get_history_for_node(validator) { let last_sealing_message = node_history.get_sealing_message(); @@ -305,22 +315,17 @@ impl HbbftEarlyEpochEndManager { // this function will also add the validator to the list of flagged validators. self.notify_about_missing_validator(&validator, client, full_client); } - } else { // this validator is OK. // maybe it was flagged and we need to unflag it ? - - if self.is_reported(client, validator_address) { self.notify_about_validator_reconnect(&validator, full_client, client); } } } else { - debug!(target: "engine", "early-epoch-end: no history info for validator {validator}"); - // we do not have any history for this node. if !self.is_reported(client, validator_address) { // this function will also add the validator to the list of flagged validators. diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 9f12d7a6a..d0546c9d7 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,8 +1,7 @@ use std::collections::VecDeque; use ethereum_types::Address; -use hbbft::sync_key_gen::Ack; -use hbbft::sync_key_gen::Part; +use hbbft::sync_key_gen::{Ack, Part}; struct HbbftForkKeys { validators: Vec
, @@ -19,13 +18,11 @@ struct HbbftFork { validator_set: HbbftForkKeys, } - /// Hbbft network fork manager. /// This manager is responsible for managing the forks. /// It allows cheap queries to see if a Fork is pending, /// and stores information about a fork that is finished. pub struct HbbftNetworkForkManager { - /// If a fork is currently in progress, this is true. is_currently_forking: bool, @@ -37,19 +34,17 @@ pub struct HbbftNetworkForkManager { pending_forks: VecDeque, } - impl HbbftNetworkForkManager { - - - /// Returns None if not forking /// Returns a List of Addresses that become the new validator set and - /// declares the fork as active, - pub fn should_fork(&mut self,last_block_number: u64, last_block_time_stamp: u64) -> Option> { + /// declares the fork as active, + pub fn should_fork( + &mut self, + last_block_number: u64, + last_block_time_stamp: u64, + ) -> Option> { // fields omitted - None } - -} \ No newline at end of file +} diff --git a/crates/ethcore/src/engines/hbbft/mod.rs b/crates/ethcore/src/engines/hbbft/mod.rs index 25883f6ba..c181acc02 100644 --- a/crates/ethcore/src/engines/hbbft/mod.rs +++ b/crates/ethcore/src/engines/hbbft/mod.rs @@ -3,8 +3,8 @@ mod contracts; mod contribution; mod hbbft_early_epoch_end_manager; mod hbbft_engine; -mod hbbft_network_fork_manager; mod hbbft_message_memorium; +mod hbbft_network_fork_manager; mod hbbft_peers_management; mod hbbft_state; mod keygen_transactions; @@ -18,7 +18,6 @@ pub use self::hbbft_engine::HoneyBadgerBFT; use crypto::publickey::Public; use std::fmt; - #[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, Deserialize)] pub struct NodeId(pub Public); diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 8d1ab76f2..25b01ebaa 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -41,15 +41,13 @@ pub struct HbbftNetworkFork { /// Block number at which the fork starts. pub block_number_start: u64, /// Validator set at the fork. - pub validators: Vec
, #[serde_as(as = "Vec")] pub parts: Vec>, #[serde_as(as = "Vec")] - pub acks: Vec>, + pub acks: Vec>, } - /// Hbbft parameters. #[derive(Debug, PartialEq, Deserialize)] #[serde(deny_unknown_fields)] @@ -120,8 +118,8 @@ mod tests { #[test] fn hbbft_deserialization_forks() { // let s = r#"{ - // "params": { - // "forks": { + // "params": { + // "forks": { // { // "blockNumberStart" : 777, // "validators": [ @@ -135,8 +133,8 @@ mod tests { // ] // } // } - // } - // }"#; + // } + // }"#; let s = r#"{ "params": { @@ -159,12 +157,18 @@ mod tests { }"#; let deserialized: Hbbft = serde_json::from_str(s).unwrap(); - assert_eq!(deserialized.params.forks.len() , 1); - assert_eq!(deserialized.params.forks.get(0).expect("").block_number_start , 777); - assert_eq!(deserialized.params.forks.get(0).expect("").parts.len() , 1); - assert_eq!(deserialized.params.forks.get(0).expect("").acks.len() , 1); - - + assert_eq!(deserialized.params.forks.len(), 1); + assert_eq!( + deserialized + .params + .forks + .get(0) + .expect("") + .block_number_start, + 777 + ); + assert_eq!(deserialized.params.forks.get(0).expect("").parts.len(), 1); + assert_eq!(deserialized.params.forks.get(0).expect("").acks.len(), 1); } #[test] From 4185a62e3a3f49218b8024cc2855cae1e461fa22 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 9 Feb 2024 13:15:00 +0100 Subject: [PATCH 083/166] code cleanup for fork config tests --- crates/ethjson/src/spec/hbbft.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 25b01ebaa..e0762ee77 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -117,24 +117,6 @@ mod tests { #[test] fn hbbft_deserialization_forks() { - // let s = r#"{ - // "params": { - // "forks": { - // { - // "blockNumberStart" : 777, - // "validators": [ - // "0xfe163fc225f3863cef09f1f68ead173f30300d13" - // ], - // "parts": [ - // "0x19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9" - // ], - // "acks": [ - // "0x19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9" - // ] - // } - // } - // } - // }"#; let s = r#"{ "params": { From 8edba46f64fc900bb68fc7a7893b2caf76ec6365 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 9 Feb 2024 13:56:59 +0100 Subject: [PATCH 084/166] including block number end, to define the block of the epoch change when the regular validator set took over. --- crates/ethjson/src/spec/hbbft.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index e0762ee77..19f9521bb 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -40,6 +40,11 @@ pub struct HbbftParamsSkipBlockReward { pub struct HbbftNetworkFork { /// Block number at which the fork starts. pub block_number_start: u64, + + /// Forks that became finished, require a definition when the take over of the + /// specified validators was finished. + #[serde(default)] + pub block_number_end: Option, /// Validator set at the fork. pub validators: Vec
, #[serde_as(as = "Vec")] From 6a237901c73cbfcdeb0cfe54d955c650035b77a8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 9 Feb 2024 17:52:25 +0100 Subject: [PATCH 085/166] HbbftNetworkFork: Clone --- crates/ethjson/src/spec/hbbft.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 19f9521bb..09209c03e 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -34,21 +34,24 @@ pub struct HbbftParamsSkipBlockReward { } #[serde_as] -#[derive(Debug, PartialEq, Deserialize)] +#[derive(Debug, PartialEq, Deserialize, Clone)] #[serde(deny_unknown_fields)] #[serde(rename_all = "camelCase")] pub struct HbbftNetworkFork { /// Block number at which the fork starts. pub block_number_start: u64, - /// Forks that became finished, require a definition when the take over of the + /// Forks that became finished, require a definition when the take over of the /// specified validators was finished. #[serde(default)] pub block_number_end: Option, + /// Validator set at the fork. pub validators: Vec
, + #[serde_as(as = "Vec")] pub parts: Vec>, + #[serde_as(as = "Vec")] pub acks: Vec>, } @@ -122,7 +125,6 @@ mod tests { #[test] fn hbbft_deserialization_forks() { - let s = r#"{ "params": { "minimumBlockTime": 0, From 272763aa69aee6a82da55620396295645cf7d788 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 9 Feb 2024 17:52:54 +0100 Subject: [PATCH 086/166] fork manager: initialization --- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 11 ++ .../hbbft/hbbft_network_fork_manager.rs | 117 ++++++++++++++++-- 2 files changed, 120 insertions(+), 8 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index af4d91d42..885a0a0f9 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1,6 +1,7 @@ use super::{ block_reward_hbbft::BlockRewardContract, hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, + hbbft_network_fork_manager::HbbftNetworkForkManager, }; use crate::{ client::BlockChainClient, @@ -92,6 +93,7 @@ pub struct HoneyBadgerBFT { peers_management: Mutex, current_minimum_gas_price: Mutex>, early_epoch_manager: Mutex>, + fork_manager: Mutex, } struct TransitionHandler { @@ -422,6 +424,7 @@ impl HoneyBadgerBFT { /// Creates an instance of the Honey Badger BFT Engine. pub fn new(params: HbbftParams, machine: EthereumMachine) -> Result, Error> { let is_unit_test = params.is_unit_test.unwrap_or(false); + let engine = Arc::new(HoneyBadgerBFT { transition_service: IoService::<()>::start("Hbbft")?, client: Arc::new(RwLock::new(None)), @@ -450,6 +453,7 @@ impl HoneyBadgerBFT { peers_management: Mutex::new(HbbftPeersManagement::new()), current_minimum_gas_price: Mutex::new(None), early_epoch_manager: Mutex::new(None), + fork_manager: Mutex::new(HbbftNetworkForkManager::new()), }); if !engine.params.is_unit_test.unwrap_or(false) { @@ -1419,6 +1423,13 @@ impl Engine for HoneyBadgerBFT { fn register_client(&self, client: Weak) { *self.client.write() = Some(client.clone()); if let Some(client) = self.client_arc() { + + if let Some(latest_block) = client.block_number(BlockId::Latest) { + self.fork_manager.lock().initialize(latest_block, self.params.forks.clone()); + } else { + error!(target: "engine", "hbbft-hardfork : could not initialialize hardfork manager, no latest block found."); + } + let mut state = self.hbbft_state.write(); match state.update_honeybadger( client, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index d0546c9d7..792c9aec8 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,21 +1,55 @@ use std::collections::VecDeque; use ethereum_types::Address; +use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{Ack, Part}; -struct HbbftForkKeys { +struct HbbftFork { +// start_timestamp: u64, + start_block: u64, +// end_timestamp: u64, + end_block: Option, validators: Vec
, parts: Vec, acks: Vec, } -struct HbbftFork { - start_timestamp: u64, - start_block: u64, - is_finished: bool, - end_timestamp: u64, - end_block: u64, - validator_set: HbbftForkKeys, + +impl HbbftFork { + + pub fn from_definition(fork_definiton: &HbbftNetworkFork) -> HbbftFork { + + let parts = fork_definiton.parts.iter().map(|p| { + + if let Ok(part) = bincode::deserialize( p.as_slice()) { + part + } else { + error!(target:"engine", "hbbft-hardfork: could not interprete part from spec: {:?}", p.as_slice()); + panic!("hbbft-hardfork: could not interprete part from spec: {:?}", p.as_slice()); + + } + }).collect(); + + let acks = fork_definiton.acks.iter().map(|a| { + + if let Ok(ack) = bincode::deserialize( a.as_slice()) { + ack + } else { + error!(target:"engine", "hbbft-hardfork: could not interprete part from spec: {:?}", a.as_slice()); + panic!("hbbft-hardfork: could not interprete part from spec: {:?}", a.as_slice()); + } + }).collect(); + + //bincode::deserialize(&serialized_part).unwrap(); + + HbbftFork { + start_block: fork_definiton.block_number_start, + end_block: fork_definiton.block_number_end, + validators: fork_definiton.validators.clone(), + parts, + acks + } + } } /// Hbbft network fork manager. @@ -32,6 +66,10 @@ pub struct HbbftNetworkForkManager { /// a ordered list with upcomming forks, including a fork that is in progress. /// see @is_currently_forking for more information. pending_forks: VecDeque, + + /// we cannot apply the RAI pattern because of the delayed Hbbft initialization + /// this variable tracks if the fork manager is initialized or not. + is_init: bool, } impl HbbftNetworkForkManager { @@ -47,4 +85,67 @@ impl HbbftNetworkForkManager { None } + + /// Initializes the fork Manager, + /// with the information of the current block. + /// the Fork Manager is able to determine when the next fork is pending. + /// Forks that are already known to be finished, + /// have to be declared as finished. + pub fn initialize(&mut self, startup_block_number: u64, mut fork_definition: Vec,) { + if self.is_init { + panic!("HbbftNetworkForkManager is already initialized"); + } + + fork_definition.sort_by_key(|fork| fork.block_number_start); + + // the fork definition can contain + // - forks that are already finished + // - forks that are pending + + // there is one corner case: + // we could be in a current fork, + // if there is a a fork defined, + // that started in the past, + // is ongoing, and the normal key generation did not proceed to a new block. + + // first of all, we are appending all forks that happened in the past and are considered finished. + + for fork_def in fork_definition.iter() { + if let Some(end_block) = fork_def.block_number_end { + // if the fork is known to be ended, + // and the end is after current block, + // we do not need to take care about this fork anymore. + if end_block < startup_block_number { + debug!(target: "engine", "hbbft-hardfork: ignoring already finished fork {:?}", fork_def); + continue; + } + + self.pending_forks.push_back(HbbftFork::from_definition(fork_def)); + } + } + + // self.fork_definition.iter().filter(predicate).for_each(|fork| { + // self.pending_forks.push_back(HbbftFork { + // start_timestamp: 0, + // start_block: fork.block_number_start, + // is_finished: false, + // end_timestamp: 0, + // end_block: 0, + // validator_set: HbbftForkKeys { + // validators: fork.validators.clone(), + // parts: Vec::new(), + // acks: Vec::new(), + // }, + // }); + // }); + } + + pub fn new() -> HbbftNetworkForkManager { + HbbftNetworkForkManager { + is_currently_forking: false, + finished_forks: VecDeque::new(), + pending_forks: VecDeque::new(), + is_init: false, + } + } } From 8c3ab215152255d25e3ea3642e6907a04dc45ab7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 9 Feb 2024 17:59:01 +0100 Subject: [PATCH 087/166] cargo fmt --all -- --config imports_granularity=Crate --- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 5 ++-- .../hbbft/hbbft_network_fork_manager.rs | 27 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 885a0a0f9..d94a93d93 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1423,9 +1423,10 @@ impl Engine for HoneyBadgerBFT { fn register_client(&self, client: Weak) { *self.client.write() = Some(client.clone()); if let Some(client) = self.client_arc() { - if let Some(latest_block) = client.block_number(BlockId::Latest) { - self.fork_manager.lock().initialize(latest_block, self.params.forks.clone()); + self.fork_manager + .lock() + .initialize(latest_block, self.params.forks.clone()); } else { error!(target: "engine", "hbbft-hardfork : could not initialialize hardfork manager, no latest block found."); } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 792c9aec8..756a8bda0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -5,33 +5,27 @@ use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{Ack, Part}; struct HbbftFork { -// start_timestamp: u64, + // start_timestamp: u64, start_block: u64, -// end_timestamp: u64, + // end_timestamp: u64, end_block: Option, validators: Vec
, parts: Vec, acks: Vec, } - impl HbbftFork { - pub fn from_definition(fork_definiton: &HbbftNetworkFork) -> HbbftFork { - - let parts = fork_definiton.parts.iter().map(|p| { - + let parts = fork_definiton.parts.iter().map(|p| { if let Ok(part) = bincode::deserialize( p.as_slice()) { part } else { error!(target:"engine", "hbbft-hardfork: could not interprete part from spec: {:?}", p.as_slice()); - panic!("hbbft-hardfork: could not interprete part from spec: {:?}", p.as_slice()); - + panic!("hbbft-hardfork: could not interprete part from spec: {:?}", p.as_slice()); } }).collect(); - let acks = fork_definiton.acks.iter().map(|a| { - + let acks = fork_definiton.acks.iter().map(|a| { if let Ok(ack) = bincode::deserialize( a.as_slice()) { ack } else { @@ -47,7 +41,7 @@ impl HbbftFork { end_block: fork_definiton.block_number_end, validators: fork_definiton.validators.clone(), parts, - acks + acks, } } } @@ -91,7 +85,11 @@ impl HbbftNetworkForkManager { /// the Fork Manager is able to determine when the next fork is pending. /// Forks that are already known to be finished, /// have to be declared as finished. - pub fn initialize(&mut self, startup_block_number: u64, mut fork_definition: Vec,) { + pub fn initialize( + &mut self, + startup_block_number: u64, + mut fork_definition: Vec, + ) { if self.is_init { panic!("HbbftNetworkForkManager is already initialized"); } @@ -120,7 +118,8 @@ impl HbbftNetworkForkManager { continue; } - self.pending_forks.push_back(HbbftFork::from_definition(fork_def)); + self.pending_forks + .push_back(HbbftFork::from_definition(fork_def)); } } From 922aedf0152b7bde4e8b39b2148622947752d6aa Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 10 Feb 2024 22:23:35 +0100 Subject: [PATCH 088/166] fork integraton in honeybadger comment --- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 29d107357..c0da81110 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -89,6 +89,17 @@ impl HbbftState { } } + // https://github.com/DMDcoin/diamond-node/issues/98 + // check here if we are in a fork scenario. + // in a fork scenario, the new honeybadger keys will come from the config, + // and not from the contracts. + // also the current block will trigger the epoch end, + // this will start the loop for finding a new validator set, + // probably it will fail multiple times, + // because nodes that do not apply to the fork rule will drop out. + // this might happen for a lot of key-gen rounds, until a set with responsive validators + // can be found. + if !force && self.current_posdao_epoch == target_posdao_epoch { // hbbft state is already up to date. // @todo Return proper error codes. From 27ca2ff1fff59f1619b1d36d0bbf652a86afa008 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 11 Feb 2024 23:41:53 +0100 Subject: [PATCH 089/166] moved fork manager from engine to state --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 9 +++++---- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 15 ++++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index d94a93d93..4c965b581 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1423,15 +1423,16 @@ impl Engine for HoneyBadgerBFT { fn register_client(&self, client: Weak) { *self.client.write() = Some(client.clone()); if let Some(client) = self.client_arc() { + + let mut state = self.hbbft_state.write(); + if let Some(latest_block) = client.block_number(BlockId::Latest) { - self.fork_manager - .lock() - .initialize(latest_block, self.params.forks.clone()); + state.init_fork_manager(latest_block, self.params.forks.clone()); + } else { error!(target: "engine", "hbbft-hardfork : could not initialialize hardfork manager, no latest block found."); } - let mut state = self.hbbft_state.write(); match state.update_honeybadger( client, &self.signer, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index c0da81110..de7866246 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -2,6 +2,7 @@ use client::traits::EngineClient; use engines::signer::EngineSigner; use ethcore_miner::pool::{PoolVerifiedTransaction, ScoredTransaction}; use ethereum_types::U256; +use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::{ crypto::{PublicKey, Signature}, honey_badger::{self, HoneyBadgerBuilder}, @@ -23,11 +24,7 @@ use super::{ keygen_history::{initialize_synckeygen, synckeygen_to_network_info}, staking::{get_posdao_epoch, get_posdao_epoch_start}, validator_set::ValidatorType, - }, - contribution::Contribution, - hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, - hbbft_peers_management::HbbftPeersManagement, - NodeId, + }, contribution::Contribution, hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, hbbft_network_fork_manager::HbbftNetworkForkManager, hbbft_peers_management::HbbftPeersManagement, NodeId }; pub type HbMessage = honey_badger::Message; @@ -44,6 +41,7 @@ pub(crate) struct HbbftState { current_posdao_epoch_start_block: u64, last_posdao_epoch_start_block: Option, future_messages_cache: BTreeMap>, + fork_manager: HbbftNetworkForkManager, } impl HbbftState { @@ -56,6 +54,7 @@ impl HbbftState { current_posdao_epoch_start_block: 0, last_posdao_epoch_start_block: None, future_messages_cache: BTreeMap::new(), + fork_manager: HbbftNetworkForkManager::new(), } } @@ -65,6 +64,10 @@ impl HbbftState { return Some(builder.build()); } + pub fn init_fork_manager(&mut self, latest_block: u64, fork_definition: Vec) { + self.fork_manager.initialize(latest_block, fork_definition); + } + /** * Updates the underlying honeybadger instance, possible switching into a new * honeybadger instance if according to contracts a new staking epoch has started. @@ -100,6 +103,8 @@ impl HbbftState { // this might happen for a lot of key-gen rounds, until a set with responsive validators // can be found. + + if !force && self.current_posdao_epoch == target_posdao_epoch { // hbbft state is already up to date. // @todo Return proper error codes. From 9e4fb9aee8c497d4af3497d1bd0989a0f59950da Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 11 Feb 2024 23:42:06 +0100 Subject: [PATCH 090/166] cargo fmt --all -- --config imports_granularity=Crate --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 4 +--- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 9 ++++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 4c965b581..a4bf62dc1 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1423,12 +1423,10 @@ impl Engine for HoneyBadgerBFT { fn register_client(&self, client: Weak) { *self.client.write() = Some(client.clone()); if let Some(client) = self.client_arc() { - let mut state = self.hbbft_state.write(); - + if let Some(latest_block) = client.block_number(BlockId::Latest) { state.init_fork_manager(latest_block, self.params.forks.clone()); - } else { error!(target: "engine", "hbbft-hardfork : could not initialialize hardfork manager, no latest block found."); } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index de7866246..283c902b2 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -24,7 +24,12 @@ use super::{ keygen_history::{initialize_synckeygen, synckeygen_to_network_info}, staking::{get_posdao_epoch, get_posdao_epoch_start}, validator_set::ValidatorType, - }, contribution::Contribution, hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, hbbft_network_fork_manager::HbbftNetworkForkManager, hbbft_peers_management::HbbftPeersManagement, NodeId + }, + contribution::Contribution, + hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, + hbbft_network_fork_manager::HbbftNetworkForkManager, + hbbft_peers_management::HbbftPeersManagement, + NodeId, }; pub type HbMessage = honey_badger::Message; @@ -103,8 +108,6 @@ impl HbbftState { // this might happen for a lot of key-gen rounds, until a set with responsive validators // can be found. - - if !force && self.current_posdao_epoch == target_posdao_epoch { // hbbft state is already up to date. // @todo Return proper error codes. From b507e6727f9a0ba73faed396c09b71b3fef88c4d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 12 Feb 2024 15:51:44 +0100 Subject: [PATCH 091/166] fork manager interface change: should_fork returns now directly the NetworkInfo --- .../engines/hbbft/hbbft_network_fork_manager.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 756a8bda0..79fc0437a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -2,7 +2,9 @@ use std::collections::VecDeque; use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; -use hbbft::sync_key_gen::{Ack, Part}; +use hbbft::{sync_key_gen::{Ack, Part}, NetworkInfo}; + +use super::NodeId; struct HbbftFork { // start_timestamp: u64, @@ -67,17 +69,18 @@ pub struct HbbftNetworkForkManager { } impl HbbftNetworkForkManager { + /// Returns None if not forking /// Returns a List of Addresses that become the new validator set and /// declares the fork as active, pub fn should_fork( &mut self, - last_block_number: u64, - last_block_time_stamp: u64, - ) -> Option> { + last_block_number: u64 + ) -> Option> { // fields omitted None + } /// Initializes the fork Manager, @@ -148,3 +151,6 @@ impl HbbftNetworkForkManager { } } } + + + From a1953a9c0b4b782a1768565414c061c29a7ae9ea Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 12 Feb 2024 16:32:34 +0100 Subject: [PATCH 092/166] fork manager: first should_fork implementation. TODO: causing panic during linking ? --- .../hbbft/hbbft_network_fork_manager.rs | 43 ++++++++++++++++--- .../ethcore/src/engines/hbbft/hbbft_state.rs | 10 +++++ 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 79fc0437a..445a38fb0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -9,8 +9,13 @@ use super::NodeId; struct HbbftFork { // start_timestamp: u64, start_block: u64, - // end_timestamp: u64, + + // start epoch is set, if the fork has been started. + start_epoch: Option, + + // end_block is set when the fork process is finished and the network operation has normaliced again. end_block: Option, + validators: Vec
, parts: Vec, acks: Vec, @@ -40,6 +45,7 @@ impl HbbftFork { HbbftFork { start_block: fork_definiton.block_number_start, + start_epoch: None, end_block: fork_definiton.block_number_end, validators: fork_definiton.validators.clone(), parts, @@ -53,8 +59,6 @@ impl HbbftFork { /// It allows cheap queries to see if a Fork is pending, /// and stores information about a fork that is finished. pub struct HbbftNetworkForkManager { - /// If a fork is currently in progress, this is true. - is_currently_forking: bool, /// a ordered list with upcomming forks. finished_forks: VecDeque, @@ -75,10 +79,40 @@ impl HbbftNetworkForkManager { /// declares the fork as active, pub fn should_fork( &mut self, - last_block_number: u64 + last_block_number: u64, + current_epoch: u64 ) -> Option> { // fields omitted + if let Some(next_fork) = self.pending_forks.front_mut() { + + if next_fork.start_block == last_block_number { + + todo!("Fork not implemented!"); + + // return Some(NetworkInfo { + // validators: next_fork.validators.clone(), + // parts: next_fork.parts.clone(), + // acks: next_fork.acks.clone(), + // }); + } else if next_fork.start_block > last_block_number { + + // in the following blocks after the fork process was started, + // it is possible for the network to have now ended the fork process. + // we are checking if the current epoch is greater than the start epoch. + + if let Some(start_epoch) = next_fork.start_epoch { + if current_epoch == start_epoch + 1 { + next_fork.end_block = Some(last_block_number); + + // the fork process is finished. + // we are moving the fork to the finished forks list. + + // self.finished_forks.push_back(self.pending_forks.pop_front().unwrap()); + } + } + } // else: we are just waiting for the fork to happen. + } None } @@ -144,7 +178,6 @@ impl HbbftNetworkForkManager { pub fn new() -> HbbftNetworkForkManager { HbbftNetworkForkManager { - is_currently_forking: false, finished_forks: VecDeque::new(), pending_forks: VecDeque::new(), is_init: false, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 283c902b2..8e849dcf0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -108,6 +108,16 @@ impl HbbftState { // this might happen for a lot of key-gen rounds, until a set with responsive validators // can be found. + // if let Some(last_block_number) = client.block_number(block_id) { + // if let Some(fork_start_set) = self.fork_manager.should_fork(last_block_number) { + // let network_info = synckeygen_to_network_info(&synckeygen, pks, sks)?; + // self.network_info = Some(network_info.clone()); + // self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); + // } + // } + + // + if !force && self.current_posdao_epoch == target_posdao_epoch { // hbbft state is already up to date. // @todo Return proper error codes. From 9d42cfef5375e0bee76e04061cbaf2f9973692bb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 12 Feb 2024 16:50:54 +0100 Subject: [PATCH 093/166] simplified contribution --- crates/ethcore/src/engines/hbbft/contribution.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contribution.rs b/crates/ethcore/src/engines/hbbft/contribution.rs index b058addcc..6954a23d9 100644 --- a/crates/ethcore/src/engines/hbbft/contribution.rs +++ b/crates/ethcore/src/engines/hbbft/contribution.rs @@ -42,12 +42,11 @@ impl Contribution { s.drain() }) .collect(); - let mut rng = rand::thread_rng(); Contribution { transactions: ser_txns, timestamp: unix_now_secs(), - random_data: rng + random_data: rand::thread_rng() .sample_iter(&Standard) .take(RANDOM_BYTES_PER_EPOCH) .collect(), From 16c27a46032d8b1588aca2f552ba9138bc1b983f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 12 Feb 2024 16:51:57 +0100 Subject: [PATCH 094/166] removed unused import in hbbft_peers_management. --- crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index c42bfa0cd..4039a1fe9 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -12,7 +12,7 @@ use crate::{ use bytes::ToPretty; use ethereum_types::Address; -use hbbft::NetworkInfo; + use super::{contracts::staking::get_pool_public_key, NodeId}; From 6b85b363a47afec9c3c1cde50839ba8745e1cc19 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 12 Feb 2024 16:57:36 +0100 Subject: [PATCH 095/166] missing comments in new_test_round_rewrite_bytecode_transitions spec.rs --- crates/ethcore/src/spec/spec.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/spec/spec.rs b/crates/ethcore/src/spec/spec.rs index bf2df2a22..94b062379 100644 --- a/crates/ethcore/src/spec/spec.rs +++ b/crates/ethcore/src/spec/spec.rs @@ -1196,6 +1196,7 @@ impl Spec { load_bundled!("test/authority_round_block_reward_contract") } + /// test: authority_round_rewrite_bytecode_transitions #[cfg(any(test, feature = "test-helpers"))] pub fn new_test_round_rewrite_bytecode_transitions() -> Self { load_bundled!("test/authority_round_rewrite_bytecode_transitions") From 54adbed38e1c54c8c7ff4a300ba1cbb6f1fe7a46 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 12 Feb 2024 17:44:14 +0100 Subject: [PATCH 096/166] ethjson spec: hardfork declaration for public keys --- crates/ethjson/src/spec/hbbft.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 09209c03e..405dac04c 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -46,8 +46,9 @@ pub struct HbbftNetworkFork { #[serde(default)] pub block_number_end: Option, - /// Validator set at the fork. - pub validators: Vec
, + /// Validator set (public keys) of the fork. + #[serde_as(as = "Vec")] + pub validators: Vec>, #[serde_as(as = "Vec")] pub parts: Vec>, @@ -119,8 +120,9 @@ impl HbbftParams { #[cfg(test)] mod tests { - use super::Hbbft; use ethereum_types::Address; + + use super::Hbbft; use std::str::FromStr; #[test] @@ -136,7 +138,7 @@ mod tests { { "blockNumberStart" : 777, "validators": [ - "0xfe163fc225f3863cef09f1f68ead173f30300d13" + "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678" ], "parts": ["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"], "acks": ["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"] @@ -158,6 +160,8 @@ mod tests { ); assert_eq!(deserialized.params.forks.get(0).expect("").parts.len(), 1); assert_eq!(deserialized.params.forks.get(0).expect("").acks.len(), 1); + assert_eq!(deserialized.params.forks.get(0).expect("").validators.len(), 1); + assert_eq!(deserialized.params.forks.get(0).expect("").validators.get(0).expect("").len(), 64); } #[test] From 4d978bf96c595bc47f572d6c848b0ab04bbf6699 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 13 Feb 2024 12:07:22 +0100 Subject: [PATCH 097/166] key generation for fork, according to logic in update_honeybadger --- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 24 +++- .../hbbft/hbbft_network_fork_manager.rs | 119 +++++++++++++++--- .../ethcore/src/engines/hbbft/hbbft_state.rs | 4 +- 3 files changed, 128 insertions(+), 19 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index a4bf62dc1..004b9b037 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -18,7 +18,7 @@ use engines::{ SealingState, }; use error::{BlockError, Error}; -use ethereum_types::{Address, H256, H512, U256}; +use ethereum_types::{Address, Public, H256, H512, U256}; use ethjson::spec::HbbftParams; use hbbft::{NetworkInfo, Target}; use io::{IoContext, IoHandler, IoService, TimerToken}; @@ -1421,12 +1421,32 @@ impl Engine for HoneyBadgerBFT { } fn register_client(&self, client: Weak) { + + *self.client.write() = Some(client.clone()); + + + if let Some(client) = self.client_arc() { let mut state = self.hbbft_state.write(); + // let our_addr = match *self.signer.read() { + // Some(ref signer) => signer.address(), + // None => { + // NodeId::default() + // } + // }; + + // todo: better get the own ID from devP2P communication ?! + let own_public_key = match self.signer.read().as_ref() { + Some(signer) => signer + .public() + .expect("Signer's public key must be available!"), + None => Public::from(H512::from_low_u64_be(0)), + }; + if let Some(latest_block) = client.block_number(BlockId::Latest) { - state.init_fork_manager(latest_block, self.params.forks.clone()); + state.init_fork_manager(NodeId(own_public_key), latest_block, self.params.forks.clone()); } else { error!(target: "engine", "hbbft-hardfork : could not initialialize hardfork manager, no latest block found."); } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 445a38fb0..509abd590 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,11 +1,15 @@ -use std::collections::VecDeque; +use std::{collections::{BTreeMap, VecDeque}, sync::Arc}; use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; -use hbbft::{sync_key_gen::{Ack, Part}, NetworkInfo}; +use hbbft::{crypto::PublicKeySet, sync_key_gen::{Ack, Part, SyncKeyGen}, util::max_faulty, NetworkInfo}; +use parking_lot::RwLock; + +use crate::engines::{hbbft::contracts::keygen_history::{KeyPairWrapper, PublicWrapper}, EngineSigner}; use super::NodeId; +#[derive(Debug)] struct HbbftFork { // start_timestamp: u64, start_block: u64, @@ -16,7 +20,7 @@ struct HbbftFork { // end_block is set when the fork process is finished and the network operation has normaliced again. end_block: Option, - validators: Vec
, + validators: Vec, parts: Vec, acks: Vec, } @@ -36,18 +40,26 @@ impl HbbftFork { if let Ok(ack) = bincode::deserialize( a.as_slice()) { ack } else { - error!(target:"engine", "hbbft-hardfork: could not interprete part from spec: {:?}", a.as_slice()); - panic!("hbbft-hardfork: could not interprete part from spec: {:?}", a.as_slice()); + error!(target:"engine", "hbbft-hardfork: could not interprete acks from spec: {:?}", a.as_slice()); + panic!("hbbft-hardfork: could not interprete acks from spec: {:?}", a.as_slice()); } }).collect(); - //bincode::deserialize(&serialized_part).unwrap(); + + let node_ids = fork_definiton.acks.iter().map(|h| { + if let Ok(node_id) = bincode::deserialize( h.as_slice()) { + node_id + } else { + error!(target:"engine", "hbbft-hardfork: could not interprete nodeIds from spec: {:?}", h.as_slice()); + panic!("hbbft-hardfork: could not interprete part from spec: {:?}", h.as_slice()); + } + }).collect(); HbbftFork { start_block: fork_definiton.block_number_start, start_epoch: None, end_block: fork_definiton.block_number_end, - validators: fork_definiton.validators.clone(), + validators: node_ids, parts, acks, } @@ -70,6 +82,8 @@ pub struct HbbftNetworkForkManager { /// we cannot apply the RAI pattern because of the delayed Hbbft initialization /// this variable tracks if the fork manager is initialized or not. is_init: bool, + + own_id: NodeId } impl HbbftNetworkForkManager { @@ -80,7 +94,8 @@ impl HbbftNetworkForkManager { pub fn should_fork( &mut self, last_block_number: u64, - current_epoch: u64 + current_epoch: u64, + signer_lock: Arc>>>, ) -> Option> { // fields omitted @@ -88,13 +103,52 @@ impl HbbftNetworkForkManager { if next_fork.start_block == last_block_number { - todo!("Fork not implemented!"); + //let keys : PublicKeySet = PublicKeySet:: + let wrapper = KeyPairWrapper { + inner: signer_lock.clone(), + }; + + let mut rng = rand::thread_rng(); + let mut pub_keys_btree: BTreeMap = BTreeMap::new(); + + for v in next_fork.validators.iter() { + pub_keys_btree.insert(v.clone(), PublicWrapper { + inner: v.clone().0 + }); + } + + let pub_keys: Arc> = Arc::new(pub_keys_btree); + let skg = match SyncKeyGen::new(self.own_id, wrapper, pub_keys, max_faulty(next_fork.validators.len()), &mut rng) { + Ok(s) => s.0, + Err(e) => { + error!(target: "engine", "hbbft-hardfork: could not create SyncKeyGen: {:?}", e); + panic!("hbbft-hardfork: could not create SyncKeyGen: {:?}", e); + } + }; - // return Some(NetworkInfo { - // validators: next_fork.validators.clone(), - // parts: next_fork.parts.clone(), - // acks: next_fork.acks.clone(), - // }); + if !skg.is_ready() { + error!(target: "engine", "hbbft-hardfork: missing parts for SyncKeyGen for fork {:?}", next_fork); + panic!("hbbft-hardfork: missing parts for SyncKeyGen for fork {:?}", next_fork); + } + + + let (pks, sks) = match skg.generate() { + Ok((p, s)) => (p, s), + Err(e) => { + error!(target: "engine", "hbbft-hardfork: could not generate keys for fork: {:?} {:?}", e, next_fork); + panic!("hbbft-hardfork: could not generate keys for fork: {:?} {:?}", e, next_fork); + } + }; + + let result = NetworkInfo::::new( + self.own_id, + sks, + pks, + next_fork.validators.clone() + ); + + return Some(result); + } else if next_fork.start_block > last_block_number { // in the following blocks after the fork process was started, @@ -108,7 +162,7 @@ impl HbbftNetworkForkManager { // the fork process is finished. // we are moving the fork to the finished forks list. - // self.finished_forks.push_back(self.pending_forks.pop_front().unwrap()); + self.finished_forks.push_back(self.pending_forks.pop_front().unwrap()); } } } // else: we are just waiting for the fork to happen. @@ -124,6 +178,7 @@ impl HbbftNetworkForkManager { /// have to be declared as finished. pub fn initialize( &mut self, + own_id: NodeId, startup_block_number: u64, mut fork_definition: Vec, ) { @@ -131,6 +186,8 @@ impl HbbftNetworkForkManager { panic!("HbbftNetworkForkManager is already initialized"); } + self.own_id = own_id; + fork_definition.sort_by_key(|fork| fork.block_number_start); // the fork definition can contain @@ -181,9 +238,41 @@ impl HbbftNetworkForkManager { finished_forks: VecDeque::new(), pending_forks: VecDeque::new(), is_init: false, + own_id: NodeId::default(), } } } +#[cfg(test)] +mod tests { + + use super::*; + use ethjson::spec::hbbft::HbbftNetworkFork; + use hbbft::sync_key_gen::{Ack, Part}; + use ethereum_types::Address; + + #[test] + fn test_should_fork() { + // let mut fork_manager = HbbftNetworkForkManager::new(); + // let mut fork_definition = Vec::new(); + + // let mut fork = HbbftNetworkFork { + // block_number_start: 10, + // block_number_end: Some(20), + // validators: vec![Address::from([0; 20])], + // parts: vec![bincode::serialize(&Part::new(0, 0)).unwrap()], + // acks: vec![bincode::serialize(&Ack::new(0, 0)).unwrap()], + // }; + + // fork_definition.push(fork); + + // fork_manager.initialize(5, fork_definition); + + // let result = fork_manager.should_fork(10, 0); + // assert!(result.is_some()); + } + + +} \ No newline at end of file diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 8e849dcf0..c9a945992 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -69,8 +69,8 @@ impl HbbftState { return Some(builder.build()); } - pub fn init_fork_manager(&mut self, latest_block: u64, fork_definition: Vec) { - self.fork_manager.initialize(latest_block, fork_definition); + pub fn init_fork_manager(&mut self, own_id: NodeId, latest_block: u64, fork_definition: Vec) { + self.fork_manager.initialize(own_id, latest_block, fork_definition); } /** From 46e66c84800eb6c7cafc7e1373ea13b30ebcaebb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 14 Feb 2024 23:33:22 +0100 Subject: [PATCH 098/166] improved logging if part read from blockchain is invalid --- crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index 066c10d47..fc943606c 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -106,7 +106,10 @@ pub fn part_of_address( .unwrap(); match outcome { - PartOutcome::Invalid(_) => Err(CallError::ReturnValueInvalid), + PartOutcome::Invalid(e) => { + error!(target: "engine", "Part for address {} is invalid: {:?}", address, e); + Err(CallError::ReturnValueInvalid) + }, PartOutcome::Valid(ack) => Ok(ack), } } From 50245cdd6482cc5506509016517a8996f003c6bf Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 14 Feb 2024 23:36:05 +0100 Subject: [PATCH 099/166] code cleanup --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 004b9b037..7ab367136 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1429,13 +1429,6 @@ impl Engine for HoneyBadgerBFT { if let Some(client) = self.client_arc() { let mut state = self.hbbft_state.write(); - - // let our_addr = match *self.signer.read() { - // Some(ref signer) => signer.address(), - // None => { - // NodeId::default() - // } - // }; // todo: better get the own ID from devP2P communication ?! let own_public_key = match self.signer.read().as_ref() { From 9013644642e0e5e5cfc3a113fee582190c75f427 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 14 Feb 2024 23:40:57 +0100 Subject: [PATCH 100/166] cargo fmt --all -- --config imports_granularity=Crate --- .../engines/hbbft/contracts/keygen_history.rs | 4 +- .../ethcore/src/engines/hbbft/hbbft_engine.rs | 14 +-- .../hbbft/hbbft_network_fork_manager.rs | 105 +++++++++++------- .../engines/hbbft/hbbft_peers_management.rs | 4 - .../ethcore/src/engines/hbbft/hbbft_state.rs | 10 +- crates/ethjson/src/spec/hbbft.rs | 18 ++- 6 files changed, 98 insertions(+), 57 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index fc943606c..94c3724db 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -108,8 +108,8 @@ pub fn part_of_address( match outcome { PartOutcome::Invalid(e) => { error!(target: "engine", "Part for address {} is invalid: {:?}", address, e); - Err(CallError::ReturnValueInvalid) - }, + Err(CallError::ReturnValueInvalid) + } PartOutcome::Valid(ack) => Ok(ack), } } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 7ab367136..c07cb68ff 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1421,15 +1421,11 @@ impl Engine for HoneyBadgerBFT { } fn register_client(&self, client: Weak) { - - *self.client.write() = Some(client.clone()); - - if let Some(client) = self.client_arc() { let mut state = self.hbbft_state.write(); - + // todo: better get the own ID from devP2P communication ?! let own_public_key = match self.signer.read().as_ref() { Some(signer) => signer @@ -1437,9 +1433,13 @@ impl Engine for HoneyBadgerBFT { .expect("Signer's public key must be available!"), None => Public::from(H512::from_low_u64_be(0)), }; - + if let Some(latest_block) = client.block_number(BlockId::Latest) { - state.init_fork_manager(NodeId(own_public_key), latest_block, self.params.forks.clone()); + state.init_fork_manager( + NodeId(own_public_key), + latest_block, + self.params.forks.clone(), + ); } else { error!(target: "engine", "hbbft-hardfork : could not initialialize hardfork manager, no latest block found."); } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 509abd590..abc308817 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,11 +1,22 @@ -use std::{collections::{BTreeMap, VecDeque}, sync::Arc}; +use std::{ + collections::{BTreeMap, VecDeque}, + sync::Arc, +}; use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; -use hbbft::{crypto::PublicKeySet, sync_key_gen::{Ack, Part, SyncKeyGen}, util::max_faulty, NetworkInfo}; +use hbbft::{ + crypto::PublicKeySet, + sync_key_gen::{Ack, Part, PartOutcome, SyncKeyGen}, + util::max_faulty, + NetworkInfo, +}; use parking_lot::RwLock; -use crate::engines::{hbbft::contracts::keygen_history::{KeyPairWrapper, PublicWrapper}, EngineSigner}; +use crate::engines::{ + hbbft::contracts::keygen_history::{KeyPairWrapper, PublicWrapper}, + EngineSigner, +}; use super::NodeId; @@ -45,7 +56,6 @@ impl HbbftFork { } }).collect(); - let node_ids = fork_definiton.acks.iter().map(|h| { if let Ok(node_id) = bincode::deserialize( h.as_slice()) { node_id @@ -71,7 +81,6 @@ impl HbbftFork { /// It allows cheap queries to see if a Fork is pending, /// and stores information about a fork that is finished. pub struct HbbftNetworkForkManager { - /// a ordered list with upcomming forks. finished_forks: VecDeque, @@ -83,11 +92,10 @@ pub struct HbbftNetworkForkManager { /// this variable tracks if the fork manager is initialized or not. is_init: bool, - own_id: NodeId + own_id: NodeId, } impl HbbftNetworkForkManager { - /// Returns None if not forking /// Returns a List of Addresses that become the new validator set and /// declares the fork as active, @@ -100,57 +108,78 @@ impl HbbftNetworkForkManager { // fields omitted if let Some(next_fork) = self.pending_forks.front_mut() { - if next_fork.start_block == last_block_number { - - //let keys : PublicKeySet = PublicKeySet:: - let wrapper = KeyPairWrapper { + //let keys : PublicKeySet = PublicKeySet:: + let wrapper = KeyPairWrapper { inner: signer_lock.clone(), }; - + let mut rng = rand::thread_rng(); let mut pub_keys_btree: BTreeMap = BTreeMap::new(); for v in next_fork.validators.iter() { - pub_keys_btree.insert(v.clone(), PublicWrapper { - inner: v.clone().0 - }); + pub_keys_btree.insert(v.clone(), PublicWrapper { inner: v.clone().0 }); } - + let pub_keys: Arc> = Arc::new(pub_keys_btree); - let skg = match SyncKeyGen::new(self.own_id, wrapper, pub_keys, max_faulty(next_fork.validators.len()), &mut rng) { + let mut skg = match SyncKeyGen::new( + self.own_id, + wrapper, + pub_keys, + max_faulty(next_fork.validators.len()), + &mut rng, + ) { Ok(s) => s.0, Err(e) => { error!(target: "engine", "hbbft-hardfork: could not create SyncKeyGen: {:?}", e); panic!("hbbft-hardfork: could not create SyncKeyGen: {:?}", e); } }; - + + //adding the PARTs to the SyncKeyGen + + for i_p in 0..next_fork.validators.len() { + let part = next_fork.parts.get(i_p).unwrap(); + let node_id = next_fork.validators.get(i_p).unwrap(); + let outcome = skg.handle_part(node_id, part.clone(), &mut rng).unwrap(); + + match outcome { + PartOutcome::Invalid(e) => { + error!(target: "engine", "hbbft-hardfork: Part for node {} is invalid: {:?}", node_id.as_8_byte_string(), e); + panic!( + "hbbft-hardfork: Part for node {} is invalid: {:?}", + node_id.as_8_byte_string(), + e + ); + } + PartOutcome::Valid(_) => {} + } + } + if !skg.is_ready() { error!(target: "engine", "hbbft-hardfork: missing parts for SyncKeyGen for fork {:?}", next_fork); - panic!("hbbft-hardfork: missing parts for SyncKeyGen for fork {:?}", next_fork); + panic!( + "hbbft-hardfork: missing parts for SyncKeyGen for fork {:?}", + next_fork + ); } - let (pks, sks) = match skg.generate() { Ok((p, s)) => (p, s), Err(e) => { error!(target: "engine", "hbbft-hardfork: could not generate keys for fork: {:?} {:?}", e, next_fork); - panic!("hbbft-hardfork: could not generate keys for fork: {:?} {:?}", e, next_fork); + panic!( + "hbbft-hardfork: could not generate keys for fork: {:?} {:?}", + e, next_fork + ); } }; - let result = NetworkInfo::::new( - self.own_id, - sks, - pks, - next_fork.validators.clone() - ); + let result = + NetworkInfo::::new(self.own_id, sks, pks, next_fork.validators.clone()); return Some(result); - } else if next_fork.start_block > last_block_number { - // in the following blocks after the fork process was started, // it is possible for the network to have now ended the fork process. // we are checking if the current epoch is greater than the start epoch. @@ -161,14 +190,14 @@ impl HbbftNetworkForkManager { // the fork process is finished. // we are moving the fork to the finished forks list. - - self.finished_forks.push_back(self.pending_forks.pop_front().unwrap()); + + self.finished_forks + .push_back(self.pending_forks.pop_front().unwrap()); } } } // else: we are just waiting for the fork to happen. } None - } /// Initializes the fork Manager, @@ -186,7 +215,7 @@ impl HbbftNetworkForkManager { panic!("HbbftNetworkForkManager is already initialized"); } - self.own_id = own_id; + self.own_id = own_id; fork_definition.sort_by_key(|fork| fork.block_number_start); @@ -243,15 +272,13 @@ impl HbbftNetworkForkManager { } } - - #[cfg(test)] -mod tests { +mod tests { use super::*; + use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{Ack, Part}; - use ethereum_types::Address; #[test] fn test_should_fork() { @@ -273,6 +300,4 @@ mod tests { // let result = fork_manager.should_fork(10, 0); // assert!(result.is_some()); } - - -} \ No newline at end of file +} diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index 4039a1fe9..a04a8ac11 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -13,7 +13,6 @@ use bytes::ToPretty; use ethereum_types::Address; - use super::{contracts::staking::get_pool_public_key, NodeId}; #[derive(Clone, Debug)] @@ -26,9 +25,6 @@ struct ValidatorConnectionData { mining_address: Address, } -// impl ValidatorConnectionData { -// } - pub struct HbbftPeersManagement { own_validator_address: Address, last_written_internet_address: Option, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index c9a945992..008532fd7 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -69,8 +69,14 @@ impl HbbftState { return Some(builder.build()); } - pub fn init_fork_manager(&mut self, own_id: NodeId, latest_block: u64, fork_definition: Vec) { - self.fork_manager.initialize(own_id, latest_block, fork_definition); + pub fn init_fork_manager( + &mut self, + own_id: NodeId, + latest_block: u64, + fork_definition: Vec, + ) { + self.fork_manager + .initialize(own_id, latest_block, fork_definition); } /** diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index 405dac04c..e0aaef807 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -160,8 +160,22 @@ mod tests { ); assert_eq!(deserialized.params.forks.get(0).expect("").parts.len(), 1); assert_eq!(deserialized.params.forks.get(0).expect("").acks.len(), 1); - assert_eq!(deserialized.params.forks.get(0).expect("").validators.len(), 1); - assert_eq!(deserialized.params.forks.get(0).expect("").validators.get(0).expect("").len(), 64); + assert_eq!( + deserialized.params.forks.get(0).expect("").validators.len(), + 1 + ); + assert_eq!( + deserialized + .params + .forks + .get(0) + .expect("") + .validators + .get(0) + .expect("") + .len(), + 64 + ); } #[test] From 21328f62535cdaef06985f881b8ef07cde74cb3c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 17 Feb 2024 23:52:22 +0100 Subject: [PATCH 101/166] removed fork_manager from hbbft_engine. hbbft state is mmanaging the fork manager --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index c07cb68ff..f3f1b088b 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -93,7 +93,6 @@ pub struct HoneyBadgerBFT { peers_management: Mutex, current_minimum_gas_price: Mutex>, early_epoch_manager: Mutex>, - fork_manager: Mutex, } struct TransitionHandler { @@ -453,7 +452,6 @@ impl HoneyBadgerBFT { peers_management: Mutex::new(HbbftPeersManagement::new()), current_minimum_gas_price: Mutex::new(None), early_epoch_manager: Mutex::new(None), - fork_manager: Mutex::new(HbbftNetworkForkManager::new()), }); if !engine.params.is_unit_test.unwrap_or(false) { From 82f5cf39445f074175098fa73b7642ceff970957 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 18 Feb 2024 23:50:44 +0100 Subject: [PATCH 102/166] recovered missing changes from i98-hardfork branch due local git repo corruption. --- Cargo.lock | 1 + .../hbbft/hbbft_config_generator/Cargo.toml | 1 + .../src/keygen_history_helpers.rs | 36 +++++++- .../hbbft/hbbft_config_generator/src/main.rs | 12 ++- .../hbbft/hbbft_network_fork_manager.rs | 92 +++++++++++++------ .../ethcore/src/engines/hbbft/hbbft_state.rs | 16 ++-- crates/ethjson/src/spec/hbbft.rs | 13 ++- 7 files changed, 128 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ed683e86..d33c539bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2140,6 +2140,7 @@ dependencies = [ "clap", "ethcore", "ethereum-types 0.9.2", + "ethjson", "ethkey", "ethstore", "hbbft", diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml index 37de51a9d..91ef228f6 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml @@ -11,6 +11,7 @@ authors = [ bincode = "1.1.2" clap = "2" ethcore = { path = "../../../.." } +ethjson = { path = "../../../../../ethjson" } ethereum-types = "0.9.2" ethkey = { path = "../../../../../accounts/ethkey" } ethstore = { path = "../../../../../accounts/ethstore"} diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs index 1cbce2005..b2f0a76b0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs @@ -1,5 +1,6 @@ use crate::Enode; use ethereum_types::H128; +use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{AckOutcome, Part, PartOutcome, PublicKey, SecretKey, SyncKeyGen}; use parity_crypto::publickey::{public_to_address, Address, Public, Secret}; use serde::{Deserialize, Serialize}; @@ -112,7 +113,7 @@ pub fn enodes_to_pub_keys( } #[derive(Serialize, Deserialize)] -struct KeyGenHistoryData { +pub struct KeyGenHistoryData { validators: Vec, staking_addresses: Vec, public_keys: Vec, @@ -121,12 +122,41 @@ struct KeyGenHistoryData { acks: Vec>>, } + +impl KeyGenHistoryData { + pub fn to_json(&self) -> String { + serde_json::to_string(self).expect("Keygen History must convert to JSON") + } + + pub fn create_example_fork_definition(&self) -> HbbftNetworkFork { + + let validators : Vec> = self.public_keys.iter().map(|v| { + let mut hex = v.clone(); + println!("public key: {}", v); + if v.starts_with("0x") { + hex = v.split_at(2).1.to_string(); + } + + let public = hex.parse::().expect("Could not parse public key"); + public.as_bytes().to_vec() + }).collect(); + + HbbftNetworkFork { + block_number_start: 10, + block_number_end: Some(100), + validators: validators, + parts: self.parts.clone(), + acks: self.acks.clone(), + } + } +} + pub fn key_sync_history_data( parts: &BTreeMap, acks: &BTreeMap>, enodes: &BTreeMap, include_validators_only: bool, -) -> String { +) -> KeyGenHistoryData { let mut data = KeyGenHistoryData { validators: Vec::new(), staking_addresses: Vec::new(), @@ -215,7 +245,7 @@ pub fn key_sync_history_data( parts_total_bytes + acks_total_bytes ); - serde_json::to_string(&data).expect("Keygen History must convert to JSON") + data } #[cfg(test)] diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 4eaf58315..97fd6d96c 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -12,6 +12,7 @@ extern crate rustc_hex; extern crate serde; extern crate serde_json; extern crate toml; +extern crate ethjson; mod keygen_history_helpers; @@ -511,18 +512,23 @@ fn main() { fs::write("password.txt", "test").expect("Unable to write password.txt file"); // only pass over enodes in the enodes_map that are also available for acks and parts. - fs::write( "keygen_history.json", - key_sync_history_data(&parts, &acks, &enodes_map, true), + key_sync_history_data(&parts, &acks, &enodes_map, true).to_json(), ) .expect("Unable to write keygen history data file"); fs::write( "nodes_info.json", - key_sync_history_data(&parts, &acks, &enodes_map, false), + key_sync_history_data(&parts, &acks, &enodes_map, false).to_json(), ) .expect("Unable to write nodes_info data file"); + + fs::write( + "fork_example.json", + key_sync_history_data(&parts, &acks, &enodes_map, false).create_example_fork_definition().to_json(), + ) + .expect("Unable to write fork_example.json data file"); } #[cfg(test)] diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index abc308817..c7a7c4bab 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -7,7 +7,7 @@ use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::{ crypto::PublicKeySet, - sync_key_gen::{Ack, Part, PartOutcome, SyncKeyGen}, + sync_key_gen::{Ack, AckOutcome, Part, PartOutcome, SyncKeyGen}, util::max_faulty, NetworkInfo, }; @@ -33,7 +33,7 @@ struct HbbftFork { validators: Vec, parts: Vec, - acks: Vec, + acks: Vec>, } impl HbbftFork { @@ -47,16 +47,21 @@ impl HbbftFork { } }).collect(); - let acks = fork_definiton.acks.iter().map(|a| { - if let Ok(ack) = bincode::deserialize( a.as_slice()) { - ack - } else { - error!(target:"engine", "hbbft-hardfork: could not interprete acks from spec: {:?}", a.as_slice()); - panic!("hbbft-hardfork: could not interprete acks from spec: {:?}", a.as_slice()); + let acks = fork_definiton.acks.iter().map(|acks| { + let mut fork_acks: Vec = Vec::new(); + + for ack_bytes in acks { + if let Ok(ack) = bincode::deserialize( ack_bytes.as_slice()) { + fork_acks.push(ack); + } else { + error!(target:"engine", "hbbft-hardfork: could not interprete acks from spec: {:?}", ack_bytes.as_slice()); + panic!("hbbft-hardfork: could not interprete acks from spec: {:?}", ack_bytes.as_slice()); + } } + fork_acks }).collect(); - let node_ids = fork_definiton.acks.iter().map(|h| { + let node_ids = fork_definiton.validators.iter().map(|h| { if let Ok(node_id) = bincode::deserialize( h.as_slice()) { node_id } else { @@ -109,7 +114,7 @@ impl HbbftNetworkForkManager { if let Some(next_fork) = self.pending_forks.front_mut() { if next_fork.start_block == last_block_number { - //let keys : PublicKeySet = PublicKeySet:: + let wrapper = KeyPairWrapper { inner: signer_lock.clone(), }; @@ -138,9 +143,9 @@ impl HbbftNetworkForkManager { //adding the PARTs to the SyncKeyGen - for i_p in 0..next_fork.validators.len() { - let part = next_fork.parts.get(i_p).unwrap(); - let node_id = next_fork.validators.get(i_p).unwrap(); + for i in 0..next_fork.validators.len() { + let part = next_fork.parts.get(i).unwrap(); + let node_id = next_fork.validators.get(i).unwrap(); let outcome = skg.handle_part(node_id, part.clone(), &mut rng).unwrap(); match outcome { @@ -156,6 +161,27 @@ impl HbbftNetworkForkManager { } } + for i in 0..next_fork.validators.len() { + let acks = next_fork.acks.get(i).unwrap(); + + for ack in acks.iter() { + let node_id = next_fork.validators.get(i).unwrap(); + let outcome = skg.handle_ack(node_id, ack.clone()).unwrap(); + + match outcome { + AckOutcome::Invalid(e) => { + error!(target: "engine", "hbbft-hardfork: Part for node {} is invalid: {:?}", node_id.as_8_byte_string(), e); + panic!( + "hbbft-hardfork: Part for node {} is invalid: {:?}", + node_id.as_8_byte_string(), + e + ); + } + AckOutcome::Valid => {} + } + } + } + if !skg.is_ready() { error!(target: "engine", "hbbft-hardfork: missing parts for SyncKeyGen for fork {:?}", next_fork); panic!( @@ -275,29 +301,41 @@ impl HbbftNetworkForkManager { #[cfg(test)] mod tests { + use std::{fs, str::FromStr}; + + use crate::engines::{hbbft::test::hbbft_test_client::HbbftTestClient, signer::from_keypair}; + use super::*; use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{Ack, Part}; + //use parity_crypto::publickey::{KeyPair, Secret}; #[test] - fn test_should_fork() { - // let mut fork_manager = HbbftNetworkForkManager::new(); - // let mut fork_definition = Vec::new(); + fn test_fork_manager_should_fork() { + + let mut fork_manager = HbbftNetworkForkManager::new(); + + let test_file_content = std::fs::read("res/local_tests/hbbft_test_fork.json").expect("could not read test file."); + let test_fork = serde_json::from_slice::(test_file_content.as_slice()).expect("fork file is parsable."); + + + //let test_client = HbbftTestClient::new(); + + let key1 = KeyPair::from_secret( + Secret::from_str("0000000000000000000000000000000000000000000000000000000000000001") + .unwrap(), + ).unwrap(); - // let mut fork = HbbftNetworkFork { - // block_number_start: 10, - // block_number_end: Some(20), - // validators: vec![Address::from([0; 20])], - // parts: vec![bincode::serialize(&Part::new(0, 0)).unwrap()], - // acks: vec![bincode::serialize(&Ack::new(0, 0)).unwrap()], - // }; + let signer = from_keypair(key1); - // fork_definition.push(fork); + //let signer = Box::new(Signer (key1)); + let signer_lock = Arc::new(RwLock::new(Some(signer))); - // fork_manager.initialize(5, fork_definition); + let own_id = NodeId::default(); + fork_manager.initialize(own_id, 1, vec![test_fork]); + + assert!(fork_manager.should_fork(9, 1, signer_lock).is_none()); - // let result = fork_manager.should_fork(10, 0); - // assert!(result.is_some()); } } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 008532fd7..d8e0b7f76 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -114,14 +114,16 @@ impl HbbftState { // this might happen for a lot of key-gen rounds, until a set with responsive validators // can be found. - // if let Some(last_block_number) = client.block_number(block_id) { - // if let Some(fork_start_set) = self.fork_manager.should_fork(last_block_number) { - // let network_info = synckeygen_to_network_info(&synckeygen, pks, sks)?; - // self.network_info = Some(network_info.clone()); - // self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); - // } - // } + if let Some(last_block_number) = client.block_number(block_id) { + if let Some(network_info) = self.fork_manager.should_fork(last_block_number, self.current_posdao_epoch, signer.clone()) { + info!(target: "engine", "Forking at block {last_block_number}, starting new honeybadger instance with new validator set."); + + self.public_master_key = Some(network_info.public_key_set().public_key()); + self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); + self.network_info = Some(network_info); + } + } // if !force && self.current_posdao_epoch == target_posdao_epoch { diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index e0aaef807..f7529e8fd 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -34,7 +34,7 @@ pub struct HbbftParamsSkipBlockReward { } #[serde_as] -#[derive(Debug, PartialEq, Deserialize, Clone)] +#[derive(Debug, PartialEq, Deserialize, Serialize, Clone)] #[serde(deny_unknown_fields)] #[serde(rename_all = "camelCase")] pub struct HbbftNetworkFork { @@ -53,8 +53,15 @@ pub struct HbbftNetworkFork { #[serde_as(as = "Vec")] pub parts: Vec>, - #[serde_as(as = "Vec")] - pub acks: Vec>, + #[serde_as(as = "Vec>")] + pub acks: Vec>>, +} + +impl HbbftNetworkFork { + /// Returns true if the fork is finished. + pub fn to_json(&self) -> String { + serde_json::to_string(self).expect("HbbftNetworkFork must convert to JSON") + } } /// Hbbft parameters. From c3d8e7f48a5fcdf514926945929ce16a95531b8d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 11:54:34 +0100 Subject: [PATCH 103/166] missing testfile: hbbft_test_fork.json --- .../local_tests/hbbft/hbbft_test_fork.json | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 crates/ethcore/res/local_tests/hbbft/hbbft_test_fork.json diff --git a/crates/ethcore/res/local_tests/hbbft/hbbft_test_fork.json b/crates/ethcore/res/local_tests/hbbft/hbbft_test_fork.json new file mode 100644 index 000000000..ec136e3c0 --- /dev/null +++ b/crates/ethcore/res/local_tests/hbbft/hbbft_test_fork.json @@ -0,0 +1,22 @@ +{ + "blockNumberStart": 10, + "blockNumberEnd": 100, + "validators": [ + "091d8eba3fedbd073d07d5da39fc42f61a2f4e7100018329f5b845aa86f64d6636de27aaa4c9872942811750a3db8cb8be03584fb50aaa557f8f13d4187db686", + "bf4ee1d6d3e72fe8ab1c8ccdeef3aff73665ca0dd2ef5497cd8152e329a9ebd283eba076c369977390f4697026209a9fdfa78c2d98e76c4bafb3f8fb669ee4b0" + ], + "parts": [ + "00000000000000000100000000000000b8192b72d83b24d9d13229521f74e6664135cd9dd3d5c4fee6b46244c7fb637e099a7cf83ff84f7da56f119391a5be45020000000000000099000000000000000410da71b86de8a64eda03139cb4aa2c86d7dc30b3a8125658d25454e31b6aaadc21d8a16290cd9a9367f7c81933e517f314481fe43f0385829e843a4ff5f614c0329f8725ba757f0f05543255b5ccf70e204af8ad430a8dc7be7ba923be1e3efbcd0c2852ad29e2516972dedbe8d1cfba4f2d3af8a08caeee33cd60d294b95ecd70d60e5a2b0929106eea34d457b95487f8864ea926e9b04b990000000000000004dbb6269a2ffe83a197d9687060e1a509affa81b88b8b0b5ec37b6323abd6a4220d8d445273b5f0b937b01fb900369add18030953e62239353599d6005081526d12567acda069033fb2c82109e8b8294d9f68e49fa461a81886d7162d37d8090c5e4ce633acd0ced42200a09eb9dacfb8c9dc0dcb5d5fa9b5d645318ed856fec6bdd146367d1258d5975681084122833c910f9c2c5f6ca8bf", + "00000000000000000100000000000000b38755bce7abb9935778b1803b7a4351f68c367e20a38d7208a5c24e3af245b13ded32434b982f15dfd0de99fb5188eb0200000000000000990000000000000004634fd14e7ce463dde2973d53ea2f9638239c22a7f22ee776f900f72ea093dd64c1b9747df1348a1c9293aafc5a99abbf511be721fc898d549dc9ffe94b3f4b6348eedc44322c1c1a6e62ecccc0b266fc44901bd777bddd512c351e56e6b6e3516c12cf3713edff7df201914d071f9a80cbcaea0fc1d228dc2485653d44d8829c9036040a184ac838e80074b2b6ee56f34690b6f26b85aa7a99000000000000000451456684fa30515c8d0ef1244ac419791fb0ff5d52bf2229cbef4fcf4928961d386f9c20c75fb530b1fce6e7e9ad5f0b0cd09944e8598d20e55f0208703e37ba191261e0d302824202eda3e0150731715b88e165f17203f1406023f9cd3d898e10fef65d99fc3f5e3891ce1001fda7bcbea95ac74d030f0a369c0b8cce8bdaac1d7b682649f644677953d1dc3f076bd3befa2c4aaa9d5ea3" + ], + "acks": [ + [ + "0000000000000000020000000000000091000000000000000490a193eab4de97351348833b933705dfb903c7f5875559722a25de970a7bf58a434a9c4d251fa8412ada1e11d8b38e1530a765ef4d3f5d89264967ad75d9e0559318ea05314b8317d686ac51c4bd66ce09de4f4dc6cc64efde35efc1394d5371e968592551401240d901ee9bcde99de77bbdcfa6a65d64dc9f814ca0b4f17a0b5e35562e01c21c850903c55a2ab442699100000000000000042d9c2e94e9a5d2283fdf0dae7f0671fd9a81787ecb2908d1fccee00c57c43022e4f42f2bbf3059ce2c0bebc12d7b4fcae2c87ff1072e111bb7b67839266e23a778272003f3ec618082b750c3b7fdb5800ce76312154fd8ba33a6aaf3aa6c6aaa5880f9516c6f5094d09a69f3c7918f0e2ec92542d91a0e2ba9f65722e3a374ab01c73bff571f114b7bdd0e9298eba220", + "010000000000000002000000000000009100000000000000047eee4f119edac1a8f78f0b44426ffbb26b03ea36234678b287711d4e3a47a0215fc917d83c64ff1adfa3c4e985dcaddf550953768ab3725680f8cb4046e0b4338f351cbe49e69c4fcfd3df3285f7b1deed4e1fe41a0ca2d6962de6348db84a690e018a170b3df8a1283a16514ff58be083668fc4226a4921c35a15ac59f8c2e6e3e00adb9da20df161013beacef2330c9100000000000000049d03818e04ff4631844a94e73976653117fa97d88d029159af7cfadf71ed285202f17332cef132f3bb0ca6f5ddfdb3b9cafcc6a9e5b4b86e493d9946b3a6ab5b8e981fe70792b2ec3f63ed9b682eb5b8667398191a16fa308bf1b600541418d6673ba3902d4b58f60875e117984b970dc0d646f721285cacb759e07938ee5a8dbb2bfc70c1b5d6168446571531cccf64" + ], + [ + "00000000000000000200000000000000910000000000000004a87bbba9d5bed1aaa03a2f761213b7bcc8e9b7ae4fb9704562504a07d17f058dfc8725686682e31a12795822f748bd7925085106f2632aecd1e8f2aba231c02c619d8f9263a2683e0cc87be5bad052873cad313550e4c3509ee5cd410cf1aa3350e6ac24c3741781ffa3c5f4a64676cb533f73470e56c7679caef649785494c12c999f6bfb9053c31627ca112cffac1c9100000000000000046a88660f1c401aabfc2e565105eb6ccdaa7f403f897e63512beee5b2a8f5b5a3a63f002ee74ace2778da41935a5fc44a1f5dc5e5a58484f662edd3dbb9f5a6088a7b53b0626b5c42fd2a1ec9f78374288bab74bd0e8398d7203aa294d1c78733365b646b0d38b72447f36e3908e9f2ab31a682b4f62c37ca3240b7e607f264b63917eff09c6fbaaef0331b17260b2074", + "010000000000000002000000000000009100000000000000040a911f3a00d13a252002b042e65052016a1426e05464246145247c72b3825459d92903a1dbf8381a475f38d89b79d6c3b8ea4213a379e5c0dfd78540b633ad3aac019c199c6f22c7c484e2c405bff32d55bc650ae88088b8d930f9a0b066f4576a0c781c80feeb6fc8c220b11964807aa611dcf4dafb5386cbaab7a14f210d78438472b1f427e5e85b49bfbf97e03f7a91000000000000000406c4f04455ad55cecdecd1969ec7ad7684602056eb17b7cd656adc82e741c873eab437d54d8c9e191bc51246e25d0b5c77b2440e866d6c38b6d82a408bd02b64c1bf0584231a4201b9916ed2be1282ab1640866c347ec017a5c92a924e5012334b59d82359544177b762568ea96bb3f7ce2dd6ff60cdfa6fa52c7a78cc6a3f2ec230bddfa6974934a0f6899797493f85" + ] + ] +} \ No newline at end of file From fde9d98509db773982ee3c3b2fbbb5edd52f4a1c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 11:54:49 +0100 Subject: [PATCH 104/166] fixed missing imports in tests --- .../ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index c7a7c4bab..5cb62444f 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -309,6 +309,10 @@ mod tests { use ethereum_types::Address; use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{Ack, Part}; + + use crypto::publickey::{ + KeyPair, Secret, + }; //use parity_crypto::publickey::{KeyPair, Secret}; #[test] @@ -316,7 +320,7 @@ mod tests { let mut fork_manager = HbbftNetworkForkManager::new(); - let test_file_content = std::fs::read("res/local_tests/hbbft_test_fork.json").expect("could not read test file."); + let test_file_content = std::fs::read("res/local_tests/hbbft/hbbft_test_fork.json").expect("could not read test file."); let test_fork = serde_json::from_slice::(test_file_content.as_slice()).expect("fork file is parsable."); From 2322a646329eca6db4ef30c1cb2d1c2c6ea5edc8 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 11:57:34 +0100 Subject: [PATCH 105/166] fixed bug in HbbftFork::from_definition --- crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 5cb62444f..686b1da95 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -61,7 +61,7 @@ impl HbbftFork { fork_acks }).collect(); - let node_ids = fork_definiton.validators.iter().map(|h| { + let node_ids = fork_definiton.parts.iter().map(|h| { if let Ok(node_id) = bincode::deserialize( h.as_slice()) { node_id } else { From c714521d705f57f1815ee00b47a044b8981f1964 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 12:20:53 +0100 Subject: [PATCH 106/166] unit test for HbbftNetworkFork serialisation/deserialisation --- crates/ethjson/src/spec/hbbft.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index f7529e8fd..ec7d5215e 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -269,4 +269,26 @@ mod tests { false ); } + + #[test] + fn test_fork_serialisation() { + let fork = super::HbbftNetworkFork { + block_number_start: 10, + block_number_end: Some(100), + validators: vec![vec![1, 2, 3, 4]], + parts: vec![vec![5, 6, 7, 8]], + acks: vec![vec![vec![9, 10, 11, 12]]], + }; + + let json = fork.to_json(); + let deserialized: super::HbbftNetworkFork = serde_json::from_str(&json).unwrap(); + assert_eq!(deserialized.block_number_start, 10); + assert_eq!(deserialized.block_number_end, Some(100)); + assert_eq!(deserialized.validators.len(), 1); + assert_eq!(deserialized.parts.len(), 1); + assert_eq!(deserialized.acks.len(), 1); + + assert_eq!(deserialized.parts[0][1], 6); + assert_eq!(deserialized.acks[0][0][2], 11); + } } From a09f185b4a95a3e55571cc09261a8d093ddf3798 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 13:30:26 +0100 Subject: [PATCH 107/166] hbbft_config_generator: reusing the generated key_sync_history_data --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 97fd6d96c..49db88e6a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -511,10 +511,11 @@ fn main() { // Write the password file fs::write("password.txt", "test").expect("Unable to write password.txt file"); + let key_sync_file_validators_only = key_sync_history_data(&parts, &acks, &enodes_map, true); // only pass over enodes in the enodes_map that are also available for acks and parts. fs::write( "keygen_history.json", - key_sync_history_data(&parts, &acks, &enodes_map, true).to_json(), + key_sync_file_validators_only.to_json(), ) .expect("Unable to write keygen history data file"); @@ -526,7 +527,7 @@ fn main() { fs::write( "fork_example.json", - key_sync_history_data(&parts, &acks, &enodes_map, false).create_example_fork_definition().to_json(), + key_sync_file_validators_only.create_example_fork_definition().to_json(), ) .expect("Unable to write fork_example.json data file"); } From 5071dcd68ae256270de18c2a912414c2f9489d6b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 13:31:19 +0100 Subject: [PATCH 108/166] hbbft_network_fork_manager: fixed creating HbbftFork from definition --- .../src/engines/hbbft/hbbft_network_fork_manager.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 686b1da95..5224429ce 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,9 +1,10 @@ + use std::{ collections::{BTreeMap, VecDeque}, sync::Arc, }; -use ethereum_types::Address; +use ethereum_types::{Address, H512}; use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::{ crypto::PublicKeySet, @@ -61,13 +62,8 @@ impl HbbftFork { fork_acks }).collect(); - let node_ids = fork_definiton.parts.iter().map(|h| { - if let Ok(node_id) = bincode::deserialize( h.as_slice()) { - node_id - } else { - error!(target:"engine", "hbbft-hardfork: could not interprete nodeIds from spec: {:?}", h.as_slice()); - panic!("hbbft-hardfork: could not interprete part from spec: {:?}", h.as_slice()); - } + let node_ids = fork_definiton.validators.iter().map(|h| { + NodeId(H512::from_slice(h.as_slice())) }).collect(); HbbftFork { From 0f7113155b1f6afdf62aa22a3c914b681b2f9e21 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 19 Feb 2024 23:34:52 +0100 Subject: [PATCH 109/166] improved unit test for hbbft_network_fork_manager --- .../src/engines/hbbft/hbbft_network_fork_manager.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 5224429ce..fd694731a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -333,9 +333,12 @@ mod tests { let signer_lock = Arc::new(RwLock::new(Some(signer))); let own_id = NodeId::default(); - fork_manager.initialize(own_id, 1, vec![test_fork]); - - assert!(fork_manager.should_fork(9, 1, signer_lock).is_none()); + fork_manager.initialize(own_id, 8, vec![test_fork]); + assert!(fork_manager.should_fork(9, 1, signer_lock.clone()).is_none()); + let fork = fork_manager.should_fork(10, 1, signer_lock.clone()); + assert!(fork.is_some()); + assert!(fork.unwrap().num_nodes() == 2); + assert!(fork_manager.should_fork(11, 1, signer_lock.clone()).is_none()); } } From 87b54a8b0403048d0fa371a80951a0fcd5fa0394 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 20 Feb 2024 16:20:13 +0100 Subject: [PATCH 110/166] cargo fmt --all -- --config imports_granularity=Crate --- .../src/keygen_history_helpers.rs | 24 +++++++------ .../hbbft/hbbft_network_fork_manager.rs | 36 ++++++++++--------- .../ethcore/src/engines/hbbft/hbbft_state.rs | 9 +++-- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs index b2f0a76b0..f627499d7 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs @@ -122,24 +122,26 @@ pub struct KeyGenHistoryData { acks: Vec>>, } - impl KeyGenHistoryData { pub fn to_json(&self) -> String { serde_json::to_string(self).expect("Keygen History must convert to JSON") } pub fn create_example_fork_definition(&self) -> HbbftNetworkFork { + let validators: Vec> = self + .public_keys + .iter() + .map(|v| { + let mut hex = v.clone(); + println!("public key: {}", v); + if v.starts_with("0x") { + hex = v.split_at(2).1.to_string(); + } - let validators : Vec> = self.public_keys.iter().map(|v| { - let mut hex = v.clone(); - println!("public key: {}", v); - if v.starts_with("0x") { - hex = v.split_at(2).1.to_string(); - } - - let public = hex.parse::().expect("Could not parse public key"); - public.as_bytes().to_vec() - }).collect(); + let public = hex.parse::().expect("Could not parse public key"); + public.as_bytes().to_vec() + }) + .collect(); HbbftNetworkFork { block_number_start: 10, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index fd694731a..44acbd521 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -1,4 +1,3 @@ - use std::{ collections::{BTreeMap, VecDeque}, sync::Arc, @@ -62,9 +61,11 @@ impl HbbftFork { fork_acks }).collect(); - let node_ids = fork_definiton.validators.iter().map(|h| { - NodeId(H512::from_slice(h.as_slice())) - }).collect(); + let node_ids = fork_definiton + .validators + .iter() + .map(|h| NodeId(H512::from_slice(h.as_slice()))) + .collect(); HbbftFork { start_block: fork_definiton.block_number_start, @@ -110,7 +111,6 @@ impl HbbftNetworkForkManager { if let Some(next_fork) = self.pending_forks.front_mut() { if next_fork.start_block == last_block_number { - let wrapper = KeyPairWrapper { inner: signer_lock.clone(), }; @@ -306,26 +306,25 @@ mod tests { use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{Ack, Part}; - use crypto::publickey::{ - KeyPair, Secret, - }; + use crypto::publickey::{KeyPair, Secret}; //use parity_crypto::publickey::{KeyPair, Secret}; #[test] fn test_fork_manager_should_fork() { - let mut fork_manager = HbbftNetworkForkManager::new(); - - let test_file_content = std::fs::read("res/local_tests/hbbft/hbbft_test_fork.json").expect("could not read test file."); - let test_fork = serde_json::from_slice::(test_file_content.as_slice()).expect("fork file is parsable."); + let test_file_content = std::fs::read("res/local_tests/hbbft/hbbft_test_fork.json") + .expect("could not read test file."); + let test_fork = serde_json::from_slice::(test_file_content.as_slice()) + .expect("fork file is parsable."); //let test_client = HbbftTestClient::new(); - + let key1 = KeyPair::from_secret( Secret::from_str("0000000000000000000000000000000000000000000000000000000000000001") .unwrap(), - ).unwrap(); + ) + .unwrap(); let signer = from_keypair(key1); @@ -334,11 +333,14 @@ mod tests { let own_id = NodeId::default(); fork_manager.initialize(own_id, 8, vec![test_fork]); - assert!(fork_manager.should_fork(9, 1, signer_lock.clone()).is_none()); + assert!(fork_manager + .should_fork(9, 1, signer_lock.clone()) + .is_none()); let fork = fork_manager.should_fork(10, 1, signer_lock.clone()); assert!(fork.is_some()); assert!(fork.unwrap().num_nodes() == 2); - assert!(fork_manager.should_fork(11, 1, signer_lock.clone()).is_none()); - + assert!(fork_manager + .should_fork(11, 1, signer_lock.clone()) + .is_none()); } } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index d8e0b7f76..c637a3a51 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -114,11 +114,14 @@ impl HbbftState { // this might happen for a lot of key-gen rounds, until a set with responsive validators // can be found. - if let Some(last_block_number) = client.block_number(block_id) { - if let Some(network_info) = self.fork_manager.should_fork(last_block_number, self.current_posdao_epoch, signer.clone()) { + if let Some(network_info) = self.fork_manager.should_fork( + last_block_number, + self.current_posdao_epoch, + signer.clone(), + ) { info!(target: "engine", "Forking at block {last_block_number}, starting new honeybadger instance with new validator set."); - + self.public_master_key = Some(network_info.public_key_set().public_key()); self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); self.network_info = Some(network_info); From a7b52d3ad4f7fb66fa3ccc8c3d51f74b80fa1abe Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 25 Feb 2024 14:35:14 +0100 Subject: [PATCH 111/166] witing out a fork example definition --- .../hbbft/hbbft_config_generator/src/main.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 49db88e6a..64a011316 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -3,6 +3,7 @@ extern crate bincode; extern crate clap; extern crate ethcore; extern crate ethereum_types; +extern crate ethjson; extern crate ethkey; extern crate ethstore; extern crate hbbft; @@ -12,7 +13,6 @@ extern crate rustc_hex; extern crate serde; extern crate serde_json; extern crate toml; -extern crate ethjson; mod keygen_history_helpers; @@ -374,6 +374,11 @@ fn main() { .required(false) .takes_value(true), ) + .arg(Arg::with_name("fork_block") + .long("fork block number") + .help("defines a fork block number.") + .required(false) + .takes_value(true),) .get_matches(); let num_nodes_validators: usize = matches @@ -396,6 +401,13 @@ fn main() { ) }); + let fork_block_number: Option = matches.value_of("fork_block_number").map_or(None, |v| { + Some( + v.parse::() + .expect("fork_block_number need to be of integer type"), + ) + }); + let metrics_port_base: Option = matches.value_of("metrics_port_base").map_or(None, |v| { Some( v.parse::() @@ -527,7 +539,9 @@ fn main() { fs::write( "fork_example.json", - key_sync_file_validators_only.create_example_fork_definition().to_json(), + key_sync_file_validators_only + .create_example_fork_definition() + .to_json(), ) .expect("Unable to write fork_example.json data file"); } From 8b30c833874561b3410bcbf5454be1b456186ffb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 26 Feb 2024 12:57:56 +0100 Subject: [PATCH 112/166] support definition of Ports as CLI Argument --- .../hbbft/hbbft_config_generator/src/main.rs | 77 ++++++++++++++++--- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 64a011316..13a7c83a3 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -112,11 +112,10 @@ fn to_toml( tx_queue_per_sender: Option, base_metrics_port: Option, metrics_interface: Option<&str>, + base_port: u16, + base_rpc_port: u16, + base_ws_port: u16, ) -> Value { - let base_port = 30300i64; - let base_rpc_port = 8540i64; - let base_ws_port = 9540i64; - let mut parity = Map::new(); match config_type { ConfigType::PosdaoSetup => { @@ -134,7 +133,7 @@ fn to_toml( } let mut network = Map::new(); - network.insert("port".into(), Value::Integer(base_port + i as i64)); + network.insert("port".into(), Value::Integer((base_port as usize + i) as i64)); match config_type { ConfigType::PosdaoSetup => { network.insert( @@ -183,12 +182,12 @@ fn to_toml( "traces", ]); rpc.insert("apis".into(), apis); - rpc.insert("port".into(), Value::Integer(base_rpc_port + i as i64)); + rpc.insert("port".into(), Value::Integer((base_rpc_port as usize + i) as i64)); let mut websockets = Map::new(); websockets.insert("interface".into(), Value::String("all".into())); websockets.insert("origins".into(), to_toml_array(vec!["all"])); - websockets.insert("port".into(), Value::Integer(base_ws_port + i as i64)); + websockets.insert("port".into(), Value::Integer((base_ws_port as usize + i) as i64)); let mut ipc = Map::new(); ipc.insert("disable".into(), Value::Boolean(true)); @@ -375,10 +374,33 @@ fn main() { .takes_value(true), ) .arg(Arg::with_name("fork_block") - .long("fork block number") - .help("defines a fork block number.") - .required(false) - .takes_value(true),) + .long("fork block number") + .help("defines a fork block number.") + .required(false) + .takes_value(true), + ) + .arg( + Arg::with_name("port_base") + .long("port_base") + .help("devp2p communication port base address") + .required(false) + .default_value("30300") + .takes_value(true), + ).arg( + Arg::with_name("port_base_rpc") + .long("port_base_rpc") + .help("rpc port base") + .required(false) + .default_value("8540") + .takes_value(true), + ).arg( + Arg::with_name("port_base_ws") + .long("port_base_ws") + .help("rpc web socket port base") + .required(false) + .default_value("9540") + .takes_value(true), + ) .get_matches(); let num_nodes_validators: usize = matches @@ -415,6 +437,27 @@ fn main() { ) }); + let port_base: Option = matches.value_of("port_base").map_or(None, |v| { + Some( + v.parse::() + .expect("metrics_port need to be an integer port definition 1-65555"), + ) + }); + + let port_base_rpc: Option = matches.value_of("port_base_rpc").map_or(None, |v| { + Some( + v.parse::() + .expect("metrics_port need to be an integer port definition 1-65555"), + ) + }); + + let port_base_ws: Option = matches.value_of("port_base_ws").map_or(None, |v| { + Some( + v.parse::() + .expect("metrics_port need to be an integer port definition 1-65555"), + ) + }); + std::println!("metrics_port_base: {:?}", metrics_port_base); let metrics_interface = matches.value_of("metrics_interface"); @@ -472,6 +515,7 @@ fn main() { .expect("enode should be written to the reserved peers string"); let i = enode.idx; let file_name = format!("hbbft_validator_{}.toml", i); + // the unwrap is safe, because there is a default value defined. let toml_string = toml::to_string(&to_toml( i, &config_type, @@ -481,6 +525,9 @@ fn main() { tx_queue_per_sender.clone(), metrics_port_base, metrics_interface, + port_base.unwrap(), + port_base_rpc.unwrap(), + port_base_ws.unwrap() )) .expect("TOML string generation should succeed"); fs::write(file_name, toml_string).expect("Unable to write config file"); @@ -503,6 +550,11 @@ fn main() { format!("hbbft_validator_key_{}.json", i), ); } + + // let base_port = 30300i64; + // let base_rpc_port = 8540i64; + // let base_ws_port = 9540i64; + // Write rpc node config let rpc_string = toml::to_string(&to_toml( 0, @@ -513,6 +565,9 @@ fn main() { tx_queue_per_sender.clone(), metrics_port_base, metrics_interface, + port_base.unwrap(), + port_base_rpc.unwrap(), + port_base_ws.unwrap(), )) .expect("TOML string generation should succeed"); fs::write("rpc_node.toml", rpc_string).expect("Unable to write rpc config file"); From fad68e1c8f586953ac181bac64d87b8484e98782 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 26 Feb 2024 22:45:00 +0100 Subject: [PATCH 113/166] added port management for enodes and reserved peers file generation. --- .../hbbft/hbbft_config_generator/src/main.rs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 13a7c83a3..d5af6b506 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -41,14 +41,15 @@ pub struct Enode { address: Address, idx: usize, ip: String, + port: u16, } impl ToString for Enode { fn to_string(&self) -> String { // Example: // enode://30ccdeb8c31972f570e4eea0673cd08cbe7cefc5de1d70119b39c63b1cba33b48e494e9916c0d1eab7d296774f3573da46025d1accdef2f3690bc9e6659a34b4@192.168.0.101:30300 - let port = 30300usize + self.idx; - format!("enode://{:x}@{}:{}", self.public, self.ip, port) + + format!("enode://{:x}@{}:{}", self.public, self.ip, self.port) } } @@ -56,6 +57,7 @@ fn generate_enodes( num_nodes: usize, private_keys: Vec, external_ip: Option<&str>, + port_base: u16, ) -> BTreeMap { let mut map = BTreeMap::new(); for i in 0..num_nodes { @@ -85,6 +87,7 @@ fn generate_enodes( address, idx, ip: ip.into(), + port: port_base + i as u16, }, ); } @@ -437,12 +440,11 @@ fn main() { ) }); - let port_base: Option = matches.value_of("port_base").map_or(None, |v| { - Some( + + let port_base: u16 = matches.value_of("port_base").map( |v| { v.parse::() - .expect("metrics_port need to be an integer port definition 1-65555"), - ) - }); + .expect("metrics_port need to be an integer port definition 1-65555") + }).unwrap(); let port_base_rpc: Option = matches.value_of("port_base_rpc").map_or(None, |v| { Some( @@ -487,7 +489,7 @@ fn main() { assert!(private_keys.len() == num_nodes_total); }; - let enodes_map = generate_enodes(num_nodes_total, private_keys, external_ip); + let enodes_map = generate_enodes(num_nodes_total, private_keys, external_ip, port_base); let mut rng = rand::thread_rng(); let pub_keys = enodes_to_pub_keys(&enodes_map); @@ -525,7 +527,7 @@ fn main() { tx_queue_per_sender.clone(), metrics_port_base, metrics_interface, - port_base.unwrap(), + port_base, port_base_rpc.unwrap(), port_base_ws.unwrap() )) @@ -565,7 +567,7 @@ fn main() { tx_queue_per_sender.clone(), metrics_port_base, metrics_interface, - port_base.unwrap(), + port_base, port_base_rpc.unwrap(), port_base_ws.unwrap(), )) From b57aa5693f6b93de52780def969db642726a58bf Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Mar 2024 15:30:09 +0100 Subject: [PATCH 114/166] fixed test test_threshold_encryption_multiple --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index d5af6b506..be4ec5c6d 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -647,7 +647,7 @@ mod tests { let num_nodes = 4; let t = 1; - let enodes = generate_enodes(num_nodes, Vec::new(), None); + let enodes = generate_enodes(num_nodes, Vec::new(), None, 30300); let pub_keys = enodes_to_pub_keys(&enodes); let mut rng = rand::thread_rng(); From 3e04f9c4c3c47633c0221e1e5165a97d9196e3ea Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 11 Mar 2024 17:12:49 +0100 Subject: [PATCH 115/166] fixed a bug concerning used port and port used in reserved peers, simplified some things by using Vec instead of BTreeMap. --- .../src/keygen_history_helpers.rs | 20 ++--- .../hbbft/hbbft_config_generator/src/main.rs | 85 +++++++++---------- 2 files changed, 51 insertions(+), 54 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs index f627499d7..095011159 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs @@ -93,15 +93,13 @@ pub fn generate_keygens( (sync_keygen, parts, acks) } -pub fn enodes_to_pub_keys( - enodes: &BTreeMap, -) -> Arc> { +pub fn enodes_to_pub_keys(enodes: &Vec) -> Arc> { Arc::new( enodes .iter() - .map(|(n, e)| { + .map(|e| { ( - n.clone(), + e.public.clone(), KeyPairWrapper { public: e.public, secret: e.secret.clone(), @@ -156,7 +154,7 @@ impl KeyGenHistoryData { pub fn key_sync_history_data( parts: &BTreeMap, acks: &BTreeMap>, - enodes: &BTreeMap, + enodes: &Vec, include_validators_only: bool, ) -> KeyGenHistoryData { let mut data = KeyGenHistoryData { @@ -173,10 +171,13 @@ pub fn key_sync_history_data( let mut acks_total_bytes = 0; let mut num_acks = 0; - let ids = enodes.keys(); + //let ids: Vec = enodes.iter().map(|e| e.public.clone()).collect(); + let mut staking_counter = 1; // Add Parts and Acks in strict order - for id in ids { + for enode in enodes.iter() { + let id = &enode.public; + // if there is no part available for this node, // then the it is not a initial validator. @@ -189,8 +190,7 @@ pub fn key_sync_history_data( data.staking_addresses .push(format!("{:?}", Address::from_low_u64_be(staking_counter))); staking_counter += 1; - data.public_keys - .push(format!("{:?}", enodes.get(id).unwrap().public)); + data.public_keys.push(format!("{:?}", id)); data.ip_addresses .push(format!("{:?}", H128::from_low_u64_be(1))); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index be4ec5c6d..978166c44 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -20,10 +20,7 @@ use clap::{App, Arg}; use ethstore::{KeyFile, SafeAccount}; use keygen_history_helpers::{enodes_to_pub_keys, generate_keygens, key_sync_history_data}; use parity_crypto::publickey::{Address, Generator, KeyPair, Public, Random, Secret}; -use std::{ - collections::BTreeMap, convert::TryInto, fmt::Write, fs, num::NonZeroU32, str::FromStr, - sync::Arc, -}; +use std::{convert::TryInto, fmt::Write, fs, num::NonZeroU32, str::FromStr}; use toml::{map::Map, Value}; pub fn create_account() -> (Secret, Public, Address) { @@ -48,7 +45,7 @@ impl ToString for Enode { fn to_string(&self) -> String { // Example: // enode://30ccdeb8c31972f570e4eea0673cd08cbe7cefc5de1d70119b39c63b1cba33b48e494e9916c0d1eab7d296774f3573da46025d1accdef2f3690bc9e6659a34b4@192.168.0.101:30300 - + format!("enode://{:x}@{}:{}", self.public, self.ip, self.port) } } @@ -58,8 +55,8 @@ fn generate_enodes( private_keys: Vec, external_ip: Option<&str>, port_base: u16, -) -> BTreeMap { - let mut map = BTreeMap::new(); +) -> Vec { + let mut map = Vec::new(); for i in 0..num_nodes { // Note: node 0 is a regular full node (not a validator) in the testnet setup, so we start at index 1. let idx = i + 1; @@ -79,26 +76,23 @@ fn generate_enodes( create_account() }; println!("Debug, Secret: {:?}", secret); - map.insert( + map.push(Enode { + secret, public, - Enode { - secret, - public, - address, - idx, - ip: ip.into(), - port: port_base + i as u16, - }, - ); + address, + idx, + ip: ip.into(), + port: port_base + idx as u16, + }); } // the map has the element order by their public key. // we reassign the idx here, so the index of the nodes follows // the same order like everything else. - let mut new_index = 1; - for public in map.iter_mut() { - public.1.idx = new_index; - new_index = new_index + 1; - } + // let mut new_index = 1; + // for public in map.iter_mut() { + // public.1.idx = new_index; + // new_index = new_index + 1; + // } map } @@ -136,7 +130,10 @@ fn to_toml( } let mut network = Map::new(); - network.insert("port".into(), Value::Integer((base_port as usize + i) as i64)); + network.insert( + "port".into(), + Value::Integer((base_port as usize + i) as i64), + ); match config_type { ConfigType::PosdaoSetup => { network.insert( @@ -185,12 +182,18 @@ fn to_toml( "traces", ]); rpc.insert("apis".into(), apis); - rpc.insert("port".into(), Value::Integer((base_rpc_port as usize + i) as i64)); + rpc.insert( + "port".into(), + Value::Integer((base_rpc_port as usize + i) as i64), + ); let mut websockets = Map::new(); websockets.insert("interface".into(), Value::String("all".into())); websockets.insert("origins".into(), to_toml_array(vec!["all"])); - websockets.insert("port".into(), Value::Integer((base_ws_port as usize + i) as i64)); + websockets.insert( + "port".into(), + Value::Integer((base_ws_port as usize + i) as i64), + ); let mut ipc = Map::new(); ipc.insert("disable".into(), Value::Boolean(true)); @@ -440,11 +443,13 @@ fn main() { ) }); - - let port_base: u16 = matches.value_of("port_base").map( |v| { + let port_base: u16 = matches + .value_of("port_base") + .map(|v| { v.parse::() .expect("metrics_port need to be an integer port definition 1-65555") - }).unwrap(); + }) + .unwrap(); let port_base_rpc: Option = matches.value_of("port_base_rpc").map_or(None, |v| { Some( @@ -489,30 +494,22 @@ fn main() { assert!(private_keys.len() == num_nodes_total); }; - let enodes_map = generate_enodes(num_nodes_total, private_keys, external_ip, port_base); + let enodes = generate_enodes(num_nodes_total, private_keys, external_ip, port_base); let mut rng = rand::thread_rng(); - let pub_keys = enodes_to_pub_keys(&enodes_map); + //let pub_keys = enodes_to_pub_keys(&enodes_map); - // we only need the first x pub_keys - let pub_keys_for_key_gen_btree = pub_keys - .iter() - .take(num_nodes_validators) - .map(|x| (x.0.clone(), x.1.clone())) - .collect(); + let pub_keys_for_key_gen_btree = enodes_to_pub_keys(&enodes); let (_sync_keygen, parts, acks) = generate_keygens( - Arc::new(pub_keys_for_key_gen_btree), + pub_keys_for_key_gen_btree.clone(), &mut rng, (num_nodes_validators - 1) / 3, ); let mut reserved_peers = String::new(); - for pub_key in pub_keys.iter() { - let our_id = pub_key.0; - - let enode = enodes_map.get(our_id).expect("validator id must be mapped"); + for enode in enodes.iter() { writeln!(&mut reserved_peers, "{}", enode.to_string()) .expect("enode should be written to the reserved peers string"); let i = enode.idx; @@ -529,7 +526,7 @@ fn main() { metrics_interface, port_base, port_base_rpc.unwrap(), - port_base_ws.unwrap() + port_base_ws.unwrap(), )) .expect("TOML string generation should succeed"); fs::write(file_name, toml_string).expect("Unable to write config file"); @@ -580,7 +577,7 @@ fn main() { // Write the password file fs::write("password.txt", "test").expect("Unable to write password.txt file"); - let key_sync_file_validators_only = key_sync_history_data(&parts, &acks, &enodes_map, true); + let key_sync_file_validators_only = key_sync_history_data(&parts, &acks, &enodes, true); // only pass over enodes in the enodes_map that are also available for acks and parts. fs::write( "keygen_history.json", @@ -590,7 +587,7 @@ fn main() { fs::write( "nodes_info.json", - key_sync_history_data(&parts, &acks, &enodes_map, false).to_json(), + key_sync_history_data(&parts, &acks, &enodes, false).to_json(), ) .expect("Unable to write nodes_info data file"); From 737f2291e23333f972988af47e0a55365f80b426 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Mar 2024 10:09:14 +0100 Subject: [PATCH 116/166] fork: reporting if block number could not get read --- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index c637a3a51..a6b202a4d 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -126,6 +126,8 @@ impl HbbftState { self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); self.network_info = Some(network_info); } + } else { + error!(target: "engine", "fork: could not get block number for block_id: {:?}", block_id); } // From 9b5286a204fad2a2d8b6d6be3ec5cbb63a20e4eb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Mar 2024 11:02:34 +0100 Subject: [PATCH 117/166] log "hbbft_message_memorium report new epoch" is now Info Level --- crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 44acbd521..49d5dfff9 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -237,6 +237,8 @@ impl HbbftNetworkForkManager { panic!("HbbftNetworkForkManager is already initialized"); } + debug!(target: "engine", "hbbft-hardfork: initializing HbbftNetworkForkManager. Startup block number: {}", startup_block_number); + self.own_id = own_id; fork_definition.sort_by_key(|fork| fork.block_number_start); From d9b90535d149653d377f08d828125f305875194d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 14 Mar 2024 23:41:34 +0100 Subject: [PATCH 118/166] log level decreased for hbbft_message_memorium -> report new epoch: --- crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs index ebe87422b..184c187d2 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_message_memorium.rs @@ -949,7 +949,7 @@ impl HbbftMessageMemorium { // report that hbbft has switched to a new staking epoch pub fn report_new_epoch(&mut self, staking_epoch: u64, staking_epoch_start_block: u64) { - warn!(target: "hbbft_message_memorium", "report new epoch: {}", staking_epoch); + debug!(target: "hbbft_message_memorium", "report new epoch: {}", staking_epoch); self.latest_epoch = staking_epoch; self.latest_epoch_start_block = staking_epoch_start_block; if let Ok(epoch_history_index) = self From 4e791aff91a705bf94c7a582b897430e51eb3ac4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 17 Mar 2024 18:32:48 +0100 Subject: [PATCH 119/166] fork: debug output during config --- .../hbbft/hbbft_network_fork_manager.rs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 49d5dfff9..f5ab2df08 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -231,16 +231,23 @@ impl HbbftNetworkForkManager { &mut self, own_id: NodeId, startup_block_number: u64, - mut fork_definition: Vec, + fork_definition_config: Vec, ) { if self.is_init { panic!("HbbftNetworkForkManager is already initialized"); } - debug!(target: "engine", "hbbft-hardfork: initializing HbbftNetworkForkManager. Startup block number: {}", startup_block_number); + if fork_definition_config.len() == 0 { + + self.is_init = true; + return; + } + + debug!(target: "engine", "hbbft-hardfork: initializing HbbftNetworkForkManager. Startup block number: {} total forks defined: {}", startup_block_number, fork_definition.len()); self.own_id = own_id; + let mut fork_definition = fork_definition_config.clone(); fork_definition.sort_by_key(|fork| fork.block_number_start); // the fork definition can contain @@ -265,11 +272,23 @@ impl HbbftNetworkForkManager { continue; } + let fork = HbbftFork::from_definition(fork_def); + debug!(target: "engine", "hbbft-hardfork: added upcomming fork - add block {:?}", fork.start_block); + self.pending_forks - .push_back(HbbftFork::from_definition(fork_def)); + .push_back(fork); + } else if fork_def.block_number_start <= startup_block_number { + + let fork = HbbftFork::from_definition(fork_def); + debug!(target: "engine", "hbbft-hardfork: added upcomming fork - add block {:?}", fork.start_block); + + self.pending_forks + .push_back(fork); } } + self.is_init = true; + // self.fork_definition.iter().filter(predicate).for_each(|fork| { // self.pending_forks.push_back(HbbftFork { // start_timestamp: 0, From 3824d779b41d902a39aa1efed71d40156af283bc Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 17 Mar 2024 19:15:39 +0100 Subject: [PATCH 120/166] fixed compile error --- crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index f5ab2df08..56763149e 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -243,7 +243,7 @@ impl HbbftNetworkForkManager { return; } - debug!(target: "engine", "hbbft-hardfork: initializing HbbftNetworkForkManager. Startup block number: {} total forks defined: {}", startup_block_number, fork_definition.len()); + debug!(target: "engine", "hbbft-hardfork: initializing HbbftNetworkForkManager. Startup block number: {} total forks defined: {}", startup_block_number, fork_definition_config.len()); self.own_id = own_id; From 961a677be3d51862de1295975d520d50c9004af2 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 17 Mar 2024 21:06:40 +0100 Subject: [PATCH 121/166] fixed fork manager fork starts in the future --- .../engines/hbbft/hbbft_network_fork_manager.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 56763149e..4ca7b9aaa 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -277,7 +277,7 @@ impl HbbftNetworkForkManager { self.pending_forks .push_back(fork); - } else if fork_def.block_number_start <= startup_block_number { + } else if fork_def.block_number_start >= startup_block_number { let fork = HbbftFork::from_definition(fork_def); debug!(target: "engine", "hbbft-hardfork: added upcomming fork - add block {:?}", fork.start_block); @@ -288,21 +288,6 @@ impl HbbftNetworkForkManager { } self.is_init = true; - - // self.fork_definition.iter().filter(predicate).for_each(|fork| { - // self.pending_forks.push_back(HbbftFork { - // start_timestamp: 0, - // start_block: fork.block_number_start, - // is_finished: false, - // end_timestamp: 0, - // end_block: 0, - // validator_set: HbbftForkKeys { - // validators: fork.validators.clone(), - // parts: Vec::new(), - // acks: Vec::new(), - // }, - // }); - // }); } pub fn new() -> HbbftNetworkForkManager { From cebd95debd4e91469dfd01a8f90966c82ea4a6c0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 18 Mar 2024 14:59:34 +0100 Subject: [PATCH 122/166] early epoch manager: improved logging for the early epoch manager (ConnectivityTracker) --- .../engines/hbbft/hbbft_early_epoch_end_manager.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 5646fa578..5ff30bcf0 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -137,18 +137,21 @@ impl HbbftEarlyEpochEndManager { continue; }; - if let Ok(reported) = is_connectivity_loss_reported( + match is_connectivity_loss_reported( client, block_id, signing_address, epoch, validator_address, ) { - if reported { - result.push(validator.clone()); + Ok(reported) => { + if reported { + result.push(validator.clone()); + } + } + Err(e) => { + error!(target: "engine", "early-epoch-end: could not get reported status for validator {validator:?}. call error: {e:?}"); } - } else { - error!(target: "engine", "early-epoch-end: could not get reported status for validator {validator:?}"); } } From e28d22eefaadcf126216b061d1a9a21b595e363a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 18 Mar 2024 19:14:57 +0100 Subject: [PATCH 123/166] commented out implementation for get_current_flagged_validators_from_contract, since we are interested only if we got other nodes flagged or not. --- .../contracts/connectivity_tracker_hbbft.rs | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index b99958f17..2bef3ce7e 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -45,20 +45,22 @@ pub fn is_connectivity_loss_reported( )?); } -pub fn get_current_flagged_validators_from_contract( - client: &dyn EngineClient, - block_id: BlockId, -) -> Result, CallError> { - let c = BoundContract::bind( - client, - block_id, - *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, - ); - return Ok(call_const_connectivity_tracker_hbbft!( - c, - get_flagged_validators - )?); -} +// currently not required for operation. +// we just check if "we" have reported the validator. +// pub fn get_current_flagged_validators_from_contract( +// client: &dyn EngineClient, +// block_id: BlockId, +// ) -> Result, CallError> { +// let c = BoundContract::bind( +// client, +// block_id, +// *CONNECTIVITY_TRACKER_HBBFT_CONTRACT_ADDRESS, +// ); +// return Ok(call_const_connectivity_tracker_hbbft!( +// c, +// get_flagged_validators +// )?); +// } fn get_block_data(client: &dyn EngineClient) -> (u64, H256) { if let Some(block_number) = client.block_number(BlockId::Latest) { From e0b350c05dc012afe0893e49180a7348580558d6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 18 Mar 2024 19:24:04 +0100 Subject: [PATCH 124/166] decreased log level for: "Block creation: Batch received for" --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index f3f1b088b..fc0514881 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -503,7 +503,7 @@ impl HoneyBadgerBFT { }) .collect(); - info!(target: "consensus", "Block creation: Batch received for epoch {}, total {} contributions, with {} unique transactions.", batch.epoch, batch + debug!(target: "consensus", "Block creation: Batch received for epoch {}, total {} contributions, with {} unique transactions.", batch.epoch, batch .contributions.iter().fold(0, |i, c| i + c.1.transactions.len()), batch_txns.len()); // Make sure the resulting transactions do not contain nonces out of order. From 4c621f79c40c3b3f34441dea5296970df6706ed4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 21 Mar 2024 22:28:55 +0100 Subject: [PATCH 125/166] - debug output of forked validators. --- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index a6b202a4d..90e262769 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -44,6 +44,7 @@ pub(crate) struct HbbftState { public_master_key: Option, current_posdao_epoch: u64, current_posdao_epoch_start_block: u64, + last_fork_start_block: Option, last_posdao_epoch_start_block: Option, future_messages_cache: BTreeMap>, fork_manager: HbbftNetworkForkManager, @@ -58,6 +59,7 @@ impl HbbftState { current_posdao_epoch: 0, current_posdao_epoch_start_block: 0, last_posdao_epoch_start_block: None, + last_fork_start_block: None, future_messages_cache: BTreeMap::new(), fork_manager: HbbftNetworkForkManager::new(), } @@ -103,6 +105,7 @@ impl HbbftState { } } + let mut has_forked = false; // https://github.com/DMDcoin/diamond-node/issues/98 // check here if we are in a fork scenario. // in a fork scenario, the new honeybadger keys will come from the config, @@ -124,14 +127,23 @@ impl HbbftState { self.public_master_key = Some(network_info.public_key_set().public_key()); self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); + + for x in network_info.validator_set().all_ids() { + info!(target: "engine", "Validator: {:?}", x); + } + self.network_info = Some(network_info); + self.last_fork_start_block = Some(last_block_number); + + + has_forked = true; } } else { error!(target: "engine", "fork: could not get block number for block_id: {:?}", block_id); } // - if !force && self.current_posdao_epoch == target_posdao_epoch { + if !force && self.current_posdao_epoch == target_posdao_epoch && !has_forked { // hbbft state is already up to date. // @todo Return proper error codes. return Some(()); From 9e563e66ed3e49f8e8b5b71efae648bb2e73335f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 28 Mar 2024 10:08:50 +0100 Subject: [PATCH 126/166] fixed bug where num_nodes_validators was not respected anymore. --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 978166c44..b6e99bc58 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -32,6 +32,7 @@ pub fn create_account() -> (Secret, Public, Address) { ) } +#[derive(Clone)] pub struct Enode { secret: Secret, public: Public, @@ -499,7 +500,9 @@ fn main() { //let pub_keys = enodes_to_pub_keys(&enodes_map); - let pub_keys_for_key_gen_btree = enodes_to_pub_keys(&enodes); + let enodes_for_key : Vec = enodes.iter().take(num_nodes_validators).map(|e| e.clone()).collect(); + + let pub_keys_for_key_gen_btree = enodes_to_pub_keys(&enodes_for_key); let (_sync_keygen, parts, acks) = generate_keygens( pub_keys_for_key_gen_btree.clone(), From 13b94051b41a716fb83e3ead44097107e0403d8a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 12 Apr 2024 13:32:39 +0200 Subject: [PATCH 127/166] .gitignore: add fork_example.json --- .../ethcore/src/engines/hbbft/hbbft_config_generator/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/.gitignore b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/.gitignore index e90ae314c..0c65d01ed 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/.gitignore +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/.gitignore @@ -13,3 +13,4 @@ password.txt reserved-peers rpc_node.toml nodes_info.json +fork_example.json From 61363ccb37dc87cfc95d65f36f0a645306d29a26 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 22 Apr 2024 17:28:39 +0200 Subject: [PATCH 128/166] cargo fmt --all -- --config imports_granularity=Crate --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 6 +++++- .../src/engines/hbbft/hbbft_network_fork_manager.rs | 8 ++------ crates/ethcore/src/engines/hbbft/hbbft_state.rs | 3 +-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index b6e99bc58..714fd9988 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -500,7 +500,11 @@ fn main() { //let pub_keys = enodes_to_pub_keys(&enodes_map); - let enodes_for_key : Vec = enodes.iter().take(num_nodes_validators).map(|e| e.clone()).collect(); + let enodes_for_key: Vec = enodes + .iter() + .take(num_nodes_validators) + .map(|e| e.clone()) + .collect(); let pub_keys_for_key_gen_btree = enodes_to_pub_keys(&enodes_for_key); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 4ca7b9aaa..36d6e43b8 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -238,7 +238,6 @@ impl HbbftNetworkForkManager { } if fork_definition_config.len() == 0 { - self.is_init = true; return; } @@ -275,15 +274,12 @@ impl HbbftNetworkForkManager { let fork = HbbftFork::from_definition(fork_def); debug!(target: "engine", "hbbft-hardfork: added upcomming fork - add block {:?}", fork.start_block); - self.pending_forks - .push_back(fork); + self.pending_forks.push_back(fork); } else if fork_def.block_number_start >= startup_block_number { - let fork = HbbftFork::from_definition(fork_def); debug!(target: "engine", "hbbft-hardfork: added upcomming fork - add block {:?}", fork.start_block); - self.pending_forks - .push_back(fork); + self.pending_forks.push_back(fork); } } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 90e262769..90d55a913 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -128,13 +128,12 @@ impl HbbftState { self.public_master_key = Some(network_info.public_key_set().public_key()); self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); - for x in network_info.validator_set().all_ids() { + for x in network_info.validator_set().all_ids() { info!(target: "engine", "Validator: {:?}", x); } self.network_info = Some(network_info); self.last_fork_start_block = Some(last_block_number); - has_forked = true; } From 1eecd4211f35002ee8057c0f242cfbf535a609be Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 22 Apr 2024 21:46:16 +0200 Subject: [PATCH 129/166] fixed hbbft_deserialization_forks test. ACKS were not provided as Array of Arrays. --- crates/ethjson/src/spec/hbbft.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethjson/src/spec/hbbft.rs b/crates/ethjson/src/spec/hbbft.rs index ec7d5215e..140195813 100644 --- a/crates/ethjson/src/spec/hbbft.rs +++ b/crates/ethjson/src/spec/hbbft.rs @@ -148,7 +148,7 @@ mod tests { "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678" ], "parts": ["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"], - "acks": ["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"] + "acks": [["19585436b7d97298a751e2a6020c30677497772013001420c0a6aea5790347bdf5531c1387be685a232b01ec614913b18da0a6cbcd1074f1733f902a7eb656e9"]] } ] } From 83b66d70247d1dfb244eb120413720674b7727a0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 28 Apr 2024 20:55:22 +0200 Subject: [PATCH 130/166] validator logging for fork + fix not reinitializing --- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 90d55a913..52e293f03 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -105,7 +105,6 @@ impl HbbftState { } } - let mut has_forked = false; // https://github.com/DMDcoin/diamond-node/issues/98 // check here if we are in a fork scenario. // in a fork scenario, the new honeybadger keys will come from the config, @@ -125,6 +124,10 @@ impl HbbftState { ) { info!(target: "engine", "Forking at block {last_block_number}, starting new honeybadger instance with new validator set."); + for id in network_info.validator_set().all_ids() { + info!(target: "engine", "Fork Validator: {}", id); + } + self.public_master_key = Some(network_info.public_key_set().public_key()); self.honey_badger = Some(self.new_honey_badger(network_info.clone())?); @@ -134,15 +137,16 @@ impl HbbftState { self.network_info = Some(network_info); self.last_fork_start_block = Some(last_block_number); + self.current_posdao_epoch_start_block = last_block_number; - has_forked = true; + return Some(()); } } else { error!(target: "engine", "fork: could not get block number for block_id: {:?}", block_id); } // - if !force && self.current_posdao_epoch == target_posdao_epoch && !has_forked { + if !force && self.current_posdao_epoch == target_posdao_epoch { // hbbft state is already up to date. // @todo Return proper error codes. return Some(()); From 660b1552fd01181f950ff2420c53a0e3276d526f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 1 May 2024 11:32:22 +0200 Subject: [PATCH 131/166] added debug log for initialize_synckeygen. --- crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index 94c3724db..a8a642d60 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -229,6 +229,7 @@ pub fn initialize_synckeygen( block_id: BlockId, validator_type: ValidatorType, ) -> Result, CallError> { + debug!(target: "engine", "Initializing SyncKeyGen with block_id: {:?}", block_id); let vmap = get_validator_pubkeys(&*client, block_id, validator_type)?; let pub_keys: BTreeMap<_, _> = vmap .values() From 786ba14fa289a33ceee047c509f84b07f26dea7d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 18 May 2024 09:56:34 +0200 Subject: [PATCH 132/166] encode ACKS ad PARTs as hex for Key Gen JSON https://github.com/DMDcoin/diamond-node/issues/112 --- Cargo.lock | 1 + .../src/engines/hbbft/hbbft_config_generator/Cargo.toml | 4 +++- .../hbbft_config_generator/src/keygen_history_helpers.rs | 4 ++++ .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index d33c539bf..60608d893 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2150,6 +2150,7 @@ dependencies = [ "rustc-hex 2.1.0", "serde", "serde_json", + "serde_with", "toml 0.5.8", ] diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml index 91ef228f6..b5a162b7e 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/Cargo.toml @@ -4,7 +4,8 @@ name = "hbbft_config_generator" version = "0.0.1" license = "GPL-3.0" authors = [ - "David Forstenlechner " + "David Forstenlechner ", + "Thomas Haller " ] [dependencies] @@ -22,6 +23,7 @@ rand = "0.7.3" rustc-hex = "2.1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +serde_with = { version = "3.6", features = [ "hex", "std", "macros" ] } toml = "0.5.6" [dev-dependencies] diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs index 095011159..e86d8cad4 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs @@ -5,6 +5,7 @@ use hbbft::sync_key_gen::{AckOutcome, Part, PartOutcome, PublicKey, SecretKey, S use parity_crypto::publickey::{public_to_address, Address, Public, Secret}; use serde::{Deserialize, Serialize}; use std::{collections::BTreeMap, sync::Arc}; +use serde_with::serde_as; #[derive(Clone)] pub struct KeyPairWrapper { @@ -110,13 +111,16 @@ pub fn enodes_to_pub_keys(enodes: &Vec) -> Arc, staking_addresses: Vec, public_keys: Vec, ip_addresses: Vec, + #[serde_as(as = "Vec")] parts: Vec>, + #[serde_as(as = "Vec>")] acks: Vec>>, } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 714fd9988..e5084f94a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -11,6 +11,7 @@ extern crate parity_crypto; extern crate rand; extern crate rustc_hex; extern crate serde; +extern crate serde_with; extern crate serde_json; extern crate toml; From 330f2fb184607913c2e0ab6245ed50f9d97ad625 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 May 2024 12:24:47 +0200 Subject: [PATCH 133/166] cargo fmt --all -- --config imports_granularity=Crate --- .../hbbft/hbbft_config_generator/src/keygen_history_helpers.rs | 2 +- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs index e86d8cad4..dba6e142a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/keygen_history_helpers.rs @@ -4,8 +4,8 @@ use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::sync_key_gen::{AckOutcome, Part, PartOutcome, PublicKey, SecretKey, SyncKeyGen}; use parity_crypto::publickey::{public_to_address, Address, Public, Secret}; use serde::{Deserialize, Serialize}; -use std::{collections::BTreeMap, sync::Arc}; use serde_with::serde_as; +use std::{collections::BTreeMap, sync::Arc}; #[derive(Clone)] pub struct KeyPairWrapper { diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index e5084f94a..3c7f83c10 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -11,8 +11,8 @@ extern crate parity_crypto; extern crate rand; extern crate rustc_hex; extern crate serde; -extern crate serde_with; extern crate serde_json; +extern crate serde_with; extern crate toml; mod keygen_history_helpers; From 844321ed048f3e8b8bc5f6cc7bf6ff3d7584b81c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 18 Jun 2024 21:59:35 +0200 Subject: [PATCH 134/166] pump arrayvec = "0.7" --- Cargo.lock | 8 +++++++- bin/oe/logger/Cargo.toml | 2 +- bin/oe/logger/src/rotating.rs | 6 +++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index edc57c6ad..78d0d30fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,6 +133,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "assert_matches" version = "1.3.0" @@ -1405,7 +1411,7 @@ name = "ethcore-logger" version = "1.12.0" dependencies = [ "ansi_term 0.10.2", - "arrayvec 0.4.12", + "arrayvec 0.7.4", "atty", "env_logger 0.5.13", "lazy_static", diff --git a/bin/oe/logger/Cargo.toml b/bin/oe/logger/Cargo.toml index 3e9655a25..9c388dbbe 100644 --- a/bin/oe/logger/Cargo.toml +++ b/bin/oe/logger/Cargo.toml @@ -13,5 +13,5 @@ lazy_static = "1.0" regex = "1.0" time = "0.1" parking_lot = "0.11.1" -arrayvec = "0.4" +arrayvec = "0.7" ansi_term = "0.10" diff --git a/bin/oe/logger/src/rotating.rs b/bin/oe/logger/src/rotating.rs index 7a00c85c3..e2b0567ce 100644 --- a/bin/oe/logger/src/rotating.rs +++ b/bin/oe/logger/src/rotating.rs @@ -50,7 +50,7 @@ pub struct RotatingLogger { /// Defined logger levels levels: String, /// Logs array. Latest log is always at index 0 - logs: RwLock>, + logs: RwLock>, } impl RotatingLogger { @@ -59,7 +59,7 @@ impl RotatingLogger { pub fn new(levels: String) -> Self { RotatingLogger { levels: levels, - logs: RwLock::new(ArrayVec::<[_; LOG_SIZE]>::new()), + logs: RwLock::new(ArrayVec::<_, LOG_SIZE>::new()), } } @@ -78,7 +78,7 @@ impl RotatingLogger { } /// Return logs - pub fn logs(&self) -> RwLockReadGuard> { + pub fn logs(&self) -> RwLockReadGuard> { self.logs.read() } } From 767ee924e9ead90a595e73b2495f98e5caf6b1b0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 18 Jun 2024 21:59:48 +0200 Subject: [PATCH 135/166] cleanup of unused imports --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 1 - crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index fc0514881..f2ea21420 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1,7 +1,6 @@ use super::{ block_reward_hbbft::BlockRewardContract, hbbft_early_epoch_end_manager::HbbftEarlyEpochEndManager, - hbbft_network_fork_manager::HbbftNetworkForkManager, }; use crate::{ client::BlockChainClient, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 36d6e43b8..d77d91faa 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -3,10 +3,9 @@ use std::{ sync::Arc, }; -use ethereum_types::{Address, H512}; +use ethereum_types::H512; use ethjson::spec::hbbft::HbbftNetworkFork; use hbbft::{ - crypto::PublicKeySet, sync_key_gen::{Ack, AckOutcome, Part, PartOutcome, SyncKeyGen}, util::max_faulty, NetworkInfo, From 6bdaf9c1c521e4db9f961a626fa182d652923211 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 25 Jun 2024 09:00:51 +0200 Subject: [PATCH 136/166] spec generation: removed gas floor target, decreased min gas price to 1000 wei. --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 3c7f83c10..66083b12b 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -231,11 +231,10 @@ fn to_toml( } mining.insert("force_sealing".into(), Value::Boolean(true)); - mining.insert("min_gas_price".into(), Value::Integer(1000000000)); - mining.insert( - "gas_floor_target".into(), - Value::String("1000000000".into()), - ); + // we put an extremly low min gas price in the config + // the min gas price is gathered from the DAO + // this makes sure that the min_gas_price wont be higher then the gas pricce the DAO decides. + mining.insert("min_gas_price".into(), Value::Integer(1000)); mining.insert("reseal_on_txs".into(), Value::String("none".into())); mining.insert("reseal_min_period".into(), Value::Integer(0)); From 16fddd364c2579a42bbb44235298538e08516317 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 25 Jun 2024 09:15:06 +0200 Subject: [PATCH 137/166] hbbft config generation: reduced default logging level for engine from trace to debug --- .../src/engines/hbbft/hbbft_config_generator/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 66083b12b..0a8966068 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -251,7 +251,7 @@ fn to_toml( // Value::String("txqueue=trace,consensus=debug,engine=trace,own_tx=trace,miner=trace,tx_filter=trace".into()) misc.insert( "logging".into(), - Value::String("txqueue=info,consensus=debug,engine=trace,tx_own=trace".into()), + Value::String("txqueue=info,consensus=debug,engine=debug,tx_own=trace".into()), ); misc.insert("log_file".into(), Value::String("diamond-node.log".into())); From 6f636f4e157cfa697ca740ba7a4ac1b848ba11bb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 26 Jun 2024 21:10:35 +0200 Subject: [PATCH 138/166] remove currfently unused API from generated network configs --- .../hbbft/hbbft_config_generator/src/main.rs | 63 +++++++++++-------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 0a8966068..81ebffd04 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -104,6 +104,7 @@ fn to_toml_array(vec: Vec<&str>) -> Value { fn to_toml( i: usize, + open_ports: bool, config_type: &ConfigType, external_ip: Option<&str>, signer_address: &Address, @@ -116,6 +117,7 @@ fn to_toml( base_ws_port: u16, ) -> Value { let mut parity = Map::new(); + match config_type { ConfigType::PosdaoSetup => { parity.insert("chain".into(), Value::String("./spec/spec.json".into())); @@ -169,33 +171,40 @@ fn to_toml( } let mut rpc = Map::new(); - rpc.insert("interface".into(), Value::String("all".into())); - rpc.insert("cors".into(), to_toml_array(vec!["all"])); - rpc.insert("hosts".into(), to_toml_array(vec!["all"])); - let apis = to_toml_array(vec![ - "web3", - "eth", - "pubsub", - "net", - "parity", - "parity_set", - "parity_pubsub", - "personal", - "traces", - ]); - rpc.insert("apis".into(), apis); - rpc.insert( - "port".into(), - Value::Integer((base_rpc_port as usize + i) as i64), - ); - let mut websockets = Map::new(); - websockets.insert("interface".into(), Value::String("all".into())); - websockets.insert("origins".into(), to_toml_array(vec!["all"])); - websockets.insert( - "port".into(), - Value::Integer((base_ws_port as usize + i) as i64), - ); + + if open_ports { + + rpc.insert("interface".into(), Value::String("all".into())); + rpc.insert("cors".into(), to_toml_array(vec!["all"])); + rpc.insert("hosts".into(), to_toml_array(vec!["all"])); + let apis = to_toml_array(vec![ + "web3", + "eth", + "pubsub", + "net", + "parity", + "parity_pubsub", + "traces", + ]); + rpc.insert("apis".into(), apis); + rpc.insert( + "port".into(), + Value::Integer((base_rpc_port as usize + i) as i64), + ); + + + websockets.insert("interface".into(), Value::String("all".into())); + websockets.insert("origins".into(), to_toml_array(vec!["all"])); + websockets.insert( + "port".into(), + Value::Integer((base_ws_port as usize + i) as i64), + ); + + } else { + rpc.insert("disable".into(), Value::Boolean(true)); + websockets.insert("disable".into(), Value::Boolean(true)); + } let mut ipc = Map::new(); ipc.insert("disable".into(), Value::Boolean(true)); @@ -524,6 +533,7 @@ fn main() { // the unwrap is safe, because there is a default value defined. let toml_string = toml::to_string(&to_toml( i, + false, &config_type, external_ip, &enode.address, @@ -564,6 +574,7 @@ fn main() { // Write rpc node config let rpc_string = toml::to_string(&to_toml( 0, + true, &ConfigType::Rpc, external_ip, &Address::default(), // todo: insert HBBFT Contracts pot here. From f602384b587b8805197ecc35cbddf86a5a96230b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 1 Jul 2024 23:46:04 +0200 Subject: [PATCH 139/166] fixed warnings --- .../hbbft/hbbft_config_generator/src/main.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index 81ebffd04..e1dd9ac80 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -174,7 +174,6 @@ fn to_toml( let mut websockets = Map::new(); if open_ports { - rpc.insert("interface".into(), Value::String("all".into())); rpc.insert("cors".into(), to_toml_array(vec!["all"])); rpc.insert("hosts".into(), to_toml_array(vec!["all"])); @@ -193,14 +192,12 @@ fn to_toml( Value::Integer((base_rpc_port as usize + i) as i64), ); - websockets.insert("interface".into(), Value::String("all".into())); websockets.insert("origins".into(), to_toml_array(vec!["all"])); websockets.insert( "port".into(), Value::Integer((base_ws_port as usize + i) as i64), ); - } else { rpc.insert("disable".into(), Value::Boolean(true)); websockets.insert("disable".into(), Value::Boolean(true)); @@ -439,12 +436,12 @@ fn main() { ) }); - let fork_block_number: Option = matches.value_of("fork_block_number").map_or(None, |v| { - Some( - v.parse::() - .expect("fork_block_number need to be of integer type"), - ) - }); + // let fork_block_number: Option = matches.value_of("fork_block_number").map_or(None, |v| { + // Some( + // v.parse::() + // .expect("fork_block_number need to be of integer type"), + // ) + // }); let metrics_port_base: Option = matches.value_of("metrics_port_base").map_or(None, |v| { Some( From 68acf28247743905e51d997c2e4a9bdad14c0d5e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Oct 2024 13:22:43 +0200 Subject: [PATCH 140/166] improved logging for key generation --- .../engines/hbbft/contracts/keygen_history.rs | 16 ++++++++++++---- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 14 +++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index a8a642d60..e008790c2 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -1,5 +1,8 @@ use client::traits::EngineClient; -use crypto::{self, publickey::Public}; +use crypto::{ + self, + publickey::{ec_math_utils::public_add, Public}, +}; use engines::{ hbbft::{ contracts::validator_set::{get_validator_pubkeys, ValidatorType}, @@ -46,9 +49,14 @@ pub fn engine_signer_to_synckeygen<'a>( inner: signer.clone(), }; let public = match signer.read().as_ref() { - Some(signer) => signer - .public() - .expect("Signer's public key must be available!"), + Some(signer) => { + if let Some(this_public) = signer.public() { + this_public + } else { + error!(target: "engine", "Signer's public key must be available for address {:?}", signer.address()); + return Err(hbbft::sync_key_gen::Error::UnknownSender); + } + } None => Public::from(H512::from_low_u64_be(0)), }; let mut rng = rand::thread_rng(); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index f2ea21420..7b9f99688 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1161,14 +1161,22 @@ impl HoneyBadgerBFT { { if all_available { let null_signer = Arc::new(RwLock::new(None)); - if let Ok(synckeygen) = initialize_synckeygen( + match initialize_synckeygen( &*client, &null_signer, BlockId::Latest, ValidatorType::Pending, ) { - if synckeygen.is_ready() { - return true; + Ok(synckeygen) => { + if synckeygen.is_ready() { + return true; + } + } + Err(e) => { + error!(target: "consensus", "Error initializing synckeygen: {:?}", e); + } + Err(_) => { + error!(target: "consensus", "Error initializing synckeygen: unknown Error"); } } } From 47e5b6c9e001f7dd854fda3c41c12741a21b206d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 1 Oct 2024 13:38:57 +0200 Subject: [PATCH 141/166] removed assert that leads to hardcrash for synckeygen --- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 52e293f03..356405696 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -166,7 +166,10 @@ impl HbbftState { } }; - assert!(synckeygen.is_ready()); + if !synckeygen.is_ready() { + error!(target: "engine", "Synckeygen not ready when it should be!"); + return None; + } let (pks, sks) = synckeygen.generate().ok()?; self.public_master_key = Some(pks.public_key()); From 439fc0a908d3cd0d64a3f625a9aa3daf542d7891 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 16 Oct 2024 18:18:52 +0200 Subject: [PATCH 142/166] fixed create_miner tool to use the correct chain name --- .../src/engines/hbbft/dmd/src/create_miner.rs | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs b/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs index 7cfb4e3fb..aed220889 100644 --- a/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs +++ b/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs @@ -1,6 +1,7 @@ use ethstore::{KeyFile, SafeAccount}; use parity_crypto::publickey::{Generator, KeyPair, Random, Secret}; -use std::{fs, num::NonZeroU32, path::Path}; +use serde_json::Value; +use std::{fs, num::NonZeroU32, path::Path, str::FromStr}; fn write_json_for_secret(secret: Secret, filename: &str) { let json_key: KeyFile = SafeAccount::create( @@ -21,6 +22,38 @@ fn write_json_for_secret(secret: Secret, filename: &str) { pub fn create_miner() { println!("Creating dmd v4 miner..."); + let mut name: String = "DPoSChain".to_string(); + match fs::read_to_string("spec.json") { + Ok(s) => { + match serde_json::from_str(s.as_str()) { + Ok(Value::Object(map)) => { + if map.contains_key("name") { + let x = &map["name"]; + + match x.as_str() { + Some(n) => { + name = String::from_str(n).expect("could not parse chain name from spec.json"); + println!("chain: {}", name); + }, + None => { + println!("could not read chain name from spec.json"); + } + } + } + }, + _ => { + println!("unable to parse spec.json"); + } + } + }, + Err(e) => { + println!("unable to to open spec.json: {:?}", e); + }, + } + + //let serialized_json_key = + //serde_json::to_string(&json_key).expect("json key object serialization should succeed"); + let acc = Random.generate(); // Create "data" and "network" subfolders. @@ -31,8 +64,8 @@ pub fn create_miner() { .expect("Unable to write the network key file"); // Create "keys" and "DPoSChain" subfolders. - let accounts_dir = Path::new("./data/keys/DPoSChain"); - fs::create_dir_all(accounts_dir).expect("Could not create accounts directory"); + let accounts_dir = Path::new("./data/keys/").join(name); + fs::create_dir_all(accounts_dir.clone()).expect("Could not create accounts directory"); // Write JSON account. write_json_for_secret( From 8a3766d2de4db5a15d266dfbf23fc0e294f3762c Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 18 Oct 2024 11:49:37 +0200 Subject: [PATCH 143/166] cargo fmt --all -- --config imports_granularity=Crate --- .../src/engines/hbbft/dmd/src/create_miner.rs | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs b/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs index aed220889..1c2805800 100644 --- a/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs +++ b/crates/ethcore/src/engines/hbbft/dmd/src/create_miner.rs @@ -24,31 +24,30 @@ pub fn create_miner() { println!("Creating dmd v4 miner..."); let mut name: String = "DPoSChain".to_string(); match fs::read_to_string("spec.json") { - Ok(s) => { - match serde_json::from_str(s.as_str()) { - Ok(Value::Object(map)) => { - if map.contains_key("name") { - let x = &map["name"]; + Ok(s) => match serde_json::from_str(s.as_str()) { + Ok(Value::Object(map)) => { + if map.contains_key("name") { + let x = &map["name"]; - match x.as_str() { - Some(n) => { - name = String::from_str(n).expect("could not parse chain name from spec.json"); - println!("chain: {}", name); - }, - None => { - println!("could not read chain name from spec.json"); - } + match x.as_str() { + Some(n) => { + name = String::from_str(n) + .expect("could not parse chain name from spec.json"); + println!("chain: {}", name); + } + None => { + println!("could not read chain name from spec.json"); } } - }, - _ => { - println!("unable to parse spec.json"); } } + _ => { + println!("unable to parse spec.json"); + } }, Err(e) => { println!("unable to to open spec.json: {:?}", e); - }, + } } //let serialized_json_key = From 9e130811c8eff49f3b3bd055b70603427e6f14df Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 18 Oct 2024 11:56:36 +0200 Subject: [PATCH 144/166] setting gas_floor_target in the hbbft_config_generator. --- .../ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs index e1dd9ac80..1eeadb9e7 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_config_generator/src/main.rs @@ -242,6 +242,7 @@ fn to_toml( // this makes sure that the min_gas_price wont be higher then the gas pricce the DAO decides. mining.insert("min_gas_price".into(), Value::Integer(1000)); mining.insert("reseal_on_txs".into(), Value::String("none".into())); + mining.insert("gas_floor_target".into(), Value::String("300000000".into())); mining.insert("reseal_min_period".into(), Value::Integer(0)); if let Some(tx_queue_per_sender_) = tx_queue_per_sender { From 65cb273d5c479263d17695ed23c2d24f43a663f1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 21 Oct 2024 12:30:31 +0200 Subject: [PATCH 145/166] improved logging for early epoch end reconnects --- .../src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs index 2bef3ce7e..fce2bbf3c 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/connectivity_tracker_hbbft.rs @@ -134,9 +134,9 @@ pub fn report_reconnect( .gas(U256::from(200_000)) .nonce(nonce); - info!(target:"consensus", "early-epoch-end: sending report_missing_connectivity for with nonce: {nonce}, missing: {:?} ", reconnected_validator); + info!(target:"engine", "early-epoch-end: sending report_reconnect for with nonce: {nonce}, missing: {:?} ", reconnected_validator); if let Err(e) = full_client.transact_silently(transaction) { - warn!(target:"consensus", "early-epoch-end: could not report_missing_connectivity {e:?}"); + warn!(target:"engine", "early-epoch-end: could not report_missing_connectivity {e:?}"); return false; } return true; From 14877c991912a10ab433afdc4089260d36ffb2e3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 22 Oct 2024 09:13:28 +0200 Subject: [PATCH 146/166] increased devp2p warmup time for not sending early epoch end reports from 2 minutes to 20 minutes. --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 2 +- crates/ethcore/src/engines/hbbft/hbbft_state.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 7b9f99688..7f0f32e90 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -942,7 +942,7 @@ impl HoneyBadgerBFT { mining_address: &Address, ) { // todo: acquire allowed devp2p warmup time from contracts ?! - let allowed_devp2p_warmup_time = Duration::from_secs(120); + let allowed_devp2p_warmup_time = Duration::from_secs(1200); debug!(target: "engine", "early-epoch-end: handle_early_epoch_end."); diff --git a/crates/ethcore/src/engines/hbbft/hbbft_state.rs b/crates/ethcore/src/engines/hbbft/hbbft_state.rs index 356405696..0cf959405 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_state.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_state.rs @@ -233,7 +233,7 @@ impl HbbftState { warn!(target: "engine", "could not acquire to connect to current validators on switching to new validator set for staking epoch {}.", self.current_posdao_epoch); } - let allowed_devp2p_warmup_time = Duration::from_secs(120); + let allowed_devp2p_warmup_time = Duration::from_secs(1200); if let Some(full_client) = client.as_full_client() { let signing_address = if let Some(s) = signer.read().as_ref() { From 03abfce2d188dd3e8cea0ded9b9d15e9563af276 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 28 Oct 2024 15:30:12 +0100 Subject: [PATCH 147/166] logging transactions for block that gets created. --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 7f0f32e90..64ee9d24e 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -505,6 +505,8 @@ impl HoneyBadgerBFT { debug!(target: "consensus", "Block creation: Batch received for epoch {}, total {} contributions, with {} unique transactions.", batch.epoch, batch .contributions.iter().fold(0, |i, c| i + c.1.transactions.len()), batch_txns.len()); + trace!(target: "consensus", "Block creation: transactions {}", batch_txns.iter().map(|x| x.hash.to_string()).join(", ")); + // Make sure the resulting transactions do not contain nonces out of order. // Not necessary any more - we select contribution transactions by sender, contributing all transactions by that sender or none. // The transaction queue's "pending" transactions already guarantee there are no nonce gaps for a selected sender. From 210c265bf52b56a921d6d8603316fced3c3fffaa Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Oct 2024 09:20:54 +0100 Subject: [PATCH 148/166] logging: do_validator_engine_actions: skipping because we are syncing. --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 64ee9d24e..a235d92ba 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1009,6 +1009,7 @@ impl HoneyBadgerBFT { Some(client_arc) => { if self.is_syncing(&client_arc) { // we are syncing - do not do anything. + trace!(target: "engine", "do_validator_engine_actions: skipping because we are syncing."); return Ok(()); } From 293f6aa7e1f03426d4fc6013609c1a747075f496 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Oct 2024 11:22:18 +0100 Subject: [PATCH 149/166] logging public keys of pending validators --- .../ethcore/src/engines/hbbft/keygen_transactions.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index e0d6ee567..067e21584 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -128,11 +128,19 @@ impl KeygenTransactionSender { .map(|p| (*p, PublicWrapper { inner: p.clone() })) .collect(); + let pub_leys_arc = Arc::new(pub_keys); + + //let pub_key_len = pub_keys.len(); // if synckeygen creation fails then either signer or validator pub keys are problematic. // Todo: We should expect up to f clients to write invalid pub keys. Report and re-start pending validator set selection. - let (mut synckeygen, part) = engine_signer_to_synckeygen(signer, Arc::new(pub_keys)) + let (mut synckeygen, part) = engine_signer_to_synckeygen(signer, pub_leys_arc.clone()) .map_err(|e| { - warn!(target:"engine", "engine_signer_to_synckeygen error {:?}", e); + warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_leys_arc.len(), e); + + pub_leys_arc.iter().for_each(|(k, v)| { + warn!(target:"engine", "pub key {}", k); + }); + CallError::ReturnValueInvalid })?; From 6cdddabb7e758cbab01a364434ed2ca3ba5a4a57 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Oct 2024 11:23:25 +0100 Subject: [PATCH 150/166] cargo fmt --all -- --config imports_granularity=Crate --- crates/ethcore/src/engines/hbbft/keygen_transactions.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index 067e21584..b7dd738d5 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -136,11 +136,9 @@ impl KeygenTransactionSender { let (mut synckeygen, part) = engine_signer_to_synckeygen(signer, pub_leys_arc.clone()) .map_err(|e| { warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_leys_arc.len(), e); - pub_leys_arc.iter().for_each(|(k, v)| { warn!(target:"engine", "pub key {}", k); }); - CallError::ReturnValueInvalid })?; From 67cd17649a66a93c41fb42a1e6d8ea21fc904dcb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Oct 2024 12:20:48 +0100 Subject: [PATCH 151/166] PublicKey: check if public key is valid for the use of BLS 381 12 --- .../ethcore/src/engines/hbbft/contracts/keygen_history.rs | 7 +++++++ crates/ethcore/src/engines/hbbft/keygen_transactions.rs | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index e008790c2..4ebcd1a87 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -179,6 +179,13 @@ pub struct KeyPairWrapper { pub inner: Arc>>>, } +impl PublicWrapper { + /// Check if the public key is valid. + pub fn is_valid(&self) -> bool { + self.encrypt(b"a", &mut rand::thread_rng()).is_ok() + } +} + impl<'a> PublicKey for PublicWrapper { type Error = crypto::publickey::Error; type SecretKey = KeyPairWrapper; diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index b7dd738d5..5c1cd90ba 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -137,7 +137,11 @@ impl KeygenTransactionSender { .map_err(|e| { warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_leys_arc.len(), e); pub_leys_arc.iter().for_each(|(k, v)| { - warn!(target:"engine", "pub key {}", k); + warn!(target:"engine", "pub key {}", k.as_bytes().iter().join("")); + + if !v.is_valid() { + warn!(target:"engine", "INVALID pub key {}", k); + } }); CallError::ReturnValueInvalid })?; From b93d9e61de7580f2c66ad4f0d085fb04176d286e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Oct 2024 22:25:37 +0100 Subject: [PATCH 152/166] i132 on detecting invalid public keys, write parts to progress into the next key gen phase for this node https://github.com/DMDcoin/diamond-node/issues/132 --- .../src/engines/hbbft/keygen_transactions.rs | 102 ++++++++++++++---- 1 file changed, 80 insertions(+), 22 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index 5c1cd90ba..5bdaf668b 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -16,7 +16,7 @@ use engines::{ }, signer::EngineSigner, }; -use ethereum_types::{Address, U256}; +use ethereum_types::{Address, Public, U256}; use itertools::Itertools; use parking_lot::RwLock; use std::{collections::BTreeMap, sync::Arc}; @@ -36,6 +36,23 @@ enum ShouldSendKeyAnswer { Yes, } +#[derive(Debug)] +pub enum KeyGenError { + NoSigner, + NoFullClient, + NoPartToWrite, + InvalidPublicKey(Vec), + CallError(CallError), + Unexpected +} + + +impl From for KeyGenError { + fn from(e: CallError) -> Self { + KeyGenError::CallError(e) + } +} + static KEYGEN_TRANSACTION_SEND_DELAY: u64 = 3; static KEYGEN_TRANSACTION_RESEND_DELAY: u64 = 10; @@ -102,17 +119,17 @@ impl KeygenTransactionSender { &mut self, client: &dyn EngineClient, signer: &Arc>>>, - ) -> Result<(), CallError> { + ) -> Result<(), KeyGenError> { // If we have no signer there is nothing for us to send. let address = match signer.read().as_ref() { Some(signer) => signer.address(), None => { warn!(target: "engine", "Could not send keygen transactions, because signer module could not be retrieved"); - return Err(CallError::ReturnValueInvalid); + return Err(KeyGenError::NoSigner); } }; - let full_client = client.as_full_client().ok_or(CallError::NotFullClient)?; + let full_client = client.as_full_client().ok_or(KeyGenError::NoFullClient)?; // If the chain is still syncing, do not send Parts or Acks. if full_client.is_major_syncing() { @@ -122,40 +139,81 @@ impl KeygenTransactionSender { trace!(target:"engine", " get_validator_pubkeys..."); - let vmap = get_validator_pubkeys(&*client, BlockId::Latest, ValidatorType::Pending)?; + let vmap = get_validator_pubkeys(&*client, BlockId::Latest, ValidatorType::Pending).map_err(|e| KeyGenError::CallError(e))?; let pub_keys: BTreeMap<_, _> = vmap .values() .map(|p| (*p, PublicWrapper { inner: p.clone() })) .collect(); - let pub_leys_arc = Arc::new(pub_keys); + let pub_keys_arc = Arc::new(pub_keys); + let upcoming_epoch = get_posdao_epoch(client, BlockId::Latest).map_err(|e| KeyGenError::CallError(e))? + 1; //let pub_key_len = pub_keys.len(); // if synckeygen creation fails then either signer or validator pub keys are problematic. // Todo: We should expect up to f clients to write invalid pub keys. Report and re-start pending validator set selection. - let (mut synckeygen, part) = engine_signer_to_synckeygen(signer, pub_leys_arc.clone()) - .map_err(|e| { - warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_leys_arc.len(), e); - pub_leys_arc.iter().for_each(|(k, v)| { - warn!(target:"engine", "pub key {}", k.as_bytes().iter().join("")); - - if !v.is_valid() { - warn!(target:"engine", "INVALID pub key {}", k); + let (mut synckeygen, part) = + match engine_signer_to_synckeygen(signer, pub_keys_arc.clone()) { + Ok((mut synckeygen_, part_)) => (synckeygen_, part_), + Err(e) => { + warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_keys_arc.len(), e); + //let mut failure_pub_keys: Vec = Vec::new(); + let mut failure_pub_keys: Vec = Vec::new(); + pub_keys_arc.iter().for_each(|(k, v)| { + warn!(target:"engine", "pub key {}", k.as_bytes().iter().join("")); + + if !v.is_valid() { + warn!(target:"engine", "INVALID pub key {}", k); + + // append the bytes of the public key to the failure_pub_keys. + k.as_bytes().iter().for_each(|b| { + failure_pub_keys.push(*b); + }); + } + }); + + // if we should send our parts, we will send the public keys of the troublemakers instead. + + match self.should_send_part(client, &address).map_err(|e| KeyGenError::CallError(e))? { + ShouldSendKeyAnswer::NoNotThisKeyGenMode => return Err(KeyGenError::Unexpected), + ShouldSendKeyAnswer::NoWaiting => return Err(KeyGenError::Unexpected), + ShouldSendKeyAnswer::Yes => { + + // the required gas values have been approximated by + // experimenting and it's a very rough estimation. + // it can be further fine tuned to be just above the real consumption. + // ACKs require much more gas, + // and usually run into the gas limit problems. + let gas: usize = failure_pub_keys.len() * 800 + 100_000; + + let part_transaction = + TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, failure_pub_keys) + .gas(U256::from(gas)) + .nonce(full_client.nonce(&address, BlockId::Latest).unwrap()) + .gas_price(U256::from(10000000000u64)); + full_client + .transact_silently(part_transaction) + .map_err(|e| { + warn!(target:"engine", "could not transact_silently: {:?}", e); + CallError::ReturnValueInvalid + })?; + + trace!(target:"engine", "PART Transaction send."); + return Ok(()); + }, } - }); - CallError::ReturnValueInvalid - })?; + }, + }; // If there is no part then we are not part of the pending validator set and there is nothing for us to do. let part_data = match part { Some(part) => part, None => { warn!(target:"engine", "no part to write."); - return Err(CallError::ReturnValueInvalid); + return Err(KeyGenError::NoPartToWrite); } }; - let upcoming_epoch = get_posdao_epoch(client, BlockId::Latest)? + 1; + trace!(target:"engine", "preparing to send PARTS for upcoming epoch: {}", upcoming_epoch); // Check if we already sent our part. @@ -165,7 +223,7 @@ impl KeygenTransactionSender { Ok(part) => part, Err(e) => { warn!(target:"engine", "could not serialize part: {:?}", e); - return Err(CallError::ReturnValueInvalid); + return Err(KeyGenError::Unexpected); } }; let serialized_part_len = serialized_part.len(); @@ -223,7 +281,7 @@ impl KeygenTransactionSender { } Err(err) => { error!(target:"engine", "could not retrieve part for {} call failed. Error: {:?}", *v, err); - return Err(err); + return Err(KeyGenError::CallError(err)); } } ); @@ -240,7 +298,7 @@ impl KeygenTransactionSender { for ack in acks { let ack_to_push = match bincode::serialize(&ack) { Ok(serialized_ack) => serialized_ack, - Err(_) => return Err(CallError::ReturnValueInvalid), + Err(e) => return Err(KeyGenError::Unexpected), }; total_bytes_for_acks += ack_to_push.len(); serialized_acks.push(ack_to_push); From 3e6e9c611a2d32ff99674da0f54047c148417b9a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 30 Oct 2024 23:28:57 +0100 Subject: [PATCH 153/166] compressing part as bincode , logging Nonce for Part Transaction that holds the public key. --- .../src/engines/hbbft/keygen_transactions.rs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index 5bdaf668b..a9cb45c72 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -41,9 +41,9 @@ pub enum KeyGenError { NoSigner, NoFullClient, NoPartToWrite, - InvalidPublicKey(Vec), CallError(CallError), - Unexpected + Unexpected, + } @@ -185,10 +185,20 @@ impl KeygenTransactionSender { // and usually run into the gas limit problems. let gas: usize = failure_pub_keys.len() * 800 + 100_000; + let serialized_part = match bincode::serialize(&failure_pub_keys) { + Ok(part) => part, + Err(e) => { + warn!(target:"engine", "could not serialize part: {:?}", e); + return Err(KeyGenError::Unexpected); + } + }; + + let nonce = full_client.nonce(&address, BlockId::Latest).unwrap(); + let part_transaction = - TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, failure_pub_keys) + TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, serialized_part) .gas(U256::from(gas)) - .nonce(full_client.nonce(&address, BlockId::Latest).unwrap()) + .nonce(nonce) .gas_price(U256::from(10000000000u64)); full_client .transact_silently(part_transaction) @@ -197,7 +207,7 @@ impl KeygenTransactionSender { CallError::ReturnValueInvalid })?; - trace!(target:"engine", "PART Transaction send."); + trace!(target:"engine", "PART Transaction send for moving forward key gen phase with nonce: {}", nonce); return Ok(()); }, } From 65d32e8b8ddbe05ef960475e34ea2339cd952cc6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 31 Oct 2024 00:12:19 +0100 Subject: [PATCH 154/166] refactored part transactions to a function. --- .../src/engines/hbbft/keygen_transactions.rs | 90 +++++++++---------- 1 file changed, 41 insertions(+), 49 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index a9cb45c72..c1669d599 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -22,6 +22,8 @@ use parking_lot::RwLock; use std::{collections::BTreeMap, sync::Arc}; use types::ids::BlockId; +use crate::client::BlockChainClient; + pub struct KeygenTransactionSender { last_keygen_mode: KeyGenMode, keygen_mode_counter: u64, @@ -177,13 +179,6 @@ impl KeygenTransactionSender { ShouldSendKeyAnswer::NoNotThisKeyGenMode => return Err(KeyGenError::Unexpected), ShouldSendKeyAnswer::NoWaiting => return Err(KeyGenError::Unexpected), ShouldSendKeyAnswer::Yes => { - - // the required gas values have been approximated by - // experimenting and it's a very rough estimation. - // it can be further fine tuned to be just above the real consumption. - // ACKs require much more gas, - // and usually run into the gas limit problems. - let gas: usize = failure_pub_keys.len() * 800 + 100_000; let serialized_part = match bincode::serialize(&failure_pub_keys) { Ok(part) => part, @@ -192,22 +187,9 @@ impl KeygenTransactionSender { return Err(KeyGenError::Unexpected); } }; - - let nonce = full_client.nonce(&address, BlockId::Latest).unwrap(); - - let part_transaction = - TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, serialized_part) - .gas(U256::from(gas)) - .nonce(nonce) - .gas_price(U256::from(10000000000u64)); - full_client - .transact_silently(part_transaction) - .map_err(|e| { - warn!(target:"engine", "could not transact_silently: {:?}", e); - CallError::ReturnValueInvalid - })?; - - trace!(target:"engine", "PART Transaction send for moving forward key gen phase with nonce: {}", nonce); + + send_part_transaction(full_client, client, &address, upcoming_epoch, serialized_part)?; + trace!(target:"engine", "PART Transaction send for moving forward key gen phase"); return Ok(()); }, } @@ -229,6 +211,7 @@ impl KeygenTransactionSender { // Check if we already sent our part. match self.should_send_part(client, &address)? { ShouldSendKeyAnswer::Yes => { + let serialized_part = match bincode::serialize(&part_data) { Ok(part) => part, Err(e) => { @@ -236,33 +219,8 @@ impl KeygenTransactionSender { return Err(KeyGenError::Unexpected); } }; - let serialized_part_len = serialized_part.len(); - let current_round = get_current_key_gen_round(client)?; - let write_part_data = key_history_contract::functions::write_part::call( - upcoming_epoch, - current_round, - serialized_part, - ); - - // the required gas values have been approximated by - // experimenting and it's a very rough estimation. - // it can be further fine tuned to be just above the real consumption. - // ACKs require much more gas, - // and usually run into the gas limit problems. - let gas: usize = serialized_part_len * 800 + 100_000; - - let part_transaction = - TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, write_part_data.0) - .gas(U256::from(gas)) - .nonce(full_client.nonce(&address, BlockId::Latest).unwrap()) - .gas_price(U256::from(10000000000u64)); - full_client - .transact_silently(part_transaction) - .map_err(|e| { - warn!(target:"engine", "could not transact_silently: {:?}", e); - CallError::ReturnValueInvalid - })?; + send_part_transaction(full_client, client, &address, upcoming_epoch, serialized_part)?; trace!(target:"engine", "PART Transaction send."); return Ok(()); } @@ -341,3 +299,37 @@ impl KeygenTransactionSender { Ok(()) } } + + +fn send_part_transaction(full_client: &dyn BlockChainClient, client: &dyn EngineClient, mining_address: &Address, upcoming_epoch: U256 , data: Vec) -> Result<(), KeyGenError> { + + // the required gas values have been approximated by + // experimenting and it's a very rough estimation. + // it can be further fine tuned to be just above the real consumption. + // ACKs require much more gas, + // and usually run into the gas limit problems. + let gas: usize = data.len() * 800 + 100_000; + + let nonce = full_client.nonce(&mining_address, BlockId::Latest).unwrap(); + let current_round = get_current_key_gen_round(client)?; + let write_part_data = key_history_contract::functions::write_part::call( + upcoming_epoch, + current_round, + data, + ); + + let part_transaction = + TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, write_part_data.0) + .gas(U256::from(gas)) + .nonce(nonce) + .gas_price(U256::from(10000000000u64)); + full_client + .transact_silently(part_transaction) + .map_err(|e| { + warn!(target:"engine", "could not transact_silently: {:?}", e); + CallError::ReturnValueInvalid + })?; + + return Ok(()); + +} From e74af66a52b862599ead45194d6aad1141f3815e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 31 Oct 2024 00:46:11 +0100 Subject: [PATCH 155/166] cargo fmt --all -- --config imports_granularity=Crate --- .../src/engines/hbbft/keygen_transactions.rs | 139 ++++++++++-------- 1 file changed, 76 insertions(+), 63 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs index c1669d599..440b7c479 100644 --- a/crates/ethcore/src/engines/hbbft/keygen_transactions.rs +++ b/crates/ethcore/src/engines/hbbft/keygen_transactions.rs @@ -45,10 +45,8 @@ pub enum KeyGenError { NoPartToWrite, CallError(CallError), Unexpected, - } - impl From for KeyGenError { fn from(e: CallError) -> Self { KeyGenError::CallError(e) @@ -141,60 +139,72 @@ impl KeygenTransactionSender { trace!(target:"engine", " get_validator_pubkeys..."); - let vmap = get_validator_pubkeys(&*client, BlockId::Latest, ValidatorType::Pending).map_err(|e| KeyGenError::CallError(e))?; + let vmap = get_validator_pubkeys(&*client, BlockId::Latest, ValidatorType::Pending) + .map_err(|e| KeyGenError::CallError(e))?; let pub_keys: BTreeMap<_, _> = vmap .values() .map(|p| (*p, PublicWrapper { inner: p.clone() })) .collect(); let pub_keys_arc = Arc::new(pub_keys); - let upcoming_epoch = get_posdao_epoch(client, BlockId::Latest).map_err(|e| KeyGenError::CallError(e))? + 1; + let upcoming_epoch = + get_posdao_epoch(client, BlockId::Latest).map_err(|e| KeyGenError::CallError(e))? + 1; //let pub_key_len = pub_keys.len(); // if synckeygen creation fails then either signer or validator pub keys are problematic. // Todo: We should expect up to f clients to write invalid pub keys. Report and re-start pending validator set selection. - let (mut synckeygen, part) = - match engine_signer_to_synckeygen(signer, pub_keys_arc.clone()) { - Ok((mut synckeygen_, part_)) => (synckeygen_, part_), - Err(e) => { - warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_keys_arc.len(), e); - //let mut failure_pub_keys: Vec = Vec::new(); - let mut failure_pub_keys: Vec = Vec::new(); - pub_keys_arc.iter().for_each(|(k, v)| { - warn!(target:"engine", "pub key {}", k.as_bytes().iter().join("")); - - if !v.is_valid() { - warn!(target:"engine", "INVALID pub key {}", k); - - // append the bytes of the public key to the failure_pub_keys. - k.as_bytes().iter().for_each(|b| { - failure_pub_keys.push(*b); - }); - } - }); - - // if we should send our parts, we will send the public keys of the troublemakers instead. - - match self.should_send_part(client, &address).map_err(|e| KeyGenError::CallError(e))? { - ShouldSendKeyAnswer::NoNotThisKeyGenMode => return Err(KeyGenError::Unexpected), - ShouldSendKeyAnswer::NoWaiting => return Err(KeyGenError::Unexpected), - ShouldSendKeyAnswer::Yes => { - - let serialized_part = match bincode::serialize(&failure_pub_keys) { - Ok(part) => part, - Err(e) => { - warn!(target:"engine", "could not serialize part: {:?}", e); - return Err(KeyGenError::Unexpected); - } - }; - - send_part_transaction(full_client, client, &address, upcoming_epoch, serialized_part)?; - trace!(target:"engine", "PART Transaction send for moving forward key gen phase"); - return Ok(()); - }, + let (mut synckeygen, part) = match engine_signer_to_synckeygen(signer, pub_keys_arc.clone()) + { + Ok((mut synckeygen_, part_)) => (synckeygen_, part_), + Err(e) => { + warn!(target:"engine", "engine_signer_to_synckeygen pub keys count {:?} error {:?}", pub_keys_arc.len(), e); + //let mut failure_pub_keys: Vec = Vec::new(); + let mut failure_pub_keys: Vec = Vec::new(); + pub_keys_arc.iter().for_each(|(k, v)| { + warn!(target:"engine", "pub key {}", k.as_bytes().iter().join("")); + + if !v.is_valid() { + warn!(target:"engine", "INVALID pub key {}", k); + + // append the bytes of the public key to the failure_pub_keys. + k.as_bytes().iter().for_each(|b| { + failure_pub_keys.push(*b); + }); } - }, - }; + }); + + // if we should send our parts, we will send the public keys of the troublemakers instead. + + match self + .should_send_part(client, &address) + .map_err(|e| KeyGenError::CallError(e))? + { + ShouldSendKeyAnswer::NoNotThisKeyGenMode => { + return Err(KeyGenError::Unexpected) + } + ShouldSendKeyAnswer::NoWaiting => return Err(KeyGenError::Unexpected), + ShouldSendKeyAnswer::Yes => { + let serialized_part = match bincode::serialize(&failure_pub_keys) { + Ok(part) => part, + Err(e) => { + warn!(target:"engine", "could not serialize part: {:?}", e); + return Err(KeyGenError::Unexpected); + } + }; + + send_part_transaction( + full_client, + client, + &address, + upcoming_epoch, + serialized_part, + )?; + trace!(target:"engine", "PART Transaction send for moving forward key gen phase"); + return Ok(()); + } + } + } + }; // If there is no part then we are not part of the pending validator set and there is nothing for us to do. let part_data = match part { @@ -205,13 +215,11 @@ impl KeygenTransactionSender { } }; - trace!(target:"engine", "preparing to send PARTS for upcoming epoch: {}", upcoming_epoch); // Check if we already sent our part. match self.should_send_part(client, &address)? { ShouldSendKeyAnswer::Yes => { - let serialized_part = match bincode::serialize(&part_data) { Ok(part) => part, Err(e) => { @@ -220,7 +228,13 @@ impl KeygenTransactionSender { } }; - send_part_transaction(full_client, client, &address, upcoming_epoch, serialized_part)?; + send_part_transaction( + full_client, + client, + &address, + upcoming_epoch, + serialized_part, + )?; trace!(target:"engine", "PART Transaction send."); return Ok(()); } @@ -300,9 +314,13 @@ impl KeygenTransactionSender { } } - -fn send_part_transaction(full_client: &dyn BlockChainClient, client: &dyn EngineClient, mining_address: &Address, upcoming_epoch: U256 , data: Vec) -> Result<(), KeyGenError> { - +fn send_part_transaction( + full_client: &dyn BlockChainClient, + client: &dyn EngineClient, + mining_address: &Address, + upcoming_epoch: U256, + data: Vec, +) -> Result<(), KeyGenError> { // the required gas values have been approximated by // experimenting and it's a very rough estimation. // it can be further fine tuned to be just above the real consumption. @@ -312,17 +330,13 @@ fn send_part_transaction(full_client: &dyn BlockChainClient, client: &dyn Engine let nonce = full_client.nonce(&mining_address, BlockId::Latest).unwrap(); let current_round = get_current_key_gen_round(client)?; - let write_part_data = key_history_contract::functions::write_part::call( - upcoming_epoch, - current_round, - data, - ); - - let part_transaction = - TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, write_part_data.0) - .gas(U256::from(gas)) - .nonce(nonce) - .gas_price(U256::from(10000000000u64)); + let write_part_data = + key_history_contract::functions::write_part::call(upcoming_epoch, current_round, data); + + let part_transaction = TransactionRequest::call(*KEYGEN_HISTORY_ADDRESS, write_part_data.0) + .gas(U256::from(gas)) + .nonce(nonce) + .gas_price(U256::from(10000000000u64)); full_client .transact_silently(part_transaction) .map_err(|e| { @@ -331,5 +345,4 @@ fn send_part_transaction(full_client: &dyn BlockChainClient, client: &dyn Engine })?; return Ok(()); - } From 86ecdbb6aad4fa93732f36f530f630d056f78cd7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 1 Nov 2024 20:21:14 +0100 Subject: [PATCH 156/166] unused field --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 5ff30bcf0..7a959fd7a 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -39,7 +39,7 @@ pub(crate) struct HbbftEarlyEpochEndManager { node_id_to_address: BTreeMap, - address_to_node_id: BTreeMap, + // address_to_node_id: BTreeMap, signing_address: Address, } @@ -109,7 +109,7 @@ impl HbbftEarlyEpochEndManager { validators: validators, flagged_validators: flagged_validators, node_id_to_address, - address_to_node_id, + // address_to_node_id, signing_address: signing_address.clone(), }; From f349d7814a867ee34773c64699f1d14434174242 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 1 Nov 2024 20:23:04 +0100 Subject: [PATCH 157/166] cleanup --- .../src/engines/hbbft/hbbft_network_fork_manager.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index d77d91faa..59831dc38 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -298,17 +298,11 @@ impl HbbftNetworkForkManager { #[cfg(test)] mod tests { - use std::{fs, str::FromStr}; - - use crate::engines::{hbbft::test::hbbft_test_client::HbbftTestClient, signer::from_keypair}; - - use super::*; - use ethereum_types::Address; + use std::str::FromStr; + use crate::engines::signer::from_keypair; + use super::*; use ethjson::spec::hbbft::HbbftNetworkFork; - use hbbft::sync_key_gen::{Ack, Part}; - use crypto::publickey::{KeyPair, Secret}; - //use parity_crypto::publickey::{KeyPair, Secret}; #[test] fn test_fork_manager_should_fork() { From 83d3c5a0a8fc5023d908ff02b4fee7924537fc39 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 1 Nov 2024 20:23:12 +0100 Subject: [PATCH 158/166] cleanup --- crates/ethcore/src/engines/hbbft/hbbft_engine.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs index 7f0f32e90..90bbdc30e 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_engine.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_engine.rs @@ -1175,9 +1175,6 @@ impl HoneyBadgerBFT { Err(e) => { error!(target: "consensus", "Error initializing synckeygen: {:?}", e); } - Err(_) => { - error!(target: "consensus", "Error initializing synckeygen: unknown Error"); - } } } } From 32f328d116fcddc2b1c6a29bf0fda381f8477315 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 1 Nov 2024 20:24:31 +0100 Subject: [PATCH 159/166] cargo fmt --all -- --config imports_granularity=Crate --- .../src/engines/hbbft/hbbft_early_epoch_end_manager.rs | 1 - .../ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs index 7a959fd7a..5b8f2411b 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_early_epoch_end_manager.rs @@ -40,7 +40,6 @@ pub(crate) struct HbbftEarlyEpochEndManager { node_id_to_address: BTreeMap, // address_to_node_id: BTreeMap, - signing_address: Address, } diff --git a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs index 59831dc38..b021e5a9c 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_network_fork_manager.rs @@ -298,11 +298,11 @@ impl HbbftNetworkForkManager { #[cfg(test)] mod tests { - use std::str::FromStr; + use super::*; use crate::engines::signer::from_keypair; - use super::*; - use ethjson::spec::hbbft::HbbftNetworkFork; use crypto::publickey::{KeyPair, Secret}; + use ethjson::spec::hbbft::HbbftNetworkFork; + use std::str::FromStr; #[test] fn test_fork_manager_should_fork() { From 63606660378fe72151da55a73906c872757cf726 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 5 Nov 2024 21:11:24 +0100 Subject: [PATCH 160/166] removed RequestMiddleware use --- bin/oe/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/oe/rpc.rs b/bin/oe/rpc.rs index d098b2776..d4dd37c41 100644 --- a/bin/oe/rpc.rs +++ b/bin/oe/rpc.rs @@ -29,7 +29,7 @@ use parity_rpc::{ }; use parity_runtime::Executor; -pub use parity_rpc::{HttpServer, IpcServer, RequestMiddleware}; +pub use parity_rpc::{HttpServer, IpcServer}; //pub use parity_rpc::ws::Server as WsServer; pub use parity_rpc::ws::{ws, Server as WsServer}; From 8dfc0e9b18ea27586b6030999b5fbaedb92199b7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 5 Nov 2024 21:15:49 +0100 Subject: [PATCH 161/166] cargo fix --- crates/concensus/ethash/src/keccak.rs | 2 +- crates/ethcore/benches/builtin.rs | 3 +-- crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs | 2 +- crates/ethcore/src/engines/validator_set/safe_contract.rs | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/concensus/ethash/src/keccak.rs b/crates/concensus/ethash/src/keccak.rs index 134a11fb2..187e16b85 100644 --- a/crates/concensus/ethash/src/keccak.rs +++ b/crates/concensus/ethash/src/keccak.rs @@ -30,6 +30,6 @@ pub mod keccak_256 { use super::hash; pub use self::hash::{ - keccak256 as inplace, keccak256_range as inplace_range, keccak_256 as write, + keccak256 as inplace, keccak_256 as write, }; } diff --git a/crates/ethcore/benches/builtin.rs b/crates/ethcore/benches/builtin.rs index 47c6cd568..ffdce6242 100644 --- a/crates/ethcore/benches/builtin.rs +++ b/crates/ethcore/benches/builtin.rs @@ -50,8 +50,7 @@ impl<'a> BuiltinBenchmark<'a> { let builtin = builtins .get(&H160::from_str(builtin_address).unwrap()) - .unwrap() - .clone(); + .unwrap(); let input = FromHex::from_hex(input).unwrap(); let expected = FromHex::from_hex(expected).unwrap(); diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index e008790c2..26e7a5e2c 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -1,7 +1,7 @@ use client::traits::EngineClient; use crypto::{ self, - publickey::{ec_math_utils::public_add, Public}, + publickey::{Public}, }; use engines::{ hbbft::{ diff --git a/crates/ethcore/src/engines/validator_set/safe_contract.rs b/crates/ethcore/src/engines/validator_set/safe_contract.rs index 135f5a898..7d56ba5d8 100644 --- a/crates/ethcore/src/engines/validator_set/safe_contract.rs +++ b/crates/ethcore/src/engines/validator_set/safe_contract.rs @@ -861,7 +861,7 @@ mod tests { use types::{header::Header, log_entry::LogEntry}; let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract); - let engine = client.engine().clone(); + let engine = client.engine(); let validator_contract = "0000000000000000000000000000000000000005" .parse::
() .unwrap(); @@ -900,7 +900,7 @@ mod tests { use types::header::Header; let client = generate_dummy_client_with_spec(Spec::new_validator_safe_contract); - let engine = client.engine().clone(); + let engine = client.engine(); let mut new_header = Header::default(); new_header.set_number(0); // so the validator set doesn't look for a log From cff8e2f6885559e138d956f8f7e8d7cdca35a6e4 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 5 Nov 2024 21:18:12 +0100 Subject: [PATCH 162/166] cargo fix --lib -p parity-rpc --- crates/rpc/src/v1/helpers/mod.rs | 1 - crates/rpc/src/v1/types/mod.rs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/rpc/src/v1/helpers/mod.rs b/crates/rpc/src/v1/helpers/mod.rs index 686ec7738..a9f4d4f2e 100644 --- a/crates/rpc/src/v1/helpers/mod.rs +++ b/crates/rpc/src/v1/helpers/mod.rs @@ -40,7 +40,6 @@ mod subscription_manager; mod work; pub use self::{ - dispatch::{Dispatcher, FullDispatcher}, network_settings::NetworkSettings, poll_filter::{limit_logs, PollFilter, SyncPollFilter}, poll_manager::PollManager, diff --git a/crates/rpc/src/v1/types/mod.rs b/crates/rpc/src/v1/types/mod.rs index df1e7d535..255065a5a 100644 --- a/crates/rpc/src/v1/types/mod.rs +++ b/crates/rpc/src/v1/types/mod.rs @@ -20,7 +20,7 @@ pub use rpc_common::Bytes; pub use self::{ account_info::{AccountInfo, EthAccount, ExtAccountInfo, RecoveredAccount, StorageProof}, - block::{Block, BlockTransactions, Header, Rich, RichBlock, RichHeader}, + block::{Block, BlockTransactions, Header, RichBlock, RichHeader}, block_number::{block_number_to_id, BlockNumber}, call_request::CallRequest, confirmations::{ @@ -41,13 +41,13 @@ pub use self::{ rpc_settings::RpcSettings, secretstore::EncryptedDocumentKey, sync::{ - ChainStatus, EthProtocolInfo, PeerInfo, PeerNetworkInfo, PeerProtocolsInfo, Peers, + ChainStatus, Peers, SyncInfo, SyncStatus, TransactionStats, }, trace::{LocalizedTrace, TraceResults, TraceResultsWithTransactionHash}, trace_filter::TraceFilter, transaction::{LocalTransactionStatus, RichRawTransaction, Transaction}, - transaction_access_list::{AccessList, AccessListItem}, + transaction_access_list::{AccessList}, transaction_condition::TransactionCondition, transaction_request::TransactionRequest, work::Work, From 0fd1bafa928f3bb02b3115604ee96bd3a1b009f0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 6 Nov 2024 23:30:28 +0100 Subject: [PATCH 163/166] cargo fix --- crates/accounts/ethstore/src/account/mod.rs | 2 +- crates/accounts/ethstore/src/json/mod.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/accounts/ethstore/src/account/mod.rs b/crates/accounts/ethstore/src/account/mod.rs index b1757474f..ceb8116ac 100644 --- a/crates/accounts/ethstore/src/account/mod.rs +++ b/crates/accounts/ethstore/src/account/mod.rs @@ -23,7 +23,7 @@ mod version; pub use self::{ cipher::{Aes128Ctr, Cipher}, crypto::Crypto, - kdf::{Kdf, Pbkdf2, Prf, Scrypt}, + kdf::{Kdf, Pbkdf2, Prf}, safe_account::SafeAccount, version::Version, }; diff --git a/crates/accounts/ethstore/src/json/mod.rs b/crates/accounts/ethstore/src/json/mod.rs index 02614eaea..d9a5c7f3e 100644 --- a/crates/accounts/ethstore/src/json/mod.rs +++ b/crates/accounts/ethstore/src/json/mod.rs @@ -32,13 +32,13 @@ mod version; pub use self::{ bytes::Bytes, cipher::{Aes128Ctr, Cipher, CipherSer, CipherSerParams}, - crypto::{CipherText, Crypto}, + crypto::{Crypto}, error::Error, hash::{H128, H160, H256}, id::Uuid, kdf::{Kdf, KdfSer, KdfSerParams, Pbkdf2, Prf, Scrypt}, key_file::{KeyFile, OpaqueKeyFile}, - presale::{Encseed, PresaleWallet}, + presale::{PresaleWallet}, vault_file::VaultFile, vault_key_file::{ insert_vault_name_to_json_meta, remove_vault_name_from_json_meta, VaultKeyFile, From 5ef8a348f91293b2bdfe9209944cbb47997f190a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 7 Nov 2024 08:51:44 +0100 Subject: [PATCH 164/166] formatted imports --- crates/accounts/ethstore/src/json/mod.rs | 4 ++-- crates/concensus/ethash/src/keccak.rs | 4 +--- .../ethcore/src/engines/hbbft/contracts/keygen_history.rs | 5 +---- crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs | 4 +--- crates/rpc/src/v1/types/mod.rs | 7 ++----- 5 files changed, 7 insertions(+), 17 deletions(-) diff --git a/crates/accounts/ethstore/src/json/mod.rs b/crates/accounts/ethstore/src/json/mod.rs index d9a5c7f3e..27d2c994e 100644 --- a/crates/accounts/ethstore/src/json/mod.rs +++ b/crates/accounts/ethstore/src/json/mod.rs @@ -32,13 +32,13 @@ mod version; pub use self::{ bytes::Bytes, cipher::{Aes128Ctr, Cipher, CipherSer, CipherSerParams}, - crypto::{Crypto}, + crypto::Crypto, error::Error, hash::{H128, H160, H256}, id::Uuid, kdf::{Kdf, KdfSer, KdfSerParams, Pbkdf2, Prf, Scrypt}, key_file::{KeyFile, OpaqueKeyFile}, - presale::{PresaleWallet}, + presale::PresaleWallet, vault_file::VaultFile, vault_key_file::{ insert_vault_name_to_json_meta, remove_vault_name_from_json_meta, VaultKeyFile, diff --git a/crates/concensus/ethash/src/keccak.rs b/crates/concensus/ethash/src/keccak.rs index 187e16b85..d3dbf1be9 100644 --- a/crates/concensus/ethash/src/keccak.rs +++ b/crates/concensus/ethash/src/keccak.rs @@ -29,7 +29,5 @@ pub mod keccak_512 { pub mod keccak_256 { use super::hash; - pub use self::hash::{ - keccak256 as inplace, keccak_256 as write, - }; + pub use self::hash::{keccak256 as inplace, keccak_256 as write}; } diff --git a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs index 26e7a5e2c..80167b4c0 100644 --- a/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs +++ b/crates/ethcore/src/engines/hbbft/contracts/keygen_history.rs @@ -1,8 +1,5 @@ use client::traits::EngineClient; -use crypto::{ - self, - publickey::{Public}, -}; +use crypto::{self, publickey::Public}; use engines::{ hbbft::{ contracts::validator_set::{get_validator_pubkeys, ValidatorType}, diff --git a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs index a04a8ac11..d219ad4f7 100644 --- a/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs +++ b/crates/ethcore/src/engines/hbbft/hbbft_peers_management.rs @@ -9,12 +9,10 @@ use crate::{ ethereum::public_key_to_address::public_key_to_address, }; +use super::{contracts::staking::get_pool_public_key, NodeId}; use bytes::ToPretty; - use ethereum_types::Address; -use super::{contracts::staking::get_pool_public_key, NodeId}; - #[derive(Clone, Debug)] struct ValidatorConnectionData { // mining_address: Address, diff --git a/crates/rpc/src/v1/types/mod.rs b/crates/rpc/src/v1/types/mod.rs index 255065a5a..de7478bba 100644 --- a/crates/rpc/src/v1/types/mod.rs +++ b/crates/rpc/src/v1/types/mod.rs @@ -40,14 +40,11 @@ pub use self::{ receipt::Receipt, rpc_settings::RpcSettings, secretstore::EncryptedDocumentKey, - sync::{ - ChainStatus, Peers, - SyncInfo, SyncStatus, TransactionStats, - }, + sync::{ChainStatus, Peers, SyncInfo, SyncStatus, TransactionStats}, trace::{LocalizedTrace, TraceResults, TraceResultsWithTransactionHash}, trace_filter::TraceFilter, transaction::{LocalTransactionStatus, RichRawTransaction, Transaction}, - transaction_access_list::{AccessList}, + transaction_access_list::AccessList, transaction_condition::TransactionCondition, transaction_request::TransactionRequest, work::Work, From ee62bf57e3ea52545b6245ed5d60c0e981033892 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sat, 16 Nov 2024 20:00:26 +0100 Subject: [PATCH 165/166] fixed test imports --- crates/rpc/src/v1/tests/mocked/signing.rs | 5 +++-- crates/rpc/src/v1/types/transaction.rs | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/rpc/src/v1/tests/mocked/signing.rs b/crates/rpc/src/v1/tests/mocked/signing.rs index a1a234605..0febdcb28 100644 --- a/crates/rpc/src/v1/tests/mocked/signing.rs +++ b/crates/rpc/src/v1/tests/mocked/signing.rs @@ -16,12 +16,12 @@ use std::{str::FromStr, sync::Arc, thread, time::Duration}; -use jsonrpc_core::{futures::Future, IoHandler, Success}; +use jsonrpc_core::{futures::Future, IoHandler, Success}; use v1::{ helpers::{ dispatch, external_signer::{SignerService, SigningQueue}, - nonce, FullDispatcher, + nonce, }, impls::SigningQueueClient, metadata::Metadata, @@ -39,6 +39,7 @@ use parity_runtime::{Executor, Runtime}; use parking_lot::Mutex; use serde_json; use types::transaction::{Action, SignedTransaction, Transaction, TypedTransaction}; +use crate::dispatch::FullDispatcher; struct SigningTester { pub runtime: Runtime, diff --git a/crates/rpc/src/v1/types/transaction.rs b/crates/rpc/src/v1/types/transaction.rs index 220a701a9..85231b7f4 100644 --- a/crates/rpc/src/v1/types/transaction.rs +++ b/crates/rpc/src/v1/types/transaction.rs @@ -360,11 +360,12 @@ impl LocalTransactionStatus { #[cfg(test)] mod tests { + use crate::v1::types::transaction_access_list::AccessListItem; + use super::{LocalTransactionStatus, Transaction}; use ethereum_types::H256; use serde_json; use types::transaction::TypedTxId; - use v1::types::AccessListItem; #[test] fn test_transaction_serialize() { From 474a28f14ba832f54ba8588deed87a2fa977850d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 17 Nov 2024 11:02:21 +0100 Subject: [PATCH 166/166] cargo fmt --all -- --config imports_granularity=Crate --- crates/rpc/src/v1/tests/mocked/signing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/rpc/src/v1/tests/mocked/signing.rs b/crates/rpc/src/v1/tests/mocked/signing.rs index 0febdcb28..64adfbf54 100644 --- a/crates/rpc/src/v1/tests/mocked/signing.rs +++ b/crates/rpc/src/v1/tests/mocked/signing.rs @@ -16,7 +16,7 @@ use std::{str::FromStr, sync::Arc, thread, time::Duration}; -use jsonrpc_core::{futures::Future, IoHandler, Success}; +use jsonrpc_core::{futures::Future, IoHandler, Success}; use v1::{ helpers::{ dispatch, @@ -30,6 +30,7 @@ use v1::{ types::{ConfirmationResponse, RichRawTransaction}, }; +use crate::dispatch::FullDispatcher; use accounts::AccountProvider; use bytes::ToPretty; use crypto::publickey::{Generator, Random, Secret}; @@ -39,7 +40,6 @@ use parity_runtime::{Executor, Runtime}; use parking_lot::Mutex; use serde_json; use types::transaction::{Action, SignedTransaction, Transaction, TypedTransaction}; -use crate::dispatch::FullDispatcher; struct SigningTester { pub runtime: Runtime,