From fd5b42cbeb3d16db50164c9443be5048d5488b1b Mon Sep 17 00:00:00 2001 From: Shreyan Gupta Date: Thu, 14 Nov 2024 16:07:36 +0530 Subject: [PATCH 1/4] ReshardingV3 memtrie --- neps/assets/nep-0568/NEP-SplitState.png | Bin 0 -> 81729 bytes neps/nep-0568.md | 44 ++++++++++++++++++++---- 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 neps/assets/nep-0568/NEP-SplitState.png diff --git a/neps/assets/nep-0568/NEP-SplitState.png b/neps/assets/nep-0568/NEP-SplitState.png new file mode 100644 index 0000000000000000000000000000000000000000..a160a5949b648e3dd00eeecc3d9f834f0b23f068 GIT binary patch literal 81729 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 literal 0 HcmV?d00001 diff --git a/neps/nep-0568.md b/neps/nep-0568.md index 98615acf0..ebe02d9eb 100644 --- a/neps/nep-0568.md +++ b/neps/nep-0568.md @@ -63,14 +63,45 @@ post-processing, as long as the chain's view reflects a fully resharded state. stateless validation mechanisms. * State Sync: Nodes must be able to sync the states of the child shards post-resharding. -* Cross-Shard Traffic: Receipts sent to the parent shard may need to be - reassigned to one of the child shards. +* Cross-Shard Traffic: Receipts and buffered receipts sent to the parent shard may + need to be reassigned to one of the child shards. * Receipt Handling: Delayed, postponed, buffered, and promise-yield receipts must be correctly distributed between the child shards. * ShardId Semantics: The shard identifiers will become abstract identifiers where today they are number in the 0..num_shards range. +* Congestion Info: CongestionInfo in the chunk header would be recalculated for the child + shards at the resharding boundary. Proof must be compatible with Stateless Validation. -### State Storage - Mem Trie +### State Storage - MemTrie + +MemTrie is the in-memory representation of the trie that the runtime uses for all trie accesses. This is kept in sync with the Trie representation in state. + +For the purposes of resharding, we need an efficient way to split the MemTrie into two child tries based on the boundary account. This splitting happens at the epoch boundary when the new epoch is expected to have the two child shards. The set of requirements around MemTrie splitting are: +* MemTrie splitting needs to be "instant", i.e. happen efficiently within the span of one block. The child tries need to be available for the processing of the next block in the new epoch. +* MemTrie splitting needs to be compatible with stateless validation, i.e. we need to generate a proof that the memtrie split proposed by the chunk producer is correct. +* The proof generated for splitting the MemTrie needs to be compatible with the limits of the size of state witness that we send to all chunk validators. This prevents us from doing things like iterating through all trie keys for delayed receipts etc. + +With ReshardingV3 design, there's no protocol change to the structure of MemTries, however the implementation constraints required us to introduce the concept of a Frozen MemTrie. More details are in the [implementation](#state-storage---memtrie-1) section below. + +Based on the requirements above, we came up with an algorithm to efficiently split the parent trie into two child tries. Trie entries can be divided into three categories based on whether the trie keys have an account_id prefix and based on the total number of such trie keys. Splitting of these keys are handled in different ways. + +#### TrieKey with AccountID prefix + +This category includes most of the trie keys like `TrieKey::Account`, `TrieKey::ContractCode`, `TrieKey::PostponedReceipt`. For these keys, we can efficiently split the trie based on the boundary account trie key. In the example below, "pass" was the split key, note that we only need to read all the intermediate nodes that form a part of the split key and nothing more. The accessed nodes form a part of the state witness. This limits the size of the witness to effectively O(depth) of trie. + +![Splitting Trie diagram](assets/nep-0568/NEP-SplitState.png) + +#### Singleton TrieKey + +This category includes the trie keys `TrieKey::DelayedReceiptIndices`, `TrieKey::PromiseYieldIndices`, `TrieKey::BufferedReceiptIndices`. Notably, these are just a single entry (or O(num_shard) entries) in the trie and hence are small enough to read and modify for the children tries efficiently. + +#### Indexed TrieKey + +This category includes the trie keys `TrieKey::DelayedReceipt`, `TrieKey::PromiseYieldTimeout` and `TrieKey::BufferedReceipt`. The number of entries for these keys can potentially be arbitrarily large and it's not feasible to iterate through all the entries. In pre-stateless validation world, where we didn't care about state witness size limits, for ReshardingV2 we could just iterate over all delayed receipts and split them into the respective child shards. + +For ReshardingV3, these are handled by either of the two strategies +- `TrieKey::DelayedReceipt` and `TrieKey::PromiseYieldTimeout` are handled by duplicating entries across both child shards as each entry could belong to either of the child shards. More details in the [Delayed Receipts](#delayed-receipt-handling) and [Promise Yield](#promiseyield-receipt-handling) sections below. +- `TrieKey::BufferedReceipt` are independent of the account_id and therefore can be sent to either of the child shards, but not both. We copy the buffered receipts and the associated metadata to the child shard with the lower index. More details in the [Buffered Receipts](#buffered-receipt-handling) section below. ### State Storage - Flat State @@ -137,9 +168,9 @@ supporting smooth transitions without altering storage structures directly. ### Cross Shard Traffic -### Receipt Handling - Delayed, Postponed, PromiseYield - -### Receipt Handling - Buffered +### Delayed Receipt Handling +### PromiseYield Receipt Handling +### Buffered Receipt Handling ### ShardId Semantics @@ -160,6 +191,7 @@ In this NEP, we propose updating the ShardId semantics to allow for arbitrary id The section should return to the examples given in the previous section, and explain more fully how the detailed proposal makes those examples work.] ``` +### State Storage - MemTrie ### State Storage - State mapping From f945e6531735c3ae7320ae6f9d8cc521e997b263 Mon Sep 17 00:00:00 2001 From: Shreyan Gupta Date: Thu, 14 Nov 2024 18:15:33 +0530 Subject: [PATCH 2/4] reference impl --- neps/assets/nep-0568/NEP-HybridMemTrie.png | Bin 0 -> 20318 bytes neps/nep-0568.md | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 neps/assets/nep-0568/NEP-HybridMemTrie.png diff --git a/neps/assets/nep-0568/NEP-HybridMemTrie.png b/neps/assets/nep-0568/NEP-HybridMemTrie.png new file mode 100644 index 0000000000000000000000000000000000000000..c18836f816ae862a39277a0e8ad8914022a5734b GIT binary patch literal 20318 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

XIMx1&~l|YP3h$ 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 literal 0 HcmV?d00001 diff --git a/neps/nep-0568.md b/neps/nep-0568.md index ebe02d9eb..9018649dd 100644 --- a/neps/nep-0568.md +++ b/neps/nep-0568.md @@ -193,6 +193,24 @@ The section should return to the examples given in the previous section, and exp ``` ### State Storage - MemTrie +The current implementation of MemTrie uses a pool of memory (`STArena`) to allocate and deallocate nodes and internal pointers in this pool to reference child nodes. MemTries, unlike the State representation of Trie, do not work with the hash of the nodes but internal memory pointers directly. Additionally, MemTries are not thread safe and one MemTrie exists per shard. + +As described in [MemTrie](#state-storage---memtrie) section above, we need an efficient way to split the MemTrie into two child MemTries within a span of 1 block. What makes this challenging is that the current implementation of MemTrie is not thread safe and can not be shared across two shards. + +The naive way to create two MemTries for the child shards would be to iterate through all the entries of the parent MemTrie and fill in these values into the child MemTries. This however is prohibitively time consuming. + +The solution to this problem was to introduce the concept of Frozen MemTrie (with a `FrozenArena`) which is a cloneable, read-only, thread-safe snapshot of a MemTrie. We can call the `freeze` method on an existing MemTrie that converts it into a Frozen MemTrie. Note that this process consumes the original MemTrie and we can no longer allocate and deallocate nodes to it. + +Along with `FrozenArena`, we also introduce a `HybridArena` which is effectively a base made of `FrozenArena` with a top layer of `STArena` where we support allocating and deallocating new nodes into the MemTrie. Newly allocated nodes can reference/point to nodes in the `FrozenArena`. We use this Hybrid MemTrie as a temporary MemTrie while the flat storage is being constructed in the background. + +During a resharding event, at the boundary of the epoch, when we need to split the parent shard into the two child shards, we do the following steps: +1. Freeze the parent MemTrie arena to create a read-only frozen arena that represents a snapshot of the state as of the time of freezing, i.e. after postprocessing last block of epoch. Note that we no longer require the parent MemTrie in runtime going forward. +2. We cheaply clone the Frozen MemTrie for both the child MemTries to use. Note that this doesn't clone the parent arena memory, but just increases the refcount. +3. We then create a new MemTrie with HybridArena for each of the children. The base of the MemTrie is the read-only FrozenArena while all new node allocations happens on a dedicated STArena memory pool for each child MemTrie. This is the temporary MemTrie that we use while Flat Storage is being built in the background. +4. Once the Flat Storage is constructed in the post processing step of resharding, we use that to load a new MemTrie and discard the Hybrid MemTrie. + +![Hybrid MemTrie diagram](assets/nep-0568/NEP-HybridMemTrie.png) + ### State Storage - State mapping To enable efficient shard state management during resharding, Resharding V3 uses the `DBCol::ShardUIdMapping` column. From 8e9155e4798ce094d5cd098a20dd8c260536019b Mon Sep 17 00:00:00 2001 From: Shreyan Gupta Date: Thu, 14 Nov 2024 18:20:04 +0530 Subject: [PATCH 3/4] white background for image --- neps/assets/nep-0568/NEP-HybridMemTrie.png | Bin 20318 -> 20185 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/neps/assets/nep-0568/NEP-HybridMemTrie.png b/neps/assets/nep-0568/NEP-HybridMemTrie.png index c18836f816ae862a39277a0e8ad8914022a5734b..013c761f8a6722a96c6a34686d9c73f017e3c6f2 100644 GIT binary patch literal 20185 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 PvQFm$DafDamr(pKQO?#D literal 20318 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

XIMx1&~l|YP3h$ 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 From 2a5b628ae010cdc168fa0a033708cfb9bd96dd2f Mon Sep 17 00:00:00 2001 From: Shreyan Gupta Date: Thu, 14 Nov 2024 20:24:06 +0530 Subject: [PATCH 4/4] Resolve comments --- neps/nep-0568.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/neps/nep-0568.md b/neps/nep-0568.md index 9018649dd..9f536e9bc 100644 --- a/neps/nep-0568.md +++ b/neps/nep-0568.md @@ -63,8 +63,8 @@ post-processing, as long as the chain's view reflects a fully resharded state. stateless validation mechanisms. * State Sync: Nodes must be able to sync the states of the child shards post-resharding. -* Cross-Shard Traffic: Receipts and buffered receipts sent to the parent shard may - need to be reassigned to one of the child shards. +* Cross-Shard Traffic: Receipts sent to the parent shard may need to be + reassigned to one of the child shards. * Receipt Handling: Delayed, postponed, buffered, and promise-yield receipts must be correctly distributed between the child shards. * ShardId Semantics: The shard identifiers will become abstract identifiers @@ -76,6 +76,8 @@ post-processing, as long as the chain's view reflects a fully resharded state. MemTrie is the in-memory representation of the trie that the runtime uses for all trie accesses. This is kept in sync with the Trie representation in state. +As of today it isn't mandatory for nodes to have MemTrie feature enabled but going forward, with ReshardingV3, all nodes would require to have MemTrie enabled for resharding to happen successfully. + For the purposes of resharding, we need an efficient way to split the MemTrie into two child tries based on the boundary account. This splitting happens at the epoch boundary when the new epoch is expected to have the two child shards. The set of requirements around MemTrie splitting are: * MemTrie splitting needs to be "instant", i.e. happen efficiently within the span of one block. The child tries need to be available for the processing of the next block in the new epoch. * MemTrie splitting needs to be compatible with stateless validation, i.e. we need to generate a proof that the memtrie split proposed by the chunk producer is correct. @@ -83,11 +85,11 @@ For the purposes of resharding, we need an efficient way to split the MemTrie in With ReshardingV3 design, there's no protocol change to the structure of MemTries, however the implementation constraints required us to introduce the concept of a Frozen MemTrie. More details are in the [implementation](#state-storage---memtrie-1) section below. -Based on the requirements above, we came up with an algorithm to efficiently split the parent trie into two child tries. Trie entries can be divided into three categories based on whether the trie keys have an account_id prefix and based on the total number of such trie keys. Splitting of these keys are handled in different ways. +Based on the requirements above, we came up with an algorithm to efficiently split the parent trie into two child tries. Trie entries can be divided into three categories based on whether the trie keys have an `account_id` prefix and based on the total number of such trie keys. Splitting of these keys is handled in different ways. #### TrieKey with AccountID prefix -This category includes most of the trie keys like `TrieKey::Account`, `TrieKey::ContractCode`, `TrieKey::PostponedReceipt`. For these keys, we can efficiently split the trie based on the boundary account trie key. In the example below, "pass" was the split key, note that we only need to read all the intermediate nodes that form a part of the split key and nothing more. The accessed nodes form a part of the state witness. This limits the size of the witness to effectively O(depth) of trie. +This category includes most of the trie keys like `TrieKey::Account`, `TrieKey::ContractCode`, `TrieKey::PostponedReceipt`, etc. For these keys, we can efficiently split the trie based on the boundary account trie key. Note that we only need to read all the intermediate nodes that form a part of the split key. In the example below, if "pass" is the split key, we access all the nodes along the path of `root` -> `p` -> `a` -> `s` -> `s`, while not needing to touch any of the other intermediate nodes like `o` -> `s` -> `t` in key "post". The accessed nodes form a part of the state witness as those are the only nodes that the validators would need to verify that the resharding split is correct. This limits the size of the witness to effectively O(depth) of trie for each trie key in this category. ![Splitting Trie diagram](assets/nep-0568/NEP-SplitState.png) @@ -203,11 +205,16 @@ The solution to this problem was to introduce the concept of Frozen MemTrie (wit Along with `FrozenArena`, we also introduce a `HybridArena` which is effectively a base made of `FrozenArena` with a top layer of `STArena` where we support allocating and deallocating new nodes into the MemTrie. Newly allocated nodes can reference/point to nodes in the `FrozenArena`. We use this Hybrid MemTrie as a temporary MemTrie while the flat storage is being constructed in the background. +While Frozen MemTries provide the benefits of being compatible with instant resharding, they come at the cost of memory consumption. Once a MemTrie is frozen, since it doesn't support deallocation of memory, it continues to consume as much memory as it did at the time of freezing. In case a node is tracking only one of the child shards, a Frozen MemTrie would continue to use the same amount of memory as the parent trie. Due to this, Hybrid MemTries are only a temporary solution and we rebuild the MemTrie for the children once the post-processing step for Flat Storage is completed. + +Additionally, a node would have to support 2x the memory footprint of a single trie as after resharding, we would have two copies of the trie in memory, one from the temporary Hybrid MemTrie in use for block production, and other from the background MemTrie that would be under construction. Once the background MemTrie is fully constructed and caught up with the latest block, we do an in-place swap of the Hybrid MemTrie with the new child MemTrie and deallocate the memory from the Hybrid MemTrie. + During a resharding event, at the boundary of the epoch, when we need to split the parent shard into the two child shards, we do the following steps: 1. Freeze the parent MemTrie arena to create a read-only frozen arena that represents a snapshot of the state as of the time of freezing, i.e. after postprocessing last block of epoch. Note that we no longer require the parent MemTrie in runtime going forward. 2. We cheaply clone the Frozen MemTrie for both the child MemTries to use. Note that this doesn't clone the parent arena memory, but just increases the refcount. 3. We then create a new MemTrie with HybridArena for each of the children. The base of the MemTrie is the read-only FrozenArena while all new node allocations happens on a dedicated STArena memory pool for each child MemTrie. This is the temporary MemTrie that we use while Flat Storage is being built in the background. -4. Once the Flat Storage is constructed in the post processing step of resharding, we use that to load a new MemTrie and discard the Hybrid MemTrie. +4. Once the Flat Storage is constructed in the post processing step of resharding, we use that to load a new MemTrie and catchup to the latest block. +5. After the new child MemTrie has caught up to the latest block, we do an in-place swap in Client and discard the Hybrid MemTrie. ![Hybrid MemTrie diagram](assets/nep-0568/NEP-HybridMemTrie.png)