mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-19 05:10:55 +00:00
refactor: Add SHAMapNodeID::isPrefixOf (#7939)
Co-authored-by: Bart <11445373+bthomee@users.noreply.github.com>
This commit is contained in:
@@ -55,6 +55,20 @@ public:
|
||||
[[nodiscard]] SHAMapNodeID
|
||||
getChildNodeID(unsigned int branch) const;
|
||||
|
||||
/**
|
||||
* Test whether this node ID lies on the path to the given leaf key
|
||||
*
|
||||
* A node at depth d identifies the tree path spelled by the first d
|
||||
* nibbles of its key, so any leaf beneath it must agree on that prefix.
|
||||
* A node ID that fails this test names a different subtree than the one
|
||||
* it was built for.
|
||||
*
|
||||
* @param key the key of a leaf below this node
|
||||
* @return whether this node ID is a prefix of the leaf key
|
||||
*/
|
||||
[[nodiscard]] bool
|
||||
isPrefixOf(uint256 const& key) const;
|
||||
|
||||
/**
|
||||
* Create a SHAMapNodeID of a node with the depth of the node and
|
||||
* the key of a leaf
|
||||
|
||||
@@ -46,8 +46,7 @@ SHAMapNodeID::SHAMapNodeID(unsigned int depth, uint256 const& hash) : id_(hash),
|
||||
XRPL_ASSERT(
|
||||
depth <= SHAMap::kLeafDepth, "xrpl::SHAMapNodeID::SHAMapNodeID : maximum depth input");
|
||||
XRPL_ASSERT(
|
||||
id_ == (id_ & depthMask(depth)),
|
||||
"xrpl::SHAMapNodeID::SHAMapNodeID : hash and depth inputs do match");
|
||||
isPrefixOf(id_), "xrpl::SHAMapNodeID::SHAMapNodeID : hash and depth inputs do match");
|
||||
}
|
||||
|
||||
std::string
|
||||
@@ -79,7 +78,7 @@ SHAMapNodeID::getChildNodeID(unsigned int branch) const
|
||||
if (depth_ >= SHAMap::kLeafDepth)
|
||||
Throw<std::logic_error>("Request for child node ID of " + to_string(*this));
|
||||
|
||||
if (id_ != (id_ & depthMask(depth_)))
|
||||
if (!isPrefixOf(id_))
|
||||
Throw<std::logic_error>("Incorrect mask for " + to_string(*this));
|
||||
|
||||
SHAMapNodeID node{depth_ + 1, id_};
|
||||
@@ -87,6 +86,12 @@ SHAMapNodeID::getChildNodeID(unsigned int branch) const
|
||||
return node;
|
||||
}
|
||||
|
||||
bool
|
||||
SHAMapNodeID::isPrefixOf(uint256 const& key) const
|
||||
{
|
||||
return (key & depthMask(depth_)) == id_;
|
||||
}
|
||||
|
||||
[[nodiscard]] std::optional<SHAMapNodeID>
|
||||
deserializeSHAMapNodeID(void const* data, std::size_t size)
|
||||
{
|
||||
|
||||
@@ -555,10 +555,9 @@ SHAMap::addKnownNode(
|
||||
{
|
||||
XRPL_ASSERT(!nodeID.isRoot(), "xrpl::SHAMap::addKnownNode : valid node");
|
||||
XRPL_ASSERT(treeNode, "xrpl::SHAMap::addKnownNode : non-null tree node");
|
||||
XRPL_ASSERT(
|
||||
!treeNode->isLeaf() ||
|
||||
SHAMapNodeID::createID(nodeID.getDepth(), leafKey(*treeNode)).getNodeID() ==
|
||||
nodeID.getNodeID(),
|
||||
XRPL_ASSERT_IF(
|
||||
treeNode->isLeaf(),
|
||||
nodeID.isPrefixOf(leafKey(*treeNode)),
|
||||
"xrpl::SHAMap::addKnownNode : leaf position consistent with node ID");
|
||||
|
||||
if (!isSynching())
|
||||
|
||||
@@ -75,11 +75,10 @@ getSHAMapNodeID(protocol::TMLedgerNode const& ledgerNode, SHAMapTreeNode const&
|
||||
if (treeNode.isLeaf())
|
||||
{
|
||||
auto const key = leafKey(treeNode);
|
||||
auto const expectedID = SHAMapNodeID::createID(nodeID->getDepth(), key);
|
||||
SOMETIMES(
|
||||
nodeID->getNodeID() != expectedID.getNodeID(),
|
||||
!nodeID->isPrefixOf(key),
|
||||
"xrpl::getSHAMapNodeID : legacy leaf ID inconsistent with key");
|
||||
if (nodeID->getNodeID() != expectedID.getNodeID())
|
||||
if (!nodeID->isPrefixOf(key))
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user