Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions trie-db/src/trie_codec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -513,10 +513,18 @@ where

// Since `advance_child_index` returned true, the preconditions for `encode_node` are
// satisfied.
let hash = last_entry
.attached_value
.as_ref()
.map(|value| db.insert(prefix.as_prefix(), value));
let hash = last_entry.attached_value.as_ref().map(|value| {
let partial_prefix_len = match &last_entry.node {
Node::Leaf(partial, _) | Node::NibbledBranch(partial, _, _) => {
prefix.append_partial(partial.right());
partial.len()
},
_ => 0,
};
let hash = db.insert(prefix.as_prefix(), value);
prefix.drop_lasts(partial_prefix_len);
hash
});
let node_data = last_entry.encode_node(hash.as_ref().map(|h| h.as_ref()));
let node_hash = db.insert(prefix.as_prefix(), node_data.as_ref());

Expand Down
23 changes: 18 additions & 5 deletions trie-db/test/src/trie_codec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

use hash_db::{HashDB, Hasher, EMPTY_PREFIX};
use hash_db::{HashDB, HashDBRef, Hasher, EMPTY_PREFIX};
use reference_trie::{test_layouts, ExtensionLayout};
use trie_db::{
decode_compact, encode_compact, DBValue, NodeCodec, Recorder, Trie, TrieDBBuilder,
Expand All @@ -25,6 +25,12 @@ type MemoryDB<T> = memory_db::MemoryDB<
DBValue,
>;

type PrefixedMemoryDB<T> = memory_db::MemoryDB<
<T as TrieLayout>::Hash,
memory_db::PrefixedKey<<T as TrieLayout>::Hash>,
DBValue,
>;

fn test_encode_compact<L: TrieLayout>(
entries: Vec<(&'static [u8], &'static [u8])>,
keys: Vec<&'static [u8]>,
Expand Down Expand Up @@ -70,21 +76,21 @@ fn test_encode_compact<L: TrieLayout>(
}

fn test_decode_compact<L: TrieLayout>(
mut db: impl HashDB<L::Hash, DBValue> + HashDBRef<L::Hash, DBValue>,
encoded: &[Vec<u8>],
items: Vec<(&'static [u8], Option<DBValue>)>,
items: &[(&'static [u8], Option<DBValue>)],
expected_root: <L::Hash as Hasher>::Out,
expected_used: usize,
) {
// Reconstruct the partial DB from the compact encoding.
let mut db = MemoryDB::<L>::default();
let (root, used) = decode_compact::<L, _>(&mut db, encoded).unwrap();
assert_eq!(root, expected_root);
assert_eq!(used, expected_used);

// Check that lookups for all items succeed.
let trie = <TrieDBBuilder<L>>::new(&db, &root).build();
for (key, expected_value) in items {
assert_eq!(trie.get(key).unwrap(), expected_value);
assert_eq!(&trie.get(key).unwrap(), expected_value);
}
}

Expand Down Expand Up @@ -115,7 +121,14 @@ fn trie_compact_encoding_works_internal<T: TrieLayout>() {
);

encoded.push(Vec::new()); // Add an extra item to ensure it is not read.
test_decode_compact::<T>(&encoded, items, root, encoded.len() - 1);
test_decode_compact::<T>(MemoryDB::<T>::default(), &encoded, &items, root, encoded.len() - 1);
test_decode_compact::<T>(
PrefixedMemoryDB::<T>::default(),
&encoded,
&items,
root,
encoded.len() - 1,
);
}

test_layouts!(
Expand Down