Cli option for greedy relayer + run no-losses relayer by default (#1042)

* cli option for greedy relayer + run no-losses relayer by default

* trigger build

* Revert "trigger build"

This reverts commit f77ae3a634b909bb4dc915941a4c1011a86019f0.

* NoLosses -> Rational
This commit is contained in:
Svyatoslav Nikolsky
2021-07-06 21:56:23 +03:00
committed by Bastian Köcher
parent 754e5ad8c7
commit a428420866
11 changed files with 131 additions and 23 deletions
+10 -2
View File
@@ -21,7 +21,7 @@
use num_traits::{SaturatingAdd, Zero};
use relay_utils::{BlockNumberBase, HeaderId};
use std::fmt::Debug;
use std::{fmt::Debug, ops::Sub};
/// One-way message lane.
pub trait MessageLane: 'static + Clone + Send + Sync {
@@ -40,7 +40,15 @@ pub trait MessageLane: 'static + Clone + Send + Sync {
/// 1) pay transaction fees;
/// 2) pay message delivery and dispatch fee;
/// 3) pay relayer rewards.
type SourceChainBalance: Clone + Copy + Debug + PartialOrd + SaturatingAdd + Zero + Send + Sync;
type SourceChainBalance: Clone
+ Copy
+ Debug
+ PartialOrd
+ Sub<Output = Self::SourceChainBalance>
+ SaturatingAdd
+ Zero
+ Send
+ Sync;
/// Number of the source header.
type SourceHeaderNumber: BlockNumberBase;
/// Hash of the source header.
@@ -65,7 +65,7 @@ pub enum RelayerMode {
/// The relayer doesn't care about rewards.
Altruistic,
/// The relayer will deliver all messages and confirmations as long as he's not losing any funds.
NoLosses,
Rational,
}
/// Message delivery race parameters.
@@ -540,8 +540,7 @@ where
/// From given set of source nonces, that are ready to be delivered, select nonces
/// to fit into single delivery transaction.
///
/// The function returns nonces that are NOT selected for current batch and will be
/// delivered later.
/// The function returns last nonce that must be delivered to the target chain.
#[allow(clippy::too_many_arguments)]
async fn select_nonces_for_delivery_transaction<P: MessageLane>(
relayer_mode: RelayerMode,
@@ -564,6 +563,8 @@ async fn select_nonces_for_delivery_transaction<P: MessageLane>(
let mut selected_unpaid_weight: Weight = 0;
let mut selected_size: u32 = 0;
let mut selected_count: MessageNonce = 0;
let mut selected_reward = P::SourceChainBalance::zero();
let mut selected_cost = P::SourceChainBalance::zero();
let mut total_reward = P::SourceChainBalance::zero();
let mut total_confirmations_cost = P::SourceChainBalance::zero();
@@ -647,7 +648,7 @@ async fn select_nonces_for_delivery_transaction<P: MessageLane>(
RelayerMode::Altruistic => {
soft_selected_count = index + 1;
}
RelayerMode::NoLosses => {
RelayerMode::Rational => {
let delivery_transaction_cost = lane_target_client
.estimate_delivery_transaction_in_source_tokens(
0..=(new_selected_count as MessageNonce - 1),
@@ -698,9 +699,11 @@ async fn select_nonces_for_delivery_transaction<P: MessageLane>(
);
}
// NoLosses relayer never want to lose his funds
// Rational relayer never want to lose his funds
if total_reward >= total_cost {
soft_selected_count = index + 1;
selected_reward = total_reward;
selected_cost = total_cost;
}
}
}
@@ -732,6 +735,18 @@ async fn select_nonces_for_delivery_transaction<P: MessageLane>(
}
if hard_selected_count != 0 {
if relayer_mode != RelayerMode::Altruistic {
log::trace!(
target: "bridge",
"Expected reward from delivering nonces [{:?}; {:?}] is: {:?} - {:?} = {:?}",
hard_selected_begin_nonce,
hard_selected_begin_nonce + hard_selected_count as MessageNonce - 1,
selected_reward,
selected_cost,
selected_reward - selected_cost,
);
}
Some(hard_selected_begin_nonce + hard_selected_count as MessageNonce - 1)
} else {
None
@@ -1151,9 +1166,9 @@ mod tests {
}
#[async_std::test]
async fn no_losses_relayer_is_delivering_messages_if_cost_is_equal_to_reward() {
async fn rational_relayer_is_delivering_messages_if_cost_is_equal_to_reward() {
let (state, mut strategy) = prepare_strategy();
strategy.relayer_mode = RelayerMode::NoLosses;
strategy.relayer_mode = RelayerMode::Rational;
// so now we have:
// - 20..=23 with reward = cost
@@ -1165,7 +1180,7 @@ mod tests {
}
#[async_std::test]
async fn no_losses_relayer_is_not_delivering_messages_if_cost_is_larger_than_reward() {
async fn rational_relayer_is_not_delivering_messages_if_cost_is_larger_than_reward() {
let (mut state, mut strategy) = prepare_strategy();
let nonces = source_nonces(
24..=25,
@@ -1175,7 +1190,7 @@ mod tests {
);
strategy.strategy.source_nonces_updated(header_id(2), nonces);
state.best_finalized_source_header_id_at_best_target = Some(header_id(2));
strategy.relayer_mode = RelayerMode::NoLosses;
strategy.relayer_mode = RelayerMode::Rational;
// so now we have:
// - 20..=23 with reward = cost
@@ -1188,7 +1203,7 @@ mod tests {
}
#[async_std::test]
async fn no_losses_relayer_is_delivering_unpaid_messages() {
async fn rational_relayer_is_delivering_unpaid_messages() {
async fn test_with_dispatch_fee_payment(
dispatch_fee_payment: DispatchFeePayment,
) -> Option<(RangeInclusive<MessageNonce>, MessageProofParameters)> {
@@ -1206,7 +1221,7 @@ mod tests {
strategy.max_messages_in_single_batch = 100;
strategy.max_messages_weight_in_single_batch = 100;
strategy.max_messages_size_in_single_batch = 100;
strategy.relayer_mode = RelayerMode::NoLosses;
strategy.relayer_mode = RelayerMode::Rational;
// so now we have:
// - 20..=23 with reward = cost