Files
pezkuwi-subxt/cumulus/bridges/docs/polkadot-kusama-bridge-overview.md
T
Branislav Kontur d810f65044 Initial version of bridging pallets as git subtree (#2458)
* Initial version of bridges pallet as subtree of https://github.com/paritytech/parity-bridges-common
Added `Bridges subtree files` pr review rule

* Squashed 'bridges/' content from commit d30927c08

git-subtree-dir: bridges
git-subtree-split: d30927c089bd9e73092d1ec1a62895603cb277a3

* Updated REAMDE.md and BRIDGES.md (inspired by original https://github.com/paritytech/polkadot/blob/d22eb62fe40e55e15eb91d375f48cc540d83a47e/BRIDGES.md)

* Squashed 'bridges/' changes from d30927c08..d3970944b

d3970944b Small simplifications (#2050)

git-subtree-dir: bridges
git-subtree-split: d3970944b0cfc4ea5226225e1ca07dab234c3556

* Squashed 'bridges/' changes from d3970944b..2180797fb

2180797fb Removed CODEOWNERS (#2051)

git-subtree-dir: bridges
git-subtree-split: 2180797fbf8a990490c67853dcffd81bc8dd083c

* Squashed 'bridges/' changes from 2180797fbf..4850aac8ce

4850aac8ce Removed relayer_account: &AccountId from MessageDispatch  (#2080)
8c8adafd54 Revert "Fix max-size messages at test chains (#2064)" (#2077)
c01a63efd8 Fixed off-by-one when confirming rewards in messages pallet (#2075)
a298be96aa Update subxt dependencies (#2072)
c0eef51eab Fix max-size messages at test chains (#2064)
3a658e3697 Messages relay fixes (#2073)
0022b5ab22 Slash relayers for invalid transactions (#2025)
198104007f Bump enumflags2 from 0.7.5 to 0.7.7
9229b257e5 [ci] Fix rules for docker build (#2069)
660d791390 [ci] Update buildah command and version (#2058)
e4535c0ca4 fix the way latest_confirmed_nonce_at_source is "calculated" (#2067)
dbc2d37590 select nothing if we have already selected nonces to submit or have submitted something (#2065)
a7eedd21fe [relay-substrate-client] Bump jsonrpsee (#2066)
8875d5aeae Bump clap from 4.2.2 to 4.2.4
25f9cf55e2 Another use of RangeInclusiveExt::checked_len() (#2060)
4942c12a5f submit lane unblock transactions from relay (#2030)
c0325d3c9c Test deployments fixes (#2057)
fc7b9b7ed7 Use the new matrix server (#2056)
63bcb5c10b Fixed delivery alert rule (#2052)

git-subtree-dir: bridges
git-subtree-split: 4850aac8ce6c34e5ca6246b88cd14c873a879cba

* Squashed 'bridges/' changes from 4850aac8ce..66aaf0dd23

66aaf0dd23 Nits (#2083)

git-subtree-dir: bridges
git-subtree-split: 66aaf0dd239dde40b64264061a77c921e2c82568

* Squashed 'bridges/' changes from 66aaf0dd23..557ecbcecc

557ecbcecc Fix sized messages (Follow-up on #2064) (#2103)
54f587a066 Add weight of refund extension post_dispatch to the weights of messages pallet (#2089)
5b1626f8c4 fix pallet param for nightly benchmarks check (#2099)
ae44c6b7a1 Add millau specific messages weights (#2097)
6ad0bd1f1e Add integrity tests to rialto parachain runtiime (#2096)
6919556de5 Bump tokio from 1.27.0 to 1.28.0
58795fcb75 Bump clap from 4.2.4 to 4.2.5
01bf31085b Bump scale-info from 2.5.0 to 2.6.0
8fe383240d Bump anyhow from 1.0.70 to 1.0.71
8d94e82ad5 deployments: add new BEEFY metrics and alarms (#2090)
e9a4749e7e Bump wasmtime from 6.0.1 to 6.0.2
9d9936c0d9 Bump wasmtime from 6.0.1 to 6.0.2 in /tools/runtime-codegen
5d77cd7bee Add more logs to relayer and message pallets (#2082)
75fbb9d3ef Update comment (#2081)
9904d09cf6 Benchmarks for new relayers pallet calls (#2040)

git-subtree-dir: bridges
git-subtree-split: 557ecbcecc585547b744a5ac9fb8d7f3b9de4521

* fmt

* Squashed 'bridges/' changes from 557ecbcecc..04b3dda6aa

04b3dda6aa Remove from subtree (#2111)
f8ff15e7e7 Add `MessagesPalletInstance` for integrity tests (#2107)
92ccef58e6 Use generated runtimes for BHR/BHW (#2106)
b33e0a585b Fix comment (#2105)

git-subtree-dir: bridges
git-subtree-split: 04b3dda6aa38599e612ff637710b6d2cff275ef3

* ".git/.scripts/commands/fmt/fmt.sh"

---------

Co-authored-by: parity-processbot <>
2023-05-04 06:36:58 +00:00

8.4 KiB

Polkadot <> Kusama Bridge Overview

This document describes how we use all components, described in the High-Level Bridge Documentation, to build the XCM bridge between Kusama and Polkadot. In this case, our components merely work as a XCM transport (like XCMP/UMP/HRMP), between chains that are not a part of the same consensus system.

The overall architecture may be seen in this diagram.

Bridge Hubs

All operations at relay chain are expensive. Ideally all non-mandatory transactions must happen on parachains. That's why we are planning to have two parachains - Polkadot Bridge Hub under Polkadot consensus and Kusama Bridge Hub under Kusama consensus.

The Bridge Hub will have all required bridge pallets in its runtime. We hope that later, other teams will be able to use our bridge hubs too and have their pallets there.

The Bridge Hub will use the base token of the ecosystem - KSM at Kusama Bridge Hub and DOT at Polkadot Bridge Hub. The runtime will have minimal set of non-bridge pallets, so there's not much you can do directly on bridge hubs.

Connecting Parachains

You won't be able to directly use bridge hub transactions to send XCM messages over the bridge. Instead, you'll need to use other parachains transactions, which will use HRMP to deliver messages to the Bridge Hub. The Bridge Hub will just queue these messages in its outbound lane, which is dedicated to deliver messages between two parachains.

Our first planned bridge will connect the Polkadot' Statemint and Kusama' Statemine. Bridge between those two parachains would allow Statemint accounts to hold wrapped KSM tokens and Statemine accounts to hold wrapped DOT tokens.

For that bridge (pair of parachains under different consensus systems) we'll be using the lane 00000000. Later, when other parachains will join the bridge, they will be using other lanes for their messages.

Running Relayers

We are planning to run our own complex relayer for the lane 00000000. The relayer will relay Kusama/Polkadot GRANDPA justifications to the bridge hubs at the other side. It'll also relay finalized Kusama Bridge Hub and Polkadot Bridge Hub heads. This will only happen when messages will be queued at hubs. So most of time relayer will be idle.

There's no any active relayer sets, or something like that. Anyone may start its own relayer and relay queued messages. We are not against that and, as always, appreciate any community efforts. Of course, running relayer has the cost. Apart from paying for the CPU and network, the relayer pays for transactions at both sides of the bridge. We have a mechanism for rewarding relayers.

Compensating the Cost of Message Delivery Transactions

One part of our rewarding scheme is that the cost of message delivery, for honest relayer, is zero. The honest relayer is the relayer, which is following our rules:

  • we do not reward relayers for submitting GRANDPA finality transactions. The only exception is submitting mandatory headers (headers which are changing the GRANDPA authorities set) - the cost of such transaction is zero. The relayer will pay the full cost for submitting all other headers;

  • we do not reward relayers for submitting parachain finality transactions. The relayer will pay the full cost for submitting parachain finality transactions;

  • we compensate the cost of message delivery transactions that have actually delivered the messages. So if your transaction has claimed to deliver messages [42, 43, 44], but, because of some reasons, has actually delivered messages [42, 43], the transaction will be free for relayer. If it has not delivered any messages, then the relayer pays the full cost of the transaction;

  • we compensate the cost of message delivery and all required finality calls, if they are part of the same frame_utility::batch_all transaction. Of course, the calls inside the batch must be linked - e.g. the submitted parachain head must be used to prove messages. Relay header must be used to prove parachain head finality. If one of calls fails, or if they are not linked together, the relayer pays the full transaction cost.

Please keep in mind that the fee of "zero-cost" transactions is still withdrawn from the relayer account. But the compensation is registered in the pallet_bridge_relayers::RelayerRewards map at the target bridge hub. The relayer may later claim all its rewards later, using the pallet_bridge_relayers::claim_rewards call.

A side note: why we don't simply set the cost of useful transactions to zero? That's because the bridge has its cost. If we won't take any fees, it would mean that the sender is not obliged to pay for its messages. And Bridge Hub collators (and, maybe, "treasury") are not receiving any payment for including transactions. More about this later, in the Who is Rewarding Relayers section.

Message Delivery Confirmation Rewards

In addition to the "zero-cost" message delivery transactions, the relayer is also rewarded for:

  • delivering every message. The reward is registered during delivery confirmation transaction at the Source Bridge Hub.;

  • submitting delivery confirmation transaction. The relayer may submit delivery confirmation that e.g. confirms delivery of four messages, of which the only one (or zero) messages is actually delivered by this relayer. It receives some fee for confirming messages, delivered by other relayers.

Both rewards may be claimed using the pallet_bridge_relayers::claim_rewards call at the Source Bridge Hub.

Who is Rewarding Relayers

Obviously, there should be someone who is paying relayer rewards. We want bridge transactions to have a cost, so we can't use fees for rewards. Instead, the parachains using the bridge, use sovereign accounts on both sides of the bridge to cover relayer rewards.

Bridged Parachains will have sovereign accounts at bridge hubs. For example, the Statemine (Kusama Parachain) will have an account at the Polkadot Bridge Hub. The Statemint (Polkadot Parachain) will have an account at the Kusama Bridge Hub. The sovereign accounts are used as a source of funds when the relayer is calling the pallet_bridge_relayers::claim_rewards.

Since messages lane is only used by the pair of parachains, there's no collision between different bridges. E.g. Statemine will only reward relayers that are delivering messages from Statemine. The Statemine sovereign account is not used to cover rewards of bridging with some other Polkadot Parachain.

Multiple Relayers and Rewards

Our goal is to incentivize running honest relayers. But we have no relayers sets, so at any time anyone may submit message delivery transaction, hoping that the cost of this transaction will be compensated. So what if some message is currently queued and two relayers are submitting two identical message delivery transactions at once? Without any special means, the cost of first included transaction will be compensated and the cost of the other one won't. A honest, but unlucky relayer will lose some money. In addition, we'll waste some portion of block size and weight, which may be used by other useful transactions.

To solve the problem, we have two signed extensions (generate_bridge_reject_obsolete_headers_and_messages! {} and RefundRelayerForMessagesFromParachain), that are preventing bridge transactions with obsolete data from including into the block. We are rejecting following transactions:

  • transactions, that are submitting the GRANDPA justification for the best finalized header, or one of its ancestors;

  • transactions, that are submitting the proof of the current best parachain head, or one of its ancestors;

  • transactions, that are delivering already delivered messages. If at least one of messages is not yet delivered, the transaction is not rejected;

  • transactions, that are confirming delivery of already confirmed messages. If at least one of confirmations is new, the transaction is not rejected;

  • frame_utility::batch_all transactions, that have both finality and message delivery calls. All restrictions from the Compensating the Cost of Message Delivery Transactions are applied.