#recovery #block #candidate #parachain #protocols #relay #po-v

cumulus-client-pov-recovery

Cumulus-specific networking protocol (polkadot v1.10.0)

13 releases (breaking)

new 0.11.0 Apr 9, 2024
0.10.0 Mar 19, 2024
0.9.0 Feb 27, 2024
0.6.0 Dec 13, 2023
0.0.0 Nov 21, 2022

#2368 in Magic Beans

Download history 7/week @ 2023-12-22 101/week @ 2023-12-29 177/week @ 2024-01-05 98/week @ 2024-01-12 158/week @ 2024-01-19 131/week @ 2024-01-26 209/week @ 2024-02-02 368/week @ 2024-02-09 420/week @ 2024-02-16 539/week @ 2024-02-23 169/week @ 2024-03-01 269/week @ 2024-03-08 445/week @ 2024-03-15 457/week @ 2024-03-22 735/week @ 2024-03-29 404/week @ 2024-04-05

2,082 downloads per month
Used in 11 crates (2 directly)

GPL-3.0-or-later…

30KB
559 lines

Parachain PoV recovery

A parachain needs to build PoVs that are send to the relay chain to progress. These PoVs are erasure encoded and one piece of it is stored by each relay chain validator. As the relay chain decides on which PoV per parachain to include and thus, to progress the parachain it can happen that the block corresponding to this PoV isn't propagated in the parachain network. This can have several reasons, either a malicious collator that managed to include its own PoV and doesn't want to share it with the rest of the network or maybe a collator went down before it could distribute the block in the network. When something like this happens we can use the PoV recovery algorithm implemented in this crate to recover a PoV and to propagate it with the rest of the network.

It works in the following way:

  1. For every included relay chain block we note the backed candidate of our parachain. If the block belonging to the PoV is already known, we do nothing. Otherwise we start a timer that waits for a randomized time inside a specified interval before starting to recover the PoV.

  2. If between starting and firing the timer the block is imported, we skip the recovery of the PoV.

  3. If the timer fired we recover the PoV using the relay chain PoV recovery protocol.

4a. After it is recovered, we restore the block and import it.

4b. Since we are trying to recover pending candidates, availability is not guaranteed. If the block PoV is not yet available, we retry.

If we need to recover multiple PoV blocks (which should hopefully not happen in real life), we make sure that the blocks are imported in the correct order.

Dependencies

~74–115MB
~2M SLoC