diff --git a/trie-db/src/trie_codec.rs b/trie-db/src/trie_codec.rs index 22faf448..da7af4ed 100644 --- a/trie-db/src/trie_codec.rs +++ b/trie-db/src/trie_codec.rs @@ -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()); diff --git a/trie-db/test/src/trie_codec.rs b/trie-db/test/src/trie_codec.rs index 17b52cb5..cd77032e 100644 --- a/trie-db/test/src/trie_codec.rs +++ b/trie-db/test/src/trie_codec.rs @@ -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, @@ -25,6 +25,12 @@ type MemoryDB = memory_db::MemoryDB< DBValue, >; +type PrefixedMemoryDB = memory_db::MemoryDB< + ::Hash, + memory_db::PrefixedKey<::Hash>, + DBValue, +>; + fn test_encode_compact( entries: Vec<(&'static [u8], &'static [u8])>, keys: Vec<&'static [u8]>, @@ -70,13 +76,13 @@ fn test_encode_compact( } fn test_decode_compact( + mut db: impl HashDB + HashDBRef, encoded: &[Vec], - items: Vec<(&'static [u8], Option)>, + items: &[(&'static [u8], Option)], expected_root: ::Out, expected_used: usize, ) { // Reconstruct the partial DB from the compact encoding. - let mut db = MemoryDB::::default(); let (root, used) = decode_compact::(&mut db, encoded).unwrap(); assert_eq!(root, expected_root); assert_eq!(used, expected_used); @@ -84,7 +90,7 @@ fn test_decode_compact( // Check that lookups for all items succeed. let trie = >::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); } } @@ -115,7 +121,14 @@ fn trie_compact_encoding_works_internal() { ); encoded.push(Vec::new()); // Add an extra item to ensure it is not read. - test_decode_compact::(&encoded, items, root, encoded.len() - 1); + test_decode_compact::(MemoryDB::::default(), &encoded, &items, root, encoded.len() - 1); + test_decode_compact::( + PrefixedMemoryDB::::default(), + &encoded, + &items, + root, + encoded.len() - 1, + ); } test_layouts!(