mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-01 01:01:01 +00:00
Fix invalid batch transaction (#1957)
* fix invalid batch transaction * RaceState is now trait * clippy
This commit is contained in:
committed by
Bastian Köcher
parent
ce89a2edca
commit
2a848fd836
@@ -322,13 +322,19 @@ where
|
||||
self.strategy.is_empty()
|
||||
}
|
||||
|
||||
fn required_source_header_at_target(
|
||||
fn required_source_header_at_target<RS: RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>>>(
|
||||
&self,
|
||||
current_best: &SourceHeaderIdOf<P>,
|
||||
race_state: RS,
|
||||
) -> Option<SourceHeaderIdOf<P>> {
|
||||
// we have already submitted something - let's wait until it is mined
|
||||
if race_state.nonces_submitted().is_some() {
|
||||
return None
|
||||
}
|
||||
|
||||
let has_nonces_to_deliver = !self.strategy.is_empty();
|
||||
let header_required_for_messages_delivery =
|
||||
self.strategy.required_source_header_at_target(current_best);
|
||||
self.strategy.required_source_header_at_target(current_best, race_state);
|
||||
let header_required_for_reward_confirmations_delivery = self
|
||||
.latest_confirmed_nonces_at_source
|
||||
.back()
|
||||
@@ -381,10 +387,10 @@ where
|
||||
self.strategy.source_nonces_updated(at_block, nonces)
|
||||
}
|
||||
|
||||
fn best_target_nonces_updated(
|
||||
fn best_target_nonces_updated<RS: RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>>>(
|
||||
&mut self,
|
||||
nonces: TargetClientNonces<DeliveryRaceTargetNoncesData>,
|
||||
race_state: &mut RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>, P::MessagesProof>,
|
||||
race_state: &mut RS,
|
||||
) {
|
||||
// best target nonces must always be ge than finalized target nonces
|
||||
let latest_nonce = nonces.latest_nonce;
|
||||
@@ -396,13 +402,13 @@ where
|
||||
)
|
||||
}
|
||||
|
||||
fn finalized_target_nonces_updated(
|
||||
fn finalized_target_nonces_updated<RS: RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>>>(
|
||||
&mut self,
|
||||
nonces: TargetClientNonces<DeliveryRaceTargetNoncesData>,
|
||||
race_state: &mut RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>, P::MessagesProof>,
|
||||
race_state: &mut RS,
|
||||
) {
|
||||
if let Some(ref best_finalized_source_header_id_at_best_target) =
|
||||
race_state.best_finalized_source_header_id_at_best_target
|
||||
race_state.best_finalized_source_header_id_at_best_target()
|
||||
{
|
||||
let oldest_header_number_to_keep = best_finalized_source_header_id_at_best_target.0;
|
||||
while self
|
||||
@@ -426,13 +432,13 @@ where
|
||||
)
|
||||
}
|
||||
|
||||
async fn select_nonces_to_deliver(
|
||||
async fn select_nonces_to_deliver<RS: RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>>>(
|
||||
&self,
|
||||
race_state: RaceState<SourceHeaderIdOf<P>, TargetHeaderIdOf<P>, P::MessagesProof>,
|
||||
race_state: RS,
|
||||
) -> Option<(RangeInclusive<MessageNonce>, Self::ProofParameters)> {
|
||||
let best_target_nonce = self.strategy.best_at_target()?;
|
||||
let best_finalized_source_header_id_at_best_target =
|
||||
race_state.best_finalized_source_header_id_at_best_target.clone()?;
|
||||
race_state.best_finalized_source_header_id_at_best_target()?;
|
||||
let latest_confirmed_nonce_at_source = self
|
||||
.latest_confirmed_nonces_at_source
|
||||
.iter()
|
||||
@@ -576,12 +582,16 @@ impl<SourceChainBalance: std::fmt::Debug> NoncesRange for MessageDetailsMap<Sour
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::message_lane_loop::{
|
||||
tests::{
|
||||
header_id, TestMessageLane, TestMessagesProof, TestSourceChainBalance,
|
||||
TestSourceClient, TestSourceHeaderId, TestTargetClient, TestTargetHeaderId,
|
||||
use crate::{
|
||||
message_lane_loop::{
|
||||
tests::{
|
||||
header_id, TestMessageLane, TestMessagesBatchTransaction, TestMessagesProof,
|
||||
TestSourceChainBalance, TestSourceClient, TestSourceHeaderId, TestTargetClient,
|
||||
TestTargetHeaderId,
|
||||
},
|
||||
MessageDetails,
|
||||
},
|
||||
MessageDetails,
|
||||
message_race_loop::RaceStateImpl,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
@@ -589,7 +599,12 @@ mod tests {
|
||||
const DEFAULT_DISPATCH_WEIGHT: Weight = Weight::from_parts(1, 0);
|
||||
const DEFAULT_SIZE: u32 = 1;
|
||||
|
||||
type TestRaceState = RaceState<TestSourceHeaderId, TestTargetHeaderId, TestMessagesProof>;
|
||||
type TestRaceState = RaceStateImpl<
|
||||
TestSourceHeaderId,
|
||||
TestTargetHeaderId,
|
||||
TestMessagesProof,
|
||||
TestMessagesBatchTransaction,
|
||||
>;
|
||||
type TestStrategy =
|
||||
MessageDeliveryStrategy<TestMessageLane, TestSourceClient, TestTargetClient>;
|
||||
|
||||
@@ -617,12 +632,13 @@ mod tests {
|
||||
}
|
||||
|
||||
fn prepare_strategy() -> (TestRaceState, TestStrategy) {
|
||||
let mut race_state = RaceState {
|
||||
let mut race_state = RaceStateImpl {
|
||||
best_finalized_source_header_id_at_source: Some(header_id(1)),
|
||||
best_finalized_source_header_id_at_best_target: Some(header_id(1)),
|
||||
best_target_header_id: Some(header_id(1)),
|
||||
best_finalized_target_header_id: Some(header_id(1)),
|
||||
nonces_to_submit: None,
|
||||
nonces_to_submit_batch: None,
|
||||
nonces_submitted: None,
|
||||
};
|
||||
|
||||
@@ -964,14 +980,17 @@ mod tests {
|
||||
);
|
||||
// nothing needs to be delivered now and we don't need any new headers
|
||||
assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(1)), None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(1), state.clone()), None);
|
||||
|
||||
// now let's generate two more nonces [24; 25] at the soruce;
|
||||
strategy.source_nonces_updated(header_id(2), source_nonces(24..=25, 19, 0));
|
||||
//
|
||||
// - so now we'll need to relay source block#2 to be able to accept messages [24; 25].
|
||||
assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(1)), Some(header_id(2)));
|
||||
assert_eq!(
|
||||
strategy.required_source_header_at_target(&header_id(1), state.clone()),
|
||||
Some(header_id(2))
|
||||
);
|
||||
|
||||
// let's relay source block#2
|
||||
state.best_finalized_source_header_id_at_source = Some(header_id(2));
|
||||
@@ -982,7 +1001,7 @@ mod tests {
|
||||
// and ask strategy again => still nothing to deliver, because parallel confirmations
|
||||
// race need to be pushed further
|
||||
assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(2)), None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(2), state.clone()), None);
|
||||
|
||||
// let's confirm messages [20; 23]
|
||||
strategy.source_nonces_updated(header_id(2), source_nonces(24..=25, 23, 0));
|
||||
@@ -990,10 +1009,10 @@ mod tests {
|
||||
// and ask strategy again => now we have everything required to deliver remaining
|
||||
// [24; 25] nonces and proof of [20; 23] confirmation
|
||||
assert_eq!(
|
||||
strategy.select_nonces_to_deliver(state).await,
|
||||
strategy.select_nonces_to_deliver(state.clone()).await,
|
||||
Some(((24..=25), proof_parameters(true, 2))),
|
||||
);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(2)), None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&header_id(2), state), None);
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
@@ -1025,6 +1044,7 @@ mod tests {
|
||||
#[test]
|
||||
#[allow(clippy::reversed_empty_ranges)]
|
||||
fn no_source_headers_required_at_target_if_lanes_are_empty() {
|
||||
let (state, _) = prepare_strategy();
|
||||
let mut strategy = TestStrategy {
|
||||
max_unrewarded_relayer_entries_at_target: 4,
|
||||
max_unconfirmed_nonces_at_target: 4,
|
||||
@@ -1053,7 +1073,7 @@ mod tests {
|
||||
strategy.latest_confirmed_nonces_at_source,
|
||||
VecDeque::from([(source_header_id, 0)])
|
||||
);
|
||||
assert_eq!(strategy.required_source_header_at_target(&source_header_id), None);
|
||||
assert_eq!(strategy.required_source_header_at_target(&source_header_id, state), None);
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
|
||||
Reference in New Issue
Block a user