Skip to content

Commit 15244e5

Browse files
authored
Batch transactions in complex relays (#1669)
* batch transactions in message relay: API prototype * get rid of Box<dyn BatchTransaction> and actually submit it * test batch transactions * message_lane_loop_works_with_batch_transactions * removed logger * BatchConfirmationTransaction + BatchDeliveryTransaction * more prototyping * fmt * continue with batch calls * impl BatchCallBuilder for () * BatchDeliveryTransaction impl * BundledBatchCallBuilder * proper impl of BundledBatchCallBuilder + use it in RialtoParachain -> Millau * impl prove_header in OnDemandHeadersRelay * impl OnDemandParachainsRelay::prove_header (needs extensive tests) * added a couple of TODOs * return Result<Option<BatchTx>> when asking for more headers * prove headers when reauire_* is called && return proper headers from required_header_id * split parachains::prove_header and test select_headers_to_prove * more traces and leave TODOs * use finality stream in SubstrateFinalitySource::prove_block_finality * prove parachain head at block, selected by headers relay * const ANCIENT_BLOCK_THRESHOLD * TODO -> proof * clippy and spelling * BatchCallBuilder::build_batch_call() returns Result * read first proof from two streams * FailedToFindFinalityProof -> FinalityProofNotFound * changed select_headers_to_prove to version from PR review
1 parent c209bb9 commit 15244e5

29 files changed

+1191
-151
lines changed

Cargo.lock

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

relays/bin-substrate/src/chains/bridge_hub_rococo_messages_to_bridge_hub_wococo.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,7 @@ impl SubstrateMessageLane for BridgeHubRococoMessagesToBridgeHubWococoMessageLan
5959
BridgeHubRococoMessagesToBridgeHubWococoMessageLaneReceiveMessagesProofCallBuilder;
6060
type ReceiveMessagesDeliveryProofCallBuilder =
6161
BridgeHubRococoMessagesToBridgeHubWococoMessageLaneReceiveMessagesDeliveryProofCallBuilder;
62+
63+
type SourceBatchCallBuilder = ();
64+
type TargetBatchCallBuilder = ();
6265
}

relays/bin-substrate/src/chains/bridge_hub_wococo_messages_to_bridge_hub_rococo.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,7 @@ impl SubstrateMessageLane for BridgeHubWococoMessagesToBridgeHubRococoMessageLan
5959
BridgeHubWococoMessagesToBridgeHubRococoMessageLaneReceiveMessagesProofCallBuilder;
6060
type ReceiveMessagesDeliveryProofCallBuilder =
6161
BridgeHubWococoMessagesToBridgeHubRococoMessageLaneReceiveMessagesDeliveryProofCallBuilder;
62+
63+
type SourceBatchCallBuilder = ();
64+
type TargetBatchCallBuilder = ();
6265
}

relays/bin-substrate/src/chains/millau_messages_to_rialto.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ impl SubstrateMessageLane for MillauMessagesToRialto {
4141
millau_runtime::Runtime,
4242
millau_runtime::WithRialtoMessagesInstance,
4343
>;
44+
45+
type SourceBatchCallBuilder = ();
46+
type TargetBatchCallBuilder = ();
4447
}

relays/bin-substrate/src/chains/millau_messages_to_rialto_parachain.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ impl SubstrateMessageLane for MillauMessagesToRialtoParachain {
4141
millau_runtime::Runtime,
4242
millau_runtime::WithRialtoParachainMessagesInstance,
4343
>;
44+
45+
type SourceBatchCallBuilder = ();
46+
type TargetBatchCallBuilder = ();
4447
}

relays/bin-substrate/src/chains/rialto_messages_to_millau.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ impl SubstrateMessageLane for RialtoMessagesToMillau {
4141
rialto_runtime::Runtime,
4242
rialto_runtime::WithMillauMessagesInstance,
4343
>;
44+
45+
type SourceBatchCallBuilder = ();
46+
type TargetBatchCallBuilder = ();
4447
}

relays/bin-substrate/src/chains/rialto_parachain_messages_to_millau.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@
1818
1919
use relay_millau_client::Millau;
2020
use relay_rialto_parachain_client::RialtoParachain;
21-
use substrate_relay_helper::messages_lane::{
22-
DirectReceiveMessagesDeliveryProofCallBuilder, DirectReceiveMessagesProofCallBuilder,
23-
SubstrateMessageLane,
21+
use substrate_relay_helper::{
22+
messages_lane::{
23+
DirectReceiveMessagesDeliveryProofCallBuilder, DirectReceiveMessagesProofCallBuilder,
24+
SubstrateMessageLane,
25+
},
26+
BundledBatchCallBuilder,
2427
};
2528

2629
/// Description of RialtoParachain -> Millau messages bridge.
@@ -41,4 +44,7 @@ impl SubstrateMessageLane for RialtoParachainMessagesToMillau {
4144
rialto_parachain_runtime::Runtime,
4245
rialto_parachain_runtime::WithMillauMessagesInstance,
4346
>;
47+
48+
type SourceBatchCallBuilder = ();
49+
type TargetBatchCallBuilder = BundledBatchCallBuilder<millau_runtime::Runtime>;
4450
}

relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ use crate::{
5959
declare_chain_cli_schema,
6060
};
6161
use bp_messages::LaneId;
62-
use bp_runtime::{BalanceOf, BlockNumberOf};
62+
use bp_runtime::BalanceOf;
6363
use relay_substrate_client::{
6464
AccountIdOf, AccountKeyPairOf, Chain, ChainWithBalances, ChainWithTransactions, Client,
6565
Parachain,
@@ -167,8 +167,8 @@ where
167167
/// Returns message relay parameters.
168168
fn messages_relay_params(
169169
&self,
170-
source_to_target_headers_relay: Arc<dyn OnDemandRelay<BlockNumberOf<Source>>>,
171-
target_to_source_headers_relay: Arc<dyn OnDemandRelay<BlockNumberOf<Target>>>,
170+
source_to_target_headers_relay: Arc<dyn OnDemandRelay<Source, Target>>,
171+
target_to_source_headers_relay: Arc<dyn OnDemandRelay<Target, Source>>,
172172
lane_id: LaneId,
173173
) -> MessagesRelayParams<Bridge::MessagesLane> {
174174
MessagesRelayParams {
@@ -243,8 +243,8 @@ trait Full2WayBridgeBase: Sized + Send + Sync {
243243
async fn start_on_demand_headers_relayers(
244244
&mut self,
245245
) -> anyhow::Result<(
246-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Left>>>,
247-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Right>>>,
246+
Arc<dyn OnDemandRelay<Self::Left, Self::Right>>,
247+
Arc<dyn OnDemandRelay<Self::Right, Self::Left>>,
248248
)>;
249249
}
250250

relays/bin-substrate/src/cli/relay_headers_and_messages/parachain_to_parachain.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use crate::cli::{
2323
CliChain,
2424
};
2525
use bp_polkadot_core::parachains::ParaHash;
26-
use bp_runtime::BlockNumberOf;
2726
use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber};
2827
use relay_substrate_client::{
2928
AccountIdOf, AccountKeyPairOf, Chain, ChainWithTransactions, Client, Parachain,
@@ -215,8 +214,8 @@ where
215214
async fn start_on_demand_headers_relayers(
216215
&mut self,
217216
) -> anyhow::Result<(
218-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Left>>>,
219-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Right>>>,
217+
Arc<dyn OnDemandRelay<Self::Left, Self::Right>>,
218+
Arc<dyn OnDemandRelay<Self::Right, Self::Left>>,
220219
)> {
221220
self.common.left.accounts.push(TaggedAccount::Headers {
222221
id: self.right_headers_to_left_transaction_params.signer.public().into(),
@@ -249,31 +248,31 @@ where
249248
.await?;
250249

251250
let left_relay_to_right_on_demand_headers =
252-
OnDemandHeadersRelay::new::<<L2R as ParachainToRelayHeadersCliBridge>::RelayFinality>(
251+
OnDemandHeadersRelay::<<L2R as ParachainToRelayHeadersCliBridge>::RelayFinality>::new(
253252
self.left_relay.clone(),
254253
self.common.right.client.clone(),
255254
self.left_headers_to_right_transaction_params.clone(),
256255
self.common.shared.only_mandatory_headers,
257256
);
258257
let right_relay_to_left_on_demand_headers =
259-
OnDemandHeadersRelay::new::<<R2L as ParachainToRelayHeadersCliBridge>::RelayFinality>(
258+
OnDemandHeadersRelay::<<R2L as ParachainToRelayHeadersCliBridge>::RelayFinality>::new(
260259
self.right_relay.clone(),
261260
self.common.left.client.clone(),
262261
self.right_headers_to_left_transaction_params.clone(),
263262
self.common.shared.only_mandatory_headers,
264263
);
265264

266-
let left_to_right_on_demand_parachains = OnDemandParachainsRelay::new::<
265+
let left_to_right_on_demand_parachains = OnDemandParachainsRelay::<
267266
<L2R as ParachainToRelayHeadersCliBridge>::ParachainFinality,
268-
>(
267+
>::new(
269268
self.left_relay.clone(),
270269
self.common.right.client.clone(),
271270
self.left_parachains_to_right_transaction_params.clone(),
272271
Arc::new(left_relay_to_right_on_demand_headers),
273272
);
274-
let right_to_left_on_demand_parachains = OnDemandParachainsRelay::new::<
273+
let right_to_left_on_demand_parachains = OnDemandParachainsRelay::<
275274
<R2L as ParachainToRelayHeadersCliBridge>::ParachainFinality,
276-
>(
275+
>::new(
277276
self.right_relay.clone(),
278277
self.common.left.client.clone(),
279278
self.right_parachains_to_left_transaction_params.clone(),

relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_parachain.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ use crate::cli::{
2626
CliChain,
2727
};
2828
use bp_polkadot_core::parachains::ParaHash;
29-
use bp_runtime::BlockNumberOf;
3029
use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber};
3130
use relay_substrate_client::{
3231
AccountIdOf, AccountKeyPairOf, Chain, ChainWithTransactions, Client, Parachain,
@@ -199,8 +198,8 @@ where
199198
async fn start_on_demand_headers_relayers(
200199
&mut self,
201200
) -> anyhow::Result<(
202-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Left>>>,
203-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Right>>>,
201+
Arc<dyn OnDemandRelay<Self::Left, Self::Right>>,
202+
Arc<dyn OnDemandRelay<Self::Right, Self::Left>>,
204203
)> {
205204
self.common.left.accounts.push(TaggedAccount::Headers {
206205
id: self.right_headers_to_left_transaction_params.signer.public().into(),
@@ -229,22 +228,22 @@ where
229228
.await?;
230229

231230
let left_to_right_on_demand_headers =
232-
OnDemandHeadersRelay::new::<<L2R as RelayToRelayHeadersCliBridge>::Finality>(
231+
OnDemandHeadersRelay::<<L2R as RelayToRelayHeadersCliBridge>::Finality>::new(
233232
self.common.left.client.clone(),
234233
self.common.right.client.clone(),
235234
self.left_headers_to_right_transaction_params.clone(),
236235
self.common.shared.only_mandatory_headers,
237236
);
238237
let right_relay_to_left_on_demand_headers =
239-
OnDemandHeadersRelay::new::<<R2L as ParachainToRelayHeadersCliBridge>::RelayFinality>(
238+
OnDemandHeadersRelay::<<R2L as ParachainToRelayHeadersCliBridge>::RelayFinality>::new(
240239
self.right_relay.clone(),
241240
self.common.left.client.clone(),
242241
self.right_headers_to_left_transaction_params.clone(),
243242
self.common.shared.only_mandatory_headers,
244243
);
245-
let right_to_left_on_demand_parachains = OnDemandParachainsRelay::new::<
244+
let right_to_left_on_demand_parachains = OnDemandParachainsRelay::<
246245
<R2L as ParachainToRelayHeadersCliBridge>::ParachainFinality,
247-
>(
246+
>::new(
248247
self.right_relay.clone(),
249248
self.common.left.client.clone(),
250249
self.right_parachains_to_left_transaction_params.clone(),

relays/bin-substrate/src/cli/relay_headers_and_messages/relay_to_relay.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use crate::cli::{
2222
relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams},
2323
CliChain,
2424
};
25-
use bp_runtime::BlockNumberOf;
2625
use relay_substrate_client::{AccountIdOf, AccountKeyPairOf, ChainWithTransactions};
2726
use sp_core::Pair;
2827
use substrate_relay_helper::{
@@ -149,8 +148,8 @@ where
149148
async fn start_on_demand_headers_relayers(
150149
&mut self,
151150
) -> anyhow::Result<(
152-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Left>>>,
153-
Arc<dyn OnDemandRelay<BlockNumberOf<Self::Right>>>,
151+
Arc<dyn OnDemandRelay<Self::Left, Self::Right>>,
152+
Arc<dyn OnDemandRelay<Self::Right, Self::Left>>,
154153
)> {
155154
self.common.right.accounts.push(TaggedAccount::Headers {
156155
id: self.left_to_right_transaction_params.signer.public().into(),
@@ -175,14 +174,14 @@ where
175174
.await?;
176175

177176
let left_to_right_on_demand_headers =
178-
OnDemandHeadersRelay::new::<<L2R as RelayToRelayHeadersCliBridge>::Finality>(
177+
OnDemandHeadersRelay::<<L2R as RelayToRelayHeadersCliBridge>::Finality>::new(
179178
self.common.left.client.clone(),
180179
self.common.right.client.clone(),
181180
self.left_to_right_transaction_params.clone(),
182181
self.common.shared.only_mandatory_headers,
183182
);
184183
let right_to_left_on_demand_headers =
185-
OnDemandHeadersRelay::new::<<R2L as RelayToRelayHeadersCliBridge>::Finality>(
184+
OnDemandHeadersRelay::<<R2L as RelayToRelayHeadersCliBridge>::Finality>::new(
186185
self.common.right.client.clone(),
187186
self.common.left.client.clone(),
188187
self.right_to_left_transaction_params.clone(),

relays/client-substrate/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ thiserror = "1.0.26"
2121

2222
bp-header-chain = { path = "../../primitives/header-chain" }
2323
bp-messages = { path = "../../primitives/messages" }
24+
bp-polkadot-core = { path = "../../primitives/polkadot-core" }
2425
bp-runtime = { path = "../../primitives/runtime" }
2526
pallet-bridge-messages = { path = "../../modules/messages" }
2627
finality-relay = { path = "../finality" }

relays/client-substrate/src/client.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@ const SUB_API_GRANDPA_AUTHORITIES: &str = "GrandpaApi_grandpa_authorities";
5757
const SUB_API_TXPOOL_VALIDATE_TRANSACTION: &str = "TaggedTransactionQueue_validate_transaction";
5858
const MAX_SUBSCRIPTION_CAPACITY: usize = 4096;
5959

60+
/// The difference between best block number and number of its ancestor, that is enough
61+
/// for us to consider that ancestor an "ancient" block with dropped state.
62+
///
63+
/// The relay does not assume that it is connected to the archive node, so it always tries
64+
/// to use the best available chain state. But sometimes it still may use state of some
65+
/// old block. If the state of that block is already dropped, relay will see errors when
66+
/// e.g. it tries to prove something.
67+
///
68+
/// By default Substrate-based nodes are storing state for last 256 blocks. We'll use
69+
/// half of this value.
70+
pub const ANCIENT_BLOCK_THRESHOLD: u32 = 128;
71+
6072
/// Opaque justifications subscription type.
6173
pub struct Subscription<T>(pub(crate) Mutex<futures::channel::mpsc::Receiver<Option<T>>>);
6274

relays/client-substrate/src/error.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
//! Substrate node RPC errors.
1818
19+
use bp_polkadot_core::parachains::ParaId;
1920
use jsonrpsee::core::Error as RpcError;
2021
use relay_utils::MaybeConnectionError;
2122
use sc_rpc_api::system::Health;
@@ -45,6 +46,12 @@ pub enum Error {
4546
/// Runtime storage is missing some mandatory value.
4647
#[error("Mandatory storage value is missing from the runtime storage.")]
4748
MissingMandatoryStorageValue,
49+
/// Required parachain head is not present at the relay chain.
50+
#[error("Parachain {0:?} head {1} is missing from the relay chain storage.")]
51+
MissingRequiredParachainHead(ParaId, u64),
52+
/// Failed to find finality proof for the given header.
53+
#[error("Failed to find finality proof for header {0}.")]
54+
FinalityProofNotFound(u64),
4855
/// The client we're connected to is not synced, so we can't rely on its state.
4956
#[error("Substrate client is not synced {0}.")]
5057
ClientNotSynced(Health),

relays/client-substrate/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ pub use crate::{
3737
ChainWithGrandpa, ChainWithMessages, ChainWithTransactions, Parachain, RelayChain,
3838
SignParam, TransactionStatusOf, UnsignedTransaction,
3939
},
40-
client::{ChainRuntimeVersion, Client, OpaqueGrandpaAuthoritiesSet, Subscription},
40+
client::{
41+
ChainRuntimeVersion, Client, OpaqueGrandpaAuthoritiesSet, Subscription,
42+
ANCIENT_BLOCK_THRESHOLD,
43+
},
4144
error::{Error, Result},
4245
rpc::{SubstrateBeefyFinalityClient, SubstrateFinalityClient, SubstrateGrandpaFinalityClient},
4346
sync_header::SyncHeader,

relays/lib-substrate-relay/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ bp-messages = { path = "../../primitives/messages" }
4141
frame-support = { git = "https://github.com/paritytech/substrate", branch = "master" }
4242
frame-system = { git = "https://github.com/paritytech/substrate", branch = "master" }
4343
pallet-balances = { git = "https://github.com/paritytech/substrate", branch = "master" }
44+
pallet-utility = { git = "https://github.com/paritytech/substrate", branch = "master" }
4445
sp-core = { git = "https://github.com/paritytech/substrate", branch = "master" }
4546
sp-finality-grandpa = { git = "https://github.com/paritytech/substrate", branch = "master" }
4647
sp-runtime = { git = "https://github.com/paritytech/substrate", branch = "master" }

0 commit comments

Comments
 (0)