mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 10:31:03 +00:00
d810f65044
* 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 <>
133 lines
8.4 KiB
Markdown
133 lines
8.4 KiB
Markdown
# Polkadot <> Kusama Bridge Overview
|
|
|
|
This document describes how we use all components, described in the [High-Level Bridge Documentation](./high-level-overview.md),
|
|
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](./polkadot-kusama-bridge.html).
|
|
|
|
## 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`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326)
|
|
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](#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! {}](../bin/runtime-common/src/lib.rs)
|
|
and [RefundRelayerForMessagesFromParachain](../bin/runtime-common/src/refund_relayer_extension.rs)), 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`](https://github.com/paritytech/substrate/blob/891d6a5c870ab88521183facafc811a203bb6541/frame/utility/src/lib.rs#L326)
|
|
transactions, that have both finality and message delivery calls. All restrictions from the
|
|
[Compensating the Cost of Message Delivery Transactions](#compensating-the-cost-of-message-delivery-transactions)
|
|
are applied.
|