Skip to content
Open
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
663c4c3
per-lane priority boost: prototype
svyatonik Oct 2, 2023
cb2e045
compute_per_lane_priority_boost to discuss new approach
svyatonik Oct 2, 2023
d310fe0
clippy
svyatonik Oct 2, 2023
57cd105
change approach a bit
svyatonik Oct 4, 2023
c1f9d8a
continue
svyatonik Oct 4, 2023
ebd6c61
continue
svyatonik Oct 6, 2023
facf6a5
flush
svyatonik Oct 6, 2023
e208524
continue prototyping
svyatonik Oct 6, 2023
73ea54e
Merge branch 'per-lane-priority-boost-for-discussing' into lane-prior…
svyatonik Oct 6, 2023
16aba6c
lanes now affect valid_till
svyatonik Oct 6, 2023
f473051
fmt
svyatonik Oct 6, 2023
ec87fbb
flush
svyatonik Oct 6, 2023
da47b6b
removed couple of obsolete TODOs
svyatonik Oct 6, 2023
6d52f11
added lost TODO
svyatonik Oct 6, 2023
2a0bae9
relayers are readded to the next set only if they are delivering at l…
svyatonik Oct 9, 2023
104754a
use expected reward from LaneRelayersSet to compute relayer reward
svyatonik Oct 9, 2023
034b38f
added comment to wrong code
svyatonik Oct 9, 2023
5df0872
reward is now a part of unrewarded relayers vector
svyatonik Oct 9, 2023
1a3efe7
remove unneeded constratind
svyatonik Oct 10, 2023
9c134da
set RewardAtSource to be u64
svyatonik Oct 10, 2023
5a86ed4
removed fixed TODO
svyatonik Oct 10, 2023
9b174cd
fmt
svyatonik Oct 10, 2023
579b90b
MaxRewardPerMessage + fixed TODO
svyatonik Oct 10, 2023
60b55af
fixed couple of TODOs + added comments + added new TODO
svyatonik Oct 10, 2023
72d5bbe
more TODO fixes
svyatonik Oct 10, 2023
e225164
fixed another TODO
svyatonik Oct 10, 2023
081523c
make next relayers set larger than the actual set
svyatonik Oct 11, 2023
e0e16cd
fmt
svyatonik Oct 11, 2023
926644d
Merge branch 'master' into lane-priority-prototype
svyatonik Oct 11, 2023
730e368
fix compilation
svyatonik Oct 11, 2023
f926504
added TODO
svyatonik Oct 12, 2023
043908f
tests + more TODOs
svyatonik Oct 12, 2023
2c425de
more tests
svyatonik Oct 12, 2023
2c3fed8
more tests
svyatonik Oct 12, 2023
4ad58da
tests for deregister_at_lane
svyatonik Oct 12, 2023
27e2669
tests for advance_lane_epoch
svyatonik Oct 12, 2023
1f04623
separate calls to manage relayers stake
svyatonik Oct 13, 2023
0638bcc
split active and next relayer sets
svyatonik Oct 13, 2023
38fac9f
Merge branch 'master' into lane-priority-prototype
svyatonik Oct 17, 2023
ce46ebc
removed TODO + added comment
svyatonik Oct 17, 2023
187fc19
intreoduce ActiveLaneRelayersSet and NextLaneRelayersSet
svyatonik Oct 17, 2023
392f93a
more tests
svyatonik Oct 17, 2023
b48a218
fix runtimes
svyatonik Oct 17, 2023
9f4e5cc
CI
svyatonik Oct 17, 2023
6957d6d
CI 2
svyatonik Oct 17, 2023
21f8caa
CI 3
svyatonik Oct 17, 2023
6ef384e
Merge branch 'next-and-active-lane-relayers' into lane-priority-proto…
svyatonik Oct 17, 2023
7e94f24
successful advance_lane_epoch is free for submitter
svyatonik Oct 17, 2023
03bc705
small optimization
svyatonik Oct 17, 2023
772837f
remove lane registrations when slashing relayer
svyatonik Oct 17, 2023
78a56ed
remove obsolete TODO and dev comment
svyatonik Oct 17, 2023
1f70ac7
added benchmarks for increase_stake, decrease_stake and register_at_lane
svyatonik Oct 17, 2023
94018e2
deregister_at_lane benchmark
svyatonik Oct 18, 2023
48504d9
advance_lane_epoch benchmark
svyatonik Oct 18, 2023
e235574
fixed slash_and_deregister benchmark
svyatonik Oct 18, 2023
3218672
added small comment regarding MaxLanesPerRelayer
svyatonik Oct 18, 2023
00dc6b8
removed already fixed TODO
svyatonik Oct 18, 2023
0d6d8a8
relayer_reward_per_message is now Option<RelayerRewardAtSource>
svyatonik Oct 18, 2023
113251e
properly implement relayer_reward_per_message in DeliveryConfirmation…
svyatonik Oct 18, 2023
325a99a
clippy
svyatonik Oct 18, 2023
17b678b
spelling
svyatonik Oct 18, 2023
bd000e2
fmt
svyatonik Oct 18, 2023
b5146bb
fixed benchmarks compilation
svyatonik Oct 18, 2023
cc98138
Merge branch 'master' into lane-priority-prototype
svyatonik Oct 30, 2023
c6b4f45
fix benchmarks
svyatonik Oct 30, 2023
0d761ed
Merge branch 'master' into lane-priority-prototype
svyatonik Feb 5, 2024
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
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion bin/millau/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,10 @@ impl pallet_bridge_relayers::Config for Runtime {
ConstU64<1_000>,
ConstU64<8>,
>;
type MaxRelayersPerLane = ConstU32<16>;
type SlotLength = ConstU64<16>;
type PriorityBoostPerMessage = PriorityBoostPerMessage;
type PriorityBoostForLaneRelayer = ConstU64<0>;
type WeightInfo = ();
}

Expand Down Expand Up @@ -660,7 +664,6 @@ pub type BridgeRefundRialtoParachainMessages =
bp_relayers::RuntimeWithUtilityPallet<Runtime>,
WithRialtoParachainsInstance,
WithRialtoParachainMessagesInstance,
PriorityBoostPerMessage,
>,
>;

Expand Down
8 changes: 7 additions & 1 deletion bin/rialto-parachain/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ use sp_api::impl_runtime_apis;
use sp_core::{crypto::KeyTypeId, ConstBool, OpaqueMetadata};
use sp_runtime::{
create_runtime_str, generic, impl_opaque_keys,
traits::{AccountIdLookup, Block as BlockT, ConstU128, DispatchInfoOf, SignedExtension},
traits::{
AccountIdLookup, Block as BlockT, ConstU128, ConstU64, DispatchInfoOf, SignedExtension,
},
transaction_validity::{TransactionSource, TransactionValidity, TransactionValidityError},
ApplyExtrinsicResult,
};
Expand Down Expand Up @@ -539,6 +541,10 @@ impl pallet_bridge_relayers::Config for Runtime {
type PaymentProcedure =
bp_relayers::PayRewardFromAccount<pallet_balances::Pallet<Runtime>, AccountId>;
type StakeAndSlash = ();
type MaxRelayersPerLane = ConstU32<16>;
type SlotLength = ConstU32<16>;
type PriorityBoostPerMessage = ConstU64<0>;
type PriorityBoostForLaneRelayer = ConstU64<0>;
type WeightInfo = ();
}

Expand Down
4 changes: 4 additions & 0 deletions bin/rialto/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,10 @@ impl pallet_bridge_relayers::Config for Runtime {
type PaymentProcedure =
bp_relayers::PayRewardFromAccount<pallet_balances::Pallet<Runtime>, AccountId>;
type StakeAndSlash = ();
type MaxRelayersPerLane = ConstU32<16>;
type SlotLength = ConstU32<16>;
type PriorityBoostPerMessage = ConstU64<0>;
type PriorityBoostForLaneRelayer = ConstU64<0>;
type WeightInfo = ();
}

Expand Down
3 changes: 2 additions & 1 deletion modules/messages/src/call_ext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ mod tests {
for n in 0..BridgedChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX {
inbound_lane_state.relayers.push_back(UnrewardedRelayer {
relayer: Default::default(),
messages: DeliveredMessages { begin: n + 1, end: n + 1 },
messages: DeliveredMessages { begin: n + 1, end: n + 1, reward: 0 },
});
}
InboundLanes::<TestRuntime>::insert(test_lane_id(), inbound_lane_state);
Expand All @@ -250,6 +250,7 @@ mod tests {
messages: DeliveredMessages {
begin: 1,
end: BridgedChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX,
reward: 0,
},
});
InboundLanes::<TestRuntime>::insert(test_lane_id(), inbound_lane_state);
Expand Down
10 changes: 7 additions & 3 deletions modules/messages/src/inbound_lane.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use bp_messages::{
use bp_runtime::AccountIdOf;
use codec::{Decode, Encode, EncodeLike, MaxEncodedLen};
use scale_info::{Type, TypeInfo};
use sp_runtime::RuntimeDebug;
use sp_runtime::{traits::One, RuntimeDebug};
use sp_std::prelude::PartialEq;

/// Inbound lane storage.
Expand Down Expand Up @@ -210,14 +210,18 @@ impl<S: InboundLaneStorage> InboundLane<S> {
});

// now let's update inbound lane storage
let relayer_reward_per_message = One::one(); // TODO: it must be returned by some callback!!!
match data.relayers.back_mut() {
Some(entry) if entry.relayer == *relayer_at_bridged_chain => {
Some(entry)
if entry.relayer == *relayer_at_bridged_chain &&
entry.messages.reward == relayer_reward_per_message =>
{
entry.messages.note_dispatched_message();
},
_ => {
data.relayers.push_back(UnrewardedRelayer {
relayer: relayer_at_bridged_chain.clone(),
messages: DeliveredMessages::new(nonce),
messages: DeliveredMessages::new(nonce, relayer_reward_per_message),
});
},
};
Expand Down
19 changes: 11 additions & 8 deletions modules/messages/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ use bp_messages::{
DeliveryPayments, DispatchMessage, FromBridgedChainMessagesProof, MessageDispatch,
ProvedLaneMessages, ProvedMessages,
},
ChainWithMessages, DeliveredMessages, InboundLaneData, InboundMessageDetails, LaneId,
MessageKey, MessageNonce, MessagePayload, MessagesOperatingMode, OutboundLaneData,
OutboundMessageDetails, UnrewardedRelayersState, VerificationError,
ChainWithMessages, InboundLaneData, InboundMessageDetails, LaneId, MessageKey, MessageNonce,
MessagePayload, MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails,
UnrewardedRelayersState, VerificationError,
};
use bp_runtime::{
AccountIdOf, BasicOperatingMode, HashOf, OwnedBridgeModule, PreComputedSize, RangeInclusiveExt,
Expand Down Expand Up @@ -320,6 +320,7 @@ pub mod pallet {

// let's now deal with relayer payments
T::DeliveryPayments::pay_reward(
lane_id,
relayer_id_at_this_chain,
total_messages,
valid_messages,
Expand Down Expand Up @@ -381,12 +382,12 @@ pub mod pallet {
)
.map_err(Error::<T, I>::ReceivalConfirmation)?;

if let Some(confirmed_messages) = confirmed_messages {
if let Some(received_range) = confirmed_messages {
// emit 'delivered' event
let received_range = confirmed_messages.begin..=confirmed_messages.end;
Self::deposit_event(Event::MessagesDelivered {
lane_id,
messages: confirmed_messages,
messages_begin: *received_range.start(),
messages_end: *received_range.end(),
});

// if some new messages have been confirmed, reward relayers
Expand Down Expand Up @@ -452,8 +453,10 @@ pub mod pallet {
MessagesDelivered {
/// Lane for which the delivery has been confirmed.
lane_id: LaneId,
/// Delivered messages.
messages: DeliveredMessages,
/// Nonce of the first delivered message.
messages_begin: MessageNonce,
/// Nonce of the last delivered message.
messages_end: MessageNonce,
},
}

Expand Down
33 changes: 16 additions & 17 deletions modules/messages/src/outbound_lane.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@
use crate::{Config, LOG_TARGET};

use bp_messages::{
ChainWithMessages, DeliveredMessages, LaneId, LaneState, MessageNonce, MessagePayload,
OutboundLaneData, UnrewardedRelayer, VerificationError,
ChainWithMessages, LaneId, LaneState, MessageNonce, MessagePayload, OutboundLaneData,
UnrewardedRelayer, VerificationError,
};
use bp_runtime::RangeInclusiveExt;
use codec::{Decode, Encode};
use frame_support::{traits::Get, BoundedVec, PalletError};
use scale_info::TypeInfo;
Expand Down Expand Up @@ -137,19 +138,17 @@ impl<S: OutboundLaneStorage> OutboundLane<S> {
max_allowed_messages: MessageNonce,
latest_delivered_nonce: MessageNonce,
relayers: &VecDeque<UnrewardedRelayer<RelayerId>>,
) -> Result<Option<DeliveredMessages>, ReceivalConfirmationError> {
) -> Result<Option<RangeInclusive<MessageNonce>>, ReceivalConfirmationError> {
let mut data = self.storage.data();
let confirmed_messages = DeliveredMessages {
begin: data.latest_received_nonce.saturating_add(1),
end: latest_delivered_nonce,
};
if confirmed_messages.total_messages() == 0 {
let confirmed_messages =
data.latest_received_nonce.saturating_add(1)..=latest_delivered_nonce;
if confirmed_messages.saturating_len() == 0 {
return Ok(None)
}
if confirmed_messages.end > data.latest_generated_nonce {
if *confirmed_messages.end() > data.latest_generated_nonce {
return Err(ReceivalConfirmationError::FailedToConfirmFutureMessages)
}
if confirmed_messages.total_messages() > max_allowed_messages {
if confirmed_messages.saturating_len() > max_allowed_messages {
// that the relayer has declared correct number of messages that the proof contains (it
// is checked outside of the function). But it may happen (but only if this/bridged
// chain storage is corrupted, though) that the actual number of confirmed messages if
Expand All @@ -158,20 +157,20 @@ impl<S: OutboundLaneStorage> OutboundLane<S> {
log::trace!(
target: LOG_TARGET,
"Messages delivery proof contains too many messages to confirm: {} vs declared {}",
confirmed_messages.total_messages(),
confirmed_messages.saturating_len(),
max_allowed_messages,
);
return Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected)
}

ensure_unrewarded_relayers_are_correct(confirmed_messages.end, relayers)?;
ensure_unrewarded_relayers_are_correct(*confirmed_messages.end(), relayers)?;

// prune all confirmed messages
for nonce in confirmed_messages.begin..=confirmed_messages.end {
for nonce in *confirmed_messages.start()..=*confirmed_messages.end() {
self.storage.remove_message(&nonce);
}

data.latest_received_nonce = confirmed_messages.end;
data.latest_received_nonce = *confirmed_messages.end();
data.oldest_unpruned_nonce = data.latest_received_nonce.saturating_add(1);
self.storage.set_data(data);

Expand Down Expand Up @@ -238,14 +237,14 @@ mod tests {
.collect()
}

fn delivered_messages(nonces: RangeInclusive<MessageNonce>) -> DeliveredMessages {
DeliveredMessages { begin: *nonces.start(), end: *nonces.end() }
fn delivered_messages(nonces: RangeInclusive<MessageNonce>) -> RangeInclusive<MessageNonce> {
nonces
}

fn assert_3_messages_confirmation_fails(
latest_received_nonce: MessageNonce,
relayers: &VecDeque<UnrewardedRelayer<TestRelayer>>,
) -> Result<Option<DeliveredMessages>, ReceivalConfirmationError> {
) -> Result<Option<RangeInclusive<MessageNonce>>, ReceivalConfirmationError> {
run_test(|| {
let mut lane = active_outbound_lane::<TestRuntime, _>(test_lane_id()).unwrap();
assert_ok!(lane.send_message(outbound_message_data(REGULAR_PAYLOAD)));
Expand Down
11 changes: 8 additions & 3 deletions modules/messages/src/tests/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use crate::{

use bp_header_chain::{ChainWithGrandpa, StoredHeaderData};
use bp_messages::{
calc_relayers_rewards,
calc_relayers_rewards_at_source,
source_chain::{DeliveryConfirmationPayments, FromBridgedChainMessagesDeliveryProof},
target_chain::{
DeliveryPayments, DispatchMessage, DispatchMessageData, FromBridgedChainMessagesProof,
Expand Down Expand Up @@ -329,6 +329,7 @@ impl DeliveryPayments<AccountId> for TestDeliveryPayments {
type Error = &'static str;

fn pay_reward(
_lane_id: LaneId,
relayer: AccountId,
_total_messages: MessageNonce,
_valid_messages: MessageNonce,
Expand Down Expand Up @@ -361,7 +362,11 @@ impl DeliveryConfirmationPayments<AccountId> for TestDeliveryConfirmationPayment
_confirmation_relayer: &AccountId,
received_range: &RangeInclusive<MessageNonce>,
) -> MessageNonce {
let relayers_rewards = calc_relayers_rewards(messages_relayers, received_range);
let relayers_rewards = calc_relayers_rewards_at_source::<AccountId, Balance>(
messages_relayers,
received_range,
|messages, reward_per_message| messages * reward_per_message,
);
let rewarded_relayers = relayers_rewards.len();
for (relayer, reward) in &relayers_rewards {
let key = (b":relayer-reward:", relayer, reward).encode();
Expand Down Expand Up @@ -463,7 +468,7 @@ pub fn unrewarded_relayer(
end: MessageNonce,
relayer: TestRelayer,
) -> UnrewardedRelayer<TestRelayer> {
UnrewardedRelayer { relayer, messages: DeliveredMessages { begin, end } }
UnrewardedRelayer { relayer, messages: DeliveredMessages { begin, end, reward: 1 } }
}

/// Returns unrewarded relayers state at given lane.
Expand Down
18 changes: 11 additions & 7 deletions modules/messages/src/tests/pallet_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ fn receive_messages_delivery_proof() {
last_confirmed_nonce: 1,
relayers: vec![UnrewardedRelayer {
relayer: 0,
messages: DeliveredMessages::new(1),
messages: DeliveredMessages::new(1, 0),
}]
.into(),
},
Expand All @@ -106,7 +106,8 @@ fn receive_messages_delivery_proof() {
phase: Phase::Initialization,
event: TestEvent::Messages(Event::MessagesDelivered {
lane_id: test_lane_id(),
messages: DeliveredMessages::new(1),
messages_begin: 1,
messages_end: 1,
}),
topics: vec![],
}],
Expand Down Expand Up @@ -830,7 +831,7 @@ fn proof_size_refund_from_receive_messages_proof_works() {
relayers: vec![
UnrewardedRelayer {
relayer: 42,
messages: DeliveredMessages { begin: 0, end: 100 }
messages: DeliveredMessages { begin: 0, end: 100, reward: 0 }
};
max_entries
]
Expand Down Expand Up @@ -859,7 +860,7 @@ fn proof_size_refund_from_receive_messages_proof_works() {
relayers: vec![
UnrewardedRelayer {
relayer: 42,
messages: DeliveredMessages { begin: 0, end: 100 }
messages: DeliveredMessages { begin: 0, end: 100, reward: 0 }
};
max_entries - 1
]
Expand Down Expand Up @@ -972,7 +973,7 @@ fn test_bridge_messages_call_is_correctly_defined() {
last_confirmed_nonce: 1,
relayers: vec![UnrewardedRelayer {
relayer: 0,
messages: DeliveredMessages::new(1),
messages: DeliveredMessages::new(1, 0),
}]
.into(),
},
Expand Down Expand Up @@ -1033,7 +1034,10 @@ generate_owned_bridge_module_tests!(
#[test]
fn inbound_storage_extra_proof_size_bytes_works() {
fn relayer_entry() -> UnrewardedRelayer<TestRelayer> {
UnrewardedRelayer { relayer: 42u64, messages: DeliveredMessages { begin: 0, end: 100 } }
UnrewardedRelayer {
relayer: 42u64,
messages: DeliveredMessages { begin: 0, end: 100, reward: 0 },
}
}

fn storage(relayer_entries: usize) -> RuntimeInboundLaneStorage<TestRuntime, ()> {
Expand Down Expand Up @@ -1128,7 +1132,7 @@ fn receive_messages_delivery_proof_fails_if_outbound_lane_is_unknown() {
last_confirmed_nonce: 1,
relayers: vec![UnrewardedRelayer {
relayer: 0,
messages: DeliveredMessages::new(1),
messages: DeliveredMessages::new(1, 0),
}]
.into(),
},
Expand Down
Loading