Files
pezkuwi-subxt/bridges/modules/parachains
Branislav Kontur 9e1afcafb5 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
..

Bridge Parachains Pallet

The bridge parachains pallet is a light client for one or several parachains of the bridged relay chain. It serves as a source of finalized parachain headers and is used when you need to build a bridge with a parachain.

The pallet requires bridge GRANDPA pallet to be deployed at the same chain - it is used to verify storage proofs, generated at the bridged relay chain.

A Brief Introduction into Parachains Finality

You can find detailed information on parachains finality in the Polkadot and Cumulus repositories. This section gives a brief overview of how the parachain finality works and how to build a light client for a parachain.

The main thing there is that the parachain generates blocks on its own, but it can't achieve finality without help of its relay chain. Instead, the parachain collators create a block and hand it over to the relay chain validators. Validators validate the block and register the new parachain head in the Heads map of the paras pallet, deployed at the relay chain. Keep in mind that this pallet, deployed at a relay chain, is NOT a bridge pallet, even though the names are similar.

And what the bridge parachains pallet does, is simply verifying storage proofs of parachain heads within that Heads map. It does that using relay chain header, that has been previously imported by the bridge GRANDPA pallet. Once the proof is verified, the pallet knows that the given parachain header has been finalized by the relay chain. The parachain header fields may then be used to verify storage proofs, coming from the parachain. This allows the pallet to be used e.g. as a source of finality for the messages pallet.

Pallet Operations

The main entrypoint of the pallet is the submit_parachain_heads call. It has three arguments:

  • storage proof of parachain heads from the Heads map;

  • parachain identifiers and hashes of their heads from the storage proof;

  • the relay block, at which the storage proof has been generated.

The pallet may track multiple parachains. And the parachains may use different primitives - one may use 128-bit block numbers, other - 32-bit. To avoid extra decode operations, the pallet is using relay chain block number to order parachain headers. Any finalized descendant of finalized relay block RB, which has parachain block PB in its Heads map, is guaranteed to have either PB, or its descendant. So parachain block number grows with relay block number.

The pallet may reject parachain head if it already knows better (or the same) head. In addition, pallet rejects heads of untracked parachains.

The pallet doesn't track anything behind parachain heads. So it requires no initialization - it is ready to accept headers right after deployment.

Non-Essential Functionality

There may be a special account in every runtime where the bridge parachains module is deployed. This account, named 'module owner', is like a module-level sudo account - he's able to halt and resume all module operations without requiring runtime upgrade. Calls that are related to this account are:

  • fn set_owner(): current module owner may call it to transfer "ownership" to another account;

  • fn set_operating_mode(): the module owner (or sudo account) may call this function to stop all module operations. After this call, all finality proofs will be rejected until further set_operating_mode call'. This call may be used when something extraordinary happens with the bridge.

If pallet owner is not defined, the governance may be used to make those calls.

Signed Extension to Reject Obsolete Headers

It'd be better for anyone (for chain and for submitters) to reject all transactions that are submitting already known parachain heads to the pallet. This way, we leave block space to other useful transactions and we don't charge concurrent submitters for their honest actions.

To deal with that, we have a signed extension that may be added to the runtime. It does exactly what is required - rejects all transactions with already known heads. The submitter pays nothing for such transactions - they're simply removed from the transaction pool, when the block is built.

The signed extension, however, is a bit limited - it only works with transactions that provide single parachain head. So it won't work with multiple parachain heads transactions. This fits our needs for Kusama <> Polkadot bridge. If you need to deal with other transaction formats, you may implement similar extension for your runtime.

You may also take a look at the generate_bridge_reject_obsolete_headers_and_messages macro that bundles several similar signed extensions in a single one.

Parachains Finality Relay

We have an offchain actor, who is watching for new parachain heads and submits them to the bridged chain. It is the parachains relay - you may look at the crate level documentation and the code.