mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 08:41:02 +00:00
* Make RelayStrategy::final_decision() sync Signed-off-by: Serban Iorga <serban@parity.io> * Move logic from RelayStrategy to RelayReference Signed-off-by: Serban Iorga <serban@parity.io> * Rename RelayStrategy::final_decision() Signed-off-by: Serban Iorga <serban@parity.io>
This commit is contained in:
committed by
Bastian Köcher
parent
260dad5110
commit
682fafdf56
@@ -17,9 +17,6 @@
|
||||
//! Rational relay strategy
|
||||
|
||||
use async_trait::async_trait;
|
||||
use num_traits::SaturatingAdd;
|
||||
|
||||
use bp_messages::MessageNonce;
|
||||
|
||||
use crate::{
|
||||
message_lane::MessageLane,
|
||||
@@ -44,60 +41,18 @@ impl RelayStrategy for RationalStrategy {
|
||||
&mut self,
|
||||
reference: &mut RelayReference<P, SourceClient, TargetClient>,
|
||||
) -> bool {
|
||||
let total_cost = match estimate_messages_delivery_cost(reference).await {
|
||||
Ok(total_cost) => total_cost,
|
||||
Err(err) => {
|
||||
log::debug!(
|
||||
target: "bridge",
|
||||
"Failed to estimate delivery transaction cost: {:?}. No nonces selected for delivery",
|
||||
err,
|
||||
);
|
||||
|
||||
return false
|
||||
},
|
||||
};
|
||||
|
||||
// if it is the first message that makes reward less than cost, let's log it
|
||||
// if this message makes batch profitable again, let's log it
|
||||
let MessagesDeliveryCost { confirmation_transaction_cost, delivery_transaction_cost } =
|
||||
total_cost;
|
||||
let is_total_reward_less_than_cost = reference.total_reward < reference.total_cost;
|
||||
let prev_total_cost = reference.total_cost;
|
||||
let prev_total_reward = reference.total_reward;
|
||||
reference.total_confirmations_cost = reference
|
||||
.total_confirmations_cost
|
||||
.saturating_add(&confirmation_transaction_cost);
|
||||
reference.total_reward = reference.total_reward.saturating_add(&reference.details.reward);
|
||||
reference.total_cost =
|
||||
reference.total_confirmations_cost.saturating_add(&delivery_transaction_cost);
|
||||
if !is_total_reward_less_than_cost && reference.total_reward < reference.total_cost {
|
||||
if let Err(e) = reference.update_cost_and_reward().await {
|
||||
log::debug!(
|
||||
target: "bridge",
|
||||
"Message with nonce {} (reward = {:?}) changes total cost {:?}->{:?} and makes it larger than \
|
||||
total reward {:?}->{:?}",
|
||||
reference.nonce,
|
||||
reference.details.reward,
|
||||
prev_total_cost,
|
||||
reference.total_cost,
|
||||
prev_total_reward,
|
||||
reference.total_reward,
|
||||
);
|
||||
} else if is_total_reward_less_than_cost && reference.total_reward >= reference.total_cost {
|
||||
log::debug!(
|
||||
target: "bridge",
|
||||
"Message with nonce {} (reward = {:?}) changes total cost {:?}->{:?} and makes it less than or \
|
||||
equal to the total reward {:?}->{:?} (again)",
|
||||
reference.nonce,
|
||||
reference.details.reward,
|
||||
prev_total_cost,
|
||||
reference.total_cost,
|
||||
prev_total_reward,
|
||||
reference.total_reward,
|
||||
"Failed to update transaction cost and reward: {:?}. No nonces selected for delivery",
|
||||
e,
|
||||
);
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Rational relayer never want to lose his funds
|
||||
if reference.total_reward >= reference.total_cost {
|
||||
// Rational relayer never wants to lose his funds.
|
||||
if reference.is_profitable() {
|
||||
reference.selected_reward = reference.total_reward;
|
||||
reference.selected_cost = reference.total_cost;
|
||||
return true
|
||||
@@ -106,7 +61,7 @@ impl RelayStrategy for RationalStrategy {
|
||||
false
|
||||
}
|
||||
|
||||
async fn final_decision<
|
||||
fn on_final_decision<
|
||||
P: MessageLane,
|
||||
SourceClient: MessageLaneSourceClient<P>,
|
||||
TargetClient: MessageLaneTargetClient<P>,
|
||||
@@ -118,40 +73,3 @@ impl RelayStrategy for RationalStrategy {
|
||||
// anything here
|
||||
}
|
||||
}
|
||||
|
||||
/// Total cost of mesage delivery and confirmation.
|
||||
struct MessagesDeliveryCost<SourceChainBalance> {
|
||||
/// Cost of message delivery transaction.
|
||||
pub delivery_transaction_cost: SourceChainBalance,
|
||||
/// Cost of confirmation delivery transaction.
|
||||
pub confirmation_transaction_cost: SourceChainBalance,
|
||||
}
|
||||
|
||||
/// Returns cost of message delivery and confirmation delivery transactions
|
||||
async fn estimate_messages_delivery_cost<
|
||||
P: MessageLane,
|
||||
SourceClient: MessageLaneSourceClient<P>,
|
||||
TargetClient: MessageLaneTargetClient<P>,
|
||||
>(
|
||||
reference: &RelayReference<P, SourceClient, TargetClient>,
|
||||
) -> Result<MessagesDeliveryCost<P::SourceChainBalance>, TargetClient::Error> {
|
||||
// technically, multiple confirmations will be delivered in a single transaction,
|
||||
// meaning less loses for relayer. But here we don't know the final relayer yet, so
|
||||
// we're adding a separate transaction for every message. Normally, this cost is covered
|
||||
// by the message sender. Probably reconsider this?
|
||||
let confirmation_transaction_cost =
|
||||
reference.lane_source_client.estimate_confirmation_transaction().await;
|
||||
|
||||
let delivery_transaction_cost = reference
|
||||
.lane_target_client
|
||||
.estimate_delivery_transaction_in_source_tokens(
|
||||
reference.hard_selected_begin_nonce..=
|
||||
(reference.hard_selected_begin_nonce + reference.index as MessageNonce),
|
||||
reference.selected_prepaid_nonces,
|
||||
reference.selected_unpaid_weight,
|
||||
reference.selected_size as u32,
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(MessagesDeliveryCost { confirmation_transaction_cost, delivery_transaction_cost })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user