Skip to content

Commit 92e86f0

Browse files
authored
New relayer rewards scheme integration (#1652)
* relayer rewards integration: initial commit * added refund-relayer-extension to the millau runtime * spelling * spelling again * new -> Default
1 parent 8649d12 commit 92e86f0

File tree

11 files changed

+158
-138
lines changed

11 files changed

+158
-138
lines changed

bin/millau/runtime/src/lib.rs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -471,15 +471,15 @@ impl pallet_bridge_messages::Config<WithRialtoMessagesInstance> for Runtime {
471471

472472
type InboundPayload = crate::rialto_messages::FromRialtoMessagePayload;
473473
type InboundRelayer = bp_rialto::AccountId;
474+
type DeliveryPayments = ();
474475

475476
type TargetHeaderChain = crate::rialto_messages::Rialto;
476477
type LaneMessageVerifier = crate::rialto_messages::ToRialtoMessageVerifier;
477-
type MessageDeliveryAndDispatchPayment =
478-
pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
479-
Runtime,
480-
frame_support::traits::ConstU64<100_000>,
481-
frame_support::traits::ConstU64<100_000>,
482-
>;
478+
type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
479+
Runtime,
480+
frame_support::traits::ConstU64<100_000>,
481+
frame_support::traits::ConstU64<100_000>,
482+
>;
483483

484484
type SourceHeaderChain = crate::rialto_messages::Rialto;
485485
type MessageDispatch = crate::rialto_messages::FromRialtoMessageDispatch;
@@ -502,22 +502,24 @@ impl pallet_bridge_messages::Config<WithRialtoParachainMessagesInstance> for Run
502502

503503
type InboundPayload = crate::rialto_parachain_messages::FromRialtoParachainMessagePayload;
504504
type InboundRelayer = bp_rialto_parachain::AccountId;
505+
type DeliveryPayments = ();
505506

506507
type TargetHeaderChain = crate::rialto_parachain_messages::RialtoParachain;
507508
type LaneMessageVerifier = crate::rialto_parachain_messages::ToRialtoParachainMessageVerifier;
508-
type MessageDeliveryAndDispatchPayment =
509-
pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
510-
Runtime,
511-
frame_support::traits::ConstU64<100_000>,
512-
frame_support::traits::ConstU64<100_000>,
513-
>;
509+
type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
510+
Runtime,
511+
frame_support::traits::ConstU64<100_000>,
512+
frame_support::traits::ConstU64<100_000>,
513+
>;
514514

515515
type SourceHeaderChain = crate::rialto_parachain_messages::RialtoParachain;
516516
type MessageDispatch = crate::rialto_parachain_messages::FromRialtoParachainMessageDispatch;
517517
type BridgedChainId = RialtoParachainChainId;
518518
}
519519

520520
parameter_types! {
521+
pub const RialtoParachainMessagesLane: bp_messages::LaneId = rialto_parachain_messages::XCM_LANE;
522+
pub const RialtoParachainId: u32 = bp_rialto_parachain::RIALTO_PARACHAIN_ID;
521523
pub const RialtoParasPalletName: &'static str = bp_rialto::PARAS_PALLET_NAME;
522524
pub const WestendParasPalletName: &'static str = bp_westend::PARAS_PALLET_NAME;
523525
pub const MaxRialtoParaHeadSize: u32 = bp_rialto::MAX_NESTED_PARACHAIN_HEAD_SIZE;
@@ -613,6 +615,19 @@ generate_bridge_reject_obsolete_headers_and_messages! {
613615
BridgeRialtoMessages, BridgeRialtoParachainMessages
614616
}
615617

618+
/// Signed extension that refunds relayers that are delivering messages from the Rialto parachain.
619+
pub type BridgeRefundRialtoParachainRelayers =
620+
bridge_runtime_common::refund_relayer_extension::RefundRelayerForMessagesFromParachain<
621+
Runtime,
622+
RialtoGrandpaInstance,
623+
WithRialtoParachainsInstance,
624+
WithRialtoParachainMessagesInstance,
625+
BridgeRejectObsoleteHeadersAndMessages,
626+
RialtoParachainId,
627+
RialtoParachainMessagesLane,
628+
Runtime,
629+
>;
630+
616631
/// The address format for describing accounts.
617632
pub type Address = AccountId;
618633
/// Block header type as expected by this runtime.
@@ -634,6 +649,7 @@ pub type SignedExtra = (
634649
frame_system::CheckWeight<Runtime>,
635650
pallet_transaction_payment::ChargeTransactionPayment<Runtime>,
636651
BridgeRejectObsoleteHeadersAndMessages,
652+
BridgeRefundRialtoParachainRelayers,
637653
);
638654
/// The payload being signed in transactions.
639655
pub type SignedPayload = generic::SignedPayload<RuntimeCall, SignedExtra>;

bin/rialto-parachain/runtime/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -566,15 +566,15 @@ impl pallet_bridge_messages::Config<WithMillauMessagesInstance> for Runtime {
566566

567567
type InboundPayload = crate::millau_messages::FromMillauMessagePayload;
568568
type InboundRelayer = bp_millau::AccountId;
569+
type DeliveryPayments = ();
569570

570571
type TargetHeaderChain = crate::millau_messages::Millau;
571572
type LaneMessageVerifier = crate::millau_messages::ToMillauMessageVerifier;
572-
type MessageDeliveryAndDispatchPayment =
573-
pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
574-
Runtime,
575-
frame_support::traits::ConstU64<100_000>,
576-
frame_support::traits::ConstU64<100_000>,
577-
>;
573+
type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
574+
Runtime,
575+
frame_support::traits::ConstU128<100_000>,
576+
frame_support::traits::ConstU128<100_000>,
577+
>;
578578

579579
type SourceHeaderChain = crate::millau_messages::Millau;
580580
type MessageDispatch = crate::millau_messages::FromMillauMessageDispatch;

bin/rialto/runtime/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,15 +453,15 @@ impl pallet_bridge_messages::Config<WithMillauMessagesInstance> for Runtime {
453453

454454
type InboundPayload = crate::millau_messages::FromMillauMessagePayload;
455455
type InboundRelayer = bp_millau::AccountId;
456+
type DeliveryPayments = ();
456457

457458
type TargetHeaderChain = crate::millau_messages::Millau;
458459
type LaneMessageVerifier = crate::millau_messages::ToMillauMessageVerifier;
459-
type MessageDeliveryAndDispatchPayment =
460-
pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
461-
Runtime,
462-
frame_support::traits::ConstU64<100_000>,
463-
frame_support::traits::ConstU64<100_000>,
464-
>;
460+
type DeliveryConfirmationPayments = pallet_bridge_relayers::DeliveryConfirmationPaymentsAdapter<
461+
Runtime,
462+
frame_support::traits::ConstU128<100_000>,
463+
frame_support::traits::ConstU128<100_000>,
464+
>;
465465

466466
type SourceHeaderChain = crate::millau_messages::Millau;
467467
type MessageDispatch = crate::millau_messages::FromMillauMessageDispatch;

bin/runtime-common/src/refund_relayer_extension.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use codec::{Decode, Encode};
3333
use frame_support::{
3434
dispatch::{CallableCallFor, DispatchInfo, Dispatchable, PostDispatchInfo},
3535
traits::IsSubType,
36-
CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound,
36+
CloneNoBound, DefaultNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound,
3737
};
3838
use pallet_bridge_grandpa::{
3939
BridgedChain, Call as GrandpaCall, Config as GrandpaConfig, Pallet as GrandpaPallet,
@@ -95,7 +95,14 @@ where
9595
///
9696
/// Extension does not refund transaction tip due to security reasons.
9797
#[derive(
98-
CloneNoBound, Decode, Encode, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo,
98+
CloneNoBound,
99+
Decode,
100+
DefaultNoBound,
101+
Encode,
102+
EqNoBound,
103+
PartialEqNoBound,
104+
RuntimeDebugNoBound,
105+
TypeInfo,
99106
)]
100107
#[scale_info(skip_type_params(RT, GI, PI, MI, BE, PID, LID, FEE))]
101108
#[allow(clippy::type_complexity)] // TODO: get rid of that in https://github.com/paritytech/parity-bridges-common/issues/1666

modules/messages/src/lib.rs

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ use crate::{
5252

5353
use bp_messages::{
5454
source_chain::{
55-
LaneMessageVerifier, MessageDeliveryAndDispatchPayment, SendMessageArtifacts,
56-
TargetHeaderChain,
55+
DeliveryConfirmationPayments, LaneMessageVerifier, SendMessageArtifacts, TargetHeaderChain,
5756
},
5857
target_chain::{
59-
DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages, SourceHeaderChain,
58+
DeliveryPayments, DispatchMessage, MessageDispatch, ProvedLaneMessages, ProvedMessages,
59+
SourceHeaderChain,
6060
},
6161
total_unrewarded_messages, DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId,
6262
MessageKey, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData,
@@ -143,18 +143,17 @@ pub mod pallet {
143143
/// Identifier of relayer that deliver messages to this chain. Relayer reward is paid on the
144144
/// bridged chain.
145145
type InboundRelayer: Parameter + MaxEncodedLen;
146+
/// Delivery payments.
147+
type DeliveryPayments: DeliveryPayments<Self::AccountId>;
146148

147149
// Types that are used by outbound_lane (on source chain).
148150

149151
/// Target header chain.
150152
type TargetHeaderChain: TargetHeaderChain<Self::OutboundPayload, Self::AccountId>;
151153
/// Message payload verifier.
152154
type LaneMessageVerifier: LaneMessageVerifier<Self::RuntimeOrigin, Self::OutboundPayload>;
153-
/// Message delivery payment.
154-
type MessageDeliveryAndDispatchPayment: MessageDeliveryAndDispatchPayment<
155-
Self::RuntimeOrigin,
156-
Self::AccountId,
157-
>;
155+
/// Delivery confirmation payments.
156+
type DeliveryConfirmationPayments: DeliveryConfirmationPayments<Self::AccountId>;
158157

159158
// Types that are used by inbound_lane (on target chain).
160159

@@ -377,9 +376,17 @@ pub mod pallet {
377376
messages_received_status.push(lane_messages_received_status);
378377
}
379378

379+
// let's now deal with relayer payments
380+
T::DeliveryPayments::pay_reward(
381+
relayer_id_at_this_chain,
382+
total_messages,
383+
valid_messages,
384+
actual_weight,
385+
);
386+
380387
log::debug!(
381388
target: LOG_TARGET,
382-
"Received messages: total={}, valid={}. Weight used: {}/{}",
389+
"Received messages: total={}, valid={}. Weight used: {}/{}.",
383390
total_messages,
384391
valid_messages,
385392
actual_weight,
@@ -388,7 +395,7 @@ pub mod pallet {
388395

389396
Self::deposit_event(Event::MessagesReceived(messages_received_status));
390397

391-
Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::Yes })
398+
Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee: Pays::No })
392399
}
393400

394401
/// Receive messages delivery proof from bridged chain.
@@ -475,7 +482,7 @@ pub mod pallet {
475482
});
476483

477484
// if some new messages have been confirmed, reward relayers
478-
<T as Config<I>>::MessageDeliveryAndDispatchPayment::pay_relayers_rewards(
485+
T::DeliveryConfirmationPayments::pay_reward(
479486
lane_id,
480487
lane_data.relayers,
481488
&confirmation_relayer,
@@ -879,10 +886,10 @@ mod tests {
879886
use super::*;
880887
use crate::mock::{
881888
message, message_payload, run_test, unrewarded_relayer, DbWeight,
882-
RuntimeEvent as TestEvent, RuntimeOrigin, TestMessageDeliveryAndDispatchPayment,
883-
TestMessagesDeliveryProof, TestMessagesProof, TestRuntime, MAX_OUTBOUND_PAYLOAD_SIZE,
884-
PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_LANE_ID_2,
885-
TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B,
889+
RuntimeEvent as TestEvent, RuntimeOrigin, TestDeliveryConfirmationPayments,
890+
TestDeliveryPayments, TestMessagesDeliveryProof, TestMessagesProof, TestRuntime,
891+
MAX_OUTBOUND_PAYLOAD_SIZE, PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID,
892+
TEST_LANE_ID_2, TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B,
886893
};
887894
use bp_messages::{UnrewardedRelayer, UnrewardedRelayersState};
888895
use bp_test_utils::generate_owned_bridge_module_tests;
@@ -1165,6 +1172,8 @@ mod tests {
11651172
));
11661173

11671174
assert_eq!(InboundLanes::<TestRuntime>::get(TEST_LANE_ID).0.last_delivered_nonce(), 1);
1175+
1176+
assert!(TestDeliveryPayments::is_reward_paid(1));
11681177
});
11691178
}
11701179

@@ -1326,8 +1335,8 @@ mod tests {
13261335
..Default::default()
13271336
},
13281337
));
1329-
assert!(TestMessageDeliveryAndDispatchPayment::is_reward_paid(TEST_RELAYER_A, 1));
1330-
assert!(!TestMessageDeliveryAndDispatchPayment::is_reward_paid(TEST_RELAYER_B, 1));
1338+
assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1));
1339+
assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1));
13311340

13321341
// this reports delivery of both message 1 and message 2 => reward is paid only to
13331342
// TEST_RELAYER_B
@@ -1352,8 +1361,8 @@ mod tests {
13521361
..Default::default()
13531362
},
13541363
));
1355-
assert!(!TestMessageDeliveryAndDispatchPayment::is_reward_paid(TEST_RELAYER_A, 1));
1356-
assert!(TestMessageDeliveryAndDispatchPayment::is_reward_paid(TEST_RELAYER_B, 1));
1364+
assert!(!TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_A, 1));
1365+
assert!(TestDeliveryConfirmationPayments::is_reward_paid(TEST_RELAYER_B, 1));
13571366
});
13581367
}
13591368

modules/messages/src/mock.rs

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ use crate::Config;
2121

2222
use bp_messages::{
2323
calc_relayers_rewards,
24-
source_chain::{LaneMessageVerifier, MessageDeliveryAndDispatchPayment, TargetHeaderChain},
24+
source_chain::{DeliveryConfirmationPayments, LaneMessageVerifier, TargetHeaderChain},
2525
target_chain::{
26-
DispatchMessage, DispatchMessageData, MessageDispatch, ProvedLaneMessages, ProvedMessages,
27-
SourceHeaderChain,
26+
DeliveryPayments, DispatchMessage, DispatchMessageData, MessageDispatch,
27+
ProvedLaneMessages, ProvedMessages, SourceHeaderChain,
2828
},
2929
DeliveredMessages, InboundLaneData, LaneId, Message, MessageKey, MessageNonce, MessagePayload,
3030
OutboundLaneData, UnrewardedRelayer,
@@ -154,10 +154,11 @@ impl Config for TestRuntime {
154154

155155
type InboundPayload = TestPayload;
156156
type InboundRelayer = TestRelayer;
157+
type DeliveryPayments = TestDeliveryPayments;
157158

158159
type TargetHeaderChain = TestTargetHeaderChain;
159160
type LaneMessageVerifier = TestLaneMessageVerifier;
160-
type MessageDeliveryAndDispatchPayment = TestMessageDeliveryAndDispatchPayment;
161+
type DeliveryConfirmationPayments = TestDeliveryConfirmationPayments;
161162

162163
type SourceHeaderChain = TestSourceHeaderChain;
163164
type MessageDispatch = TestMessageDispatch;
@@ -288,11 +289,38 @@ impl LaneMessageVerifier<RuntimeOrigin, TestPayload> for TestLaneMessageVerifier
288289
}
289290
}
290291

291-
/// Message fee payment system that is used in tests.
292+
/// Reward payments at the target chain during delivery transaction.
292293
#[derive(Debug, Default)]
293-
pub struct TestMessageDeliveryAndDispatchPayment;
294+
pub struct TestDeliveryPayments;
294295

295-
impl TestMessageDeliveryAndDispatchPayment {
296+
impl TestDeliveryPayments {
297+
/// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is
298+
/// cleared after the call.
299+
pub fn is_reward_paid(relayer: AccountId) -> bool {
300+
let key = (b":delivery-relayer-reward:", relayer).encode();
301+
frame_support::storage::unhashed::take::<bool>(&key).is_some()
302+
}
303+
}
304+
305+
impl DeliveryPayments<AccountId> for TestDeliveryPayments {
306+
type Error = &'static str;
307+
308+
fn pay_reward(
309+
relayer: AccountId,
310+
_total_messages: MessageNonce,
311+
_valid_messages: MessageNonce,
312+
_actual_weight: Weight,
313+
) {
314+
let key = (b":delivery-relayer-reward:", relayer).encode();
315+
frame_support::storage::unhashed::put(&key, &true);
316+
}
317+
}
318+
319+
/// Reward payments at the source chain during delivery confirmation transaction.
320+
#[derive(Debug, Default)]
321+
pub struct TestDeliveryConfirmationPayments;
322+
323+
impl TestDeliveryConfirmationPayments {
296324
/// Returns true if given relayer has been rewarded with given balance. The reward-paid flag is
297325
/// cleared after the call.
298326
pub fn is_reward_paid(relayer: AccountId, fee: TestMessageFee) -> bool {
@@ -301,18 +329,16 @@ impl TestMessageDeliveryAndDispatchPayment {
301329
}
302330
}
303331

304-
impl MessageDeliveryAndDispatchPayment<RuntimeOrigin, AccountId>
305-
for TestMessageDeliveryAndDispatchPayment
306-
{
332+
impl DeliveryConfirmationPayments<AccountId> for TestDeliveryConfirmationPayments {
307333
type Error = &'static str;
308334

309-
fn pay_relayers_rewards(
335+
fn pay_reward(
310336
_lane_id: LaneId,
311-
message_relayers: VecDeque<UnrewardedRelayer<AccountId>>,
337+
messages_relayers: VecDeque<UnrewardedRelayer<AccountId>>,
312338
_confirmation_relayer: &AccountId,
313339
received_range: &RangeInclusive<MessageNonce>,
314340
) {
315-
let relayers_rewards = calc_relayers_rewards(message_relayers, received_range);
341+
let relayers_rewards = calc_relayers_rewards(messages_relayers, received_range);
316342
for (relayer, reward) in &relayers_rewards {
317343
let key = (b":relayer-reward:", relayer, reward).encode();
318344
frame_support::storage::unhashed::put(&key, &true);

0 commit comments

Comments
 (0)