20 #include <ripple/shamap/SHAMapTreeNode.h>
21 #include <ripple/basics/contract.h>
22 #include <ripple/basics/Log.h>
23 #include <ripple/protocol/digest.h>
24 #include <ripple/basics/safe_cast.h>
25 #include <ripple/basics/Slice.h>
26 #include <ripple/protocol/HashPrefix.h>
27 #include <ripple/beast/core/LexicalCast.h>
30 #include <openssl/sha.h>
41 auto p = std::make_shared<SHAMapInnerNode>(seq);
47 for (
int i = 0; i < 16; ++i)
63 assert (item->peekData ().size () >= 12);
72 assert (item->peekData ().size () >= 12);
86 int type = rawNode[rawNode.
size() - 1];
89 if ((type < 0) || (type > 6))
94 auto item = std::make_shared<SHAMapItem const>(
106 Throw<std::runtime_error> (
"short AS node");
109 s.
get256 (u, len - (256 / 8));
112 if (u.
isZero ()) Throw<std::runtime_error> (
"invalid AS node");
114 auto item = std::make_shared<SHAMapItem const> (u, s.
peekData ());
116 return std::make_shared<SHAMapTreeNode>(item,
tnACCOUNT_STATE, seq, hash);
123 Throw<std::runtime_error> (
"invalid FI node");
125 auto ret = std::make_shared<SHAMapInnerNode>(seq);
126 for (
int i = 0; i < 16; ++i)
128 s.
get256 (ret->mHashes[i].as_uint256(), i * 32);
130 if (ret->mHashes[i].isNonZero ())
131 ret->mIsBranch |= (1 << i);
141 auto ret = std::make_shared<SHAMapInnerNode>(seq);
143 for (
int i = 0; i < (len / 33); ++i)
146 if (! s.
get8 (pos, 32 + (i * 33)))
147 Throw<std::runtime_error> (
"short CI node");
148 if ((pos < 0) || (pos >= 16))
149 Throw<std::runtime_error> (
"invalid CI node");
150 s.
get256 (ret->mHashes[pos].as_uint256(), i * 33);
151 if (ret->mHashes[pos].isNonZero ())
152 ret->mIsBranch |= (1 << pos);
164 Throw<std::runtime_error> (
"short TM node");
167 s.
get256 (u, len - (256 / 8));
171 Throw<std::runtime_error> (
"invalid TM node");
173 auto item = std::make_shared<SHAMapItem const> (u, s.
peekData ());
182 if (rawNode.
size () < 4)
184 JLOG (j.
info()) <<
"size < 4";
185 Throw<std::runtime_error> (
"invalid P node");
190 prefix |= rawNode[1];
192 prefix |= rawNode[2];
194 prefix |= rawNode[3];
199 auto item = std::make_shared<SHAMapItem const>(
209 Throw<std::runtime_error> (
"short PLN node");
217 JLOG (j.
info()) <<
"invalid PLN node";
218 Throw<std::runtime_error> (
"invalid PLN node");
221 auto item = std::make_shared<SHAMapItem const> (u, s.
peekData ());
223 return std::make_shared<SHAMapTreeNode>(item,
tnACCOUNT_STATE, seq, hash);
231 Throw<std::runtime_error> (
"invalid PIN node");
233 auto ret = std::make_shared<SHAMapInnerNode>(seq);
235 for (
int i = 0; i < 16; ++i)
237 s.
get256 (ret->mHashes[i].as_uint256(), i * 32);
239 if (ret->mHashes[i].isNonZero ())
240 ret->mIsBranch |= (1 << i);
253 Throw<std::runtime_error> (
"short TXN node");
258 auto item = std::make_shared<SHAMapItem const> (txID, s.
peekData ());
266 Throw<std::runtime_error> (
"invalid node prefix");
270 Throw<std::runtime_error> (
"Unknown format");
285 nh =
static_cast<typename
297 for (
auto pos = 0; pos < 16; ++pos)
342 Throw<std::runtime_error> (
"invalid I node type");
357 s.
add256 (hh.as_uint256());
364 for (
int i = 0; i <
mHashes.size(); ++i)
376 s.
add256 (hh.as_uint256());
392 Throw<std::runtime_error> (
"invalid I node type");
464 for (
int i = 0; i < 16; ++i)
475 ret += beast::lexicalCastThrow <std::string> (
id.getDepth ());
486 for (
int i = 0; i <
mHashes.size(); ++i)
491 ret += beast::lexicalCastThrow <std::string> (i);
517 ret += beast::lexicalCast <std::string> (
mItem->size());
525 assert ((m >= 0) && (m < 16));
528 assert (child.get() !=
this);
541 assert ((m >= 0) && (m < 16));
545 assert (child.get() !=
this);
553 assert (branch >= 0 && branch < 16);
563 assert (branch >= 0 && branch < 16);
573 assert (branch >= 0 && branch < 16);
576 assert (node->getNodeHash() ==
mHashes[branch]);
595 Throw<std::logic_error>(
"SHAMapInnerNode::key() should never be called");
611 for (
int i = 0; i < 16; ++i)
638 assert(
mItem !=
nullptr);