Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: improve age loop #5665

Open
wants to merge 1 commit into
base: feat/block-witnesser-es
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use core::iter::Step;
use core::{iter::Step, ops::RangeInclusive};

use crate::electoral_systems::{
block_witnesser::{primitives::ChainProgressInner, state_machine::BWProcessorTypes},
Expand Down Expand Up @@ -142,21 +142,20 @@ impl<T: BWProcessorTypes> BlockProcessor<T> {
for n in range {
let block_data = self.blocks_data.remove(&n);
if let Some((data, next_age)) = block_data {
// We need to get only events already processed (next_age not included)
for age in 0..next_age {
let events = self
.process_rules_for_age_and_block(n, age, &data)
.into_iter()
.map(|(_, event)| event)
.collect::<Vec<_>>();
match self.reorg_events.get_mut(&n) {
None => {
self.reorg_events.insert(n, events);
},
Some(previous_events) => {
previous_events.extend(events.into_iter());
},
}
let age_range: RangeInclusive<u32> =
RangeInclusive::new(0, next_age.saturating_sub(1) as u32);
let events = self
.process_rules_for_ages_and_block(n, age_range, &data)
.into_iter()
.map(|(_, event)| event)
.collect::<Vec<_>>();
match self.reorg_events.get_mut(&n) {
None => {
self.reorg_events.insert(n, events);
},
Some(previous_events) => {
previous_events.extend(events.into_iter());
},
}
}
}
Expand Down Expand Up @@ -190,14 +189,15 @@ impl<T: BWProcessorTypes> BlockProcessor<T> {
last_height: T::ChainBlockNumber,
) -> Vec<(T::ChainBlockNumber, T::Event)> {
let mut last_events: Vec<(T::ChainBlockNumber, T::Event)> = vec![];
for (block_height, (data, next_age)) in self.blocks_data.clone() {
for (block_height, (data, next_age_to_process)) in self.blocks_data.clone() {
let current_age = T::ChainBlockNumber::steps_between(&block_height, &last_height).0;
for age in next_age..=current_age as u32 {
last_events = last_events
.into_iter()
.chain(self.process_rules_for_age_and_block(block_height, age, &data))
.collect();
}
let age_range: RangeInclusive<u32> =
RangeInclusive::new(next_age_to_process, current_age as u32);
last_events.extend(self.process_rules_for_ages_and_block(
block_height,
age_range,
&data,
));
self.blocks_data.insert(block_height, (data.clone(), current_age as u32 + 1));
}
last_events
Expand All @@ -222,10 +222,10 @@ impl<T: BWProcessorTypes> BlockProcessor<T> {
///
/// A vector of (block height, events (`T::Event`)) generated by applying the rules, excluding
/// any duplicates.
fn process_rules_for_age_and_block(
fn process_rules_for_ages_and_block(
&mut self,
block: T::ChainBlockNumber,
age: u32,
age: RangeInclusive<u32>,
data: &T::BlockData,
) -> Vec<(T::ChainBlockNumber, T::Event)> {
let events: Vec<(T::ChainBlockNumber, T::Event)> =
Expand Down Expand Up @@ -303,23 +303,34 @@ pub(crate) mod test {
impl Hook<HookTypeFor<Types, RulesHook>> for Types {
fn run(
&mut self,
(block, age, block_data): (BlockNumber, u32, MockBlockData),
) -> Vec<(BlockNumber, MockBtcEvent)> {
// Prewitness rule
if age == 0 {
return block_data
.iter()
.map(|deposit_witness| (block, MockBtcEvent::PreWitness(*deposit_witness)))
.collect::<Vec<(BlockNumber, MockBtcEvent)>>();
(block, age, block_data): (
cf_chains::btc::BlockNumber,
RangeInclusive<u32>,
MockBlockData,
),
) -> Vec<(cf_chains::btc::BlockNumber, MockBtcEvent)> {
let mut results: Vec<(cf_chains::btc::BlockNumber, MockBtcEvent)> = vec![];
if age.contains(&0u32) {
results.extend(
block_data
.iter()
.map(|deposit_witness| {
(block, MockBtcEvent::PreWitness(deposit_witness.clone()))
})
.collect::<Vec<_>>(),
)
}
//Full witness rule
if age == SAFETY_MARGIN as u32 {
return block_data
.iter()
.map(|deposit_witness| (block, MockBtcEvent::Witness(*deposit_witness)))
.collect::<Vec<(BlockNumber, MockBtcEvent)>>();
if age.contains(&(SAFETY_MARGIN as u32)) {
results.extend(
block_data
.iter()
.map(|deposit_witness| {
(block, MockBtcEvent::Witness(deposit_witness.clone()))
})
.collect::<Vec<_>>(),
)
}
vec![]
results
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::electoral_systems::{
};
use cf_chains::witness_period::{BlockZero, SaturatingStep};
use codec::{Decode, Encode};
use core::iter::Step;
use core::{iter::Step, ops::RangeInclusive};
use derive_where::derive_where;
use scale_info::TypeInfo;
use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -62,7 +62,7 @@ impl<T: BWTypes> HookType for HookTypeFor<T, ElectionPropertiesHook> {

pub struct RulesHook;
impl<T: BWProcessorTypes> HookType for HookTypeFor<T, RulesHook> {
type Input = (T::ChainBlockNumber, u32, T::BlockData);
type Input = (T::ChainBlockNumber, RangeInclusive<u32>, T::BlockData);
type Output = Vec<(T::ChainBlockNumber, T::Event)>;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ fn generate_votes(
) -> ConsensusVotes<SimpleBlockWitnesser> {
println!("Generate votes called");

let to_vote = |data| ConstantIndex { data, _phantom: Default::default() };
let to_vote = |data| ConstantIndex::new(data);

let incorrect_data = vec![1u8, 2, 3];
assert_ne!(incorrect_data, correct_data);
Expand Down
92 changes: 50 additions & 42 deletions state-chain/runtime/src/chainflip/bitcoin_block_processor.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use sp_std::{collections::btree_map::BTreeMap, iter::Step, vec, vec::Vec};

use crate::{
chainflip::bitcoin_elections::{
BitcoinEgressWitnessing, BitcoinVaultDepositWitnessing, BlockDataDepositChannel,
Expand All @@ -10,6 +8,7 @@ use crate::{
use cf_chains::{btc::BlockNumber, instances::BitcoinInstance};
use cf_primitives::chains::Bitcoin;
use codec::{Decode, Encode};
use core::ops::RangeInclusive;
use frame_support::{pallet_prelude::TypeInfo, Deserialize, Serialize};
use pallet_cf_broadcast::TransactionConfirmation;
use pallet_cf_elections::electoral_systems::{
Expand All @@ -19,6 +18,7 @@ use pallet_cf_elections::electoral_systems::{
state_machine::core::Hook,
};
use pallet_cf_ingress_egress::{DepositWitness, VaultDepositWitness};
use sp_std::{collections::btree_map::BTreeMap, iter::Step, vec, vec::Vec};

use super::{bitcoin_elections::BitcoinDepositChannelWitnessing, elections::TypesFor};

Expand Down Expand Up @@ -89,65 +89,73 @@ impl Hook<HookTypeFor<TypesEgressWitnessing, ExecuteHook>> for TypesEgressWitnes
impl Hook<HookTypeFor<TypesDepositChannelWitnessing, RulesHook>> for TypesDepositChannelWitnessing {
fn run(
&mut self,
(block, age, block_data): (BlockNumber, u32, BlockDataDepositChannel),
(block, age, block_data): (BlockNumber, RangeInclusive<u32>, BlockDataDepositChannel),
) -> Vec<(BlockNumber, BtcEvent<DepositWitness<Bitcoin>>)> {
// Prewitness rule
if age == 0 {
return block_data
.iter()
.map(|deposit_witness| (block, BtcEvent::PreWitness(deposit_witness.clone())))
.collect::<Vec<_>>();
let mut results: Vec<(BlockNumber, BtcEvent<DepositWitness<Bitcoin>>)> = vec![];
if age.contains(&0u32) {
results.extend(
block_data
.iter()
.map(|deposit_witness| (block, BtcEvent::PreWitness(deposit_witness.clone())))
.collect::<Vec<_>>(),
)
}
//Full witness rule
if age ==
u64::steps_between(&0, &BitcoinIngressEgress::witness_safety_margin().unwrap_or(0)).0
as u32
{
return block_data
.iter()
.map(|deposit_witness| (block, BtcEvent::Witness(deposit_witness.clone())))
.collect::<Vec<_>>();
if age.contains(
&(u64::steps_between(&0, &BitcoinIngressEgress::witness_safety_margin().unwrap_or(0)).0
as u32),
) {
results.extend(
block_data
.iter()
.map(|deposit_witness| (block, BtcEvent::Witness(deposit_witness.clone())))
.collect::<Vec<_>>(),
)
}
vec![]
results
}
}

impl Hook<HookTypeFor<TypesVaultDepositWitnessing, RulesHook>> for TypesVaultDepositWitnessing {
fn run(
&mut self,
(block, age, block_data): (BlockNumber, u32, BlockDataVaultDeposit),
(block, age, block_data): (BlockNumber, RangeInclusive<u32>, BlockDataVaultDeposit),
) -> Vec<(BlockNumber, BtcEvent<VaultDepositWitness<Runtime, BitcoinInstance>>)> {
// Prewitness rule
if age == 0 {
return block_data
.iter()
.map(|vault_deposit| (block, BtcEvent::PreWitness(vault_deposit.clone())))
.collect::<Vec<_>>();
let mut results: Vec<(
BlockNumber,
BtcEvent<VaultDepositWitness<Runtime, BitcoinInstance>>,
)> = vec![];
if age.contains(&0u32) {
results.extend(
block_data
.iter()
.map(|vault_deposit| (block, BtcEvent::PreWitness(vault_deposit.clone())))
.collect::<Vec<_>>(),
)
}
//Full witness rule
if age ==
u64::steps_between(&0, &BitcoinIngressEgress::witness_safety_margin().unwrap_or(0)).0
as u32
{
return block_data
.iter()
.map(|vault_deposit| (block, BtcEvent::Witness(vault_deposit.clone())))
.collect::<Vec<_>>();
if age.contains(
&(u64::steps_between(&0, &BitcoinIngressEgress::witness_safety_margin().unwrap_or(0)).0
as u32),
) {
results.extend(
block_data
.iter()
.map(|vault_deposit| (block, BtcEvent::Witness(vault_deposit.clone())))
.collect::<Vec<_>>(),
)
}
vec![]
results
}
}

impl Hook<HookTypeFor<TypesEgressWitnessing, RulesHook>> for TypesEgressWitnessing {
fn run(
&mut self,
(block, age, block_data): (BlockNumber, u32, EgressBlockData),
(block, age, block_data): (BlockNumber, RangeInclusive<u32>, EgressBlockData),
) -> Vec<(BlockNumber, BtcEvent<TransactionConfirmation<Runtime, BitcoinInstance>>)> {
//Full witness rule
if age ==
u64::steps_between(&0, &BitcoinIngressEgress::witness_safety_margin().unwrap_or(0)).0
as u32
{
if age.contains(
&(u64::steps_between(&0, &BitcoinIngressEgress::witness_safety_margin().unwrap_or(0)).0
as u32),
) {
return block_data
.iter()
.map(|egress_witness| (block, BtcEvent::Witness(egress_witness.clone())))
Expand Down