Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Batch update. #110

Open
wants to merge 126 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
730ed90
next
cheme Nov 21, 2019
1275cd1
Merge branch 'master' into updatable_traverse
cheme Nov 22, 2019
76fc45f
Draft iterator, some very bad looking stuff.
cheme Nov 22, 2019
75f1c4d
update fuzzer deps
cheme Nov 24, 2019
d71a166
broken
cheme Nov 26, 2019
d7cca49
glue types
cheme Nov 28, 2019
f1c97e0
quick test to start implementing.
cheme Nov 28, 2019
5334f2f
code start to get rather awful.
cheme Nov 29, 2019
a1d1fee
fix initial testing
cheme Nov 29, 2019
1161351
Merge branch 'master' into updatable_traverse
cheme Dec 3, 2019
08b629f
make value change passing on direct value.
cheme Dec 3, 2019
81fe6f0
Add removal to transaction, some very disturbing triedbmut comparison.
cheme Dec 4, 2019
b29fd40
fix some niblle vec, by double indexing. Double indexing is convenient
cheme Dec 4, 2019
4f22667
fix index for next child
cheme Dec 4, 2019
d155f4b
naive bench (need to check first in a test both root matches!!)
cheme Dec 4, 2019
51fd864
switch partial function to thickness
cheme Dec 6, 2019
41351f6
in progress (broken)
cheme Dec 6, 2019
9520c59
this needs rewrite
cheme Dec 9, 2019
b415bf4
refact loop, index are broken
cheme Dec 9, 2019
86e974e
Fix set value case
cheme Dec 9, 2019
d96a483
set_handle need to handle case where we add a new branch in the middle
cheme Dec 9, 2019
eab458b
fix dummy3
cheme Dec 10, 2019
5ea323d
add common condition where needed (avoid descending in trie when bad).
cheme Dec 10, 2019
bf5280b
checkpoint
cheme Dec 10, 2019
a1d049c
dirty limit common (should be refact by an explicit set mid variable).
cheme Dec 10, 2019
3242b45
need fusion on delete with branch one child no value.
cheme Dec 10, 2019
15a030d
checkpoint, before moving branch transform out of set_handle function…
cheme Dec 11, 2019
4cbb403
transform branch
cheme Dec 11, 2019
f946552
fix fuse for branch case.
cheme Dec 11, 2019
7769ae1
feed a latest value for chained fusion
cheme Dec 12, 2019
db250ee
fix prefix check
cheme Dec 12, 2019
18b21f4
checkpoint
cheme Dec 12, 2019
bd4bcd6
split_child need to be a vecdeque
cheme Dec 12, 2019
b5773c2
actually a stack.
cheme Dec 12, 2019
cce1c56
looks like it finally fuzz correctly.
cheme Dec 12, 2019
9368c28
checkpoint on failing prefix(need to be stored with branch partial on…
cheme Dec 13, 2019
4690664
recursive align node requires to rebuild prefix.
cheme Dec 13, 2019
7d30e93
test missing fuzz on bigger contents.
cheme Dec 13, 2019
e60f218
yet another prefix fix
cheme Dec 13, 2019
5b1b2c6
latest change value is a bad approach, running a heavy cost variant, but
cheme Dec 13, 2019
444b1bd
fix prefix again
cheme Dec 13, 2019
d71fd2e
fix delete when rec
cheme Dec 13, 2019
b91ef04
missing no_std imports
cheme Dec 13, 2019
e926664
small bench change
cheme Dec 13, 2019
e638185
Merge branch 'master' into updatable_traverse
cheme Jan 3, 2020
074e18a
non mut backend db
cheme Jan 6, 2020
bf84a80
correct rem mut from db
cheme Jan 6, 2020
d0ccce1
Use hashdbref.
cheme Jan 6, 2020
b5e5bd2
start refacto logic to stackednode for readability
cheme Jan 8, 2020
146fbc9
fuse with stacked item methods
cheme Jan 9, 2020
aff0876
fix compile
cheme Jan 9, 2020
90874a5
seemlessly implemented path up.
cheme Jan 11, 2020
cc149bc
traverse2 algo ok (there is some issue to debug but generally fine
cheme Jan 13, 2020
9ca5c56
Remove unused state.
cheme Jan 14, 2020
05dd2dc
Merge branch 'master' into updatable_traverse
cheme Jan 14, 2020
404164d
empty trie case.
cheme Jan 15, 2020
61faf97
insert null at non empty
cheme Jan 15, 2020
18eec15
next failing test
cheme Jan 16, 2020
e91bec1
Merge branch 'master' into updatable_traverse
cheme Jan 17, 2020
3d61d3b
fix dummy1
cheme Jan 17, 2020
ee2225c
change process child to always include previous nodes
cheme Jan 17, 2020
126d64d
missing stack, fix dummy 2.
cheme Jan 17, 2020
380031b
fuse not happening in dummy 3.
cheme Jan 17, 2020
50a8c5a
fix node apply on root too.
cheme Jan 21, 2020
4713cfe
fix dummy 4 (by processing children)
cheme Jan 21, 2020
2600b55
at commit 5
cheme Jan 21, 2020
236538a
error for dummy5 when insterting into the partial of a deleted node.
cheme Jan 21, 2020
0ed0a8e
tiny fix, previous commit where bad, fundamental issue is not going down
cheme Jan 22, 2020
ed4a50d
issue with fuse, we do not go up the deleted node
cheme Jan 22, 2020
cf26a67
need refactor
cheme Jan 22, 2020
bff4d4c
passing test by disgusting code duplication on fix nodes.
cheme Jan 22, 2020
d34d566
no reg test
cheme Jan 22, 2020
7d94317
Merge branch 'master' into updatable_traverse
cheme Jan 22, 2020
abe43c7
fix fuse node, code needs refactoring
cheme Jan 22, 2020
fae39d6
process after fix when in middle node.
cheme Jan 22, 2020
b1072ae
up is also when not entering loop.
cheme Jan 22, 2020
04a9009
we can fuse a fuse branch.
cheme Jan 22, 2020
54fe97a
Merge branch 'master' into updatable_traverse
cheme Apr 28, 2020
16ff5b4
remove first key storage
cheme Apr 29, 2020
d36aa6c
simplify split child, new field for compat most likely useless
cheme Apr 29, 2020
d81ef37
indeed, removed is_in_slpit_child
cheme Apr 29, 2020
96c42bd
rename
cheme Apr 29, 2020
14a3592
remove struct redundancy and some renaming.
cheme Apr 29, 2020
0ab56d4
small cleanup
cheme Apr 29, 2020
3cc8f60
stack to smallvec
cheme Apr 29, 2020
bb2e816
small value
cheme Apr 29, 2020
d0e4bc4
adding owned prefix for deletion
cheme Apr 29, 2020
011f179
spotted some error
cheme Apr 29, 2020
598a604
still a db prefix error, but things starts to make more sense.
cheme Apr 29, 2020
16157c2
fix remaining tests
cheme Apr 30, 2020
7522073
Add db compare to fuzzer
cheme Apr 30, 2020
cc5c02a
make batch update struct suitable for migration case.
cheme Apr 30, 2020
5fa5f00
switch from option to enum
cheme Apr 30, 2020
cbc4685
remove unreachable branch
cheme Apr 30, 2020
262e197
produced node order test, there is some mismatch, probably need some
cheme Apr 30, 2020
626da62
conclusion that ordering of delete will need additional buffer, and that
cheme May 1, 2020
57e231e
change interface
cheme May 1, 2020
a95ad2a
initial implementation, will need fuzzing and tests.
cheme May 1, 2020
93f118e
added some test, next is fixing this
cheme May 2, 2020
3698e2e
attached special case
cheme May 3, 2020
d652a1c
fix detach middle condition, all detach/attach code was using mid_ind…
cheme May 3, 2020
f0179c2
fix tests
cheme May 4, 2020
934b57b
init a fuzzer, next we need to handle detached to remove prefix (then we
cheme May 4, 2020
61abb5a
fuzz error ignored on attach, will be explicit with db unprefixing
cheme May 4, 2020
97ffa92
detach prefixed key on query prefix (so all dettached trie is at this
cheme May 7, 2020
cbdcb7f
unefficient implementation of dettached trie unprefixing
cheme May 7, 2020
202c9fe
actually wrong todo
cheme May 7, 2020
1d18c9b
check on change for partial set.
cheme May 11, 2020
d588543
no need to put root, it is use from prev_hash
cheme May 11, 2020
4677da8
facto child slice build
cheme May 11, 2020
fd8ed50
type aliases
cheme May 11, 2020
8e89d25
minor changes
cheme May 11, 2020
12e4273
dropping some todos
cheme May 11, 2020
06f4295
move fetch
cheme May 11, 2020
a09f42a
move fuse branch to item operation
cheme May 11, 2020
25a4e01
move fuse branch to item operation
cheme May 11, 2020
1b7c315
move fuse branch to item operation
cheme May 11, 2020
fd29a06
move fuse branch to item operation
cheme May 11, 2020
e89f031
move fuse branch to item operation
cheme May 11, 2020
30722d0
split payload for attach content to be able to preserve ordering
cheme May 11, 2020
190f8e1
removing special condition
cheme May 11, 2020
5431bfe
skip a iter
cheme May 11, 2020
0bd5c2a
refact condition
cheme May 11, 2020
379bf92
renaming
cheme May 11, 2020
f8e79bd
Merge branch 'master' into updatable_traverse
cheme Apr 29, 2021
d9ea007
few doc
cheme Apr 29, 2021
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
12 changes: 9 additions & 3 deletions memory-db/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ use core::{
mem,
marker::PhantomData,
cmp::Eq,
cmp,
borrow::Borrow,
};

Expand Down Expand Up @@ -157,8 +158,13 @@ impl<H, KF, T, M> PartialEq<MemoryDB<H, KF, T, M>> for MemoryDB<H, KF, T, M>
M: MemTracker<T> + PartialEq,
{
fn eq(&self, other: &MemoryDB<H, KF, T, M>) -> bool {
for a in self.data.iter() {
match other.data.get(&a.0) {
let (s, other) = if self.data.len() > other.data.len() {
(&self.data, &other.data)
} else {
(&other.data, &self.data)
};
for a in s.iter() {
match other.get(&a.0) {
Some(v) if v != a.1 => return false,
None => return false,
_ => (),
Expand All @@ -178,7 +184,7 @@ impl<H, KF, T, M> Eq for MemoryDB<H, KF, T, M>
{}

pub trait KeyFunction<H: KeyHasher> {
type Key: Send + Sync + Clone + hash::Hash + Eq;
type Key: Send + Sync + Clone + hash::Hash + Eq + AsRef<[u8]>;

fn key(hash: &H::Out, prefix: Prefix) -> Self::Key;
}
Expand Down
27 changes: 27 additions & 0 deletions test-support/reference-trie/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ use trie_db::{
TrieBuilder,
TrieRoot,
Partial,
OwnedPrefix,
};
use std::borrow::Borrow;
use keccak_hasher::KeccakHasher;
pub use trie_db::traverse::{batch_update, InputAction, unprefixed_detached_trie, prefixed_detached_trie};

use trie_db::{
nibble_ops, NodeCodec,
Expand Down Expand Up @@ -1200,6 +1202,31 @@ pub fn compare_no_extension_insert_remove(
assert_eq!(*t.root(), calc_root_no_extension(data2));
}

pub fn trie_traverse_key_no_extension_build<'a, I, K, V, B>(
// TODO db to non mutable
db: &'a mut dyn hash_db::HashDBRef<keccak_hasher::KeccakHasher, B>,
root: &'a <KeccakHasher as Hasher>::Out,
elements: I,
) -> (
<KeccakHasher as Hasher>::Out,
impl Iterator<Item = (OwnedPrefix, <KeccakHasher as Hasher>::Out, Option<Vec<u8>>)>,
impl Iterator<Item = (Vec<u8>, OwnedPrefix, <KeccakHasher as Hasher>::Out)>,
)
where
I: IntoIterator<Item = (K, Option<V>)>,
K: AsRef<[u8]> + Ord,
V: AsRef<[u8]>,
B: Borrow<[u8]> + AsRef<[u8]> + for<'b> From<&'b [u8]>,
{
let elements = elements.into_iter().map(|(k, v)| (k, if let Some(v) = v {
InputAction::Insert(v)
} else {
InputAction::Delete
}));
let (root, values, values_detached, detached_root) = batch_update::<NoExtensionLayout, _, _, _, _>(db, root, elements).unwrap();
(root, values.into_iter().chain(values_detached.into_iter()), detached_root.into_iter())
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
8 changes: 8 additions & 0 deletions trie-db/fuzz/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,11 @@ path = "fuzz_targets/trie_proof_valid.rs"
[[bin]]
name = "trie_proof_invalid"
path = "fuzz_targets/trie_proof_invalid.rs"

[[bin]]
name = "batch_update"
path = "fuzz_targets/batch_update.rs"

[[bin]]
name = "detach_attach"
path = "fuzz_targets/detach_attach.rs"
10 changes: 10 additions & 0 deletions trie-db/fuzz/fuzz_targets/batch_update.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![no_main]

use libfuzzer_sys::fuzz_target;

fuzz_target!(|data: &[u8]| {
// use next line to favor complex structure and inline data
trie_db_fuzz::fuzz_batch_update(data, |_v| (), false);
// use next line to favor db prefix verification
//trie_db_fuzz::fuzz_batch_update(data, |v| v.extend(&[4u8; 32]), true);
});
10 changes: 10 additions & 0 deletions trie-db/fuzz/fuzz_targets/detach_attach.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![no_main]

use libfuzzer_sys::fuzz_target;

fuzz_target!(|data: &[u8]| {
// use next line to favor complex structure and inline data
//trie_db_fuzz::fuzz_detach_attach(data, |_v| (), false);
// use next line to favor db prefix verification
trie_db_fuzz::fuzz_detach_attach(data, |v| v.extend(&[4u8; 32]), true);
});
184 changes: 182 additions & 2 deletions trie-db/fuzz/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use reference_trie::{
calc_root_no_extension,
compare_no_extension_insert_remove,
ExtensionLayout,
NoExtensionLayout,
NoExtensionLayout, batch_update, InputAction,
proof::{generate_proof, verify_proof},
reference_trie_root,
RefTrieDBMut,
Expand Down Expand Up @@ -72,7 +72,7 @@ fn fuzz_to_data(input: &[u8]) -> Vec<(Vec<u8>,Vec<u8>)> {
result
}

fn fuzz_removal(data: Vec<(Vec<u8>,Vec<u8>)>) -> Vec<(bool, Vec<u8>,Vec<u8>)> {
fn fuzz_removal(data: Vec<(Vec<u8>,Vec<u8>)>) -> Vec<(bool, Vec<u8>, Vec<u8>)> {
let mut res = Vec::new();
let mut torem = None;
for (a, d) in data.into_iter().enumerate() {
Expand Down Expand Up @@ -363,3 +363,183 @@ fn test_generate_proof<L: TrieLayout>(

(root, proof, items)
}

pub fn fuzz_batch_update(input: &[u8], build_val: fn(&mut Vec<u8>), compare_db: bool) {
let data = fuzz_to_data(input);
let mut data = fuzz_removal(data);
for i in data.iter_mut() {
build_val(&mut i.2);
}
let data = data;
//println!("{}: {:?}", data.len(), data);
let mut db = memory_db::MemoryDB::<_, PrefixedKey<_>, _>::default();
let mut root = Default::default();
{
let mut t = reference_trie::RefTrieDBMutNoExt::new(&mut db, &mut root);
for i in 0..data.len() / 2 {
let key: &[u8]= &data[i].1;
let val: &[u8] = &data[i].2;
t.insert(key, val).unwrap();
}
}

let initial_root = root.clone();
let mut initial_db = db.clone();

let mut sorted_data = std::collections::BTreeMap::new();
{
let mut t = reference_trie::RefTrieDBMutNoExt::from_existing(&mut db, &mut root)
.unwrap();
for i in data.len() / 2..data.len() {
let key: &[u8]= &data[i].1;
let val: &[u8] = &data[i].2;
if !data[i].0 {
sorted_data.insert(key, Some(val));
t.insert(key, val).unwrap();
} else {
sorted_data.insert(key, None);
// remove overwrite insert from fuzz_removal ordering,
// that is important
t.remove(key).unwrap();
}
}
}
//println!("{:?}", sorted_data);
let (calc_root, payload, _detached) = reference_trie::trie_traverse_key_no_extension_build(
&mut initial_db,
&initial_root,
sorted_data.into_iter(),
);
assert!(calc_root == root);

if compare_db {
for (p, h, v) in payload {
use hash_db::HashDB;
if let Some(v) = v {
let prefix = (p.0.as_ref(), p.1);
initial_db.emplace(h, prefix, v[..].into());
} else {
let prefix = (p.0.as_ref(), p.1);
initial_db.remove(&h, prefix);
}
}

assert!(initial_db == db);
}
}

pub fn fuzz_detach_attach(input: &[u8], build_val: fn(&mut Vec<u8>), compare_db: bool) {
//x: &[(Vec<u8>, Vec<u8>)],
//d: &Vec<u8>,
let mut data = fuzz_to_data(input);
if data.len() == 0 {
return;
}
for i in data.iter_mut() {
build_val(&mut i.1);
}
let x = &data[1..];
let d = &data[0].0;
//println!("{:?}\n d {:?}", x, d);
let mut db = MemoryDB::<KeccakHasher, PrefixedKey<_>, DBValue>::default();
let mut root = Default::default();
{
let mut t = reference_trie::RefTrieDBMutNoExt::new(&mut db, &mut root);
for i in 1..x.len() {
let key: &[u8]= &x[i].0;
let val: &[u8] = &x[i].1;
t.insert(key, val).unwrap();
}
}
let initial_root = root.clone();
let initial_db = db.clone();
// reference
{
let mut t = RefTrieDBMutNoExt::from_existing(&mut db, &mut root).unwrap();
for i in 1..x.len() {
if x[i].0.starts_with(d) {
let key: &[u8]= &x[i].0;
t.remove(key).unwrap();
}
}
}
let elements = Some(d.clone()).into_iter().map(|k| (k, InputAction::<Vec<u8>, _>::Detach));
let (calc_root, payload, payload_det, detached_root) = batch_update::<NoExtensionLayout, _, _, _, _>(
&initial_db,
&initial_root,
elements,
).unwrap();

assert_eq!(calc_root, root);

let mut batch_delta = initial_db.clone();
for (p, h, v) in payload.into_iter().chain(payload_det) {
use hash_db::HashDB;
if let Some(v) = v {
let prefix = (p.0.as_ref(), p.1);
batch_delta.emplace(h, prefix, v[..].into());
} else {
let prefix = (p.0.as_ref(), p.1);
batch_delta.remove(&h, prefix);
}
}

// attach back
let elements = detached_root.into_iter().map(|(k, _prefix, root)| (k, InputAction::<Vec<u8>, _>::Attach(root)));
let (calc_root, payload, payload_det, detached_root) = batch_update::<NoExtensionLayout, _, _, _, _>(
&batch_delta,
&calc_root,
elements,
).unwrap();
if detached_root.is_empty() {
if compare_db {
for (p, h, v) in payload.into_iter().chain(payload_det) {
use hash_db::HashDB;
if let Some(v) = v {
let prefix = (p.0.as_ref(), p.1);
batch_delta.emplace(h, prefix, v[..].into());
} else {
let prefix = (p.0.as_ref(), p.1);
batch_delta.remove(&h, prefix);
}
}
batch_delta.purge();
assert!(initial_db == batch_delta);
}
assert!(calc_root == initial_root);
} else {
// case where there was a node fuse due to dettach
// we could inject manually detached node and compare
}
}


#[test]
fn test() {
let tests = [
vec![0x1,0x0,0x0,0x0,0x8,0xc,0x8,0x8,0x8,0x0,0x3d,0x0,0x9d,0x4,0x4e],
vec![0x1,0x0,0x0,0x0,0x8,0x8,0x8,0x8,0x8,0x0,0x80,0x0,0x9d,0x4,0x4e],
vec![0x0,0x80,0xd4,0xd4,0xd4,0xd4,0x3a,0x3a,0x3f,0x0,0x3f,0x0],
vec![0x0,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x1,0x8d,0x2c,0xd4,0x0,0x0,0x33,0x8a,0x20,0x80,0x9a,0x2c,0xd4,0x0,0x0,0x33,0x8a,0xff,0x8],
vec![0xff,0xd1,0x0,0x90,0x40,0xd4,0x8d,0x1,0x0,0x0,0xff,0x90,0x40,0xd4,0x8d,0x1,0x0,0x8d,0xce,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0xd0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x6,0x8,0x15,0x1,0x4,0x0,0x8d,0x87,0xcf,0x0,0x3f,0xcb,0xd8,0xb9,0xa2,0x4d,0x9a,0xd6,0xd2,0x0,0x0,0x0,0x0,0x80,0x0,0x6,0x8,0x15,0x1,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x23,0xc7,0xd7,0xd7,0xfb,0x7f,0x83,0x3,0x37,0x37,0x37,0xb2,0xa8,0xb,0xf5,0x5a,0x50,0xb6,0x0,0xff,0x17,0x21,0x0],
vec![0x43,0x19,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x6,0x0,0x0,0x0,0x0,0xaa,0x0,0x0,0x49,0x0,0x0,0xc7,0x8d,0x0,0x5b,0x2d,0xbd,0x20,0x0,0x0,0x0,0x0,0xc7,0x8d,0x0,0x5b,0x2d,0xbd,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xaa,0x0,0x0,0x49,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x40,0x2,0x4,0x0,0x0,0xc7,0x8d,0x0,0x0,0xe0],
vec![0x7f,0x2b,0x4,0x3a,0x89,0xfb,0x0,0x2e,0x70,0x0,0x0,0x2e,0x2,0x0,0x0,0x0,0x41,0xd1,0x2e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0xff,0xcd,0x72,0xfb,0x7f,0xc3,0x0,0x9a,0xff,0xff,0xff,0x72,0xfb,0x7f,0xff,0x0,0x0,0x0,0x0,0x0,0x82,0x82,0x81,0x81,0x29,0x8f,0x7d,0x42,0x12,0xf7,0xb4,0x77,0xd6,0x65,0x91,0xff,0x96,0xa9,0xe0,0x64,0xbc,0xc9,0x8a,0x70,0xc,0x4,0x0,0x0,0xc3,0x0,0x0,0x0,0x0,0x0,0x0],
vec![0x0,0x84,0xff,0xfb,0x7f,0xff,0xff,0xff,0xff,0x7f,0x70,0xff,0xff,0x7f,0x72,0xfd,0xc3,0x0,0x4,0xfb,0xff,0x10,0x10,0x10,0x10,0x10,0x9a,0x4],
vec![0x0,0x80,0xd4,0x0,0x1,0xc,0x0,0xc,0xd,0x2,0x9,0xd4,0xd4,0x0,0x8,0x8,0x8,0x1,0x0,0x0,0x0,0x0],
vec![0x0,0x80,0x0,0xd1,0x0,0x0,0x9a,0x4,0x4,0x0,0x0,0xc],
vec![0x0,0x0,0xff,0xff,0x0,0x0,0x4,0x8d,0x87,0xd1],
vec![0x0,0x0,0x0,0x0,0x4,0x0,0xff,0xd1,0x0,0x0,0xfe,0x0],
vec![0x0,0x0,0xfe,0x0,0xff,0xff,0xd1,0xd1,0x27,0x0],
vec![0x0,0xfe,0x41,0x0,0x0,0x80,0x0,0x0,0xff],
vec![0x0,0x0,0x0,0x4,0x20,0x1a,0x0,0x0],
vec![0x0,0x0,0x0,0x0,0xfe,0xff,0xff,0xd1,0x27],
vec![0x0,0x0,0x0,0xb7,0x4,0xf8,0x0,0x0,0x0],
vec![0xa,0x0,0x0,0x0,0x0,0x4,0x0,0x0],
vec![0x0,0x0,0x0,0x0,0x8d,0x4],
vec![0x0,0x0,0x4,0x8d,0x8d,0x4],
];
for v in tests.iter() {
fuzz_batch_update(&v[..], |_v| (), false);
fuzz_batch_update(&v[..], |v| v.extend(&[4u8; 32]), true);
}
}
2 changes: 1 addition & 1 deletion trie-db/src/iter_build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ impl<T, V> CacheAccum<T, V>
v.as_ref().map(|v| v.as_ref()),
);
self.reset_depth(branch_d);
let pr = NibbleSlice::new_offset(&key_branch, branch_d);
let pr = NibbleSlice::new_offset(key_branch, branch_d);
let branch_hash = callback.process(pr.left(), encoded, is_root && nkey.is_none());

if let Some(nkeyix) = nkey {
Expand Down
9 changes: 7 additions & 2 deletions trie-db/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ pub mod recorder;
mod fatdb;
mod fatdbmut;
mod iter_build;
pub mod traverse;
mod iterator;
mod lookup;
mod nibble;
Expand All @@ -66,7 +67,7 @@ pub use self::fatdb::{FatDB, FatDBIterator};
pub use self::fatdbmut::FatDBMut;
pub use self::recorder::{Recorder, Record};
pub use self::lookup::Lookup;
pub use self::nibble::{NibbleSlice, NibbleVec, nibble_ops};
pub use self::nibble::{NibbleSlice, NibbleVec, nibble_ops, OwnedPrefix};
pub use crate::node_codec::{NodeCodec, Partial};
pub use crate::iter_build::{trie_visit, ProcessEncodedNode,
TrieBuilder, TrieRoot, TrieRootUnhashed};
Expand Down Expand Up @@ -128,7 +129,6 @@ impl<T, E> Error for TrieError<T, E> where T: fmt::Debug, E: Error {}
/// Boxed to avoid copying around extra space for the `Hasher`s `Out` on successful queries.
pub type Result<T, H, E> = crate::rstd::result::Result<T, Box<TrieError<H, E>>>;


/// Trie-Item type used for iterators over trie data.
pub type TrieItem<'a, U, E> = Result<(Vec<u8>, DBValue), U, E>;

Expand Down Expand Up @@ -450,3 +450,8 @@ pub trait TrieConfiguration: Sized + TrieLayout {
pub type TrieHash<L> = <<L as TrieLayout>::Hash as Hasher>::Out;
/// Alias accessor to `NodeCodec` associated `Error` type from a `TrieLayout`.
pub type CError<L> = <<L as TrieLayout>::Codec as NodeCodec>::Error;

/// This was only implemented for trie without extension, it could
/// be implemented for trie and extension in the future but is not
/// at this point.
const NO_EXTENSION_ONLY: &str = "trie without extension implemented only";
2 changes: 1 addition & 1 deletion trie-db/src/nibble/leftnibbleslice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,4 +226,4 @@ mod tests {
Ordering::Equal
);
}
}
}
3 changes: 3 additions & 0 deletions trie-db/src/nibble/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ pub mod nibble_ops {
/// Backing storage for `NibbleVec`s.
pub(crate) type BackingByteVec = smallvec::SmallVec<[u8; 36]>;

/// Backing storage for `Prefix`.
pub type OwnedPrefix = (BackingByteVec, Option<u8>);

/// Owning, nibble-oriented byte vector. Counterpart to `NibbleSlice`.
/// Nibbles are always left aligned, so making a `NibbleVec` from
/// a `NibbleSlice` can get costy.
Expand Down
Loading