Skip to content

Commit

Permalink
fix(trie): check branch node masks if store_in_db_trie is None (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
shekhirin authored Jan 17, 2025
1 parent f66c7cc commit 12d3fbe
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions crates/trie/sparse/src/trie.rs
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,10 @@ impl<P> RevealedSparseTrie<P> {
if let Some((hash, store_in_db_trie)) =
hash.zip(*store_in_db_trie).filter(|_| !prefix_set_contains(&path))
{
(RlpNode::word_rlp(&hash), SparseNodeType::Extension { store_in_db_trie })
(
RlpNode::word_rlp(&hash),
SparseNodeType::Extension { store_in_db_trie: Some(store_in_db_trie) },
)
} else if buffers.rlp_node_stack.last().is_some_and(|e| e.0 == child_path) {
let (_, child, child_node_type) = buffers.rlp_node_stack.pop().unwrap();
self.rlp_buf.clear();
Expand All @@ -711,7 +714,7 @@ impl<P> RevealedSparseTrie<P> {
"Extension node"
);

*store_in_db_trie = Some(store_in_db_trie_value);
*store_in_db_trie = store_in_db_trie_value;

(
rlp_node,
Expand All @@ -734,7 +737,7 @@ impl<P> RevealedSparseTrie<P> {
buffers.rlp_node_stack.push((
path,
RlpNode::word_rlp(&hash),
SparseNodeType::Branch { store_in_db_trie },
SparseNodeType::Branch { store_in_db_trie: Some(store_in_db_trie) },
));
continue
}
Expand Down Expand Up @@ -769,17 +772,19 @@ impl<P> RevealedSparseTrie<P> {
let last_child_nibble = child_path.last().unwrap();

// Determine whether we need to set trie mask bit.
let should_set_tree_mask_bit =
// A blinded node has the tree mask bit set
(
child_node_type.is_hash() &&
self.branch_node_tree_masks
.get(&path)
.is_some_and(|mask| mask.is_bit_set(last_child_nibble))
) ||
let should_set_tree_mask_bit = if let Some(store_in_db_trie) =
child_node_type.store_in_db_trie()
{
// A branch or an extension node explicitly set the
// `store_in_db_trie` flag
child_node_type.store_in_db_trie();
store_in_db_trie
} else {
// A blinded node has the tree mask bit set
child_node_type.is_hash() &&
self.branch_node_tree_masks.get(&path).is_some_and(
|mask| mask.is_bit_set(last_child_nibble),
)
};
if should_set_tree_mask_bit {
tree_mask.set_bit(last_child_nibble);
}
Expand Down Expand Up @@ -882,7 +887,10 @@ impl<P> RevealedSparseTrie<P> {
};
*store_in_db_trie = Some(store_in_db_trie_value);

(rlp_node, SparseNodeType::Branch { store_in_db_trie: store_in_db_trie_value })
(
rlp_node,
SparseNodeType::Branch { store_in_db_trie: Some(store_in_db_trie_value) },
)
}
};
buffers.rlp_node_stack.push((path, rlp_node, node_type));
Expand Down Expand Up @@ -1227,12 +1235,12 @@ enum SparseNodeType {
/// Sparse extension node.
Extension {
/// A flag indicating whether the extension node should be stored in the database.
store_in_db_trie: bool,
store_in_db_trie: Option<bool>,
},
/// Sparse branch node.
Branch {
/// A flag indicating whether the branch node should be stored in the database.
store_in_db_trie: bool,
store_in_db_trie: Option<bool>,
},
}

Expand All @@ -1245,12 +1253,12 @@ impl SparseNodeType {
matches!(self, Self::Branch { .. })
}

const fn store_in_db_trie(&self) -> bool {
const fn store_in_db_trie(&self) -> Option<bool> {
match *self {
Self::Extension { store_in_db_trie } | Self::Branch { store_in_db_trie } => {
store_in_db_trie
}
_ => false,
_ => None,
}
}
}
Expand Down

0 comments on commit 12d3fbe

Please sign in to comment.