Skip to content

Commit 6c826a6

Browse files
authored
Deduplicate pallet call structs used for indirect runtime calls (#1744)
* Small changes * Define generic bridge pallets call structs * polkadot-core SignedExtension simplifications - we don't seem to need to pass the Call as a generic param - we can use codec(skip) instead of implementing Encode and Decode * Split BridgeHubRococo and BridgeHubWococo calls * code review fixes
1 parent e575269 commit 6c826a6

File tree

25 files changed

+354
-243
lines changed

25 files changed

+354
-243
lines changed

Cargo.lock

Lines changed: 12 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/runtime-common/src/messages.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,13 @@ pub mod target {
692692
}
693693
}
694694

695+
/// The `BridgeMessagesCall` used by a chain.
696+
pub type BridgeMessagesCallOf<C> = bp_messages::BridgeMessagesCall<
697+
bp_runtime::AccountIdOf<C>,
698+
target::FromBridgedChainMessagesProof<bp_runtime::HashOf<C>>,
699+
source::FromBridgedChainMessagesDeliveryProof<bp_runtime::HashOf<C>>,
700+
>;
701+
695702
#[cfg(test)]
696703
mod tests {
697704
use super::*;

modules/grandpa/src/lib.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,7 @@ mod tests {
612612
run_test, test_header, RuntimeOrigin, TestHeader, TestNumber, TestRuntime,
613613
MAX_BRIDGED_AUTHORITIES,
614614
};
615+
use bp_header_chain::BridgeGrandpaCall;
615616
use bp_runtime::BasicOperatingMode;
616617
use bp_test_utils::{
617618
authority_list, generate_owned_bridge_module_tests, make_default_justification,
@@ -1160,5 +1161,33 @@ mod tests {
11601161
);
11611162
}
11621163

1164+
#[test]
1165+
fn test_bridge_grandpa_call_is_correctly_defined() {
1166+
let header = test_header(0);
1167+
let init_data = InitializationData {
1168+
header: Box::new(header.clone()),
1169+
authority_list: authority_list(),
1170+
set_id: 1,
1171+
operating_mode: BasicOperatingMode::Normal,
1172+
};
1173+
let justification = make_default_justification(&header);
1174+
1175+
let direct_initialize_call =
1176+
Call::<TestRuntime>::initialize { init_data: init_data.clone() };
1177+
let indirect_initialize_call = BridgeGrandpaCall::<TestHeader>::initialize(init_data);
1178+
assert_eq!(direct_initialize_call.encode(), indirect_initialize_call.encode());
1179+
1180+
let direct_submit_finality_proof_call = Call::<TestRuntime>::submit_finality_proof {
1181+
finality_target: Box::new(header.clone()),
1182+
justification: justification.clone(),
1183+
};
1184+
let indirect_submit_finality_proof_call =
1185+
BridgeGrandpaCall::<TestHeader>::submit_finality_proof(Box::new(header), justification);
1186+
assert_eq!(
1187+
direct_submit_finality_proof_call.encode(),
1188+
indirect_submit_finality_proof_call.encode()
1189+
);
1190+
}
1191+
11631192
generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted);
11641193
}

modules/messages/src/lib.rs

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -885,13 +885,13 @@ fn verify_and_decode_messages_proof<Chain: SourceHeaderChain, DispatchPayload: D
885885
mod tests {
886886
use super::*;
887887
use crate::mock::{
888-
message, message_payload, run_test, unrewarded_relayer, DbWeight,
888+
message, message_payload, run_test, unrewarded_relayer, AccountId, DbWeight,
889889
RuntimeEvent as TestEvent, RuntimeOrigin, TestDeliveryConfirmationPayments,
890890
TestDeliveryPayments, TestMessagesDeliveryProof, TestMessagesProof, TestRuntime,
891891
MAX_OUTBOUND_PAYLOAD_SIZE, PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID,
892892
TEST_LANE_ID_2, TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B,
893893
};
894-
use bp_messages::{UnrewardedRelayer, UnrewardedRelayersState};
894+
use bp_messages::{BridgeMessagesCall, UnrewardedRelayer, UnrewardedRelayersState};
895895
use bp_test_utils::generate_owned_bridge_module_tests;
896896
use frame_support::{
897897
assert_noop, assert_ok,
@@ -1891,6 +1891,69 @@ mod tests {
18911891
});
18921892
}
18931893

1894+
#[test]
1895+
fn test_bridge_messages_call_is_correctly_defined() {
1896+
let account_id = 1;
1897+
let message_proof: TestMessagesProof = Ok(vec![message(1, REGULAR_PAYLOAD)]).into();
1898+
let message_delivery_proof = TestMessagesDeliveryProof(Ok((
1899+
TEST_LANE_ID,
1900+
InboundLaneData {
1901+
last_confirmed_nonce: 1,
1902+
relayers: vec![UnrewardedRelayer {
1903+
relayer: 0,
1904+
messages: DeliveredMessages::new(1),
1905+
}]
1906+
.into_iter()
1907+
.collect(),
1908+
},
1909+
)));
1910+
let unrewarded_relayer_state = UnrewardedRelayersState {
1911+
unrewarded_relayer_entries: 1,
1912+
total_messages: 1,
1913+
last_delivered_nonce: 1,
1914+
..Default::default()
1915+
};
1916+
1917+
let direct_receive_messages_proof_call = Call::<TestRuntime>::receive_messages_proof {
1918+
relayer_id_at_bridged_chain: account_id,
1919+
proof: message_proof.clone(),
1920+
messages_count: 1,
1921+
dispatch_weight: REGULAR_PAYLOAD.declared_weight,
1922+
};
1923+
let indirect_receive_messages_proof_call = BridgeMessagesCall::<
1924+
AccountId,
1925+
TestMessagesProof,
1926+
TestMessagesDeliveryProof,
1927+
>::receive_messages_proof(
1928+
account_id,
1929+
message_proof,
1930+
1,
1931+
REGULAR_PAYLOAD.declared_weight,
1932+
);
1933+
assert_eq!(
1934+
direct_receive_messages_proof_call.encode(),
1935+
indirect_receive_messages_proof_call.encode()
1936+
);
1937+
1938+
let direct_receive_messages_delivery_proof_call =
1939+
Call::<TestRuntime>::receive_messages_delivery_proof {
1940+
proof: message_delivery_proof.clone(),
1941+
relayers_state: unrewarded_relayer_state.clone(),
1942+
};
1943+
let indirect_receive_messages_delivery_proof_call = BridgeMessagesCall::<
1944+
AccountId,
1945+
TestMessagesProof,
1946+
TestMessagesDeliveryProof,
1947+
>::receive_messages_delivery_proof(
1948+
message_delivery_proof,
1949+
unrewarded_relayer_state,
1950+
);
1951+
assert_eq!(
1952+
direct_receive_messages_delivery_proof_call.encode(),
1953+
indirect_receive_messages_delivery_proof_call.encode()
1954+
);
1955+
}
1956+
18941957
generate_owned_bridge_module_tests!(
18951958
MessagesOperatingMode::Basic(BasicOperatingMode::Normal),
18961959
MessagesOperatingMode::Basic(BasicOperatingMode::Halted)

modules/parachains/src/lib.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,9 @@ mod tests {
661661
};
662662
use codec::Encode;
663663

664-
use bp_parachains::{BestParaHeadHash, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider};
664+
use bp_parachains::{
665+
BestParaHeadHash, BridgeParachainCall, ImportedParaHeadsKeyProvider, ParasInfoKeyProvider,
666+
};
665667
use bp_runtime::{
666668
record_all_trie_keys, BasicOperatingMode, OwnedBridgeModuleError,
667669
StorageDoubleMapKeyProvider, StorageMapKeyProvider,
@@ -1471,5 +1473,24 @@ mod tests {
14711473
});
14721474
}
14731475

1476+
#[test]
1477+
fn test_bridge_parachain_call_is_correctly_defined() {
1478+
let (state_root, proof, _) = prepare_parachain_heads_proof(vec![(1, head_data(1, 0))]);
1479+
let parachains = vec![(ParaId(2), Default::default())];
1480+
let relay_header_id = (0, test_relay_header(0, state_root).hash());
1481+
1482+
let direct_submit_parachain_heads_call = Call::<TestRuntime>::submit_parachain_heads {
1483+
at_relay_block: relay_header_id,
1484+
parachains: parachains.clone(),
1485+
parachain_heads_proof: proof.clone(),
1486+
};
1487+
let indirect_submit_parachain_heads_call =
1488+
BridgeParachainCall::submit_parachain_heads(relay_header_id, parachains, proof);
1489+
assert_eq!(
1490+
direct_submit_parachain_heads_call.encode(),
1491+
indirect_submit_parachain_heads_call.encode()
1492+
);
1493+
}
1494+
14741495
generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted);
14751496
}

primitives/chain-bridge-hub-cumulus/Cargo.toml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ edition = "2021"
77
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
88

99
[dependencies]
10-
smallvec = "1.10.0"
11-
1210
# Bridge Dependencies
1311

1412
bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false }
@@ -23,15 +21,15 @@ sp-api = { git = "https://github.com/paritytech/substrate", branch = "master", d
2321
sp-std = { git = "https://github.com/paritytech/substrate", branch = "master", default-features = false }
2422

2523
# Polkadot Dependencies
26-
polkadot-primitives = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" }
27-
polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", default-features = false, branch = "master" }
24+
polkadot-primitives = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false }
25+
polkadot-runtime-constants = { git = "https://github.com/paritytech/polkadot", branch = "master", default-features = false }
2826

2927
[features]
3028
default = ["std"]
3129
std = [
3230
"bp-polkadot-core/std",
33-
"bp-messages/std",
3431
"bp-runtime/std",
32+
"bp-messages/std",
3533
"frame-system/std",
3634
"frame-support/std",
3735
"sp-api/std",

primitives/chain-bridge-hub-rococo/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ edition = "2021"
77
license = "GPL-3.0-or-later WITH Classpath-exception-2.0"
88

99
[dependencies]
10-
smallvec = "1.10.0"
11-
1210
# Bridge Dependencies
1311

1412
bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false }

primitives/chain-bridge-hub-wococo/src/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,9 @@
1616

1717
//! Module with configuration which reflects BridgeHubWococo runtime setup
1818
//! (AccountId, Headers, Hashes...)
19-
//!
20-
//! but actually this is just reexported BridgeHubRococo stuff, because they are supposed to be
21-
//! identical, at least uses the same parachain runtime
2219
2320
#![cfg_attr(not(feature = "std"), no_std)]
2421

25-
// Re-export only what is really needed
2622
pub use bp_bridge_hub_cumulus::*;
2723
use bp_messages::*;
2824
use bp_runtime::{

primitives/header-chain/src/lib.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
2020
#![cfg_attr(not(feature = "std"), no_std)]
2121

22-
use bp_runtime::{BasicOperatingMode, Chain, HashOf, HasherOf, StorageProofChecker};
22+
use bp_runtime::{BasicOperatingMode, Chain, HashOf, HasherOf, HeaderOf, StorageProofChecker};
2323
use codec::{Codec, Decode, Encode, EncodeLike, MaxEncodedLen};
2424
use core::{clone::Clone, cmp::Eq, default::Default, fmt::Debug};
2525
use frame_support::PalletError;
@@ -169,3 +169,18 @@ impl<Number: Codec> ConsensusLogReader for GrandpaConsensusLogReader<Number> {
169169
GrandpaConsensusLogReader::<Number>::find_authorities_change(digest).is_some()
170170
}
171171
}
172+
173+
/// A minimized version of `pallet-bridge-grandpa::Call` that can be used without a runtime.
174+
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
175+
#[allow(non_camel_case_types)]
176+
pub enum BridgeGrandpaCall<Header: HeaderT> {
177+
/// `pallet-bridge-grandpa::Call::submit_finality_proof`
178+
#[codec(index = 0)]
179+
submit_finality_proof(Box<Header>, justification::GrandpaJustification<Header>),
180+
/// `pallet-bridge-grandpa::Call::initialize`
181+
#[codec(index = 1)]
182+
initialize(InitializationData<Header>),
183+
}
184+
185+
/// The `BridgeGrandpaCall` used by a chain.
186+
pub type BridgeGrandpaCallOf<C> = BridgeGrandpaCall<HeaderOf<C>>;

primitives/messages/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,18 @@ where
391391
relayers_rewards
392392
}
393393

394+
/// A minimized version of `pallet-bridge-messages::Call` that can be used without a runtime.
395+
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
396+
#[allow(non_camel_case_types)]
397+
pub enum BridgeMessagesCall<AccountId, MessagesProof, MessagesDeliveryProof> {
398+
/// `pallet-bridge-messages::Call::receive_messages_proof`
399+
#[codec(index = 2)]
400+
receive_messages_proof(AccountId, MessagesProof, u32, Weight),
401+
/// `pallet-bridge-messages::Call::receive_messages_delivery_proof`
402+
#[codec(index = 3)]
403+
receive_messages_delivery_proof(MessagesDeliveryProof, UnrewardedRelayersState),
404+
}
405+
394406
#[cfg(test)]
395407
mod tests {
396408
use super::*;

primitives/parachains/src/lib.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
pub use bp_header_chain::StoredHeaderData;
2222

2323
use bp_polkadot_core::{
24-
parachains::{ParaHash, ParaHead, ParaId},
25-
BlockNumber as RelayBlockNumber,
24+
parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId},
25+
BlockNumber as RelayBlockNumber, Hash as RelayBlockHash,
2626
};
2727
use bp_runtime::{
2828
BlockNumberOf, Chain, HashOf, HeaderOf, Parachain, StorageDoubleMapKeyProvider,
@@ -150,3 +150,16 @@ impl ParaStoredHeaderDataBuilder for C {
150150
None
151151
}
152152
}
153+
154+
/// A minimized version of `pallet-bridge-parachains::Call` that can be used without a runtime.
155+
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
156+
#[allow(non_camel_case_types)]
157+
pub enum BridgeParachainCall {
158+
/// `pallet-bridge-parachains::Call::submit_parachain_heads`
159+
#[codec(index = 0)]
160+
submit_parachain_heads(
161+
(RelayBlockNumber, RelayBlockHash),
162+
Vec<(ParaId, ParaHash)>,
163+
ParaHeadsProof,
164+
),
165+
}

0 commit comments

Comments
 (0)