20 #include <ripple/app/misc/ValidatorList.h>
21 #include <ripple/basics/Slice.h>
22 #include <ripple/basics/base64.h>
23 #include <ripple/basics/strHex.h>
24 #include <ripple/protocol/HashPrefix.h>
25 #include <ripple/protocol/PublicKey.h>
26 #include <ripple/protocol/SecretKey.h>
27 #include <ripple/protocol/Sign.h>
28 #include <ripple/protocol/digest.h>
134 for (
auto const& val : validators)
136 data +=
"{\"validation_public_key\":\"" +
strHex(val.masterPublic) +
137 "\",\"manifest\":\"" + val.manifest +
"\"},";
159 for (
auto const& pk : pks)
167 testcase(
"Genesis Quorum");
171 auto& app = env.
app();
173 auto trustedKeys = std::make_unique<ValidatorList>(
177 app.config().legacy(
"database_path"),
179 BEAST_EXPECT(trustedKeys->quorum() == 1);
183 auto trustedKeys = std::make_unique<ValidatorList>(
187 app.config().legacy(
"database_path"),
190 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
197 testcase(
"Config Load");
200 auto& app = env.
app();
206 auto const localSigningPublicOuter = localSigningKeys.first;
207 auto const localSigningSecret = localSigningKeys.second;
209 auto const localMasterPublic =
215 localSigningPublicOuter,
219 auto format = [](
PublicKey const& publicKey,
220 char const* comment =
nullptr) {
232 while (configList.
size() != 8)
237 {format(configList[0]),
238 format(configList[1],
" Comment"),
239 format(configList[2],
" Multi Word Comment"),
240 format(configList[3],
" Leading Whitespace"),
241 format(configList[4],
" Trailing Whitespace "),
242 format(configList[5],
" Leading & Trailing Whitespace "),
245 " Leading, Trailing & Internal Whitespace "),
246 format(configList[7],
" ")});
250 auto trustedKeys = std::make_unique<ValidatorList>(
254 app.config().legacy(
"database_path"),
258 BEAST_EXPECT(trustedKeys->load(
259 emptyLocalKey, emptyCfgKeys, emptyCfgPublishers));
262 BEAST_EXPECT(trustedKeys->load(
263 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
264 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
267 BEAST_EXPECT(trustedKeys->load(
268 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
270 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
271 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
276 auto trustedKeys = std::make_unique<ValidatorList>(
280 app.config().legacy(
"database_path"),
284 trustedKeys->load(emptyLocalKey, cfgKeys, emptyCfgPublishers));
286 for (
auto const& n : configList)
287 BEAST_EXPECT(trustedKeys->listed(n));
294 {format(masterNode1), format(masterNode2,
" Comment")});
295 BEAST_EXPECT(trustedKeys->load(
296 emptyLocalKey, cfgMasterKeys, emptyCfgPublishers));
297 BEAST_EXPECT(trustedKeys->listed(masterNode1));
298 BEAST_EXPECT(trustedKeys->listed(masterNode2));
301 BEAST_EXPECT(!trustedKeys->load(
302 emptyLocalKey, {
"NotAPublicKey"}, emptyCfgPublishers));
303 BEAST_EXPECT(!trustedKeys->load(
305 {format(randomNode(),
"!")},
306 emptyCfgPublishers));
310 BEAST_EXPECT(!trustedKeys->load(
312 {format(randomNode(),
"!"), format(goodKey)},
313 emptyCfgPublishers));
314 BEAST_EXPECT(!trustedKeys->listed(goodKey));
319 auto trustedKeys = std::make_unique<ValidatorList>(
323 app.config().legacy(
"database_path"),
326 auto const localSigningPublic =
329 BEAST_EXPECT(trustedKeys->load(
330 *localSigningPublic, cfgKeys, emptyCfgPublishers));
332 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
333 BEAST_EXPECT(trustedKeys->listed(*localSigningPublic));
334 for (
auto const& n : configList)
335 BEAST_EXPECT(trustedKeys->listed(n));
340 auto trustedKeys = std::make_unique<ValidatorList>(
344 app.config().legacy(
"database_path"),
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"),
368 BEAST_EXPECT(trustedKeys->load(
369 localSigningPublicOuter, cfgKeys, emptyCfgPublishers));
371 BEAST_EXPECT(trustedKeys->localPublicKey() == localMasterPublic);
372 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
373 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
374 for (
auto const& n : configList)
375 BEAST_EXPECT(trustedKeys->listed(n));
379 auto trustedKeys = std::make_unique<ValidatorList>(
383 app.config().legacy(
"database_path"),
389 !trustedKeys->load(emptyLocalKey, emptyCfgKeys, badPublishers));
395 badPublishers.
clear();
396 for (
auto const& key : keys)
400 !trustedKeys->load(emptyLocalKey, emptyCfgKeys, badPublishers));
401 for (
auto const& key : keys)
402 BEAST_EXPECT(!trustedKeys->trustedPublisher(key));
406 for (
auto const& key : keys)
410 trustedKeys->load(emptyLocalKey, emptyCfgKeys, cfgPublishers));
411 for (
auto const& key : keys)
412 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
419 auto trustedKeys = std::make_unique<ValidatorList>(
423 app.config().legacy(
"database_path"),
427 auto const pubRevokedPublic =
435 pubRevokedSigning.first,
436 pubRevokedSigning.second,
445 trustedKeys->load(emptyLocalKey, emptyCfgKeys, cfgPublishers));
447 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
448 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey));
455 testcase(
"Apply list");
461 auto& app = env.
app();
462 auto trustedKeys = std::make_unique<ValidatorList>(
466 app.config().legacy(
"database_path"),
470 auto const publisherPublic =
476 pubSigningKeys1.first,
477 pubSigningKeys1.second,
484 BEAST_EXPECT(trustedKeys->load(emptyLocalKey, emptyCfgKeys, cfgKeys1));
486 auto constexpr listSize = 20;
489 while (list1.
size() < listSize)
494 while (list2.
size() < listSize)
498 auto const version = 1;
499 auto const sequence = 1;
501 list1, sequence, env.
timeKeeper().
now().time_since_epoch().count());
502 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
508 manifest1, expiredblob, expiredSig, version, siteUri)
512 using namespace std::chrono_literals;
516 auto const sig1 =
signList(blob1, pubSigningKeys1);
520 trustedKeys->applyList(manifest1, blob1, sig1, version, siteUri)
523 for (
auto const& val : list1)
525 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
526 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
533 pubSigningKeys1.first,
534 pubSigningKeys1.second,
540 ->applyList(untrustedManifest, blob1, sig1, version, siteUri)
544 auto const badVersion = 666;
547 trustedKeys->applyList(manifest1, blob1, sig1, badVersion, siteUri)
551 auto const sequence2 = 2;
554 auto const sig2 =
signList(blob2, pubSigningKeys1);
558 trustedKeys->applyList(manifest1, blob2, sig2, version, siteUri)
561 for (
auto const& val : list1)
563 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
564 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
567 for (
auto const& val : list2)
569 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
570 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
576 trustedKeys->applyList(manifest1, blob1, sig1, version, siteUri)
581 trustedKeys->applyList(manifest1, blob2, sig2, version, siteUri)
589 pubSigningKeys2.first,
590 pubSigningKeys2.second,
593 auto const sequence3 = 3;
596 auto const sig3 =
signList(blob3, pubSigningKeys2);
600 trustedKeys->applyList(manifest2, blob3, sig3, version, siteUri)
603 auto const sequence4 = 4;
606 auto const badSig =
signList(blob4, pubSigningKeys1);
609 trustedKeys->applyList(manifest1, blob4, badSig, version, siteUri)
618 auto const sequence5 = 5;
621 auto const sig5 =
signList(blob5, signingKeysMax);
625 trustedKeys->applyList(maxManifest, blob5, sig5, version, siteUri)
628 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
629 for (
auto const& val : list1)
631 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
632 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
639 testcase(
"Update trusted");
641 std::string const siteUri =
"testUpdateTrusted.test";
646 auto& app = env.
app();
647 auto trustedKeysOuter = std::make_unique<ValidatorList>(
651 app.config().legacy(
"database_path"),
663 while (cfgKeys.
size() != maxKeys)
667 if (cfgKeys.
size() <= maxKeys - 5)
673 BEAST_EXPECT(trustedKeysOuter->load(
674 emptyLocalKeyOuter, cfgKeys, cfgPublishersOuter));
679 trustedKeysOuter->updateTrusted(activeValidatorsOuter);
681 for (
auto const& val : unseenValidators)
682 activeValidatorsOuter.
emplace(val);
684 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
685 BEAST_EXPECT(changes.
removed.empty());
687 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
688 for (
auto const& val : cfgKeys)
690 if (
auto const valKey =
693 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
694 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
700 changes = trustedKeysOuter->updateTrusted(activeValidatorsOuter);
701 BEAST_EXPECT(changes.
added.empty());
702 BEAST_EXPECT(changes.
removed.empty());
704 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.size() * 0.8f));
709 auto const masterPublic =
715 BEAST_EXPECT(trustedKeysOuter->load(
716 emptyLocalKeyOuter, cfgKeys, cfgPublishersOuter));
719 auto const signingPublic1 = signingKeys1.first;
724 trustedKeysOuter->updateTrusted(activeValidatorsOuter);
726 BEAST_EXPECT(changes.
removed.empty());
728 trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
729 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
730 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
731 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
732 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
745 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
746 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
747 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
748 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
753 auto const signingPublic2 = signingKeys2.first;
763 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
764 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
765 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
766 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
767 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
768 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
772 auto const signingPublicMax = signingKeysMax.first;
777 BEAST_EXPECT(mMax->revoked());
783 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
786 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
787 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
789 changes = trustedKeysOuter->updateTrusted(activeValidatorsOuter);
791 BEAST_EXPECT(changes.
added.empty());
793 trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
794 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
795 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
796 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
797 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
798 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
799 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
800 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
801 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
806 auto trustedKeys = std::make_unique<ValidatorList>(
810 app.config().legacy(
"database_path"),
813 auto const publisherPublic =
819 BEAST_EXPECT(trustedKeys->load(
820 emptyLocalKeyOuter, emptyCfgKeys, cfgPublishers));
823 trustedKeys->updateTrusted(activeValidatorsOuter);
824 BEAST_EXPECT(changes.
removed.empty());
825 BEAST_EXPECT(changes.
added.empty());
827 trustedKeys->quorum() ==
834 auto trustedKeys = std::make_unique<ValidatorList>(
838 app.config().legacy(
"database_path"),
849 while (cfgKeys.
size() < n)
860 BEAST_EXPECT(trustedKeys->load(
861 emptyLocalKeyOuter, cfgKeys, cfgPublishersOuter));
863 TrustChanges changes = trustedKeys->updateTrusted(activeValidators);
864 BEAST_EXPECT(changes.
removed.empty());
865 BEAST_EXPECT(changes.
added == expectedTrusted);
866 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
869 activeValidators.
emplace(toBeSeen);
870 changes = trustedKeys->updateTrusted(activeValidators);
871 BEAST_EXPECT(changes.
removed.empty());
872 BEAST_EXPECT(changes.
added.empty());
873 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(n * 0.8f));
877 auto trustedKeys = std::make_unique<ValidatorList>(
881 app.config().legacy(
"database_path"),
890 publisherKeys.second,
891 pubSigningKeys.first,
892 pubSigningKeys.second,
898 trustedKeys->load(emptyLocalKey, emptyCfgKeys, cfgKeys));
902 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
905 auto const version = 1;
906 auto const sequence = 1;
907 using namespace std::chrono_literals;
916 trustedKeys->applyList(
manifest, blob,
sig, version, siteUri)
919 TrustChanges changes = trustedKeys->updateTrusted(activeValidators);
920 BEAST_EXPECT(changes.
removed.empty());
921 BEAST_EXPECT(changes.
added == activeValidators);
924 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
925 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
927 BEAST_EXPECT(trustedKeys->quorum() == 2);
930 changes = trustedKeys->updateTrusted(activeValidators);
931 BEAST_EXPECT(changes.
removed == activeValidators);
932 BEAST_EXPECT(changes.
added.empty());
933 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
934 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
936 trustedKeys->quorum() ==
942 auto const sequence2 = 2;
947 auto const sig2 =
signList(blob2, pubSigningKeys);
951 trustedKeys->applyList(
manifest, blob2, sig2, version, siteUri)
954 changes = trustedKeys->updateTrusted(activeValidators);
955 BEAST_EXPECT(changes.
removed.empty());
958 asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
961 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
962 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
964 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
965 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
966 BEAST_EXPECT(trustedKeys->quorum() == 2);
970 auto trustedKeys = std::make_unique<ValidatorList>(
974 app.config().legacy(
"database_path"),
990 BEAST_EXPECT(trustedKeys->load(
991 emptyLocalKeyOuter, cfgKeys, cfgPublishers));
993 trustedKeys->updateTrusted(activeValidators);
994 BEAST_EXPECT(changes.
removed.empty());
998 for (
auto const& key : activeKeys)
999 BEAST_EXPECT(trustedKeys->trusted(key));
1004 auto trustedKeys = std::make_unique<ValidatorList>(
1008 app.config().legacy(
"database_path"),
1019 while (cfgKeys.size() < cfgKeys.capacity())
1027 trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1029 trustedKeys->updateTrusted(activeValidators);
1030 BEAST_EXPECT(changes.
removed.empty());
1031 if (cfgKeys.size() > 2)
1038 trustedKeys->quorum() ==
std::ceil(cfgKeys.size() * 0.8f));
1040 for (
auto const& key : activeKeys)
1041 BEAST_EXPECT(trustedKeys->trusted(key));
1047 auto trustedKeys = std::make_unique<ValidatorList>(
1051 app.config().legacy(
"database_path"),
1058 while (valKeys.
size() != maxKeys)
1065 auto addPublishedList = [
this,
1071 auto const publisherPublic =
1077 pubSigningKeys.first,
1078 pubSigningKeys.second,
1082 {
strHex(publisherPublic)});
1086 BEAST_EXPECT(trustedKeys->load(
1087 emptyLocalKey, emptyCfgKeys, cfgPublishers));
1089 auto const version = 1;
1090 auto const sequence = 1;
1091 using namespace std::chrono_literals;
1095 valKeys, sequence,
expiration.time_since_epoch().count());
1101 ->applyList(
manifest, blob,
sig, version, siteUri)
1106 for (
auto i = 0; i < 3; ++i)
1109 TrustChanges changes = trustedKeys->updateTrusted(activeValidators);
1112 trustedKeys->quorum() ==
std::ceil(valKeys.size() * 0.8f));
1115 for (
auto const& val : valKeys)
1117 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1120 BEAST_EXPECT(changes.
added == added);
1121 BEAST_EXPECT(changes.
removed.empty());
1128 testcase(
"Expires");
1133 auto& app = env.
app();
1135 auto toStr = [](
PublicKey const& publicKey) {
1142 auto trustedKeys = std::make_unique<ValidatorList>(
1146 app.config().legacy(
"database_path"),
1150 BEAST_EXPECT(trustedKeys->expires() == boost::none);
1155 trustedKeys->load(emptyLocalKey, {toStr(localCfgListed)}, {});
1157 trustedKeys->expires() &&
1159 BEAST_EXPECT(trustedKeys->listed(localCfgListed));
1165 auto trustedKeys = std::make_unique<ValidatorList>(
1169 app.config().legacy(
"database_path"),
1186 using namespace std::chrono_literals;
1187 auto addPublishedList = [
this, &env, &trustedKeys, &validators]() {
1189 auto const publisherPublic =
1195 pubSigningKeys.first,
1196 pubSigningKeys.second,
1200 {
strHex(publisherPublic)});
1204 BEAST_EXPECT(trustedKeys->load(
1205 emptyLocalKey, emptyCfgKeys, cfgPublishers));
1207 auto const version = 1;
1208 auto const sequence = 1;
1221 PreparedList prep1 = addPublishedList();
1223 PreparedList prep2 = addPublishedList();
1226 BEAST_EXPECT(trustedKeys->expires() == boost::none);
1241 BEAST_EXPECT(trustedKeys->expires() == boost::none);
1257 trustedKeys->expires() &&
1258 trustedKeys->expires().get() == prep1.expiration);
1263 trustedKeys->updateTrusted(activeValidators);
1265 trustedKeys->expires() &&
1266 trustedKeys->expires().get() == prep1.expiration);
1273 testcase(
"NegativeUNL");
1278 auto createValidatorList =
1280 boost::optional<std::size_t> minimumQuorum = {})
1282 auto trustedKeys = std::make_shared<ValidatorList>(
1300 if (trustedKeys->load(emptyLocalKey, cfgKeys, cfgPublishers))
1302 trustedKeys->updateTrusted(activeValidators);
1303 if (trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f))
1328 for (
auto us : unlSizes)
1330 for (
auto np : nUnlPercent)
1332 auto validators = createValidatorList(us);
1333 BEAST_EXPECT(validators);
1337 auto unl = validators->getTrustedMasterKeys();
1339 auto it = unl.
begin();
1345 validators->setNegativeUNL(nUnl);
1346 validators->updateTrusted(activeValidators);
1348 validators->quorum() ==
1350 std::max((us - nUnlSize) * 0.8f, us * 0.6f))));
1358 auto validators = createValidatorList(60);
1359 BEAST_EXPECT(validators);
1363 auto unl = validators->getTrustedMasterKeys();
1364 BEAST_EXPECT(unl.size() == 60);
1371 auto it = unl.
begin();
1377 validators->setNegativeUNL(nUnl);
1378 auto nUnl_temp = validators->getNegativeUNL();
1379 if (nUnl_temp.size() == nUnl.
size())
1381 for (
auto& n : nUnl_temp)
1383 if (nUnl.
find(n) == nUnl.
end())
1386 validators->updateTrusted(activeValidators);
1387 return validators->quorum() == quorum;
1391 BEAST_EXPECT(nUnlChange(0, 48));
1392 BEAST_EXPECT(nUnlChange(30, 36));
1393 BEAST_EXPECT(nUnlChange(18, 36));
1394 BEAST_EXPECT(nUnlChange(12, 39));
1399 auto nUnl = validators->getNegativeUNL();
1400 BEAST_EXPECT(nUnl.size() == 12);
1404 for (
int i = 0; i < 6; ++i)
1406 Slice s(data.data(), ss);
1410 validators->setNegativeUNL(nUnl);
1411 validators->updateTrusted(activeValidators);
1412 BEAST_EXPECT(validators->quorum() == 39);
1421 auto validators = createValidatorList(60, 30);
1422 BEAST_EXPECT(validators);
1427 auto it = unl.
begin();
1433 validators->updateTrusted(activeValidators);
1434 BEAST_EXPECT(validators->quorum() == 48);
1442 validators->setNegativeUNL(nUnl);
1443 validators->updateTrusted(activeValidators);
1444 BEAST_EXPECT(validators->quorum() == 30);