Files
pezkuwi-subxt/polkadot/bridges/deployments
Svyatoslav Nikolsky 8e01ba9c03 Update bridges subtree (#5165)
* Squashed 'bridges/' changes from 1602249f0a..f220d2fcca

f220d2fcca Polkadot staging update (#1356)
02fd3d497c fix parse_transaction on Rialto+Millau (#1360)
bc191fd9a2 update parity-scale-codec to 3.1.2 (#1359)
a37226e79c update chain versions (#1358)
ff5d539fcb Update Substrate/Polkadot/Cumulus references (#1353)
1581f60cd5 Support dedicated lanes for pallets (#962)
0a7ccf5c57 ignore more "increase" alerts that are sometimes signalling NoData at startup (#1351)
31165127cc added no_stack_overflow_when_decoding_nested_call_during_dispatch test (#1349)
7000619eb8 replace From<>InboundLaneApi with direct storage reads (#1348)
515df10ccc added alerts for relay balances (#1347)
b56f6a87de Mortal conversion rate updater transactions (#1257)
20f2f331ec edition = "2021" (#1346)
99147d4f75 update regex to 1.5.5 (#1345)
686191f379 use DecodeLimit when decoding incoming calls (#1344)
a70c276006 get rid of '[No Data] Messages from Millau to Rialto are not being delivered' warnings (#1342)
01f29b8ac1 fix conversion rate metric in dashboards (#1341)
51c3bf351f Increase rate from metric when estimating fee (#1340)
3bb9c4f68f fix generator scripts to be consistent with updatedrelay output (#1339)
0475a1667b fixed mess with conversion rates (#1338)
d8fdd7d716 synchronize relay cli changes and token swap generator script (#1337)
6e928137a5 fix conversion rate override in token swap (#1336)
62d4a4811d override conversion rate in tokens swap generator (#1335)
ed9e1c839c fi typo in generator script (#1334)
3254b5af7a Override conversion rate when computing message fee (#1261)
66df68b5b8 Revert "Revert "override conversion rate in estimate-message-fee RPC (#1189)" (#1275)" (#1333)
0ca6fc6ef8 fix clippy issues (#1332)
5414b2fffb Reinitialize bridge relay subcommand (#1331)
a63d95ba7d removed extra *_RUNTIME_VERSION consts from relay code (#1330)
59fb18a310 fix typo in alert expression (#1329)
a6267a47ee Using-same-fork metric for finality and complex relay (#1327)
88d684d37e use mortal transactions in transaction resubmitter (#1326)
8ff88b6844 impl Decode for SignedExtensions (otherwise transaction resubmitter panicks) (#1325)
1ed09854f0 Encode and estimate Rococo/Wococo/Kusama/Polkadot messages (#1322)
ddb4517e13 Add some tests to check integrity of chain constants + bridge configuration (#1316)
bdeedb7ab9 Fix issues from cargo deny (#1311)
d3d79d01e0 expose fee multiplier metrics in messages relay (#1312)
c8b3f0ea16 Endow relayer account at target chain in message benchmarks (#1310)
f51ecd92b6 fix benchmarks before using it in Polkadot/Kusama/Rococo runtimes (#1309)
6935c619ad increase relay balance guard limits for Polkadot<>Kusama bridge (#1308)
7e31834c66 Fix mandatory headers scanning in on-demand relay (#1306)
92ddc3ea7a Polkadot-staging update (#1305)
3787193a31 fix session length of Rococo and Wococo (#1304)
eb468d29c0 Revert nightly docker pin (#1301)
e2d4c073e1 Use raw balance value if tokenDecimals property is missing (#1299)
108f4b29d1 Fix ss58 prefixes of Polkadot, Kusama and Westend used by relay (#1298)
64fbd2705e bump chain spec versions (#1297)
5707777b86 Bump Substrate/Polkadot/Cumulus refs (#1295)
29eecdf1fa Merge pull request #1294 from paritytech/polkadot-staging-update
1f0c05368e Relay balance metrics (#1291)
6356bb90b3 when messages pallet is halted, relay shall not submit messages delivery/confirmation transactions (#1289)
800dc2df8d when GRANDPA pallet is halted, relay shall not submit finality transactions (#1288)
3dd8e4f936 disable BEEFY allerts for Rialto (#1285)
f58fed7380 support version mode cli options in send-message subcommand (#1284)
3aac448da3 reuse polkadot-service code (#1273)
2bdbb651e1 replace latest_confirmed_nonce runtime APIs with direct storage reads (#1282)
5f9c6d241f move "common" code of messages pallet benchmarks helpers to the common library (#1281)
173d2d8229 Merge pull request #1280 from paritytech/polkadot-staging-update
8b9c4ec16d do not start spec_version guard when version mode is set to auto (#1278)
e98d682de2 removed extra messages benchmarks (#1279)
c730e25b61 Move benchmarks from Rialto to Millau (#1277)
54146416e7 Merge pull request #1276 from paritytech/polkadot-staging-update
df70118174 Merge branch 'master' into polkadot-staging-update
ed7def64c4 Revert "override conversion rate in estimate-message-fee RPC (#1189)" (#1275)
38c6c3a49f Use "production" floating tag when uilding docker image from version git tags (#1272)
ded9ff6dbb Replace InboundLaneApi::latest_received_nonce with direct storage read (#1269)
f704a741ee Polkadot staging update (#1270)
8c65f0d7ab verify that GRANDPA pallet is not initialized before submitting initialization transaction (#1267)
e7e83d8944 remove OutboundLaneApi::latest_received_nonce (#1262)
9f4b34acf1 bump rococo version (#1263)
82c08c5a87 read latest_generated_nonce directly from storage (#1260)
50ffb5dd08 override conversion rate in estimate-message-fee RPC (#1189)
467ca5ef59 move storage keys computation to primitivs (#1254)
4f9884066b remporary use pinned bridges-ci image in Dockerfile (#1258)
edfcb74e00 Change submit transaction spec_version and transaction_version query from chain (#1248)
4009d970d0 pin bridges-ci image (#1256)
65e51b5e1c decrease startup sleep to 5s for relays and to 120s for generators + remove curl (#1251)
3bc74355d9 Add missing RPC APIs to rialto parachain node (#1250)
80c9429284 Bump relay version to 1.0.0 (#1249)
9ead06af2a runtimes: fix call_size() test (#1245)
4fc8a29357 Use same endowed accounts set on dev/local chains (#1244)
fed54371c2 Refactor message relay helpers (#1234)
a15b4faae7 post-merge build fix (#1243)
52232d8d54 Fix transactions mortality (#1196)
c07bba931f Expose prometheus BEEFY metrics and add them to grafana dashboard (#1242)
f927775bd5 Refactor finality relay helpers (#1220)
7bf76f14a8 Update Rococo/Wococo version + prepare relay for Rococo<>Wococo bridge (#1241)
e860fecd04 Enable offchain indexing for Rialto/Millau nodes (#1239)
04d4d1c6b4 Enable Beefy debug logs in test deployment (#1237)
cd771f1089 Fix storage parameter name computation (#1238)
816ddd2dd2 Integrate BEEFY with Rialto & Millau runtimes (#1227)
d94b62b1ac update dependencies (#1229)
98eb9ee13d Add mut support (#1232)
ffef6f89f9 fixed set_operational in GRANDPA pallet (#1226)
bd2f8bfbd7 Add CODEOWNERS file (#1219)
6b5cf2b591 Unify metric names (#1209)
d1541e797e remove abandoned exchange relay (#1217)
39140d0b34 Remove unused `relays/headers` (#1216)
9bc071d42b Remove unused PoA<>Substrate bridge (#1210)
877e8d01e3 Fix UI deployment. (#1211)
6cd5775ebe Add `AtLeast32BitUnsigned` for MessageLance::SourceChainBalance (#1207)

git-subtree-dir: bridges
git-subtree-split: f220d2fccabbf141101d19456ecb4e3576a1d797

* fix compilation warnings
2022-03-21 10:19:29 +00:00
..
2022-03-21 10:19:29 +00:00
2022-03-21 10:19:29 +00:00

Bridge Deployments

Requirements

Make sure to install docker and docker-compose to be able to run and test bridge deployments. If for whatever reason you can't or don't want to use Docker, you can find some scripts for running the bridge here.

Networks

One of the building blocks we use for our deployments are networks. A network is a collection of homogenous blockchain nodes. We have Docker Compose files for each network that we want to bridge. Each of the compose files found in the ./networks folder is able to independently spin up a network like so:

docker-compose -f ./networks/rialto.yml up

After running this command we would have a network of several nodes producing blocks.

Bridges

A bridge is a way for several networks to connect to one another. Bridge deployments have their own Docker Compose files which can be found in the ./bridges folder. These Compose files typically contain bridge relayers, which are services external to blockchain nodes, and other components such as testing infrastructure, or user interfaces.

Unlike the network Compose files, these cannot be deployed on their own. They must be combined with different networks.

In general, we can deploy the bridge using docker-compose up in the following way:

docker-compose -f <bridge>.yml \
               -f <network_1>.yml \
               -f <network_2>.yml \
               -f <monitoring>.yml up

If you want to see how the Compose commands are actually run, check out the source code of the ./run.sh.

One thing worth noting is that we have a monitoring Compose file. This adds support for Prometheus and Grafana. We cover these in more details in the Monitoring section. At the moment the monitoring Compose file is not optional, and must be included for bridge deployments.

Running and Updating Deployments

We currently support two bridge deployments

  1. Rialto Substrate to Millau Substrate
  2. Westend Substrate to Millau Substrate

These bridges can be deployed using our ./run.sh script.

The first argument it takes is the name of the bridge you want to run. Right now we only support two bridges: rialto-millau and westend-millau.

./run.sh rialto-millau

If you add a second update argument to the script it will pull the latest images from Docker Hub and restart the deployment.

./run.sh rialto-millau update

You can also bring down a deployment using the script with the stop argument.

./run.sh rialto-millau stop

Adding Deployments

We need two main things when adding a new deployment. First, the new network which we want to bridge. A compose file for the network should be added in the /networks/ folder. Secondly we'll need a new bridge Compose file in ./bridges/. This should configure the bridge relayer nodes correctly for the two networks, and add any additional components needed for the deployment. If you want you can also add support in the ./run script for the new deployment. While recommended it's not strictly required.

General Notes

Rialto authorities are named: Alice, Bob, Charlie, Dave, Eve. Millau authorities are named: Alice, Bob, Charlie, Dave, Eve.

Both authorities and following accounts have enough funds (for test purposes) on corresponding Substrate chains:

  • on Rialto: Ferdie, George, Harry.
  • on Millau: Ferdie, George, Harry.

Names of accounts on Substrate (Rialto and Millau) chains may be prefixed with // and used as seeds for the sr25519 keys. This seed may also be used in the signer argument in Substrate relays. Example:

./substrate-relay relay-headers rialto-to-millau \
	--source-host rialto-node-alice \
	--source-port 9944 \
	--target-host millau-node-alice \
	--target-port 9944 \
	--source-signer //Harry \
	--prometheus-host=0.0.0.0

Some accounts are used by bridge components. Using these accounts to sign other transactions is not recommended, because this may lead to nonces conflict.

Following accounts are used when rialto-millau bridge is running:

  • Millau's Charlie signs complex headers+messages relay transactions on Millau chain;
  • Rialto's Charlie signs complex headers+messages relay transactions on Rialto chain;
  • Millau's Dave signs Millau transactions which contain messages for Rialto;
  • Rialto's Dave signs Rialto transactions which contain messages for Millau;
  • Millau's Eve signs relay transactions with message delivery confirmations (lane 00000001) from Rialto to Millau;
  • Rialto's Eve signs relay transactions with messages (lane 00000001) from Millau to Rialto;
  • Millau's Ferdie signs relay transactions with messages (lane 00000001) from Rialto to Millau;
  • Rialto's Ferdie signs relay transactions with message delivery confirmations (lane 00000001) from Millau to Rialto;
  • Millau's RialtoMessagesOwner signs relay transactions with updated Rialto -> Millau conversion rate;
  • Rialto's MillauMessagesOwner signs relay transactions with updated Millau -> Rialto conversion rate.

Following accounts are used when westend-millau bridge is running:

  • Millau's George signs relay transactions with new Westend headers.

Docker Usage

When the network is running you can query logs from individual nodes using:

docker logs rialto_millau-node-charlie_1 -f

To kill all leftover containers and start the network from scratch next time:

docker ps -a --format "{{.ID}}" | xargs docker rm # This removes all containers!

Docker Compose Usage

If you're not familiar with how to use docker-compose here are some useful commands you'll need when interacting with the bridge deployments:

docker-compose pull   # Get the latest images from the Docker Hub
docker-compose build  # This is going to build images
docker-compose up     # Start all the nodes
docker-compose up -d  # Start the nodes in detached mode.
docker-compose down   # Stop the network.

Note that for the you'll need to add the appropriate -f arguments that were mentioned in the Bridges section. You can read more about using multiple Compose files here. One thing worth noting is that the order the compose files are specified in matters. A different order will result in a different configuration.

You can sanity check the final config like so:

docker-compose -f docker-compose.yml -f docker-compose.override.yml config > docker-compose.merged.yml

Docker and Git Deployment

It is also possible to avoid using images from the Docker Hub and instead build containers from Git. There are two ways to build the images this way.

Git Repo

If you have cloned the bridges repo you can build local Docker images by running the following command at the top level of the repo:

docker build . -t local/<project_you're_building> --build-arg=PROJECT=<project>

This will build a local image of a particular component with a tag of local/<project_you're_building>. This tag can be used in Docker Compose files.

You can configure the build using using Docker build arguments. Here are the arguments currently supported:

  • BRIDGE_REPO: Git repository of the bridge node and relay code
  • BRIDGE_HASH: Commit hash within that repo (can also be a branch or tag)
  • ETHEREUM_REPO: Git repository of the OpenEthereum client
  • ETHEREUM_HASH: Commit hash within that repo (can also be a branch or tag)
  • PROJECT: Project to build withing bridges repo. Can be one of:
    • rialto-bridge-node
    • millau-bridge-node
    • substrate-relay

GitHub Actions

We have a nightly job which runs and publishes Docker images for the different nodes and relayers to the ParityTech Docker Hub organization. These images are used for our ephemeral (temporary) test networks. Additionally, any time a tag in the form of v* is pushed to GitHub the publishing job is run. This will build all the components (nodes, relayers) and publish them.

With images built using either method, all you have to do to use them in a deployment is change the image field in the existing Docker Compose files to point to the tag of the image you want to use.

Monitoring

Prometheus is used by the bridge relay to monitor information such as system resource use, and block data (e.g the best blocks it knows about). In order to visualize this data a Grafana dashboard can be used.

As part of the Rialto docker-compose setup we spin up a Prometheus server and Grafana dashboard. The Prometheus server connects to the Prometheus data endpoint exposed by the bridge relay. The Grafana dashboard uses the Prometheus server as its data source.

The default port for the bridge relay's Prometheus data is 9616. The host and port can be configured though the --prometheus-host and --prometheus-port flags. The Prometheus server's dashboard can be accessed at http://localhost:9090. The Grafana dashboard can be accessed at http://localhost:3000. Note that the default log-in credentials for Grafana are admin:admin.

Environment Variables

Here is an example .env file which is used for production deployments and network updates. For security reasons it is not kept as part of version control. When deploying a network this file should be correctly populated and kept in the appropriate bridges deployment folder.

The UI_SUBSTRATE_PROVIDER variable lets you define the url of the Substrate node that the user interface will connect to. UI_ETHEREUM_PROVIDER is used only as a guidance for users to connect Metamask to the right Ethereum network. UI_EXPECTED_ETHEREUM_NETWORK_ID is used by the user interface as a fail safe to prevent users from connecting their Metamask extension to an unexpected network.

GRAFANA_ADMIN_PASS=admin_pass
GRAFANA_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/
GRAFANA_SERVER_DOMAIN=server.domain.io
MATRIX_ACCESS_TOKEN="access-token"
WITH_PROXY=1 # Optional
UI_SUBSTRATE_PROVIDER=ws://localhost:9944
UI_ETHEREUM_PROVIDER=http://localhost:8545
UI_EXPECTED_ETHEREUM_NETWORK_ID=105

UI

Use wss://rialto.bridges.test-installations.parity.io/ as a custom endpoint for https://polkadot.js.org/apps/.

Polkadot.js UI

To teach the UI decode our custom types used in the pallet, go to: Settings -> Developer and import the ./types.json

Scripts

The are some bash scripts in scripts folder that allow testing Relay without running the entire network within docker. Use if needed for development.