Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bridges - revert-back and improve congestion #6231

Open
wants to merge 69 commits into
base: master
Choose a base branch
from

Conversation

bkontur
Copy link
Contributor

@bkontur bkontur commented Oct 25, 2024

Closes: #5551
Closes: #5550

Context

Before permissionless lanes, bridges only supported hard-coded, static lanes. The congestion mechanism was based on sending Transact(report_bridge_status(is_congested)) from pallet-xcm-bridge-hub to pallet-xcm-bridge-hub-router. Depending on is_congested, we adjusted the fee factor to increase or decrease fees. This congestion mechanism relied on monitoring XCMP queues, which could cause issues like suspending the entire XCMP queue rather than just the affected bridge.

Additionally, we are progressing with deploying bridge message pallets/routing directly on AssetHub, where we don’t interact with XCMP to perform ExportXcm locally.

Description

This PR re-introduces and improves congestion for bridges:

  • Enhanced Bridge Congestion Mechanism: The bridge queue mechanism has been restructured to operate independently of XCMP, with a refined protocol for congestion detection and suspension management.

  • Bridge-Specific Channel Suspension: pallet-xcm-bridge-hub and pallet-xcm-bridge-hub-router now use BridgeId to identify specific bridges, enabling selective suspension and resumption of individual bridge channels.

  • Dynamic Congestion Detection: pallet-xcm-bridge-hub now includes callbacks for fn suspend_bridge and fn resume_bridge based on congestion status:

    • For sibling chains, the router sends xcm::Transact(report_bridge_status(bridge_id, is_congested)) using the stored callback information.
    • For local chain deployments, the router manages state directly.
  • New Stop Threshold: A stop_threshold limit in pallet-xcm-bridge-hub enables or disables ExportXcm::validate, providing a fallback mechanism when the router does not adhere to the suspend signal.

  • Flexible Message Routing: pallet-xcm-bridge-hub-router has been refactored to support message routing for both sibling chains (ExportMessage) and local deployment (ExportXcm).

These updates improve modularity, allow more granular bridge congestion handling, and support diverse deployment scenarios.

@bkontur bkontur added the T15-bridges This PR/Issue is related to bridges. label Oct 25, 2024
@bkontur bkontur self-assigned this Oct 25, 2024
@bkontur
Copy link
Contributor Author

bkontur commented Oct 25, 2024

bot fmt
/cmd prdoc --audience runtime_dev --bump patch

@bkontur
Copy link
Contributor Author

bkontur commented Oct 25, 2024

/cmd prdoc --audience runtime_dev --bump patch --force

@bkontur bkontur force-pushed the bko-bridges-congestion branch 2 times, most recently from 659be89 to b48b8a5 Compare October 25, 2024 21:14
prdoc/pr_6231.prdoc Outdated Show resolved Hide resolved
@bkontur
Copy link
Contributor Author

bkontur commented Oct 26, 2024

bot fmt

@bkontur
Copy link
Contributor Author

bkontur commented Oct 28, 2024

bot fmt

@bkontur bkontur force-pushed the bko-bridges-congestion branch 7 times, most recently from c78e707 to 152389a Compare November 5, 2024 12:33
@bkontur
Copy link
Contributor Author

bkontur commented Nov 5, 2024

bot fmt

@bkontur bkontur force-pushed the bko-bridges-congestion branch 2 times, most recently from 900bbec to ca24d6c Compare November 7, 2024 11:40
@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

/cmd fmt

@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

/cmd --help

@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

/cmd bench --runtime asset-hub-westend asset-hub-rococo --pallet pallet_xcm_bridge_hub_router

@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

bot bench cumulus-assets --runtime=asset-hub-westend --pallet=pallet_xcm_bridge_hub_router
bot bench cumulus-assets --runtime=asset-hub-rococo --pallet=pallet_xcm_bridge_hub_router

@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

/cmd fmt

@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-assets --runtime=asset-hub-westend --pallet=pallet_xcm_bridge_hub_router
bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-assets --runtime=asset-hub-rococo --pallet=pallet_xcm_bridge_hub_router

bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-bridge-hubs --runtime=bridge-hub-rococo --pallet=pallet_bridge_messages
bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-bridge-hubs --runtime=bridge-hub-westend --pallet=pallet_bridge_messages

@bkontur
Copy link
Contributor Author

bkontur commented Nov 7, 2024

bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-bridge-hubs --runtime=bridge-hub-rococo --pallet=pallet_bridge_messages
bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-bridge-hubs --runtime=bridge-hub-westend --pallet=pallet_bridge_messages
bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-bridge-hubs --subcommand=xcm --runtime=bridge-hub-rococo --pallet=pallet_xcm_benchmarks::generic
bot bench -v PIPELINE_SCRIPTS_REF=bko-fix cumulus-bridge-hubs --subcommand=xcm --runtime=bridge-hub-westend --pallet=pallet_xcm_benchmarks::generic

@command-bot command-bot bot deleted a comment from github-actions bot Nov 11, 2024
@bkontur
Copy link
Contributor Author

bkontur commented Nov 11, 2024

/cmd fmt

Copy link

Command "fmt" has started 🚀 See logs here

Copy link

Command "fmt" has finished ✅ See logs here

Comment on lines +35 to +36
/// This function ensures that the `local_origin` matches the expected `Location::here()`. If
/// the check passes, it updates the bridge status to congested.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does this have to be Location::here()?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bp_xcm_bridge_hub::LocalXcmChannelManager<BridgeIdOf<T, I>> for Pallet<T, I> implementation only makes sense when the pallet_xcm_bridge_hub_router instance is deployed in the same runtime as pallet_xcm_bridge_hub and/or used with HereOrLocalConsensusXcmChannelManager.

Essentially, this implementation will be used with HereOrLocalConsensusXcmChannelManager when both pallets are deployed on AssetHubs:

  1. pallet_xcm_bridge_hub will serve permissionless lanes for sibling parachains and use ReportBridgeStatusXcmChannelManager (which sends XCM to the sibling) for congestion.
    • The deployed pallet_xcm_bridge_hub_router on the sibling will be sending ExportMessage.
  2. pallet_xcm_bridge_hub will also serve permissionless lanes created for the AssetHub (Location::here()) and use the router's bp_xcm_bridge_hub::LocalXcmChannelManager<BridgeIdOf<T, I>> for pallet_xcm_bridge_hub_router::Pallet<T, I> implementation for direct congestion management.
    • The deployed pallet_xcm_bridge_hub_router on the AssetHub will trigger pallet_xcm_bridge_hub ExportXcm with UnpaidLocalExporter.

bridges/modules/xcm-bridge-hub-router/src/impls.rs Outdated Show resolved Hide resolved
bridges/modules/xcm-bridge-hub-router/src/impls.rs Outdated Show resolved Hide resolved
bridges/modules/xcm-bridge-hub-router/src/impls.rs Outdated Show resolved Hide resolved
// if not congested anymore, we can start to decreasing fee factor
if !bridge_state.is_congested {
let previous_factor = bridge_state.delivery_fee_factor;
let new_factor = previous_factor / EXPONENTIAL_FEE_BASE;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there some safe division we could use here? I'm a little bit spooked by the loop in on_initialize 😅

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We use this division by non-zero const for XCMP, UMP, DMP also.

I have another follow-up TODO for refatoring FeeTracker/PriceForDelivery to reuse here, so I will check better saturating/checked_div there also

bridges/modules/xcm-bridge-hub-router/src/lib.rs Outdated Show resolved Hide resolved
bridges/modules/xcm-bridge-hub/src/benchmarking.rs Outdated Show resolved Hide resolved
@bkontur
Copy link
Contributor Author

bkontur commented Nov 14, 2024

/cmd fmt

Copy link

Command "fmt" has started 🚀 See logs here

Copy link

Command "fmt" has finished ✅ See logs here

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A4-needs-backport Pull request must be backported to all maintained releases. T15-bridges This PR/Issue is related to bridges.
Projects
Status: In Progress
Development

Successfully merging this pull request may close these issues.

Add LocalXcmChannelManager impls for XcmpQueue and BridgeHubs Add benchmarks for pallet-xcm-bridge-hub
3 participants