mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 21:01:05 +00:00
state-machine: Move all functionality from trie backend to the essence (#10904)
* state-machine: Move all functionality from trie backend to the essence This is required for some future changes of me and it also makes more sense to have all the functionality inside the essence. Besides that it changes the child root cache to directly cache the hash. * Update primitives/state-machine/src/trie_backend_essence.rs Co-authored-by: cheme <emericchevalier.pro@gmail.com> * FMT Co-authored-by: cheme <emericchevalier.pro@gmail.com>
This commit is contained in:
@@ -18,19 +18,13 @@
|
||||
//! Trie-based state machine backend.
|
||||
|
||||
use crate::{
|
||||
debug,
|
||||
trie_backend_essence::{Ephemeral, TrieBackendEssence, TrieBackendStorage},
|
||||
warn, Backend, StorageKey, StorageValue,
|
||||
trie_backend_essence::{TrieBackendEssence, TrieBackendStorage},
|
||||
Backend, StorageKey, StorageValue,
|
||||
};
|
||||
use codec::{Codec, Decode};
|
||||
use codec::Codec;
|
||||
use hash_db::Hasher;
|
||||
use sp_core::storage::{ChildInfo, ChildType, StateVersion};
|
||||
use sp_std::{boxed::Box, vec::Vec};
|
||||
use sp_trie::{
|
||||
child_delta_trie_root, delta_trie_root, empty_child_trie_root,
|
||||
trie_types::{TrieDB, TrieError},
|
||||
LayoutV0, LayoutV1, Trie,
|
||||
};
|
||||
use sp_core::storage::{ChildInfo, StateVersion};
|
||||
use sp_std::vec::Vec;
|
||||
|
||||
/// Patricia trie-based backend. Transaction type is an overlay of changes to commit.
|
||||
pub struct TrieBackend<S: TrieBackendStorage<H>, H: Hasher> {
|
||||
@@ -144,43 +138,11 @@ where
|
||||
}
|
||||
|
||||
fn pairs(&self) -> Vec<(StorageKey, StorageValue)> {
|
||||
let collect_all = || -> Result<_, Box<TrieError<H::Out>>> {
|
||||
let trie = TrieDB::<H>::new(self.essence(), self.essence.root())?;
|
||||
let mut v = Vec::new();
|
||||
for x in trie.iter()? {
|
||||
let (key, value) = x?;
|
||||
v.push((key.to_vec(), value.to_vec()));
|
||||
}
|
||||
|
||||
Ok(v)
|
||||
};
|
||||
|
||||
match collect_all() {
|
||||
Ok(v) => v,
|
||||
Err(e) => {
|
||||
debug!(target: "trie", "Error extracting trie values: {}", e);
|
||||
Vec::new()
|
||||
},
|
||||
}
|
||||
self.essence.pairs()
|
||||
}
|
||||
|
||||
fn keys(&self, prefix: &[u8]) -> Vec<StorageKey> {
|
||||
let collect_all = || -> Result<_, Box<TrieError<H::Out>>> {
|
||||
let trie = TrieDB::<H>::new(self.essence(), self.essence.root())?;
|
||||
let mut v = Vec::new();
|
||||
for x in trie.iter()? {
|
||||
let (key, _) = x?;
|
||||
if key.starts_with(prefix) {
|
||||
v.push(key.to_vec());
|
||||
}
|
||||
}
|
||||
|
||||
Ok(v)
|
||||
};
|
||||
|
||||
collect_all()
|
||||
.map_err(|e| debug!(target: "trie", "Error extracting trie keys: {}", e))
|
||||
.unwrap_or_default()
|
||||
self.essence.keys(prefix)
|
||||
}
|
||||
|
||||
fn storage_root<'a>(
|
||||
@@ -191,25 +153,7 @@ where
|
||||
where
|
||||
H::Out: Ord,
|
||||
{
|
||||
let mut write_overlay = S::Overlay::default();
|
||||
let mut root = *self.essence.root();
|
||||
|
||||
{
|
||||
let mut eph = Ephemeral::new(self.essence.backend_storage(), &mut write_overlay);
|
||||
let res = match state_version {
|
||||
StateVersion::V0 =>
|
||||
delta_trie_root::<LayoutV0<H>, _, _, _, _, _>(&mut eph, root, delta),
|
||||
StateVersion::V1 =>
|
||||
delta_trie_root::<LayoutV1<H>, _, _, _, _, _>(&mut eph, root, delta),
|
||||
};
|
||||
|
||||
match res {
|
||||
Ok(ret) => root = ret,
|
||||
Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e),
|
||||
}
|
||||
}
|
||||
|
||||
(root, write_overlay)
|
||||
self.essence.storage_root(delta, state_version)
|
||||
}
|
||||
|
||||
fn child_storage_root<'a>(
|
||||
@@ -221,45 +165,7 @@ where
|
||||
where
|
||||
H::Out: Ord,
|
||||
{
|
||||
let default_root = match child_info.child_type() {
|
||||
ChildType::ParentKeyId => empty_child_trie_root::<LayoutV1<H>>(),
|
||||
};
|
||||
let mut write_overlay = S::Overlay::default();
|
||||
let prefixed_storage_key = child_info.prefixed_storage_key();
|
||||
let mut root = match self.storage(prefixed_storage_key.as_slice()) {
|
||||
Ok(value) => value
|
||||
.and_then(|r| Decode::decode(&mut &r[..]).ok())
|
||||
.unwrap_or_else(|| default_root.clone()),
|
||||
Err(e) => {
|
||||
warn!(target: "trie", "Failed to read child storage root: {}", e);
|
||||
default_root.clone()
|
||||
},
|
||||
};
|
||||
|
||||
{
|
||||
let mut eph = Ephemeral::new(self.essence.backend_storage(), &mut write_overlay);
|
||||
match match state_version {
|
||||
StateVersion::V0 => child_delta_trie_root::<LayoutV0<H>, _, _, _, _, _, _>(
|
||||
child_info.keyspace(),
|
||||
&mut eph,
|
||||
root,
|
||||
delta,
|
||||
),
|
||||
StateVersion::V1 => child_delta_trie_root::<LayoutV1<H>, _, _, _, _, _, _>(
|
||||
child_info.keyspace(),
|
||||
&mut eph,
|
||||
root,
|
||||
delta,
|
||||
),
|
||||
} {
|
||||
Ok(ret) => root = ret,
|
||||
Err(e) => warn!(target: "trie", "Failed to write to trie: {}", e),
|
||||
}
|
||||
}
|
||||
|
||||
let is_default = root == default_root;
|
||||
|
||||
(root, is_default, write_overlay)
|
||||
self.essence.child_storage_root(child_info, delta, state_version)
|
||||
}
|
||||
|
||||
fn as_trie_backend(&self) -> Option<&TrieBackend<Self::TrieBackendStorage, H>> {
|
||||
|
||||
Reference in New Issue
Block a user