mirror of
https://github.com/XRPLF/rippled.git
synced 2026-08-22 14:50:54 +00:00
refactor: Remove support for protocol version 2.1 (#7432)
Co-authored-by: Bart <11445373+bthomee@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -2253,8 +2253,7 @@ private:
|
||||
{
|
||||
testcase("Sha512 hashing");
|
||||
// Tests that ValidatorList hash_append helpers with a single blob
|
||||
// returns the same result as xrpl::Sha512Half used by the
|
||||
// TMValidatorList protocol message handler
|
||||
// return the same result as xrpl::Sha512Half
|
||||
std::string const manifest = "This is not really a manifest";
|
||||
std::string const blob = "This is not really a blob";
|
||||
std::string const signature = "This is not really a signature";
|
||||
@@ -2275,17 +2274,6 @@ private:
|
||||
BEAST_EXPECT(global != sha512Half(blob, blobMap, version));
|
||||
}
|
||||
|
||||
{
|
||||
protocol::TMValidatorList msg1;
|
||||
msg1.set_manifest(manifest);
|
||||
msg1.set_blob(blob);
|
||||
msg1.set_signature(signature);
|
||||
msg1.set_version(version);
|
||||
BEAST_EXPECT(global == sha512Half(msg1));
|
||||
msg1.set_signature(blob);
|
||||
BEAST_EXPECT(global != sha512Half(msg1));
|
||||
}
|
||||
|
||||
{
|
||||
protocol::TMValidatorListCollection msg2;
|
||||
msg2.set_manifest(manifest);
|
||||
@@ -2323,19 +2311,7 @@ private:
|
||||
BEAST_EXPECT(!ec);
|
||||
return std::make_pair(header, buffers);
|
||||
};
|
||||
auto extractProtocolMessage1 = [this, &extractHeader](Message& message) {
|
||||
auto [header, buffers] = extractHeader(message);
|
||||
if (BEAST_EXPECT(header) &&
|
||||
BEAST_EXPECT(header->messageType == protocol::mtVALIDATOR_LIST))
|
||||
{
|
||||
auto const msg =
|
||||
detail::parseMessageContent<protocol::TMValidatorList>(*header, buffers.data());
|
||||
BEAST_EXPECT(msg);
|
||||
return msg;
|
||||
}
|
||||
return std::shared_ptr<protocol::TMValidatorList>();
|
||||
};
|
||||
auto extractProtocolMessage2 = [this, &extractHeader](Message& message) {
|
||||
auto extractProtocolMessage = [this, &extractHeader](Message& message) {
|
||||
auto [header, buffers] = extractHeader(message);
|
||||
if (BEAST_EXPECT(header) &&
|
||||
BEAST_EXPECT(header->messageType == protocol::mtVALIDATOR_LIST_COLLECTION))
|
||||
@@ -2347,92 +2323,55 @@ private:
|
||||
}
|
||||
return std::shared_ptr<protocol::TMValidatorListCollection>();
|
||||
};
|
||||
auto verifyMessage =
|
||||
[this, manifestCutoff, &extractProtocolMessage1, &extractProtocolMessage2](
|
||||
auto const version,
|
||||
auto const& manifest,
|
||||
auto const& blobInfos,
|
||||
auto const& messages,
|
||||
std::vector<std::pair<std::size_t, std::vector<std::uint32_t>>> expectedInfo) {
|
||||
BEAST_EXPECT(messages.size() == expectedInfo.size());
|
||||
auto msgIter = expectedInfo.begin();
|
||||
for (auto const& messageWithHash : messages)
|
||||
auto verifyMessage = [this, manifestCutoff, &extractProtocolMessage](
|
||||
auto const version,
|
||||
auto const& manifest,
|
||||
auto const& blobInfos,
|
||||
auto const& messages,
|
||||
std::vector<std::vector<std::uint32_t>> expectedInfo) {
|
||||
BEAST_EXPECT(messages.size() == expectedInfo.size());
|
||||
auto msgIter = expectedInfo.begin();
|
||||
for (auto const& messageWithHash : messages)
|
||||
{
|
||||
if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
|
||||
break;
|
||||
if (!BEAST_EXPECT(messageWithHash.message))
|
||||
continue;
|
||||
auto const& expectedSeqs = *msgIter;
|
||||
auto seqIter = expectedSeqs.begin();
|
||||
{
|
||||
if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
|
||||
break;
|
||||
if (!BEAST_EXPECT(messageWithHash.message))
|
||||
continue;
|
||||
auto const& expectedSeqs = msgIter->second;
|
||||
auto seqIter = expectedSeqs.begin();
|
||||
auto const size =
|
||||
messageWithHash.message->getBuffer(compression::Compressed::Off).size();
|
||||
// This size is arbitrary, but shouldn't change
|
||||
BEAST_EXPECT(size == msgIter->first);
|
||||
if (expectedSeqs.size() == 1)
|
||||
std::vector<ValidatorBlobInfo> hashingBlobs;
|
||||
hashingBlobs.reserve(expectedSeqs.size());
|
||||
|
||||
auto const msg = extractProtocolMessage(*messageWithHash.message);
|
||||
if (BEAST_EXPECT(msg))
|
||||
{
|
||||
auto const msg = extractProtocolMessage1(*messageWithHash.message);
|
||||
auto const expectedVersion = 1;
|
||||
if (BEAST_EXPECT(msg))
|
||||
BEAST_EXPECT(msg->version() == version);
|
||||
BEAST_EXPECT(msg->manifest() == manifest);
|
||||
for (auto const& blobInfo : msg->blobs())
|
||||
{
|
||||
BEAST_EXPECT(msg->version() == expectedVersion);
|
||||
if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
|
||||
continue;
|
||||
break;
|
||||
auto const& expectedBlob = blobInfos.at(*seqIter);
|
||||
BEAST_EXPECT((*seqIter < manifestCutoff) == !!expectedBlob.manifest);
|
||||
auto const expectedManifest =
|
||||
*seqIter < manifestCutoff && expectedBlob.manifest
|
||||
? *expectedBlob.manifest
|
||||
: manifest;
|
||||
BEAST_EXPECT(msg->manifest() == expectedManifest);
|
||||
BEAST_EXPECT(msg->blob() == expectedBlob.blob);
|
||||
BEAST_EXPECT(msg->signature() == expectedBlob.signature);
|
||||
hashingBlobs.push_back(expectedBlob);
|
||||
BEAST_EXPECT(blobInfo.has_manifest() == !!expectedBlob.manifest);
|
||||
BEAST_EXPECT(blobInfo.has_manifest() == (*seqIter < manifestCutoff));
|
||||
|
||||
if (*seqIter < manifestCutoff)
|
||||
BEAST_EXPECT(blobInfo.manifest() == *expectedBlob.manifest);
|
||||
BEAST_EXPECT(blobInfo.blob() == expectedBlob.blob);
|
||||
BEAST_EXPECT(blobInfo.signature() == expectedBlob.signature);
|
||||
++seqIter;
|
||||
BEAST_EXPECT(seqIter == expectedSeqs.end());
|
||||
|
||||
BEAST_EXPECT(
|
||||
messageWithHash.hash ==
|
||||
sha512Half(
|
||||
expectedManifest,
|
||||
expectedBlob.blob,
|
||||
expectedBlob.signature,
|
||||
expectedVersion));
|
||||
}
|
||||
BEAST_EXPECT(seqIter == expectedSeqs.end());
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<ValidatorBlobInfo> hashingBlobs;
|
||||
hashingBlobs.reserve(msgIter->second.size());
|
||||
|
||||
auto const msg = extractProtocolMessage2(*messageWithHash.message);
|
||||
if (BEAST_EXPECT(msg))
|
||||
{
|
||||
BEAST_EXPECT(msg->version() == version);
|
||||
BEAST_EXPECT(msg->manifest() == manifest);
|
||||
for (auto const& blobInfo : msg->blobs())
|
||||
{
|
||||
if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
|
||||
break;
|
||||
auto const& expectedBlob = blobInfos.at(*seqIter);
|
||||
hashingBlobs.push_back(expectedBlob);
|
||||
BEAST_EXPECT(blobInfo.has_manifest() == !!expectedBlob.manifest);
|
||||
BEAST_EXPECT(
|
||||
blobInfo.has_manifest() == (*seqIter < manifestCutoff));
|
||||
|
||||
if (*seqIter < manifestCutoff)
|
||||
BEAST_EXPECT(blobInfo.manifest() == *expectedBlob.manifest);
|
||||
BEAST_EXPECT(blobInfo.blob() == expectedBlob.blob);
|
||||
BEAST_EXPECT(blobInfo.signature() == expectedBlob.signature);
|
||||
++seqIter;
|
||||
}
|
||||
BEAST_EXPECT(seqIter == expectedSeqs.end());
|
||||
}
|
||||
BEAST_EXPECT(
|
||||
messageWithHash.hash == sha512Half(manifest, hashingBlobs, version));
|
||||
}
|
||||
++msgIter;
|
||||
BEAST_EXPECT(
|
||||
messageWithHash.hash == sha512Half(manifest, hashingBlobs, version));
|
||||
}
|
||||
BEAST_EXPECT(msgIter == expectedInfo.end());
|
||||
};
|
||||
++msgIter;
|
||||
}
|
||||
BEAST_EXPECT(msgIter == expectedInfo.end());
|
||||
};
|
||||
auto verifyBuildMessages = [this](
|
||||
std::pair<std::size_t, std::size_t> const& result,
|
||||
std::size_t expectedSequence,
|
||||
@@ -2471,66 +2410,10 @@ private:
|
||||
|
||||
std::vector<ValidatorList::MessageWithHash> messages;
|
||||
|
||||
// Version 1
|
||||
|
||||
// This peer has a VL ahead of our "current"
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
1, 8, maxSequence, version, manifest, blobInfos, messages),
|
||||
0,
|
||||
0);
|
||||
BEAST_EXPECT(messages.empty());
|
||||
|
||||
// Don't repeat the work if messages is populated, even though the
|
||||
// peerSequence provided indicates it should. Note that this
|
||||
// situation is contrived for this test and should never happen in
|
||||
// real code.
|
||||
messages.emplace_back();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
1, 3, maxSequence, version, manifest, blobInfos, messages),
|
||||
5,
|
||||
0);
|
||||
BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
|
||||
|
||||
// Generate a version 1 message
|
||||
messages.clear();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
1, 3, maxSequence, version, manifest, blobInfos, messages),
|
||||
5,
|
||||
1);
|
||||
if (BEAST_EXPECT(messages.size() == 1) && BEAST_EXPECT(messages.front().message))
|
||||
{
|
||||
auto const& messageWithHash = messages.front();
|
||||
auto const msg = extractProtocolMessage1(*messageWithHash.message);
|
||||
auto const size =
|
||||
messageWithHash.message->getBuffer(compression::Compressed::Off).size();
|
||||
// This size is arbitrary, but shouldn't change
|
||||
BEAST_EXPECT(size == 108);
|
||||
auto const& expected = blobInfos.at(5);
|
||||
if (BEAST_EXPECT(msg))
|
||||
{
|
||||
BEAST_EXPECT(msg->version() == 1);
|
||||
// NOLINTNEXTLINE(bugprone-unchecked-optional-access)
|
||||
BEAST_EXPECT(msg->manifest() == *expected.manifest);
|
||||
BEAST_EXPECT(msg->blob() == expected.blob);
|
||||
BEAST_EXPECT(msg->signature() == expected.signature);
|
||||
}
|
||||
BEAST_EXPECT(
|
||||
messageWithHash.hash ==
|
||||
// NOLINTNEXTLINE(bugprone-unchecked-optional-access)
|
||||
sha512Half(*expected.manifest, expected.blob, expected.signature, 1));
|
||||
}
|
||||
|
||||
// Version 2
|
||||
|
||||
messages.clear();
|
||||
|
||||
// This peer has a VL ahead of us.
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, maxSequence * 2, maxSequence, version, manifest, blobInfos, messages),
|
||||
maxSequence * 2, maxSequence, version, manifest, blobInfos, messages),
|
||||
0,
|
||||
0);
|
||||
BEAST_EXPECT(messages.empty());
|
||||
@@ -2542,19 +2425,19 @@ private:
|
||||
messages.emplace_back();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, 3, maxSequence, version, manifest, blobInfos, messages),
|
||||
3, maxSequence, version, manifest, blobInfos, messages),
|
||||
maxSequence,
|
||||
0);
|
||||
BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
|
||||
|
||||
// Generate a version 2 message. Don't send the current
|
||||
// Generate a message. Don't send the current
|
||||
messages.clear();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, 5, maxSequence, version, manifest, blobInfos, messages),
|
||||
5, maxSequence, version, manifest, blobInfos, messages),
|
||||
maxSequence,
|
||||
4);
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{6, 7, 10, 12}});
|
||||
|
||||
// Test message splitting on size limits.
|
||||
|
||||
@@ -2562,50 +2445,39 @@ private:
|
||||
messages.clear();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, 5, maxSequence, version, manifest, blobInfos, messages, 300),
|
||||
5, maxSequence, version, manifest, blobInfos, messages, 300),
|
||||
maxSequence,
|
||||
4);
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{212, {6, 7}}, {192, {10, 12}}});
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{6, 7}, {10, 12}});
|
||||
|
||||
// Set a limit between the size of the two earlier messages so one
|
||||
// will split and the other won't
|
||||
messages.clear();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, 5, maxSequence, version, manifest, blobInfos, messages, 200),
|
||||
5, maxSequence, version, manifest, blobInfos, messages, 200),
|
||||
maxSequence,
|
||||
4);
|
||||
verifyMessage(
|
||||
version, manifest, blobInfos, messages, {{108, {6}}, {108, {7}}, {192, {10, 12}}});
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{6}, {7}, {10, 12}});
|
||||
|
||||
// Set a limit so that all the VLs are sent individually
|
||||
messages.clear();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, 5, maxSequence, version, manifest, blobInfos, messages, 150),
|
||||
5, maxSequence, version, manifest, blobInfos, messages, 150),
|
||||
maxSequence,
|
||||
4);
|
||||
verifyMessage(
|
||||
version,
|
||||
manifest,
|
||||
blobInfos,
|
||||
messages,
|
||||
{{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{6}, {7}, {10}, {12}});
|
||||
|
||||
// Set a limit smaller than some of the messages. Because single
|
||||
// messages send regardless, they will all still be sent
|
||||
messages.clear();
|
||||
verifyBuildMessages(
|
||||
ValidatorList::buildValidatorListMessages(
|
||||
2, 5, maxSequence, version, manifest, blobInfos, messages, 108),
|
||||
5, maxSequence, version, manifest, blobInfos, messages, 108),
|
||||
maxSequence,
|
||||
4);
|
||||
verifyMessage(
|
||||
version,
|
||||
manifest,
|
||||
blobInfos,
|
||||
messages,
|
||||
{{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
|
||||
verifyMessage(version, manifest, blobInfos, messages, {{6}, {7}, {10}, {12}});
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user