Fix trie - tests pass.
This commit is contained in:
parent
c39fa7f973
commit
84cc7715b4
31
src/trie.rs
31
src/trie.rs
@ -558,19 +558,19 @@ impl TrieDB {
|
||||
|
||||
fn fixed_indirection<'a>(n: Node<'a>, diff: &mut Diff) -> MaybeChanged<'a> {
|
||||
match n {
|
||||
Node::Extension(partial, payload) if payload.len() >= 32 => {
|
||||
Node::Extension(partial, payload) if payload.len() >= 32 && Rlp::new(payload).is_list() => {
|
||||
// make indirect
|
||||
MaybeChanged::Changed(Node::Extension(partial, &Node::decoded(payload).encoded_and_added(diff)).encoded())
|
||||
},
|
||||
Node::Branch(nodes, node_value) => {
|
||||
Node::Branch(payloads, value) => {
|
||||
// check each child isn't too big
|
||||
// TODO OPTIMISE - should really check at the point of (re-)constructing the branch.
|
||||
for i in 0..16 {
|
||||
if nodes[i].len() >= 32 {
|
||||
let n = Node::decoded(nodes[i]).encoded_and_added(diff);
|
||||
let mut new_nodes = nodes;
|
||||
if payloads[i].len() >= 32 && Rlp::new(payloads[i]).is_list() {
|
||||
let n = Node::decoded(payloads[i]).encoded_and_added(diff);
|
||||
let mut new_nodes = payloads;
|
||||
new_nodes[i] = &n;
|
||||
return MaybeChanged::Changed(Node::Branch(new_nodes, node_value).encoded())
|
||||
return MaybeChanged::Changed(Node::Branch(new_nodes, value).encoded())
|
||||
}
|
||||
}
|
||||
MaybeChanged::Same(n)
|
||||
@ -596,7 +596,7 @@ impl TrieDB {
|
||||
#[derive(Debug)]
|
||||
enum UsedIndex {
|
||||
None,
|
||||
One(usize),
|
||||
One(u8),
|
||||
Many,
|
||||
};
|
||||
let mut used_index = UsedIndex::None;
|
||||
@ -605,7 +605,7 @@ impl TrieDB {
|
||||
// 17 -> multiple non-null branches
|
||||
for i in 0..16 {
|
||||
match (nodes[i] == NULL_RLP, &used_index) {
|
||||
(false, &UsedIndex::None) => used_index = UsedIndex::One(i),
|
||||
(false, &UsedIndex::None) => used_index = UsedIndex::One(i as u8),
|
||||
(false, &UsedIndex::One(_)) => used_index = UsedIndex::Many,
|
||||
(_, _) => {},
|
||||
}
|
||||
@ -617,7 +617,7 @@ impl TrieDB {
|
||||
// transmute to extension.
|
||||
// TODO: OPTIMISE: - don't call fixed again but put the right node in straight away here.
|
||||
// call fixed again since the transmute may cause invalidity.
|
||||
let new_partial: [u8; 1] = [a as u8; 1];
|
||||
let new_partial: [u8; 1] = [a; 1];
|
||||
MaybeChanged::Changed(Self::encoded(self.fixed(Node::Extension(NibbleSlice::new_offset(&new_partial[..], 1), nodes[a as usize]), diff)))
|
||||
},
|
||||
(UsedIndex::None, Some(value)) => { // one leaf value
|
||||
@ -627,6 +627,7 @@ impl TrieDB {
|
||||
}
|
||||
_ => { // onwards node(s) and/or leaf
|
||||
// no transmute needed, but should still fix the indirection.
|
||||
trace!("no-transmute: FIXINDIRECTION");
|
||||
Self::fixed_indirection(Node::Branch(nodes, node_value), diff)
|
||||
},
|
||||
}
|
||||
@ -756,14 +757,16 @@ mod tests {
|
||||
fn playpen() {
|
||||
env_logger::init().ok();
|
||||
|
||||
let big_value = b"00000000000000000000000000000000";
|
||||
|
||||
let mut t1 = TrieDB::new_memory();
|
||||
t1.insert(&[0x01, 0x34], &[2]);
|
||||
t1.insert(&[0x01, 0x23], &big_value.to_vec());
|
||||
t1.insert(&[0x01, 0x34], &big_value.to_vec());
|
||||
let mut t2 = TrieDB::new_memory();
|
||||
t2.insert(&[0x01], &[0]);
|
||||
t2.insert(&[0x01, 0x23], &[1]);
|
||||
t2.insert(&[0x01, 0x34], &[2]);
|
||||
t2.insert(&[0x01], &big_value.to_vec());
|
||||
t2.insert(&[0x01, 0x23], &big_value.to_vec());
|
||||
t2.insert(&[0x01, 0x34], &big_value.to_vec());
|
||||
t2.remove(&[0x01]);
|
||||
t2.remove(&[0x01, 0x23]);
|
||||
/*if t1.root() != t2.root()*/ {
|
||||
trace!("{:?}", t1);
|
||||
trace!("{:?}", t2);
|
||||
|
Loading…
Reference in New Issue
Block a user