21#include <xrpld/app/misc/ValidatorList.h>
22#include <xrpld/overlay/detail/ProtocolMessage.h>
23#include <xrpl/basics/Slice.h>
24#include <xrpl/basics/base64.h>
25#include <xrpl/basics/strHex.h>
26#include <xrpl/protocol/HashPrefix.h>
27#include <xrpl/protocol/PublicKey.h>
28#include <xrpl/protocol/SecretKey.h>
29#include <xrpl/protocol/Sign.h>
30#include <xrpl/protocol/digest.h>
31#include <xrpl/protocol/jss.h>
32#include <xrpl/protocol/messages.h>
34#include <boost/beast/core/multi_buffer.hpp>
75 st[sfSigningPubKey] = spk;
140 data +=
",\"validators\":[";
142 for (
auto const& val : validators)
144 data +=
"{\"validation_public_key\":\"" +
strHex(val.masterPublic) +
145 "\",\"manifest\":\"" + val.manifest +
"\"},";
167 for (
auto const& pk : pks)
193 auto& app = env.
app();
195 auto trustedKeys = std::make_unique<ValidatorList>(
199 app.config().legacy(
"database_path"),
201 BEAST_EXPECT(trustedKeys->quorum() == 1);
205 auto trustedKeys = std::make_unique<ValidatorList>(
209 app.config().legacy(
"database_path"),
212 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
223 auto& app = env.
app();
228 auto const localSigningPublicOuter = localSigningKeys.first;
229 auto const localSigningSecret = localSigningKeys.second;
231 auto const localMasterPublic =
237 localSigningPublicOuter,
241 auto format = [](
PublicKey const& publicKey,
242 char const* comment =
nullptr) {
254 while (configList.
size() != 8)
259 {format(configList[0]),
260 format(configList[1],
" Comment"),
261 format(configList[2],
" Multi Word Comment"),
262 format(configList[3],
" Leading Whitespace"),
263 format(configList[4],
" Trailing Whitespace "),
264 format(configList[5],
" Leading & Trailing Whitespace "),
267 " Leading, Trailing & Internal Whitespace "),
268 format(configList[7],
" ")});
272 auto trustedKeys = std::make_unique<ValidatorList>(
276 app.config().legacy(
"database_path"),
281 trustedKeys->load({}, emptyCfgKeys, emptyCfgPublishers));
284 BEAST_EXPECT(trustedKeys->load(
285 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
286 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
289 BEAST_EXPECT(trustedKeys->load(
290 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
292 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
293 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
298 auto trustedKeys = std::make_unique<ValidatorList>(
302 app.config().legacy(
"database_path"),
305 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, emptyCfgPublishers));
307 for (
auto const& n : configList)
308 BEAST_EXPECT(trustedKeys->listed(n));
315 {format(masterNode1), format(masterNode2,
" Comment")});
317 trustedKeys->load({}, cfgMasterKeys, emptyCfgPublishers));
318 BEAST_EXPECT(trustedKeys->listed(masterNode1));
319 BEAST_EXPECT(trustedKeys->listed(masterNode2));
323 !trustedKeys->load({}, {
"NotAPublicKey"}, emptyCfgPublishers));
324 BEAST_EXPECT(!trustedKeys->load(
325 {}, {format(randomNode(),
"!")}, emptyCfgPublishers));
329 BEAST_EXPECT(!trustedKeys->load(
331 {format(randomNode(),
"!"), format(goodKey)},
332 emptyCfgPublishers));
333 BEAST_EXPECT(!trustedKeys->listed(goodKey));
338 auto trustedKeys = std::make_unique<ValidatorList>(
342 app.config().legacy(
"database_path"),
345 auto const localSigningPublic =
348 BEAST_EXPECT(trustedKeys->load(
349 *localSigningPublic, cfgKeys, emptyCfgPublishers));
351 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
352 BEAST_EXPECT(trustedKeys->listed(*localSigningPublic));
353 for (
auto const& n : configList)
354 BEAST_EXPECT(trustedKeys->listed(n));
359 auto trustedKeys = std::make_unique<ValidatorList>(
363 app.config().legacy(
"database_path"),
367 BEAST_EXPECT(trustedKeys->load(
368 localSigningPublic, cfgKeys, emptyCfgPublishers));
370 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
371 BEAST_EXPECT(trustedKeys->listed(localSigningPublic));
372 for (
auto const& n : configList)
373 BEAST_EXPECT(trustedKeys->listed(n));
378 auto trustedKeys = std::make_unique<ValidatorList>(
382 app.config().legacy(
"database_path"),
387 BEAST_EXPECT(trustedKeys->load(
388 localSigningPublicOuter, cfgKeys, emptyCfgPublishers));
390 BEAST_EXPECT(trustedKeys->localPublicKey() == localMasterPublic);
391 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
392 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
393 for (
auto const& n : configList)
394 BEAST_EXPECT(trustedKeys->listed(n));
398 auto trustedKeys = std::make_unique<ValidatorList>(
402 app.config().legacy(
"database_path"),
407 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
413 badPublishers.
clear();
414 for (
auto const& key : keys)
417 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
418 for (
auto const& key : keys)
419 BEAST_EXPECT(!trustedKeys->trustedPublisher(key));
423 for (
auto const& key : keys)
426 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
427 for (
auto const& key : keys)
428 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
430 trustedKeys->getListThreshold() == keys.size() / 2 + 1);
434 auto trustedKeys = std::make_unique<ValidatorList>(
438 app.config().legacy(
"database_path"),
447 for (
auto const& key : keys)
451 BEAST_EXPECT(trustedKeys->load(
453 for (
auto const& key : keys)
454 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
455 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
462 auto trustedKeys = std::make_unique<ValidatorList>(
466 app.config().legacy(
"database_path"),
470 auto const pubRevokedPublic =
478 pubRevokedSigning.first,
479 pubRevokedSigning.second,
488 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
490 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
491 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey1));
492 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey2));
494 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
501 auto trustedKeys = std::make_unique<ValidatorList>(
505 app.config().legacy(
"database_path"),
509 auto const pubRevokedPublic =
517 pubRevokedSigning.first,
518 pubRevokedSigning.second,
526 BEAST_EXPECT(trustedKeys->load(
529 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
530 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey));
532 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
540 using namespace std::chrono_literals;
544 auto checkAvailable =
546 auto const& trustedKeys,
547 auto const& hexPublic,
552 const auto available = trustedKeys->getAvailable(hexPublic);
558 BEAST_EXPECT(a[jss::public_key] == hexPublic);
559 BEAST_EXPECT(a[jss::manifest] ==
manifest);
562 BEAST_EXPECT(a[jss::version] == version);
565 BEAST_EXPECT(expected.size() == 1);
566 BEAST_EXPECT(a[jss::blob] == expected[0].first);
567 BEAST_EXPECT(a[jss::signature] == expected[0].second);
568 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
570 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
572 BEAST_EXPECT(!a.isMember(jss::blob));
573 BEAST_EXPECT(!a.isMember(jss::signature));
574 auto const& blobs_v2 = a[jss::blobs_v2];
576 blobs_v2.isArray() &&
577 blobs_v2.size() == expected.size());
579 for (
unsigned int i = 0; i < expected.size(); ++i)
582 blobs_v2[i][jss::blob] == expected[i].first);
584 blobs_v2[i][jss::signature] ==
593 auto& app = env.
app();
594 auto trustedKeys = std::make_unique<ValidatorList>(
598 app.config().legacy(
"database_path"),
603 for (
auto const& val : list)
605 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
606 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
610 auto expectUntrusted =
612 for (
auto const& val : list)
614 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
615 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
620 auto const publisherPublic =
622 const auto hexPublic =
623 strHex(publisherPublic.begin(), publisherPublic.end());
628 pubSigningKeys1.first,
629 pubSigningKeys1.second,
635 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys1));
638 auto constexpr listSize = 20;
639 auto constexpr numLists = 9;
642 for (
auto i = 1; i <= numLists; ++i)
644 auto& list = lists[i];
645 list.reserve(listSize);
646 while (list.size() < listSize)
654 auto const version = 1;
655 auto const sequence1 = 1;
660 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
663 auto const sequence2 = 2;
666 auto const sig2 =
signList(blob2, pubSigningKeys1);
669 trustedKeys->applyLists(
672 {{expiredblob, expiredSig, {}}, {blob2, sig2, {}}},
678 expectTrusted(lists.at(2));
681 trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
684 auto const version2 = 2;
685 auto const sequence7 = 7;
686 auto const effective7 = validUntil - 60s;
687 auto const expiration7 = effective7 + 3600s;
688 auto const blob7 = makeList(
691 expiration7.time_since_epoch().count(),
692 effective7.time_since_epoch().count());
693 auto const sig7 = signList(blob7, pubSigningKeys1);
695 auto const sequence8 = 8;
696 auto const effective8 = expiration7 - 60s;
697 auto const expiration8 = effective8 + 3600s;
698 auto const blob8 = makeList(
701 expiration8.time_since_epoch().count(),
702 effective8.time_since_epoch().count());
703 auto const sig8 = signList(blob8, pubSigningKeys1);
706 trustedKeys->applyLists(
709 {{blob7, sig7, {}}, {blob8, sig8, {}}},
712 ListDisposition::pending,
713 ListDisposition::pending);
715 expectUntrusted(lists.at(7));
716 expectUntrusted(lists.at(8));
719 auto const sequence6 = 6;
720 auto const effective6 = effective7 - 60s;
721 auto const expiration6 = effective6 + 3600s;
722 auto const blob6 = makeList(
725 expiration6.time_since_epoch().count(),
726 effective6.time_since_epoch().count());
727 auto const sig6 = signList(blob6, pubSigningKeys1);
730 auto const sequence6a = 5;
731 auto const effective6a = effective6 + 60s;
732 auto const expiration6a = effective6a + 3600s;
733 auto const blob6a = makeList(
736 expiration6a.time_since_epoch().count(),
737 effective6a.time_since_epoch().count());
738 auto const sig6a = signList(blob6a, pubSigningKeys1);
741 trustedKeys->applyLists(
744 {{blob6a, sig6a, {}}, {blob6, sig6, {}}},
747 ListDisposition::pending,
748 ListDisposition::pending);
750 expectUntrusted(lists.at(6));
751 expectTrusted(lists.at(2));
756 trustedKeys->applyLists(
759 {{blob7, sig7, {}}, {blob6, sig6, {}}},
762 ListDisposition::known_sequence,
763 ListDisposition::known_sequence);
765 expectUntrusted(lists.at(6));
766 expectUntrusted(lists.at(7));
767 expectTrusted(lists.at(2));
770 auto const untrustedManifest =
base64_encode(makeManifestString(
773 pubSigningKeys1.first,
774 pubSigningKeys1.second,
778 trustedKeys->applyLists(
779 untrustedManifest, version, {{blob2, sig2, {}}}, siteUri),
781 ListDisposition::untrusted,
782 ListDisposition::untrusted);
785 auto const badVersion = 666;
787 trustedKeys->applyLists(
788 manifest1, badVersion, {{blob2, sig2, {}}}, siteUri),
790 ListDisposition::unsupported_version,
791 ListDisposition::unsupported_version);
794 auto const sequence3 = 3;
795 auto const blob3 = makeList(
796 lists.at(3), sequence3, validUntil.time_since_epoch().count());
797 auto const sig3 = signList(blob3, pubSigningKeys1);
800 trustedKeys->applyLists(
801 manifest1, version, {{blob3, sig3, {}}}, siteUri),
803 ListDisposition::accepted,
804 ListDisposition::accepted);
806 expectUntrusted(lists.at(1));
807 expectUntrusted(lists.at(2));
808 expectTrusted(lists.at(3));
817 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
821 trustedKeys->applyLists(
824 {{blob2, sig2, {}}, {blob3, sig3, {}}},
827 ListDisposition::stale,
828 ListDisposition::same_sequence);
832 auto const pubSigningKeys2 =
randomKeyPair(KeyType::secp256k1);
836 pubSigningKeys2.first,
837 pubSigningKeys2.second,
840 auto const sequence4 = 4;
841 auto const blob4 = makeList(
842 lists.at(4), sequence4, validUntil.time_since_epoch().count());
843 auto const sig4 = signList(blob4, pubSigningKeys2);
846 trustedKeys->applyLists(
849 {{blob2, sig2, manifest1},
850 {blob3, sig3, manifest1},
854 ListDisposition::stale,
855 ListDisposition::accepted);
857 expectUntrusted(lists.at(2));
858 expectUntrusted(lists.at(3));
859 expectTrusted(lists.at(4));
866 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
868 auto const sequence5 = 5;
869 auto const blob5 = makeList(
870 lists.at(5), sequence5, validUntil.time_since_epoch().count());
871 auto const badSig = signList(blob5, pubSigningKeys1);
873 trustedKeys->applyLists(
874 manifest1, version, {{blob5, badSig, {}}}, siteUri),
876 ListDisposition::invalid,
877 ListDisposition::invalid);
879 expectUntrusted(lists.at(2));
880 expectUntrusted(lists.at(3));
881 expectTrusted(lists.at(4));
882 expectUntrusted(lists.at(5));
886 trustedKeys->applyLists(
889 {{blob7, sig7, {}}, {blob8, sig8, {}}},
892 ListDisposition::invalid,
893 ListDisposition::invalid);
895 expectTrusted(lists.at(4));
896 expectUntrusted(lists.at(7));
897 expectUntrusted(lists.at(8));
902 trustedKeys->updateTrusted(
907 env.app().getHashRouter());
909 expectUntrusted(lists.at(3));
910 expectTrusted(lists.at(6));
917 {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
923 env.timeKeeper().set(effective8);
924 trustedKeys->updateTrusted(
929 env.app().getHashRouter());
931 expectUntrusted(lists.at(6));
932 expectUntrusted(lists.at(7));
933 expectTrusted(lists.at(8));
935 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
941 auto const sig8_2 = signList(blob8, pubSigningKeys2);
944 trustedKeys->applyLists(
947 {{blob8, sig8, manifest1}, {blob8, sig8_2, {}}},
950 ListDisposition::invalid,
951 ListDisposition::same_sequence);
953 expectTrusted(lists.at(8));
955 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
959 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
961 makeRevocationString(publisherPublic, publisherSecret));
963 auto const sequence9 = 9;
964 auto const blob9 = makeList(
965 lists.at(9), sequence9, validUntil.time_since_epoch().count());
966 auto const sig9 = signList(blob9, signingKeysMax);
969 trustedKeys->applyLists(
970 maxManifest, version, {{blob9, sig9, {}}}, siteUri),
972 ListDisposition::untrusted,
973 ListDisposition::untrusted);
975 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
976 for (
auto const& [num, list] : lists)
979 expectUntrusted(list);
982 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
988 testcase(
"GetAvailable");
989 using namespace std::chrono_literals;
995 auto& app = env.
app();
996 auto trustedKeys = std::make_unique<ValidatorList>(
1000 app.config().legacy(
"database_path"),
1004 auto const publisherPublic =
1006 const auto hexPublic =
1007 strHex(publisherPublic.begin(), publisherPublic.end());
1008 auto const pubSigningKeys1 =
randomKeyPair(KeyType::secp256k1);
1012 pubSigningKeys1.first,
1013 pubSigningKeys1.second,
1019 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys1));
1022 auto constexpr listSize = 20;
1025 while (list.
size() < listSize)
1035 auto const sig = signList(blob, pubSigningKeys1);
1039 auto const available = trustedKeys->getAvailable(hexPublic);
1044 trustedKeys->applyLists(
manifest, 1, {{blob, sig, {}}}, siteUri)
1045 .bestDisposition() == ListDisposition::accepted);
1050 trustedKeys->getAvailable(hexPublic +
"invalid", 1);
1051 BEAST_EXPECT(!available);
1058 const auto hexBad =
strHex(badPublic.begin(), badPublic.end());
1060 auto const available = trustedKeys->getAvailable(hexBad, 1);
1061 BEAST_EXPECT(!available);
1065 auto const available = trustedKeys->getAvailable(hexPublic, 0);
1066 if (BEAST_EXPECT(available))
1068 auto const& a = *available;
1074 auto const available = trustedKeys->getAvailable(hexPublic, 3);
1075 if (BEAST_EXPECT(available))
1083 auto const available = trustedKeys->getAvailable(hexPublic, 1);
1084 if (BEAST_EXPECT(available))
1087 BEAST_EXPECT(a[jss::public_key] == hexPublic);
1088 BEAST_EXPECT(a[jss::manifest] == manifest);
1089 BEAST_EXPECT(a[jss::version] == 1);
1091 BEAST_EXPECT(a[jss::blob] == blob);
1092 BEAST_EXPECT(a[jss::signature] == sig);
1093 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
1099 auto const available = trustedKeys->getAvailable(hexPublic, 2);
1100 if (BEAST_EXPECT(available))
1103 BEAST_EXPECT(a[jss::public_key] == hexPublic);
1104 BEAST_EXPECT(a[jss::manifest] == manifest);
1105 BEAST_EXPECT(a[jss::version] == 2);
1107 if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
1109 BEAST_EXPECT(!a.isMember(jss::blob));
1110 BEAST_EXPECT(!a.isMember(jss::signature));
1111 auto const& blobs_v2 = a[jss::blobs_v2];
1112 BEAST_EXPECT(blobs_v2.isArray() && blobs_v2.size() == 1);
1114 BEAST_EXPECT(blobs_v2[0u][jss::blob] == blob);
1115 BEAST_EXPECT(blobs_v2[0u][jss::signature] == sig);
1124 testcase(
"Update trusted");
1126 std::string const siteUri =
"testUpdateTrusted.test";
1130 auto& app = env.
app();
1131 auto trustedKeysOuter = std::make_unique<ValidatorList>(
1135 app.config().legacy(
"database_path"),
1147 while (cfgKeys.
size() != maxKeys)
1149 auto const valKey = randomNode();
1151 if (cfgKeys.
size() <= maxKeys - 5)
1158 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1162 TrustChanges changes = trustedKeysOuter->updateTrusted(
1163 activeValidatorsOuter,
1169 for (
auto const& val : unseenValidators)
1170 activeValidatorsOuter.
emplace(val);
1172 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1173 BEAST_EXPECT(changes.
removed.empty());
1175 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1176 for (
auto const& val : cfgKeys)
1178 if (
auto const valKey =
1179 parseBase58<PublicKey>(TokenType::NodePublic, val))
1181 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1182 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1188 changes = trustedKeysOuter->updateTrusted(
1189 activeValidatorsOuter,
1194 BEAST_EXPECT(changes.
added.empty());
1195 BEAST_EXPECT(changes.
removed.empty());
1197 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1202 auto const masterPublic =
1206 {
toBase58(TokenType::NodePublic, masterPublic)});
1209 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1211 auto const signingKeys1 =
randomKeyPair(KeyType::secp256k1);
1212 auto const signingPublic1 = signingKeys1.first;
1216 TrustChanges changes = trustedKeysOuter->updateTrusted(
1217 activeValidatorsOuter,
1222 BEAST_EXPECT(changes.
added == asNodeIDs({masterPublic}));
1223 BEAST_EXPECT(changes.
removed.empty());
1225 trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1226 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1227 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1228 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1229 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1236 signingKeys1.second,
1241 ManifestDisposition::accepted);
1242 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1243 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1244 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1245 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1249 auto const signingKeys2 =
randomKeyPair(KeyType::secp256k1);
1250 auto const signingPublic2 = signingKeys2.first;
1255 signingKeys2.second,
1259 ManifestDisposition::accepted);
1260 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1261 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1262 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1263 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1264 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1265 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1268 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
1269 auto const signingPublicMax = signingKeysMax.first;
1272 makeRevocationString(masterPublic, masterPrivate));
1274 BEAST_EXPECT(mMax->revoked());
1277 ManifestDisposition::accepted);
1279 manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1280 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1283 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1284 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1286 changes = trustedKeysOuter->updateTrusted(
1287 activeValidatorsOuter,
1292 BEAST_EXPECT(changes.
removed == asNodeIDs({masterPublic}));
1293 BEAST_EXPECT(changes.
added.empty());
1295 trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1296 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1297 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1298 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1299 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1300 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1301 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1302 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1303 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1308 auto trustedKeys = std::make_unique<ValidatorList>(
1312 app.config().legacy(
"database_path"),
1315 auto const publisherPublic =
1321 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1324 activeValidatorsOuter,
1329 BEAST_EXPECT(changes.
removed.empty());
1330 BEAST_EXPECT(changes.
added.empty());
1332 trustedKeys->quorum() ==
1338 auto trustedKeys = std::make_unique<ValidatorList>(
1342 app.config().legacy(
"database_path"),
1345 auto const masterPublic =
1348 {
toBase58(TokenType::NodePublic, masterPublic)});
1351 auto const publisher1Public =
1354 auto const publisher2Public =
1360 trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1363 activeValidatorsOuter,
1368 BEAST_EXPECT(changes.
removed.empty());
1369 BEAST_EXPECT(changes.
added.size() == 1);
1370 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1371 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1377 auto trustedKeys = std::make_unique<ValidatorList>(
1381 app.config().legacy(
"database_path"),
1392 while (cfgKeys.
size() < n)
1394 auto const valKey = randomNode();
1403 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1411 BEAST_EXPECT(changes.
removed.empty());
1412 BEAST_EXPECT(changes.
added == expectedTrusted);
1413 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1416 activeValidators.
emplace(toBeSeen);
1417 changes = trustedKeys->updateTrusted(
1423 BEAST_EXPECT(changes.
removed.empty());
1424 BEAST_EXPECT(changes.
added.empty());
1425 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1429 auto trustedKeys = std::make_unique<ValidatorList>(
1433 app.config().legacy(
"database_path"),
1437 auto const publisherKeys =
randomKeyPair(KeyType::secp256k1);
1438 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1440 publisherKeys.first,
1441 publisherKeys.second,
1442 pubSigningKeys.first,
1443 pubSigningKeys.second,
1448 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys));
1452 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1455 auto const version = 1;
1456 auto const sequence = 1;
1457 using namespace std::chrono_literals;
1462 auto const sig = signList(blob, pubSigningKeys);
1465 ListDisposition::accepted ==
1467 ->applyLists(
manifest, version, {{blob,
sig, {}}}, siteUri)
1468 .bestDisposition());
1476 BEAST_EXPECT(changes.
removed.empty());
1477 BEAST_EXPECT(changes.
added == activeValidators);
1480 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1481 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1483 BEAST_EXPECT(trustedKeys->quorum() == 2);
1486 changes = trustedKeys->updateTrusted(
1492 BEAST_EXPECT(changes.
removed == activeValidators);
1493 BEAST_EXPECT(changes.
added.empty());
1494 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1495 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1497 trustedKeys->quorum() ==
1503 auto const sequence2 = 2;
1506 auto const blob2 = makeList(
1508 auto const sig2 = signList(blob2, pubSigningKeys);
1511 ListDisposition::accepted ==
1514 manifest, version, {{blob2, sig2, {}}}, siteUri)
1515 .bestDisposition());
1517 changes = trustedKeys->updateTrusted(
1523 BEAST_EXPECT(changes.
removed.empty());
1526 asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1529 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1530 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1532 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1533 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1534 BEAST_EXPECT(trustedKeys->quorum() == 2);
1538 auto trustedKeys = std::make_unique<ValidatorList>(
1542 app.config().legacy(
"database_path"),
1554 auto const valKey = randomNode();
1558 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1565 BEAST_EXPECT(changes.
removed.empty());
1566 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1569 for (
auto const& key : activeKeys)
1570 BEAST_EXPECT(trustedKeys->trusted(key));
1575 auto trustedKeys = std::make_unique<ValidatorList>(
1579 app.config().legacy(
"database_path"),
1582 auto const localKey = randomNode();
1587 toBase58(TokenType::NodePublic, localKey)};
1590 while (cfgKeys.size() < cfgKeys.capacity())
1592 auto const valKey = randomNode();
1593 cfgKeys.push_back(
toBase58(TokenType::NodePublic, valKey));
1598 trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1605 BEAST_EXPECT(changes.
removed.empty());
1606 if (cfgKeys.size() > 2)
1607 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1610 changes.
added == asNodeIDs({localKey, valKey}));
1613 trustedKeys->quorum() ==
std::ceil(cfgKeys.size() * 0.8f));
1615 for (
auto const& key : activeKeys)
1616 BEAST_EXPECT(trustedKeys->trusted(key));
1622 auto trustedKeys = std::make_unique<ValidatorList>(
1626 app.config().legacy(
"database_path"),
1633 while (valKeys.
size() != maxKeys)
1643 constexpr static int publishers = 3;
1646 decltype(valKeys)::const_iterator,
1655 auto addPublishedList = [&,
this](
int i) {
1657 auto const publisherPublic =
1659 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1663 pubSigningKeys.first,
1664 pubSigningKeys.second,
1668 {
strHex(publisherPublic)});
1672 BEAST_EXPECT(trustedKeys->load(
1673 {}, emptyCfgKeys, cfgPublishers,
std::size_t(1)));
1675 auto const version = 1;
1676 auto const sequence = 1;
1677 using namespace std::chrono_literals;
1681 locals[i].first, locals[i].second};
1682 auto const blob = makeList(
1684 auto const sig = signList(blob, pubSigningKeys);
1687 ListDisposition::accepted ==
1691 .bestDisposition());
1695 for (
auto i = 0; i < publishers; ++i)
1696 addPublishedList(i);
1697 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1710 for (
auto const& val : valKeys)
1712 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1715 BEAST_EXPECT(changes.
added == added);
1716 BEAST_EXPECT(changes.
removed.empty());
1721 auto trustedKeys = std::make_unique<ValidatorList>(
1725 app.config().legacy(
"database_path"),
1732 while (valKeys.
size() != maxKeys)
1744 constexpr static int publishers = 3;
1747 decltype(valKeys)::const_iterator,
1756 auto addPublishedList = [&,
this](
1761 auto const publisherPublic =
1763 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1767 pubSigningKeys.first,
1768 pubSigningKeys.second,
1772 {
strHex(publisherPublic)});
1776 trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1778 auto const version = 1;
1779 auto const sequence = 1;
1780 using namespace std::chrono_literals;
1787 validUntil1 = validUntil;
1789 validUntil2 = validUntil;
1791 locals[i].first, locals[i].second};
1792 auto const blob = makeList(
1794 auto const sig = signList(blob, pubSigningKeys);
1797 ListDisposition::accepted ==
1801 .bestDisposition());
1807 for (
auto i = 0; i < publishers; ++i)
1808 addPublishedList(i, validUntil1, validUntil2);
1809 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1819 trustedKeys->quorum() ==
1822 for (
auto const& val : valKeys)
1823 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1828 auto const& val = valKeys[i];
1829 if (i >= 1 && i < maxKeys - 2)
1831 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1835 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1837 BEAST_EXPECT(changes.
added == added);
1838 BEAST_EXPECT(changes.
removed.empty());
1842 changes = trustedKeys->updateTrusted(
1850 trustedKeys->quorum() ==
1853 for (
auto const& val : valKeys)
1854 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1859 auto const& val = valKeys[i];
1860 if (i >= 2 && i < maxKeys - 4)
1861 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1864 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1865 if (i >= 1 && i < maxKeys - 2)
1870 BEAST_EXPECT(changes.
added.empty());
1871 BEAST_EXPECT(changes.
removed == removed);
1875 changes = trustedKeys->updateTrusted(
1883 trustedKeys->quorum() ==
1889 auto const& val = valKeys[i];
1890 if (i < maxKeys - 4)
1891 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1893 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1895 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1896 if (i >= 2 && i < maxKeys - 4)
1900 BEAST_EXPECT(changes.
added.empty());
1901 BEAST_EXPECT(changes.
removed == removed);
1908 testcase(
"Expires");
1913 auto& app = env.
app();
1915 auto toStr = [](
PublicKey const& publicKey) {
1916 return toBase58(TokenType::NodePublic, publicKey);
1922 auto trustedKeys = std::make_unique<ValidatorList>(
1926 app.config().legacy(
"database_path"),
1930 BEAST_EXPECT(trustedKeys->expires() == std::nullopt);
1933 PublicKey localCfgListed = randomNode();
1934 trustedKeys->load({}, {toStr(localCfgListed)}, {});
1936 trustedKeys->expires() &&
1937 trustedKeys->expires().value() == NetClock::time_point::max());
1938 BEAST_EXPECT(trustedKeys->listed(localCfgListed));
1944 auto trustedKeys = std::make_unique<ValidatorList>(
1948 app.config().legacy(
"database_path"),
1965 using namespace std::chrono_literals;
1966 auto addPublishedList = [
this, &env, &trustedKeys, &validators]() {
1968 auto const publisherPublic =
1970 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1974 pubSigningKeys.first,
1975 pubSigningKeys.second,
1979 {
strHex(publisherPublic)});
1983 trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1985 auto const version = 2;
1986 auto const sequence1 = 1;
1989 auto const blob1 = makeList(
1993 auto const sig1 = signList(blob1, pubSigningKeys);
1997 auto const sequence2 = 2;
1998 auto const blob2 = makeList(
2003 auto const sig2 = signList(blob2, pubSigningKeys);
2005 return PreparedList{
2008 {{blob1, sig1, {}}, {blob2, sig2, {}}},
2010 {expiration1, expiration2}};
2014 PreparedList prep1 = addPublishedList();
2016 PreparedList prep2 = addPublishedList();
2019 BEAST_EXPECT(trustedKeys->expires() == std::nullopt);
2023 trustedKeys->applyLists(
2024 prep1.manifest, prep1.version, prep1.blobs, siteUri),
2025 prep1.publisherPublic,
2026 ListDisposition::pending,
2027 ListDisposition::accepted);
2031 BEAST_EXPECT(trustedKeys->expires() == std::nullopt);
2035 trustedKeys->applyLists(
2036 prep2.manifest, prep2.version, prep2.blobs, siteUri),
2037 prep2.publisherPublic,
2038 ListDisposition::pending,
2039 ListDisposition::accepted);
2042 trustedKeys->expires() &&
2043 trustedKeys->expires().value() == prep1.expirations.back());
2049 auto changes = trustedKeys->updateTrusted(
2056 trustedKeys->expires() &&
2057 trustedKeys->expires().value() == prep1.expirations.back());
2058 BEAST_EXPECT(!changes.added.empty());
2059 BEAST_EXPECT(changes.removed.empty());
2066 auto changes = trustedKeys->updateTrusted(
2073 trustedKeys->expires() &&
2074 trustedKeys->expires().value() == prep1.expirations.back());
2075 BEAST_EXPECT(changes.added.empty());
2076 BEAST_EXPECT(changes.removed.empty());
2084 testcase(
"NegativeUNL");
2088 auto createValidatorList =
2092 auto trustedKeys = std::make_shared<ValidatorList>(
2106 auto const valKey = randomNode();
2110 if (trustedKeys->load({}, cfgKeys, cfgPublishers))
2112 trustedKeys->updateTrusted(
2118 if (minimumQuorum == trustedKeys->quorum() ||
2144 for (
auto us : unlSizes)
2146 for (
auto np : nUnlPercent)
2148 auto validators = createValidatorList(us);
2149 BEAST_EXPECT(validators);
2153 auto unl = validators->getTrustedMasterKeys();
2155 auto it = unl.
begin();
2161 validators->setNegativeUNL(nUnl);
2162 validators->updateTrusted(
2169 validators->quorum() ==
2171 std::max((us - nUnlSize) * 0.8f, us * 0.6f))));
2179 auto validators = createValidatorList(60);
2180 BEAST_EXPECT(validators);
2184 auto unl = validators->getTrustedMasterKeys();
2185 BEAST_EXPECT(unl.size() == 60);
2192 auto it = unl.
begin();
2198 validators->setNegativeUNL(nUnl);
2199 auto nUnl_temp = validators->getNegativeUNL();
2200 if (nUnl_temp.size() == nUnl.
size())
2202 for (
auto& n : nUnl_temp)
2204 if (nUnl.
find(n) == nUnl.
end())
2207 validators->updateTrusted(
2213 return validators->quorum() == quorum;
2217 BEAST_EXPECT(nUnlChange(0, 48));
2218 BEAST_EXPECT(nUnlChange(30, 36));
2219 BEAST_EXPECT(nUnlChange(18, 36));
2220 BEAST_EXPECT(nUnlChange(12, 39));
2226 auto nUnl = validators->getNegativeUNL();
2227 BEAST_EXPECT(nUnl.size() == 12);
2231 for (
int i = 0; i < 6; ++i)
2233 Slice s(data.data(), ss);
2237 validators->setNegativeUNL(nUnl);
2238 validators->updateTrusted(
2244 BEAST_EXPECT(validators->quorum() == 39);
2253 auto validators = createValidatorList(60, 30);
2254 BEAST_EXPECT(validators);
2259 auto it = unl.
begin();
2265 validators->updateTrusted(
2271 BEAST_EXPECT(validators->quorum() == 30);
2279 validators->setNegativeUNL(nUnl);
2280 validators->updateTrusted(
2286 BEAST_EXPECT(validators->quorum() == 30);
2294 testcase(
"Sha512 hashing");
2299 std::string const blob =
"This is not really a blob";
2300 std::string const signature =
"This is not really a signature";
2304 BEAST_EXPECT(!!global);
2307 blobVector[0].blob = blob;
2308 blobVector[0].signature = signature;
2310 BEAST_EXPECT(global !=
sha512Half(signature, blobVector, version));
2314 {99, blobVector[0]}};
2316 BEAST_EXPECT(global !=
sha512Half(blob, blobMap, version));
2320 protocol::TMValidatorList msg1;
2322 msg1.set_blob(blob);
2323 msg1.set_signature(signature);
2324 msg1.set_version(version);
2326 msg1.set_signature(blob);
2331 protocol::TMValidatorListCollection msg2;
2333 msg2.set_version(version);
2334 auto& bi = *msg2.add_blobs();
2336 bi.set_signature(signature);
2346 testcase(
"Build and split messages");
2349 auto extractHeader = [
this](
Message& message) {
2350 auto const& buffer =
2351 message.getBuffer(compression::Compressed::Off);
2353 boost::beast::multi_buffer buffers;
2356 auto start = buffer.begin();
2357 auto end = buffer.end();
2359 buffers.commit(boost::asio::buffer_copy(
2360 buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
2362 boost::system::error_code ec;
2364 detail::parseMessageHeader(ec, buffers.data(), buffers.size());
2368 auto extractProtocolMessage1 = [
this,
2369 &extractHeader](
Message& message) {
2370 auto [header, buffers] = extractHeader(message);
2371 if (BEAST_EXPECT(header) &&
2372 BEAST_EXPECT(header->message_type == protocol::mtVALIDATORLIST))
2375 detail::parseMessageContent<protocol::TMValidatorList>(
2376 *header, buffers.data());
2382 auto extractProtocolMessage2 = [
this,
2383 &extractHeader](
Message& message) {
2384 auto [header, buffers] = extractHeader(message);
2385 if (BEAST_EXPECT(header) &&
2387 header->message_type ==
2388 protocol::mtVALIDATORLISTCOLLECTION))
2390 auto const msg = detail::parseMessageContent<
2391 protocol::TMValidatorListCollection>(
2392 *header, buffers.data());
2398 auto verifyMessage =
2401 &extractProtocolMessage1,
2402 &extractProtocolMessage2](
2405 auto const& blobInfos,
2406 auto const& messages,
2409 BEAST_EXPECT(messages.size() == expectedInfo.size());
2410 auto msgIter = expectedInfo.begin();
2411 for (
auto const& messageWithHash : messages)
2413 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2415 if (!BEAST_EXPECT(messageWithHash.message))
2417 auto const& expectedSeqs = msgIter->second;
2418 auto seqIter = expectedSeqs.begin();
2420 messageWithHash.message
2421 ->getBuffer(compression::Compressed::Off)
2424 BEAST_EXPECT(size == msgIter->first);
2425 if (expectedSeqs.size() == 1)
2428 extractProtocolMessage1(*messageWithHash.message);
2429 auto const expectedVersion = 1;
2430 if (BEAST_EXPECT(msg))
2432 BEAST_EXPECT(msg->version() == expectedVersion);
2433 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2435 auto const& expectedBlob = blobInfos.at(*seqIter);
2437 (*seqIter < manifestCutoff) ==
2438 !!expectedBlob.manifest);
2439 auto const expectedManifest =
2440 *seqIter < manifestCutoff &&
2441 expectedBlob.manifest
2442 ? *expectedBlob.manifest
2444 BEAST_EXPECT(msg->manifest() == expectedManifest);
2445 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2447 msg->signature() == expectedBlob.signature);
2449 BEAST_EXPECT(seqIter == expectedSeqs.end());
2452 messageWithHash.hash ==
2456 expectedBlob.signature,
2463 hashingBlobs.
reserve(msgIter->second.size());
2466 extractProtocolMessage2(*messageWithHash.message);
2467 if (BEAST_EXPECT(msg))
2469 BEAST_EXPECT(msg->version() == version);
2470 BEAST_EXPECT(msg->manifest() ==
manifest);
2471 for (
auto const& blobInfo : msg->blobs())
2474 seqIter != expectedSeqs.end()))
2476 auto const& expectedBlob =
2477 blobInfos.at(*seqIter);
2480 blobInfo.has_manifest() ==
2481 !!expectedBlob.manifest);
2483 blobInfo.has_manifest() ==
2484 (*seqIter < manifestCutoff));
2486 if (*seqIter < manifestCutoff)
2488 blobInfo.manifest() ==
2489 *expectedBlob.manifest);
2491 blobInfo.blob() == expectedBlob.blob);
2493 blobInfo.signature() ==
2494 expectedBlob.signature);
2497 BEAST_EXPECT(seqIter == expectedSeqs.end());
2500 messageWithHash.hash ==
2505 BEAST_EXPECT(msgIter == expectedInfo.end());
2507 auto verifyBuildMessages =
2512 BEAST_EXPECT(result.
first == expectedSequence);
2513 BEAST_EXPECT(result.
second == expectedSize);
2519 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2522 for (
auto seq : {5, 6, 7, 10, 12})
2526 s <<
"This is not a blob with sequence " <<
seq;
2529 s <<
"This is not a signature for sequence " <<
seq;
2530 b.signature = s.
str();
2531 if (
seq < manifestCutoff)
2535 s <<
"This is not manifest " <<
seq;
2536 b.manifest = s.
str();
2541 auto const maxSequence = blobInfos.
rbegin()->first;
2542 BEAST_EXPECT(maxSequence == 12);
2549 verifyBuildMessages(
2550 ValidatorList::buildValidatorListMessages(
2551 1, 8, maxSequence, version,
manifest, blobInfos, messages),
2554 BEAST_EXPECT(messages.size() == 0);
2560 messages.emplace_back();
2561 verifyBuildMessages(
2562 ValidatorList::buildValidatorListMessages(
2563 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2566 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2570 verifyBuildMessages(
2571 ValidatorList::buildValidatorListMessages(
2572 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2575 if (BEAST_EXPECT(messages.size() == 1) &&
2576 BEAST_EXPECT(messages.front().message))
2578 auto const& messageWithHash = messages.front();
2579 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2581 messageWithHash.message->getBuffer(compression::Compressed::Off)
2584 BEAST_EXPECT(size == 108);
2585 auto const& expected = blobInfos.at(5);
2586 if (BEAST_EXPECT(msg))
2588 BEAST_EXPECT(msg->version() == 1);
2589 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2590 BEAST_EXPECT(msg->blob() == expected.blob);
2591 BEAST_EXPECT(msg->signature() == expected.signature);
2594 messageWithHash.hash ==
2596 *expected.manifest, expected.blob, expected.signature, 1));
2604 verifyBuildMessages(
2605 ValidatorList::buildValidatorListMessages(
2615 BEAST_EXPECT(messages.size() == 0);
2621 messages.emplace_back();
2622 verifyBuildMessages(
2623 ValidatorList::buildValidatorListMessages(
2624 2, 3, maxSequence, version,
manifest, blobInfos, messages),
2627 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2631 verifyBuildMessages(
2632 ValidatorList::buildValidatorListMessages(
2633 2, 5, maxSequence, version,
manifest, blobInfos, messages),
2637 version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2643 verifyBuildMessages(
2644 ValidatorList::buildValidatorListMessages(
2645 2, 5, maxSequence, version,
manifest, blobInfos, messages, 300),
2653 {{212, {6, 7}}, {192, {10, 12}}});
2658 verifyBuildMessages(
2659 ValidatorList::buildValidatorListMessages(
2660 2, 5, maxSequence, version,
manifest, blobInfos, messages, 200),
2668 {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2672 verifyBuildMessages(
2673 ValidatorList::buildValidatorListMessages(
2674 2, 5, maxSequence, version,
manifest, blobInfos, messages, 150),
2682 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2687 verifyBuildMessages(
2688 ValidatorList::buildValidatorListMessages(
2689 2, 5, maxSequence, version,
manifest, blobInfos, messages, 108),
2697 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2703 testcase(
"Test quorum disabled");
2705 std::string const siteUri =
"testQuorumDisabled.test";
2707 auto& app = env.
app();
2712 while (valKeys.
size() != maxKeys)
2729 auto makeValidatorList = [&,
this](
2738 auto result = std::make_unique<ValidatorList>(
2742 app.config().legacy(
"database_path"),
2749 auto const publisherPublic =
2751 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
2759 pubSigningKeys.first,
2760 pubSigningKeys.second,
2761 i < countRevoked ?
revoked : 1));
2762 publishers.push_back(Publisher{
2771 listThreshold > 0 ?
std::optional(listThreshold) : std::nullopt;
2774 valManifests.applyManifest(
2776 BEAST_EXPECT(result->load(
2777 self->signingPublic,
2785 result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2790 using namespace std::chrono_literals;
2792 (i == countTotal - 1 ? 60s : 3600s);
2793 auto const blob = makeList(
2796 publishers[i].expiry.time_since_epoch().count());
2797 auto const sig = signList(blob, publishers[i].signingKeys);
2806 .bestDisposition() ==
2807 (publishers[i].
revoked ? ListDisposition::untrusted
2808 : ListDisposition::accepted));
2822 auto const self = randomValidator();
2823 auto const keysTotal = valKeys.
size() + 1;
2824 auto trustedKeys = makeValidatorList(
2832 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2833 for (
auto const& p : publishers)
2834 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2842 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2844 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2848 for (
auto const& val : valKeys)
2850 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2853 BEAST_EXPECT(changes.
added == added);
2854 BEAST_EXPECT(changes.
removed.empty());
2858 changes = trustedKeys->updateTrusted(
2864 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2865 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2868 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2869 for (
auto const& val : valKeys)
2871 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2872 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2875 BEAST_EXPECT(changes.
added.empty());
2876 BEAST_EXPECT(changes.
removed == removed);
2883 auto const keysTotal = valKeys.
size();
2884 auto trustedKeys = makeValidatorList(
2892 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2893 for (
auto const& p : publishers)
2894 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2902 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2904 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2907 for (
auto const& val : valKeys)
2909 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2912 BEAST_EXPECT(changes.
added == added);
2913 BEAST_EXPECT(changes.
removed.empty());
2917 changes = trustedKeys->updateTrusted(
2923 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2924 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2927 for (
auto const& val : valKeys)
2929 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2930 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2933 BEAST_EXPECT(changes.
added.empty());
2934 BEAST_EXPECT(changes.
removed == removed);
2942 auto const self = valKeys[1];
2943 auto const keysTotal = valKeys.
size();
2944 auto trustedKeys = makeValidatorList(
2952 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2953 int untrustedCount = 0;
2954 for (
auto const& p : publishers)
2956 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2957 BEAST_EXPECT(p.revoked ^ trusted);
2958 untrustedCount += trusted ? 0 : 1;
2960 BEAST_EXPECT(untrustedCount == 1);
2968 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2970 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2973 for (
auto const& val : valKeys)
2975 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2978 BEAST_EXPECT(changes.
added == added);
2979 BEAST_EXPECT(changes.
removed.empty());
2983 changes = trustedKeys->updateTrusted(
2989 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2990 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2993 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2994 for (
auto const& val : valKeys)
2996 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2997 if (val.masterPublic != self.masterPublic)
2999 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3003 BEAST_EXPECT(changes.
added.empty());
3004 BEAST_EXPECT(changes.
removed == removed);
3012 auto const self = randomValidator();
3013 auto const keysTotal = valKeys.
size() + 1;
3014 auto trustedKeys = makeValidatorList(
3022 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3023 int untrustedCount = 0;
3024 for (
auto const& p : publishers)
3026 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3027 BEAST_EXPECT(p.revoked ^ trusted);
3028 untrustedCount += trusted ? 0 : 1;
3030 BEAST_EXPECT(untrustedCount == 2);
3038 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3040 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3044 for (
auto const& val : valKeys)
3046 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3049 BEAST_EXPECT(changes.
added == added);
3050 BEAST_EXPECT(changes.
removed.empty());
3054 changes = trustedKeys->updateTrusted(
3060 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3061 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3064 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3065 for (
auto const& val : valKeys)
3067 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3068 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3071 BEAST_EXPECT(changes.
added.empty());
3072 BEAST_EXPECT(changes.
removed == removed);
3080 auto const self = valKeys[5];
3081 auto const keysTotal = valKeys.
size();
3082 auto trustedKeys = makeValidatorList(
3090 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3091 int untrustedCount = 0;
3092 for (
auto const& p : publishers)
3094 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3095 BEAST_EXPECT(p.revoked ^ trusted);
3096 untrustedCount += trusted ? 0 : 1;
3098 BEAST_EXPECT(untrustedCount == 2);
3106 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3108 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3111 for (
auto const& val : valKeys)
3113 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3116 BEAST_EXPECT(changes.
added == added);
3117 BEAST_EXPECT(changes.
removed.empty());
3121 changes = trustedKeys->updateTrusted(
3127 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3128 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3131 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3132 for (
auto const& val : valKeys)
3134 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3135 if (val.masterPublic != self.masterPublic)
3137 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3141 BEAST_EXPECT(changes.
added.empty());
3142 BEAST_EXPECT(changes.
removed == removed);
3149 auto const keysTotal = valKeys.
size();
3150 auto trustedKeys = makeValidatorList(
3158 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3159 int untrustedCount = 0;
3160 for (
auto const& p : publishers)
3162 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3163 BEAST_EXPECT(p.revoked ^ trusted);
3164 untrustedCount += trusted ? 0 : 1;
3166 BEAST_EXPECT(untrustedCount == 2);
3174 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3176 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3179 for (
auto const& val : valKeys)
3181 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3184 BEAST_EXPECT(changes.
added == added);
3185 BEAST_EXPECT(changes.
removed.empty());
3189 changes = trustedKeys->updateTrusted(
3195 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3196 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3199 for (
auto const& val : valKeys)
3201 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3202 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3205 BEAST_EXPECT(changes.
added.empty());
3206 BEAST_EXPECT(changes.
removed == removed);
3214 auto const self = randomValidator();
3215 auto const keysTotal = valKeys.
size() + 1;
3216 auto trustedKeys = makeValidatorList(
3224 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3225 int untrustedCount = 0;
3226 for (
auto const& p : publishers)
3228 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3229 BEAST_EXPECT(p.revoked ^ trusted);
3230 untrustedCount += trusted ? 0 : 1;
3232 BEAST_EXPECT(untrustedCount == 1);
3240 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3242 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3246 for (
auto const& val : valKeys)
3248 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3251 BEAST_EXPECT(changes.
added == added);
3252 BEAST_EXPECT(changes.
removed.empty());
3256 changes = trustedKeys->updateTrusted(
3262 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3264 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3266 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3267 for (
auto const& val : valKeys)
3269 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3270 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3272 BEAST_EXPECT(changes.
added.empty());
3273 BEAST_EXPECT(changes.
removed.empty());
3281 auto const self = randomValidator();
3282 auto const keysTotal = valKeys.
size() + 1;
3283 auto trustedKeys = makeValidatorList(
3291 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3292 for (
auto const& p : publishers)
3293 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3301 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3303 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3307 for (
auto const& val : valKeys)
3309 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3312 BEAST_EXPECT(changes.
added == added);
3313 BEAST_EXPECT(changes.
removed.empty());
3317 changes = trustedKeys->updateTrusted(
3323 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3325 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3327 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3328 for (
auto const& val : valKeys)
3330 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3331 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3333 BEAST_EXPECT(changes.
added.empty());
3334 BEAST_EXPECT(changes.
removed.empty());
3342 auto const self = valKeys[7];
3343 auto const keysTotal = valKeys.
size();
3344 auto trustedKeys = makeValidatorList(
3352 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3353 for (
auto const& p : publishers)
3354 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3362 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3364 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3367 for (
auto const& val : valKeys)
3369 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3372 BEAST_EXPECT(changes.
added == added);
3373 BEAST_EXPECT(changes.
removed.empty());
3377 changes = trustedKeys->updateTrusted(
3383 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3385 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3387 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3388 for (
auto const& val : valKeys)
3390 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3391 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3393 BEAST_EXPECT(changes.
added.empty());
3394 BEAST_EXPECT(changes.
removed.empty());
3401 auto const keysTotal = valKeys.
size();
3402 auto trustedKeys = makeValidatorList(
3410 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3411 for (
auto const& p : publishers)
3412 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3420 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3422 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3425 for (
auto const& val : valKeys)
3427 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3430 BEAST_EXPECT(changes.
added == added);
3431 BEAST_EXPECT(changes.
removed.empty());
3435 changes = trustedKeys->updateTrusted(
3441 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3443 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3445 for (
auto const& val : valKeys)
3447 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3448 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3450 BEAST_EXPECT(changes.
added.empty());
3451 BEAST_EXPECT(changes.
removed.empty());
3461 auto const self = randomValidator();
3462 auto const keysTotal = valKeys.
size() + 1;
3463 auto trustedKeys = makeValidatorList(
3471 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3472 int untrustedCount = 0;
3473 for (
auto const& p : publishers)
3475 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3476 BEAST_EXPECT(p.revoked ^ trusted);
3477 untrustedCount += trusted ? 0 : 1;
3479 BEAST_EXPECT(untrustedCount == 1);
3487 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3489 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3493 for (
auto const& val : valKeys)
3495 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3498 BEAST_EXPECT(changes.
added == added);
3499 BEAST_EXPECT(changes.
removed.empty());
3503 changes = trustedKeys->updateTrusted(
3509 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3510 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3513 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3514 for (
auto const& val : valKeys)
3516 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3517 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3520 BEAST_EXPECT(changes.
added.empty());
3521 BEAST_EXPECT(changes.
removed == removed);
3529 auto const self = valKeys[5];
3530 auto const keysTotal = valKeys.
size();
3531 auto trustedKeys = makeValidatorList(
3539 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3540 int untrustedCount = 0;
3541 for (
auto const& p : publishers)
3543 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3544 BEAST_EXPECT(p.revoked ^ trusted);
3545 untrustedCount += trusted ? 0 : 1;
3547 BEAST_EXPECT(untrustedCount == 1);
3555 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3557 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3560 for (
auto const& val : valKeys)
3562 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3565 BEAST_EXPECT(changes.
added == added);
3566 BEAST_EXPECT(changes.
removed.empty());
3570 changes = trustedKeys->updateTrusted(
3576 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3577 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3580 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3581 for (
auto const& val : valKeys)
3583 if (val.masterPublic != self.masterPublic)
3585 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3586 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3590 BEAST_EXPECT(changes.
added.empty());
3591 BEAST_EXPECT(changes.
removed == removed);
3598 auto const keysTotal = valKeys.
size();
3599 auto trustedKeys = makeValidatorList(
3607 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3608 int untrustedCount = 0;
3609 for (
auto const& p : publishers)
3611 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3612 BEAST_EXPECT(p.revoked ^ trusted);
3613 untrustedCount += trusted ? 0 : 1;
3615 BEAST_EXPECT(untrustedCount == 1);
3623 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3625 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3628 for (
auto const& val : valKeys)
3630 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3633 BEAST_EXPECT(changes.
added == added);
3634 BEAST_EXPECT(changes.
removed.empty());
3638 changes = trustedKeys->updateTrusted(
3644 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3645 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3648 for (
auto const& val : valKeys)
3650 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3651 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3654 BEAST_EXPECT(changes.
added.empty());
3655 BEAST_EXPECT(changes.
removed == removed);
3663 auto const self = randomValidator();
3664 auto const keysTotal = valKeys.
size() + 1;
3665 auto trustedKeys = makeValidatorList(
3673 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3674 for (
auto const& p : publishers)
3675 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3683 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3685 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3689 for (
auto const& val : valKeys)
3691 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3694 BEAST_EXPECT(changes.
added == added);
3695 BEAST_EXPECT(changes.
removed.empty());
3699 changes = trustedKeys->updateTrusted(
3705 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3706 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3709 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3710 for (
auto const& val : valKeys)
3712 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3713 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3716 BEAST_EXPECT(changes.
added.empty());
3717 BEAST_EXPECT(changes.
removed == removed);
3725 auto const self = valKeys[5];
3726 auto const keysTotal = valKeys.
size();
3727 auto trustedKeys = makeValidatorList(
3735 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3736 for (
auto const& p : publishers)
3737 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3745 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3747 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3751 for (
auto const& val : valKeys)
3753 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3756 BEAST_EXPECT(changes.
added == added);
3757 BEAST_EXPECT(changes.
removed.empty());
3761 changes = trustedKeys->updateTrusted(
3767 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3768 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3771 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3772 for (
auto const& val : valKeys)
3774 if (val.masterPublic != self.masterPublic)
3776 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3777 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3781 BEAST_EXPECT(changes.
added.empty());
3782 BEAST_EXPECT(changes.
removed == removed);
3789 auto const keysTotal = valKeys.
size();
3790 auto trustedKeys = makeValidatorList(
3798 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3799 for (
auto const& p : publishers)
3800 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3808 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3810 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3813 for (
auto const& val : valKeys)
3815 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3818 BEAST_EXPECT(changes.
added == added);
3819 BEAST_EXPECT(changes.
removed.empty());
3823 changes = trustedKeys->updateTrusted(
3829 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3830 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3833 for (
auto const& val : valKeys)
3835 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3836 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3839 BEAST_EXPECT(changes.
added.empty());
3840 BEAST_EXPECT(changes.
removed == removed);
3850 auto const self = randomValidator();
3851 auto const keysTotal = valKeys.
size() + 1;
3852 auto trustedKeys = makeValidatorList(
3860 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3861 for (
auto const& p : publishers)
3862 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3870 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3872 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3876 for (
auto const& val : valKeys)
3878 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3881 BEAST_EXPECT(changes.
added == added);
3882 BEAST_EXPECT(changes.
removed.empty());
3886 changes = trustedKeys->updateTrusted(
3892 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3893 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3896 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3897 for (
auto const& val : valKeys)
3899 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3900 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3903 BEAST_EXPECT(changes.
added.empty());
3904 BEAST_EXPECT(changes.
removed == removed);
3914 auto const self = valKeys[2];
3915 auto const keysTotal = valKeys.
size();
3916 auto trustedKeys = makeValidatorList(
3924 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3925 for (
auto const& p : publishers)
3926 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3934 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3936 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3939 for (
auto const& val : valKeys)
3941 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3944 BEAST_EXPECT(changes.
added == added);
3945 BEAST_EXPECT(changes.
removed.empty());
3954 auto const keysTotal = valKeys.
size();
3955 auto trustedKeys = makeValidatorList(
3963 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3964 for (
auto const& p : publishers)
3965 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3973 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3975 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3978 for (
auto const& val : valKeys)
3980 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3983 BEAST_EXPECT(changes.
added == added);
3984 BEAST_EXPECT(changes.
removed.empty());
3994 auto const self = randomValidator();
3995 auto const keysTotal = valKeys.
size() + 1;
3996 auto trustedKeys = makeValidatorList(
4004 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4005 int untrustedCount = 0;
4006 for (
auto const& p : publishers)
4008 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4009 BEAST_EXPECT(p.revoked ^ trusted);
4010 untrustedCount += trusted ? 0 : 1;
4012 BEAST_EXPECT(untrustedCount == 2);
4020 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4022 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4026 for (
auto const& val : valKeys)
4028 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4031 BEAST_EXPECT(changes.
added == added);
4032 BEAST_EXPECT(changes.
removed.empty());
4036 changes = trustedKeys->updateTrusted(
4042 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4043 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4046 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4047 for (
auto const& val : valKeys)
4049 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4050 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4053 BEAST_EXPECT(changes.
added.empty());
4054 BEAST_EXPECT(changes.
removed == removed);
4064 auto const self = valKeys[2];
4065 auto const keysTotal = valKeys.
size();
4066 auto trustedKeys = makeValidatorList(
4074 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4075 int untrustedCount = 0;
4076 for (
auto const& p : publishers)
4078 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4079 BEAST_EXPECT(p.revoked ^ trusted);
4080 untrustedCount += trusted ? 0 : 1;
4082 BEAST_EXPECT(untrustedCount == 3);
4090 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4092 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4095 for (
auto const& val : valKeys)
4097 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4100 BEAST_EXPECT(changes.
added == added);
4101 BEAST_EXPECT(changes.
removed.empty());
4105 changes = trustedKeys->updateTrusted(
4111 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4112 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4115 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4116 for (
auto const& val : valKeys)
4118 if (val.masterPublic != self.masterPublic)
4120 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4121 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4125 BEAST_EXPECT(changes.
added.empty());
4126 BEAST_EXPECT(changes.
removed == removed);
4134 testGenesisQuorum();
4138 testUpdateTrusted();
4142 testBuildMessages();
4143 testQuorumDisabled();
testcase_t testcase
Memberspace for declaring test cases.
virtual Config & config()=0
virtual Overlay & overlay()=0
virtual TimeKeeper & timeKeeper()=0
virtual NetworkOPs & getOPs()=0
virtual HashRouter & getHashRouter()=0
void legacy(std::string const §ion, std::string value)
Set a value that is not a key/value pair.
Remembers manifests with the highest sequence number.
std::optional< PublicKey > getSigningKey(PublicKey const &pk) const
Returns master key's current signing key.
bool revoked(PublicKey const &pk) const
Returns true if master key has been revoked in a manifest.
ManifestDisposition applyManifest(Manifest m)
Add manifest to cache.
void add(Serializer &s) const override
std::size_t size() const noexcept
void const * data() const noexcept
An immutable linear range of bytes.
time_point now() const override
Returns the current time.
void run() override
Runs the suite.
static PublicKey randomMasterKey()
void testQuorumDisabled()
static hash_set< NodeID > asNodeIDs(std::initializer_list< PublicKey > const &pks)
void checkResult(ValidatorList::PublisherListStats const &result, PublicKey pubKey, ListDisposition expectedWorst, ListDisposition expectedBest)
static std::string makeRevocationString(PublicKey const &pk, SecretKey const &sk)
std::string makeList(std::vector< Validator > const &validators, std::size_t sequence, std::size_t validUntil, std::optional< std::size_t > validFrom={})
static std::string makeManifestString(PublicKey const &pk, SecretKey const &sk, PublicKey const &spk, SecretKey const &ssk, int seq)
static PublicKey randomNode()
std::string signList(std::string const &blob, std::pair< PublicKey, SecretKey > const &keys)
static Validator randomValidator()
A transaction testing environment.
beast::Journal const journal
ManualTimeKeeper & timeKeeper()
Set the regular signature on a JTx.
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
void sign(Json::Value &jv, Account const &account)
Sign automatically.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
std::optional< Manifest > deserializeManifest(Slice s, beast::Journal journal)
Constructs Manifest from serialized string.
std::string base64_decode(std::string_view data)
@ same_sequence
Same sequence as current list.
@ expired
List is expired, but has the largest non-pending sequence seen so far.
PublicKey derivePublicKey(KeyType type, SecretKey const &sk)
Derive the public key from a secret key.
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
std::string strHex(FwdIt begin, FwdIt end)
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
SecretKey randomSecretKey()
Create a secret key using secure random numbers.
std::string base64_encode(std::uint8_t const *data, std::size_t len)
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Changes in trusted nodes after updating validator list.
hash_set< NodeID > removed
Describes the result of processing a Validator List (UNL), including some of the information from the...
ListDisposition bestDisposition() const
ListDisposition worstDisposition() const
std::optional< PublicKey > publisherKey
Set the sequence number on a JTx.
T time_since_epoch(T... args)