-
Notifications
You must be signed in to change notification settings - Fork 132
Added crate-level docs for the parachains pallet #1772
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
Merged
Merged
Changes from 1 commit
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
| # 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](../grandpa/) 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](https://github.com/paritytech/polkadot) | ||
| and [Cumulus](https://github.com/paritytech/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](https://github.com/paritytech/polkadot/blob/88013730166ba90745ae7c9eb3e0c1be1513c7cc/runtime/parachains/src/paras/mod.rs#L645) | ||
| of the [`paras`](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/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](../grandpa/). 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 laready knows better (or the same) head. In addition, pallet rejects | ||
| heads of untracked parachains. | ||
|
|
||
| The pallet deosn'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](./src/extension.rs) 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](../../docs/polkadot-kusama-bridge-overview.md). 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`](../../bin/runtime-common/src/lib.rs) | ||
| 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](../../relays/parachains/). | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo:
if it already knows better