From 85bb45b5d3a4690c954bd5eac7851b2c37b7f0f7 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky <svyatonik@gmail.com> Date: Wed, 17 Feb 2021 15:09:02 +0300 Subject: [PATCH] ForbidOutboundMessages and ForbidInboundMessages (#735) --- .../message-lane/src/source_chain.rs | 56 +++++++++++++++++++ .../message-lane/src/target_chain.rs | 29 ++++++++++ bridges/primitives/runtime/src/lib.rs | 6 ++ 3 files changed, 91 insertions(+) diff --git a/bridges/primitives/message-lane/src/source_chain.rs b/bridges/primitives/message-lane/src/source_chain.rs index 1bb0d591586..d0dc36bb693 100644 --- a/bridges/primitives/message-lane/src/source_chain.rs +++ b/bridges/primitives/message-lane/src/source_chain.rs @@ -134,3 +134,59 @@ pub trait MessageDeliveryAndDispatchPayment<AccountId, Balance> { 0 } } + +/// Structure that may be used in place of `TargetHeaderChain`, `LaneMessageVerifier` and +/// `MessageDeliveryAndDispatchPayment` on chains, where outbound messages are forbidden. +pub struct ForbidOutboundMessages; + +/// Error message that is used in `ForbidOutboundMessages` implementation. +const ALL_OUTBOUND_MESSAGES_REJECTED: &str = "This chain is configured to reject all outbound messages"; + +impl<Payload, AccountId> TargetHeaderChain<Payload, AccountId> for ForbidOutboundMessages { + type Error = &'static str; + + type MessagesDeliveryProof = (); + + fn verify_message(_payload: &Payload) -> Result<(), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } + + fn verify_messages_delivery_proof( + _proof: Self::MessagesDeliveryProof, + ) -> Result<(LaneId, InboundLaneData<AccountId>), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } +} + +impl<Submitter, Payload, Fee> LaneMessageVerifier<Submitter, Payload, Fee> for ForbidOutboundMessages { + type Error = &'static str; + + fn verify_message( + _submitter: &Sender<Submitter>, + _delivery_and_dispatch_fee: &Fee, + _lane: &LaneId, + _outbound_data: &OutboundLaneData, + _payload: &Payload, + ) -> Result<(), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } +} + +impl<AccountId, Balance> MessageDeliveryAndDispatchPayment<AccountId, Balance> for ForbidOutboundMessages { + type Error = &'static str; + + fn pay_delivery_and_dispatch_fee( + _submitter: &Sender<AccountId>, + _fee: &Balance, + _relayer_fund_account: &AccountId, + ) -> Result<(), Self::Error> { + Err(ALL_OUTBOUND_MESSAGES_REJECTED) + } + + fn pay_relayers_rewards( + _confirmation_relayer: &AccountId, + _relayers_rewards: RelayersRewards<AccountId, Balance>, + _relayer_fund_account: &AccountId, + ) { + } +} diff --git a/bridges/primitives/message-lane/src/target_chain.rs b/bridges/primitives/message-lane/src/target_chain.rs index 825fe67c549..765ce64f63b 100644 --- a/bridges/primitives/message-lane/src/target_chain.rs +++ b/bridges/primitives/message-lane/src/target_chain.rs @@ -129,3 +129,32 @@ impl<DispatchPayload: Decode, Fee> From<MessageData<Fee>> for DispatchMessageDat } } } + +/// Structure that may be used in place of `SourceHeaderChain` and `MessageDispatch` on chains, +/// where inbound messages are forbidden. +pub struct ForbidInboundMessages; + +/// Error message that is used in `ForbidOutboundMessages` implementation. +const ALL_INBOUND_MESSAGES_REJECTED: &str = "This chain is configured to reject all inbound messages"; + +impl<Fee> SourceHeaderChain<Fee> for ForbidInboundMessages { + type Error = &'static str; + type MessagesProof = (); + + fn verify_messages_proof( + _proof: Self::MessagesProof, + _messages_count: u32, + ) -> Result<ProvedMessages<Message<Fee>>, Self::Error> { + Err(ALL_INBOUND_MESSAGES_REJECTED) + } +} + +impl<Fee> MessageDispatch<Fee> for ForbidInboundMessages { + type DispatchPayload = (); + + fn dispatch_weight(_message: &DispatchMessage<Self::DispatchPayload, Fee>) -> Weight { + Weight::MAX + } + + fn dispatch(_message: DispatchMessage<Self::DispatchPayload, Fee>) {} +} diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index 058c510c1b5..6612e26c37d 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -112,6 +112,12 @@ pub trait Size { fn size_hint(&self) -> u32; } +impl Size for () { + fn size_hint(&self) -> u32 { + 0 + } +} + /// Pre-computed size. pub struct PreComputedSize(pub usize); -- GitLab