Files
pezkuwi-subxt/polkadot/bridges/docs/testing-scenarios.md
T
antonio-dropulic 392447f5c8 Squashed 'bridges/' changes from 23dda62482..407bf44a8a
407bf44a8a add missing license header (#1204)
9babb19810  Custom relay strategy (#1198)
c287872a11 fix clippy things (#1200)
3a40e62789 Expose some const value and type (#1186)
32b61476d1 increase sleep before connectingMillau (#1195)
aabe7041fa revert messages transactions mortality (#1194)
3651f4f909 Message transactions mortality (#1191)
364d6e155d Bump dependencies (#1180)
f0389acc08 cargo +nightly fmt --all (#1192)
b270b6a016 Unify error enums in substrate and ethereum clients with `thiserror` (#1094)
58c4946f74 Limit max call size of Rialto/Millau runtimes (#1187)
fd56a8cd56 Add UI to the deployment (#1047)
16f01dc736 Westend -> Millau alerts are pending before notifications are sent (#1184)
5628c11ece replace collective flip with babe randomness in Rialto (#1188)
1094a63b00 ignore another (pretty bad) RUSTSEC (#1185)
379fe323ea fix/ignore cargo deny issues (#1183)
92af5e6e64 additional log in finality relay + rephrase "failed" (#1182)
b996a3b681 Rialto parachain in test deployments (#1178)
28d9332b44 Resubmit transactions strategy for Polkadot/Kusama (#1175)
d0172c6847 Playing with CI (#1179)
fb6f42456d fix checks order when registering parachain (#1177)
ee828c005a Register-parachain subcommand of substrate-relay (#1170)
8cd2b1a112 Token swap pallet benchmarks (#1174)
bb811accb1 fix collision with westend bridge (#1172)
8d2fba70ed add token swaps to test deployments (#1169)
b6d1bdfe2c publish rialto parachain collator image (#1171)
834ae4a10a Fix OutboundLaneData types (#1159)
5ee0ea1626 copypasted -> copied (#1168)
c3bb835f18 fix spelling (#1167)
f90d041dc9 Upgrade `jsonrpsee` to v0.3 (#1051)
598c9b6d0d add some basic tests for swap tokens (#1164)
05e88c61f5 publish images when tag of specific format(e.g. v2021-09-27 + v2021-09-27-1) is published (#1166)
7f3f94a6e0 Fix CI again (#1165)
ff37de332f Move calculation relayer reward into `MessageDeliveryAndDispatchPayment` (#1153)
36fbba839b fix clippy warning (#1163)
16da44d018 explicit wasm build (#1158)
c9c8226449 Match substrate's fmt (#1148)
2fdd7f3e5e Fix/ignore clippy warnings (#1157)
43dfcc2686 Adding LookupAddress (#1156)
951eaa5582 Add rialto-parachain runtime and node (#1142)
803d266d61 Rename MessageId -> BridgeMessageId (#1152)
5f234484fc Box large arguments of GRANDPA pallet (#1154)
cf9abc1011 Fix spelling (#1150)
ab83ba2e58 Relay subcommand that performs token RLT <> MLAU token swap (#1141)
832536caf0 Polkadot <> Kusama relayers (#1122)
6d0daa8975 Add `OnMessageAccepted` callback (#1134)
5d03a20b3e Integrate token swap pallet into Millau runtime (#1099)
ea4cfa833e Adding MultiAddress type and ValidationCodeHash (#1139)
c20325a784 Add tests for `Raw` and `BridgeSendMessage` enum `Call` variants (#1125)
6d802416e2 increase pause before pining Rialto nodes (#1137)
b54fa56b62 calculate fee using full message payload (#1132)
ca5d8178f5 Add parachain pallets to rialto runtime (#1053)
9eaae4142e fix transaction resubmitter limits for Millau -> Rialto transactions (#1135)
9d4e17783c add --mandatory-headers-only cli option to complex relay (#1129)
1c5e0ec1cb Add local CI info to README (#1131)
a8e0929e14 chore: spellchecker fixes (#1130)
3b8e2118e3 set fee for importing mandatory headers to zero (#1127)
49bba9aa52 another bunch of words for spellchecker (#1128)
8a72eafef6 Increase pause before messages generation start (#1126)
1f0ba9a191 Move some associated types from relay_substrate_client::Chain to bp_runtime::Chain (#1087)
74bc1a5b54 Transactions resubmitter (#1083)
21ba001f26 log max balance drop when sending message (#1117)
638a7ddffa Code Cleaning (#1124)
be6555c51b Fix buildah logout (#1120)
87539c4a98 Format code work (#1116)
526fe7fdd7 fix spelling (#1119)
bd4ce7f241 Fix spelling (#1118)
3c1147858e added missing constants to Kusama/Polkadot primitives (#1114)
52093b22ab Fix delivery transaction estimation used by rational relayer (#1109)
77a2f2fbed Remove fund account checks from upgrade. (#1111)
824334802b Rename param and update comment (#1108)
d7784bfe06 Fix spellcheck (#1110)
0b18f5906a Refactor substrate messages source and substrate messages target (#1105)
b27240bbff fix compilation (#1107)
9697da4fe8 Emit mortal transactions from relay (#1073)
b29396c077 Change vault vars type to env vars (#1084)
35e0bbdc0c Make clippy mandatory. (#1103)
a517e8541f Remove unused deps (#1102)
873dae608a Remove unnessary deps (#1101)
13450b74ee Stored conversion rate updater (#1005)
74389829f3 [BREAKING] Migrate messages pallet to frame v2 (#1088)
424da938dd README fix (#1100)
865744c909 upgrade currency exchange pallet to frame v2 (#1097)
b5038148b3 Add missing docs (#1095)
0791e911c1 Common crate for substrate-relay (#1082)
3834c9d880 Update high-level-overview.md (#1093)
c93553face Increase the time window for messaging alerts. (#1092)
8b9cc3cecd migrate pallet-shift-session-manager to frame v2 (#1090)
dc91813c22 migrate eth PoA pallet to frame v2 (#1091)
f16bb098cc Migrate dispatch pallet  to frame v2 (#1089)
19f4325348 Bridge/This Chain Ids should be exposed as constants on pallet level. (#1085)
6381122df7 Change ChainSpec::from_genesis for Rialto and Millau chains to reflect the chain names. (#1079)
0f1d33e973 Make CI happy again (#1086)
238e65d96f fix typo (#1080)
fc008457b6 Token-swap-over-bridge pallet (#944)
3fb97fa5ef Fix full spellcheck (#1076)
eae4ed7170 fixed wrong trace (#1075)
219a0fad04 merge two weight-related loops in messages pallet (#1071)
fc85632fdb increase_message_fee depends on stored mesage size (#1066)
530f37a23b companion for https://github.com/paritytech/polkadot/pull/3507 (#1067)
53b8cba683 sc_basic_authorship=trace for millau nodes (#1074)
9874e05e98 Improve traces of message generator scripts (#1069)
7b5ee84fbb extract message_details impl into runtime common (#1070)
5a4aed5a8b refund weight for mot pruning messages (#1062)
90e3d1e111 Fix Westend -> Millau sync (#1064)
427d30ddfc When restarting client, also "restart" tokio runtime (#1065)
d47c05eeef Change get pipeline sensitive variables from Vault instead of GitLab settings (#1063)
d775a85415 use tokio reactor to execute jsonrpsee futures (#1061)
15c8cd61cb Use BABE to author blocks on Rialto (previously: Aura) (#1050)
5186293500 Allow reading suri && password override from file (#1059)
b506298262 Update jsonrpsee reference (#1049)
1734d00517 enable weight fee adjustent in Rialto/Millau (#1044)
607265afae Pay dispatch fee at target chain cli option (#1043)
ce79ef91be bump dependencies before start referencing polkadot repo (#1048)
924fa24f6d Cli option for greedy relayer + run no-losses relayer by default (#1042)
e21eba7b59 Yrong README Fixup + M1 Fixes (#1045)
20d08204a2 Confirm delivery detects when more than expected messages are confirmed (#1039)
994b846b52 pre and post dispatch weights of OnDeliveryConfirmed callback (#1040)
1dd5297e84 give real value to Rialto and Millau tokens (#1038)
035bee8715 Use real conversion rate in greedy relayer strategy (#1035)
9cfaecd0f7 fixed metrics prefix (#1037)
1d8d224937 Use kebab-case for bridge arguments (#1036)
f30a4c79a6 Shared reference to conversion rate metric value (#1034)
c34d7a5cbb estimate transaction fee (#1015)
93404b18bb change alert period from 2m to 10m for Westend -> Millau (GRANDPA or public node itself is lagging sometimes) (#1032)

git-subtree-dir: bridges
git-subtree-split: 407bf44a8a5f4e60aceef2dc755cd9ff09929ac3
2021-12-01 09:24:53 +01:00

222 lines
9.1 KiB
Markdown

# Testing Scenarios
In the scenarios, for simplicity, we call the chains Kusama (KSM token) and Polkadot (DOT token),
but they should be applicable to any other chains. The first scenario has detailed description about
the entire process (also see the [sequence diagram](./scenario1.html)). Other scenarios only contain
a simplified interaction focusing on things that are unique for that particular scenario.
Notation:
- kX - user X interacting with Kusama chain.
- `k(kX)` - Kusama account id of user kX (native account id; usable on Kusama)
- `p(kX)` - Polkadot account id of user kX (account id derived from `k(kX)` usable on Polkadot)
- [Kusama] ... - Interaction happens on Kusama (e.g. the user interacts with Kusama chain)
- [Polkadot] ... - Interaction happens on Polkadot
Basic Scenarios
===========================
Scenario 1: Kusama's Alice receiving & spending DOTs
---------------------------
Kusama's Alice (kAlice) receives 5 DOTs from Polkadot's Bob (pBob) and sends half of them to
kCharlie.
1. Generate kAlice's DOT address (`p(kAlice)`).
See function:
```rust
bp_runtime::derive_account_id(b"pdot", kAlice)
```
or:
```rust
let hash = bp_polkadot::derive_kusama_account_id(kAlice);
let p_kAlice = bp_polkadot::AccountIdConverter::convert(hash);
```
2. [Polkadot] pBob transfers 5 DOTs to `p(kAlice)`
1. Creates & Signs a transaction with `Call::Transfer(..)`
1. It is included in block.
1. kAlice observers Polkadot chain to see her balance at `p(kAlice)` updated.
3. [Kusama] kAlice sends 2.5 DOTs to `p(kCharlie)`
1. kAlice prepares:
```rust
let call = polkadot::Call::Balances(polkadot::Balances::Transfer(p(kCharlie), 2.5DOT)).encode();
let weight = call.get_dispatch_info().weight;
```
1. kAlice prepares Kusama transaction:
```rust
kusama::Call::Messages::<Instance=Polkadot>::send_message(
// dot-transfer-lane (truncated to 4bytes)
lane_id,
payload: MessagePayload {
// Get from current polkadot runtime (kind of hardcoded)
spec_version: 1,
// kAlice should know the exact dispatch weight of the call on the target
// source verifies: at least to cover call.length() and below max weight
weight,
// simply bytes, we don't know anything about that on the source chain
call,
// origin that should be used during dispatch on the target chain
origin: CallOrigin::SourceAccount(kAlice),
},
delivery_and_dispatch_fee: {
(single_message_delivery_weight
// source weight = X * target weight
+ convert_target_weight_to_source_weight(weight)
+ confirmation_transaction_weight
)
// This uses an on-chain oracle to convert weights of the target chain to source fee
* weight_to_fee
// additional reward for the relayer (pallet parameter)
+ relayers_fee
},
)
```
1. [Kusama] kAlice sends Kusama transaction with the above `Call` and pays regular fees. The
dispatch additionally reservers target-chain delivery and dispatch fees (including relayer's
reward).
4. [Kusama] kAlice's transaction is included in block `B1`
### Syncing headers loop
5. Relayer sees that `B1` has not yet been delivered to the target chain.
[Sync loop code](https://github.com/paritytech/parity-bridges-common/blob/8b327a94595c4a6fae6d7866e24ecf2390501e32/relays/headers-relay/src/sync_loop.rs#L199).
1. Relayer prepares transaction which delivers `B1` and with all of the missing
ancestors to the target chain (one header per transaction).
1. After the transaction is succesfully dispatched the Polkadot on-chain light client of the Kusama
chain learns about block `B1` - it is stored in the on-chain storage.
### Syncing finality loop
8. Relayer is subscribed to finality events on Kusama. Relayer gets a finality notification for
block `B3`.
1. The header sync informs the target chain about `B1..B3` blocks (see point 6).
1. Relayer learns about missing finalization of `B1..B3` on the target chain, see
[finality maintenance code](https://github.com/paritytech/parity-bridges-common/blob/8b327a94595c4a6fae6d7866e24ecf2390501e32/relays/substrate/src/headers_maintain.rs#L107).
1. Relayer submits justification for `B3` to the target chain (`finalize_header`).
See [#421](https://github.com/paritytech/parity-bridges-common/issues/421) for multiple
authority set changes support in Relayer (i.e. what block the target chain expects, not only
what I have).
Relayer is doing two things:
- syncing on demand (what blocks miss finality)
- and syncing as notifications are received (recently finalized on-chain)
1. Eventually Polkadot on-chain light client of Kusama learns about finality of `B1`.
### Syncing messages loop
13. The relayer checks the on-chain storage (last finalized header on the source, best header on the
target):
- Kusama outbound lane
- Polkadot inbound lane
Lanes contains `latest_generated_nonce` and `latest_received_nonce` respectively. The relayer
syncs messages between that range.
1. The relayer gets a proof for every message in that range (using the RPC of messages module)
1. The relayer creates a message delivery transaction (but it has weight, size, and count limits).
The count limit is there to make the loop of delivery code bounded.
```rust
receive_message_proof(
relayer_id, // account id of the source chain
proof, // messages + proofs (hash of source block `B1`, nonces, lane_id + storage proof)
dispatch_weight // relayer declares how much it will take to dispatch all messages in that transaction,
)
```
The `proof` can also contain an update of outbound lane state of source chain, which indicates
the delivery confirmation of these messages and reward payment, so that the target chain can
truncate its unpayed rewards vector.
The target chain stores `relayer_ids` that delivered messages because the relayer can generate
a storage proof to show that they did indeed deliver those messages. The reward is paid on the
source chain and we inform the target chain about that fact so it can prune these `relayer_ids`.
It's totally fine if there are no messages, and we only include the reward payment proof
when calling that function.
1. 🥳 the message is now delivered and dispatched on the target chain!
1. The relayer now needs to confirm the delivery to claim her payment and reward on the source
chain.
1. The relayer creates a transaction on the source chain with call:
```rust
receive_messages_delivery_proof(
proof, // hash of the finalized target chain block, lane_id, storage proof
)
```
### UI challenges
- The UI should warn before (or prevent) sending to `k(kCharlie)`!
Scenario 2: Kusama's Alice nominating validators with her DOTs
---------------------------
kAlice receives 10 DOTs from pBob and nominates `p(pCharlie)` and `p(pDave)`.
1. Generate kAlice's DOT address (`p(kAlice)`)
2. [Polkadot] pBob transfers 5 DOTs to `p(kAlice)`
3. [Kusama] kAlice sends a batch transaction:
- `staking::Bond` transaction to create stash account choosing `p(kAlice)` as the controller account.
- `staking::Nominate(vec![p(pCharlie)])` to nominate pCharlie using the controller account.
Scenario 3: Kusama Treasury receiving & spending DOTs
---------------------------
pBob sends 15 DOTs to Kusama Treasury which Kusama Governance decides to transfer to kCharlie.
1. Generate source account for the treasury (`kTreasury`).
2. [Polkadot] pBob tarnsfers 15 DOTs to `p(kTreasury)`.
2. [Kusama] Send a governance proposal to send a bridge message which transfers funds to `p(kCharlie)`.
3. [Kusama] Dispatch the governance proposal using `kTreasury` account id.
Extra scenarios
===========================
Scenario 4: Kusama's Alice setting up 1-of-2 multi-sig to spend from either Kusama or Polkadot
---------------------------
Assuming `p(pAlice)` has at least 7 DOTs already.
1. Generate multisig account id: `pMultiSig = multi_account_id(&[p(kAlice), p(pAlice)], 1)`.
2. [Kusama] Transfer 7 DOTs to `pMultiSig` using `TargetAccount` origin of `pAlice`.
3. [Kusama] Transfer 2 DOTs to `p(kAlice)` from the multisig:
- Send `multisig::as_multi_threshold_1(vec![p(pAlice)], balances::Transfer(p(kAlice), 2))`
Scenario 5: Kusama Treasury staking & nominating validators with DOTs
---------------------------
Scenario 6: Kusama Treasury voting in Polkadot's democracy proposal
---------------------------
Potentially interesting scenarios
===========================
Scenario 7: Polkadot's Bob spending his DOTs by using Kusama chain
---------------------------
We can assume he holds KSM. Problem: he can pay fees, but can't really send (sign) a transaction?
Shall we support some kind of dispatcher?
Scenario 8: Kusama Governance taking over Kusama's Alice DOT holdings
---------------------------
We use `SourceRoot` call to transfer her's DOTs to Kusama treasury. Source chain root
should also be able to send messages as `CallOrigin::SourceAccount(Alice)` though.