421 using namespace std::chrono_literals;
425 auto checkAvailable = [
this](
426 auto const& trustedKeys,
427 auto const& hexPublic,
431 auto const available = trustedKeys->getAvailable(hexPublic);
437 BEAST_EXPECT(a[jss::public_key] == hexPublic);
438 BEAST_EXPECT(a[jss::manifest] ==
manifest);
441 BEAST_EXPECT(a[jss::version] == version);
444 BEAST_EXPECT(expected.size() == 1);
445 BEAST_EXPECT(a[jss::blob] == expected[0].first);
446 BEAST_EXPECT(a[jss::signature] == expected[0].second);
447 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
449 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
451 BEAST_EXPECT(!a.isMember(jss::blob));
452 BEAST_EXPECT(!a.isMember(jss::signature));
453 auto const& blobs_v2 = a[jss::blobs_v2];
454 BEAST_EXPECT(blobs_v2.isArray() && blobs_v2.size() == expected.size());
456 for (
unsigned int i = 0; i < expected.size(); ++i)
458 BEAST_EXPECT(blobs_v2[i][jss::blob] == expected[i].first);
459 BEAST_EXPECT(blobs_v2[i][jss::signature] == expected[i].second);
467 auto& app = env.
app();
469 manifests, manifests, env.
app().
timeKeeper(), app.config().legacy(
"database_path"), env.
journal);
472 for (
auto const& val : list)
474 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
475 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
480 for (
auto const& val : list)
482 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
483 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
489 auto const hexPublic =
strHex(publisherPublic.begin(), publisherPublic.end());
492 makeManifestString(publisherPublic, publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
497 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys1));
500 auto constexpr listSize = 20;
501 auto constexpr numLists = 9;
504 for (
auto i = 1; i <= numLists; ++i)
506 auto& list = lists[i];
507 list.reserve(listSize);
508 while (list.size() < listSize)
516 auto const version = 1;
517 auto const sequence1 = 1;
519 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
522 auto const sequence2 = 2;
524 auto const sig2 =
signList(blob2, pubSigningKeys1);
527 trustedKeys->applyLists(manifest1, version, {{expiredblob, expiredSig, {}}, {blob2, sig2, {}}}, siteUri),
532 expectTrusted(lists.at(2));
534 checkAvailable(trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
537 auto const version2 = 2;
538 auto const sequence7 = 7;
539 auto const effective7 = validUntil - 60s;
540 auto const expiration7 = effective7 + 3600s;
541 auto const blob7 = makeList(
542 lists.at(7), sequence7, expiration7.time_since_epoch().count(), effective7.time_since_epoch().count());
543 auto const sig7 = signList(blob7, pubSigningKeys1);
545 auto const sequence8 = 8;
546 auto const effective8 = expiration7 - 60s;
547 auto const expiration8 = effective8 + 3600s;
548 auto const blob8 = makeList(
549 lists.at(8), sequence8, expiration8.time_since_epoch().count(), effective8.time_since_epoch().count());
550 auto const sig8 = signList(blob8, pubSigningKeys1);
553 trustedKeys->applyLists(manifest1, version2, {{blob7, sig7, {}}, {blob8, sig8, {}}}, siteUri),
555 ListDisposition::pending,
556 ListDisposition::pending);
558 expectUntrusted(lists.at(7));
559 expectUntrusted(lists.at(8));
562 auto const sequence6 = 6;
563 auto const effective6 = effective7 - 60s;
564 auto const expiration6 = effective6 + 3600s;
565 auto const blob6 = makeList(
566 lists.at(6), sequence6, expiration6.time_since_epoch().count(), effective6.time_since_epoch().count());
567 auto const sig6 = signList(blob6, pubSigningKeys1);
570 auto const sequence6a = 5;
571 auto const effective6a = effective6 + 60s;
572 auto const expiration6a = effective6a + 3600s;
573 auto const blob6a = makeList(
574 lists.at(5), sequence6a, expiration6a.time_since_epoch().count(), effective6a.time_since_epoch().count());
575 auto const sig6a = signList(blob6a, pubSigningKeys1);
578 trustedKeys->applyLists(manifest1, version, {{blob6a, sig6a, {}}, {blob6, sig6, {}}}, siteUri),
580 ListDisposition::pending,
581 ListDisposition::pending);
583 expectUntrusted(lists.at(6));
584 expectTrusted(lists.at(2));
589 trustedKeys->applyLists(manifest1, version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
591 ListDisposition::known_sequence,
592 ListDisposition::known_sequence);
594 expectUntrusted(lists.at(6));
595 expectUntrusted(lists.at(7));
596 expectTrusted(lists.at(2));
600 trustedKeys->applyLists(
"", version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
602 ListDisposition::invalid,
603 ListDisposition::invalid);
606 trustedKeys->applyLists(
607 base64_encode(
"not a manifest"), version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
609 ListDisposition::invalid,
610 ListDisposition::invalid);
614 makeManifestString(randomMasterKey(), publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
617 trustedKeys->applyLists(untrustedManifest, version, {{blob2, sig2, {}}}, siteUri),
619 ListDisposition::untrusted,
620 ListDisposition::untrusted);
623 auto const badVersion = 666;
625 trustedKeys->applyLists(manifest1, badVersion, {{blob2, sig2, {}}}, siteUri),
627 ListDisposition::unsupported_version,
628 ListDisposition::unsupported_version);
631 auto const sequence3 = 3;
632 auto const blob3 = makeList(lists.at(3), sequence3, validUntil.time_since_epoch().count());
633 auto const sig3 = signList(blob3, pubSigningKeys1);
636 trustedKeys->applyLists(manifest1, version, {{blob3, sig3, {}}}, siteUri),
638 ListDisposition::accepted,
639 ListDisposition::accepted);
641 expectUntrusted(lists.at(1));
642 expectUntrusted(lists.at(2));
643 expectTrusted(lists.at(3));
648 trustedKeys, hexPublic, manifest1, 2, {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
652 trustedKeys->applyLists(manifest1, version, {{blob2, sig2, {}}, {blob3, sig3, {}}}, siteUri),
654 ListDisposition::stale,
655 ListDisposition::same_sequence);
659 auto const pubSigningKeys2 =
randomKeyPair(KeyType::secp256k1);
661 makeManifestString(publisherPublic, publisherSecret, pubSigningKeys2.first, pubSigningKeys2.second, 2));
663 auto const sequence4 = 4;
664 auto const blob4 = makeList(lists.at(4), sequence4, validUntil.time_since_epoch().count());
665 auto const sig4 = signList(blob4, pubSigningKeys2);
668 trustedKeys->applyLists(
669 manifest2, version, {{blob2, sig2, manifest1}, {blob3, sig3, manifest1}, {blob4, sig4, {}}}, siteUri),
671 ListDisposition::stale,
672 ListDisposition::accepted);
674 expectUntrusted(lists.at(2));
675 expectUntrusted(lists.at(3));
676 expectTrusted(lists.at(4));
679 trustedKeys, hexPublic, manifest2, 2, {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
681 auto const sequence5 = 5;
682 auto const blob5 = makeList(lists.at(5), sequence5, validUntil.time_since_epoch().count());
683 auto const badSig = signList(blob5, pubSigningKeys1);
685 trustedKeys->applyLists(manifest1, version, {{blob5, badSig, {}}}, siteUri),
687 ListDisposition::invalid,
688 ListDisposition::invalid);
690 expectUntrusted(lists.at(2));
691 expectUntrusted(lists.at(3));
692 expectTrusted(lists.at(4));
693 expectUntrusted(lists.at(5));
697 trustedKeys->applyLists(manifest1, version, {{blob7, sig7, {}}, {blob8, sig8, {}}}, siteUri),
699 ListDisposition::invalid,
700 ListDisposition::invalid);
702 expectTrusted(lists.at(4));
703 expectUntrusted(lists.at(7));
704 expectUntrusted(lists.at(8));
709 trustedKeys->updateTrusted(
710 {}, effective6 + 1s, env.app().getOPs(), env.app().overlay(), env.app().getHashRouter());
712 expectUntrusted(lists.at(3));
713 expectTrusted(lists.at(6));
715 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
721 env.timeKeeper().set(effective8);
722 trustedKeys->updateTrusted(
723 {}, effective8 + 1s, env.app().getOPs(), env.app().overlay(), env.app().getHashRouter());
725 expectUntrusted(lists.at(6));
726 expectUntrusted(lists.at(7));
727 expectTrusted(lists.at(8));
729 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
735 auto const sig8_2 = signList(blob8, pubSigningKeys2);
738 trustedKeys->applyLists(manifest2, version, {{blob8, sig8, manifest1}, {blob8, sig8_2, {}}}, siteUri),
740 ListDisposition::invalid,
741 ListDisposition::same_sequence);
743 expectTrusted(lists.at(8));
745 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
749 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
750 auto maxManifest =
base64_encode(makeRevocationString(publisherPublic, publisherSecret));
752 auto const sequence9 = 9;
753 auto const blob9 = makeList(lists.at(9), sequence9, validUntil.time_since_epoch().count());
754 auto const sig9 = signList(blob9, signingKeysMax);
757 trustedKeys->applyLists(maxManifest, version, {{blob9, sig9, {}}}, siteUri),
759 ListDisposition::untrusted,
760 ListDisposition::untrusted);
762 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
763 for (
auto const& [num, list] : lists)
766 expectUntrusted(list);
769 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
899 testcase(
"Update trusted");
901 std::string const siteUri =
"testUpdateTrusted.test";
905 auto& app = env.
app();
907 manifestsOuter, manifestsOuter, env.
timeKeeper(), app.config().legacy(
"database_path"), env.
journal);
918 while (cfgKeys.
size() != maxKeys)
920 auto const valKey = randomNode();
922 if (cfgKeys.
size() <= maxKeys - 5)
928 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
933 activeValidatorsOuter,
939 for (
auto const& val : unseenValidators)
940 activeValidatorsOuter.
emplace(val);
942 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
943 BEAST_EXPECT(changes.
removed.empty());
944 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
945 for (
auto const& val : cfgKeys)
947 if (
auto const valKey = parseBase58<PublicKey>(TokenType::NodePublic, val))
949 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
950 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
956 changes = trustedKeysOuter->updateTrusted(
957 activeValidatorsOuter,
962 BEAST_EXPECT(changes.
added.empty());
963 BEAST_EXPECT(changes.
removed.empty());
964 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
969 auto const masterPublic =
derivePublicKey(KeyType::ed25519, masterPrivate);
973 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
976 auto const signingPublic1 = signingKeys1.first;
981 activeValidatorsOuter,
986 BEAST_EXPECT(changes.
added == asNodeIDs({masterPublic}));
987 BEAST_EXPECT(changes.
removed.empty());
988 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
989 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
990 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
991 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
992 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
996 makeManifestString(masterPublic, masterPrivate, signingPublic1, signingKeys1.second, 1));
998 BEAST_EXPECT(manifestsOuter.
applyManifest(std::move(*m1)) == ManifestDisposition::accepted);
999 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1000 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1001 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1002 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1006 auto const signingKeys2 =
randomKeyPair(KeyType::secp256k1);
1007 auto const signingPublic2 = signingKeys2.first;
1009 makeManifestString(masterPublic, masterPrivate, signingPublic2, signingKeys2.second, 2));
1010 BEAST_EXPECT(manifestsOuter.
applyManifest(std::move(*m2)) == ManifestDisposition::accepted);
1011 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1012 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1013 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1014 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1015 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1016 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1019 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
1020 auto const signingPublicMax = signingKeysMax.first;
1024 BEAST_EXPECT(mMax->revoked());
1025 BEAST_EXPECT(manifestsOuter.
applyManifest(std::move(*mMax)) == ManifestDisposition::accepted);
1026 BEAST_EXPECT(manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1027 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1030 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1031 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1033 changes = trustedKeysOuter->updateTrusted(
1034 activeValidatorsOuter,
1039 BEAST_EXPECT(changes.
removed == asNodeIDs({masterPublic}));
1040 BEAST_EXPECT(changes.
added.empty());
1041 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1042 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1043 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1044 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1045 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1046 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1047 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1048 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1049 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1055 manifestsOuter, manifestsOuter, env.
timeKeeper(), app.config().legacy(
"database_path"), env.
journal);
1057 auto const publisherPublic =
derivePublicKey(KeyType::ed25519, publisherSecret);
1062 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1065 activeValidatorsOuter,
1070 BEAST_EXPECT(changes.
removed.empty());
1071 BEAST_EXPECT(changes.
added.empty());
1078 manifestsOuter, manifestsOuter, env.
timeKeeper(), app.config().legacy(
"database_path"), env.
journal);
1080 auto const masterPublic =
derivePublicKey(KeyType::ed25519, masterPrivate);
1084 auto const publisher1Public =
derivePublicKey(KeyType::ed25519, publisher1Secret);
1086 auto const publisher2Public =
derivePublicKey(KeyType::ed25519, publisher2Secret);
1089 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1092 activeValidatorsOuter,
1097 BEAST_EXPECT(changes.
removed.empty());
1098 BEAST_EXPECT(changes.
added.size() == 1);
1099 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1100 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1107 manifests, manifests, env.
timeKeeper(), app.config().legacy(
"database_path"), env.
journal, minQuorum);
1116 while (cfgKeys.
size() < n)
1118 auto const valKey = randomNode();
1127 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1135 BEAST_EXPECT(changes.
removed.empty());
1136 BEAST_EXPECT(changes.
added == expectedTrusted);
1137 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1140 activeValidators.
emplace(toBeSeen);
1141 changes = trustedKeys->updateTrusted(
1147 BEAST_EXPECT(changes.
removed.empty());
1148 BEAST_EXPECT(changes.
added.empty());
1149 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1157 app.config().legacy(
"database_path"),
1161 auto const publisherKeys =
randomKeyPair(KeyType::secp256k1);
1162 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1164 publisherKeys.first, publisherKeys.second, pubSigningKeys.first, pubSigningKeys.second, 1));
1168 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys));
1171 hash_set<NodeID> activeValidators(asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1174 auto const version = 1;
1175 auto const sequence = 1;
1176 using namespace std::chrono_literals;
1178 auto const blob = makeList(list, sequence, validUntil.
time_since_epoch().count());
1179 auto const sig = signList(blob, pubSigningKeys);
1182 ListDisposition::accepted ==
1183 trustedKeys->applyLists(
manifest, version, {{blob, sig, {}}}, siteUri).bestDisposition());
1191 BEAST_EXPECT(changes.
removed.empty());
1192 BEAST_EXPECT(changes.
added == activeValidators);
1195 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1196 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1198 BEAST_EXPECT(trustedKeys->quorum() == 2);
1201 changes = trustedKeys->updateTrusted(
1207 BEAST_EXPECT(changes.
removed == activeValidators);
1208 BEAST_EXPECT(changes.
added.empty());
1209 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1210 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1216 auto const sequence2 = 2;
1218 auto const blob2 = makeList(list2, sequence2, expiration2.
time_since_epoch().count());
1219 auto const sig2 = signList(blob2, pubSigningKeys);
1222 ListDisposition::accepted ==
1223 trustedKeys->applyLists(
manifest, version, {{blob2, sig2, {}}}, siteUri).bestDisposition());
1225 changes = trustedKeys->updateTrusted(
1227 env.timeKeeper().now(),
1229 env.app().overlay(),
1230 env.app().getHashRouter());
1231 BEAST_EXPECT(changes.removed.empty());
1232 BEAST_EXPECT(changes.added == asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1233 for (Validator
const& val : list2)
1235 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1236 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1238 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1239 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1240 BEAST_EXPECT(trustedKeys->quorum() == 2);
1245 manifestsOuter, manifestsOuter, env.timeKeeper(), app.config().legacy(
"database_path"), env.journal);
1248 hash_set<NodeID> activeValidators;
1249 hash_set<PublicKey> activeKeys;
1256 auto const valKey = randomNode();
1258 activeValidators.emplace(
calcNodeID(valKey));
1259 activeKeys.emplace(valKey);
1260 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1261 TrustChanges changes = trustedKeys->updateTrusted(
1263 env.timeKeeper().now(),
1265 env.app().overlay(),
1266 env.app().getHashRouter());
1267 BEAST_EXPECT(changes.removed.empty());
1268 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1269 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1270 for (
auto const& key : activeKeys)
1271 BEAST_EXPECT(trustedKeys->trusted(key));
1277 manifestsOuter, manifestsOuter, env.timeKeeper(), app.config().legacy(
"database_path"), env.journal);
1279 auto const localKey = randomNode();
1281 hash_set<NodeID> activeValidators;
1282 hash_set<PublicKey> activeKeys;
1288 auto const valKey = randomNode();
1290 activeValidators.emplace(
calcNodeID(valKey));
1291 activeKeys.emplace(valKey);
1293 BEAST_EXPECT(trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1294 TrustChanges changes = trustedKeys->updateTrusted(
1296 env.timeKeeper().now(),
1298 env.app().overlay(),
1299 env.app().getHashRouter());
1300 BEAST_EXPECT(changes.removed.empty());
1301 if (cfgKeys.
size() > 2)
1302 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1304 BEAST_EXPECT(changes.added == asNodeIDs({localKey, valKey}));
1306 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1308 for (
auto const& key : activeKeys)
1309 BEAST_EXPECT(trustedKeys->trusted(key));
1314 ManifestCache manifests;
1316 manifests, manifests, env.timeKeeper(), app.config().legacy(
"database_path"), env.journal);
1318 hash_set<NodeID> activeValidators;
1322 while (valKeys.
size() != maxKeys)
1325 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1331 constexpr static int publishers = 3;
1339 auto addPublishedList = [&,
this](
int i) {
1344 publisherPublic, publisherSecret, pubSigningKeys.first, pubSigningKeys.second, 1));
1350 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers,
std::size_t(1)));
1352 auto const version = 1;
1353 auto const sequence = 1;
1354 using namespace std::chrono_literals;
1357 auto const blob = makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1358 auto const sig = signList(blob, pubSigningKeys);
1362 trustedKeys->applyLists(
manifest, version, {{blob, sig, {}}}, siteUri).bestDisposition());
1366 for (
auto i = 0; i < publishers; ++i)
1367 addPublishedList(i);
1368 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1370 TrustChanges changes = trustedKeys->updateTrusted(
1372 env.timeKeeper().now(),
1374 env.app().overlay(),
1375 env.app().getHashRouter());
1377 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(valKeys.
size() * 0.8f));
1379 hash_set<NodeID> added;
1380 for (
auto const& val : valKeys)
1382 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1385 BEAST_EXPECT(changes.added == added);
1386 BEAST_EXPECT(changes.removed.empty());
1390 ManifestCache manifests;
1392 manifests, manifests, env.timeKeeper(), app.config().legacy(
"database_path"), env.journal);
1394 hash_set<NodeID> activeValidators;
1398 while (valKeys.
size() != maxKeys)
1401 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1409 constexpr static int publishers = 3;
1417 auto addPublishedList = [&,
this](
1423 publisherPublic, publisherSecret, pubSigningKeys.first, pubSigningKeys.second, 1));
1428 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1430 auto const version = 1;
1431 auto const sequence = 1;
1432 using namespace std::chrono_literals;
1434 NetClock::time_point const validUntil = env.timeKeeper().now() + (i == 2 ? 120s : i == 1 ? 60s : 3600s);
1436 validUntil1 = validUntil;
1438 validUntil2 = validUntil;
1440 auto const blob = makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1441 auto const sig = signList(blob, pubSigningKeys);
1445 trustedKeys->applyLists(
manifest, version, {{blob, sig, {}}}, siteUri).bestDisposition());
1451 for (
auto i = 0; i < publishers; ++i)
1452 addPublishedList(i, validUntil1, validUntil2);
1453 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1455 TrustChanges changes = trustedKeys->updateTrusted(
1457 env.timeKeeper().now(),
1459 env.app().overlay(),
1460 env.app().getHashRouter());
1462 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.
size() - 3) * 0.8f));
1464 for (
auto const& val : valKeys)
1465 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1467 hash_set<NodeID> added;
1470 auto const& val = valKeys[i];
1471 if (i >= 1 && i < maxKeys - 2)
1473 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1477 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1479 BEAST_EXPECT(changes.added == added);
1480 BEAST_EXPECT(changes.removed.empty());
1483 env.timeKeeper().set(validUntil1);
1484 changes = trustedKeys->updateTrusted(
1486 env.timeKeeper().now(),
1488 env.app().overlay(),
1489 env.app().getHashRouter());
1491 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.
size() - 6) * 0.8f));
1493 for (
auto const& val : valKeys)
1494 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1496 hash_set<NodeID> removed;
1499 auto const& val = valKeys[i];
1500 if (i >= 2 && i < maxKeys - 4)
1501 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1504 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1505 if (i >= 1 && i < maxKeys - 2)
1506 removed.insert(
calcNodeID(val.masterPublic));
1510 BEAST_EXPECT(changes.added.empty());
1511 BEAST_EXPECT(changes.removed == removed);
1514 env.timeKeeper().set(validUntil2);
1515 changes = trustedKeys->updateTrusted(
1517 env.timeKeeper().now(),
1519 env.app().overlay(),
1520 env.app().getHashRouter());
1527 auto const& val = valKeys[i];
1528 if (i < maxKeys - 4)
1529 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1531 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1533 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1534 if (i >= 2 && i < maxKeys - 4)
1535 removed.insert(
calcNodeID(val.masterPublic));
1538 BEAST_EXPECT(changes.added.empty());
1539 BEAST_EXPECT(changes.removed == removed);
1947 testcase(
"Build and split messages");
1950 auto extractHeader = [
this](
Message& message) {
1953 boost::beast::multi_buffer buffers;
1956 auto start = buffer.begin();
1957 auto end = buffer.end();
1959 buffers.commit(boost::asio::buffer_copy(buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
1961 boost::system::error_code ec;
1966 auto extractProtocolMessage1 = [
this, &extractHeader](
Message& message) {
1967 auto [header, buffers] = extractHeader(message);
1968 if (BEAST_EXPECT(header) && BEAST_EXPECT(header->message_type == protocol::mtVALIDATOR_LIST))
1970 auto const msg = detail::parseMessageContent<protocol::TMValidatorList>(*header, buffers.data());
1976 auto extractProtocolMessage2 = [
this, &extractHeader](
Message& message) {
1977 auto [header, buffers] = extractHeader(message);
1978 if (BEAST_EXPECT(header) && BEAST_EXPECT(header->message_type == protocol::mtVALIDATOR_LIST_COLLECTION))
1981 detail::parseMessageContent<protocol::TMValidatorListCollection>(*header, buffers.data());
1987 auto verifyMessage = [
this, manifestCutoff, &extractProtocolMessage1, &extractProtocolMessage2](
1990 auto const& blobInfos,
1991 auto const& messages,
1993 BEAST_EXPECT(messages.size() == expectedInfo.size());
1994 auto msgIter = expectedInfo.begin();
1995 for (
auto const& messageWithHash : messages)
1997 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
1999 if (!BEAST_EXPECT(messageWithHash.message))
2001 auto const& expectedSeqs = msgIter->second;
2002 auto seqIter = expectedSeqs.begin();
2005 BEAST_EXPECT(size == msgIter->first);
2006 if (expectedSeqs.size() == 1)
2008 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2009 auto const expectedVersion = 1;
2010 if (BEAST_EXPECT(msg))
2012 BEAST_EXPECT(msg->version() == expectedVersion);
2013 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2015 auto const& expectedBlob = blobInfos.at(*seqIter);
2016 BEAST_EXPECT((*seqIter < manifestCutoff) == !!expectedBlob.manifest);
2017 auto const expectedManifest =
2018 *seqIter < manifestCutoff && expectedBlob.manifest ? *expectedBlob.manifest :
manifest;
2019 BEAST_EXPECT(msg->manifest() == expectedManifest);
2020 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2021 BEAST_EXPECT(msg->signature() == expectedBlob.signature);
2023 BEAST_EXPECT(seqIter == expectedSeqs.end());
2026 messageWithHash.hash ==
2027 sha512Half(expectedManifest, expectedBlob.blob, expectedBlob.signature, expectedVersion));
2033 hashingBlobs.
reserve(msgIter->second.size());
2035 auto const msg = extractProtocolMessage2(*messageWithHash.message);
2036 if (BEAST_EXPECT(msg))
2038 BEAST_EXPECT(msg->version() == version);
2039 BEAST_EXPECT(msg->manifest() ==
manifest);
2040 for (
auto const& blobInfo : msg->blobs())
2042 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2044 auto const& expectedBlob = blobInfos.at(*seqIter);
2046 BEAST_EXPECT(blobInfo.has_manifest() == !!expectedBlob.manifest);
2047 BEAST_EXPECT(blobInfo.has_manifest() == (*seqIter < manifestCutoff));
2049 if (*seqIter < manifestCutoff)
2050 BEAST_EXPECT(blobInfo.manifest() == *expectedBlob.manifest);
2051 BEAST_EXPECT(blobInfo.blob() == expectedBlob.blob);
2052 BEAST_EXPECT(blobInfo.signature() == expectedBlob.signature);
2055 BEAST_EXPECT(seqIter == expectedSeqs.end());
2061 BEAST_EXPECT(msgIter == expectedInfo.end());
2063 auto verifyBuildMessages = [
this](
2067 BEAST_EXPECT(result.
first == expectedSequence);
2068 BEAST_EXPECT(result.
second == expectedSize);
2074 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2077 for (
auto seq : {5, 6, 7, 10, 12})
2081 s <<
"This is not a blob with sequence " <<
seq;
2084 s <<
"This is not a signature for sequence " <<
seq;
2085 b.signature = s.
str();
2086 if (
seq < manifestCutoff)
2090 s <<
"This is not manifest " <<
seq;
2091 b.manifest = s.
str();
2096 auto const maxSequence = blobInfos.
rbegin()->first;
2097 BEAST_EXPECT(maxSequence == 12);
2104 verifyBuildMessages(
2106 BEAST_EXPECT(messages.size() == 0);
2112 messages.emplace_back();
2113 verifyBuildMessages(
2115 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2119 verifyBuildMessages(
2121 if (BEAST_EXPECT(messages.size() == 1) && BEAST_EXPECT(messages.front().message))
2123 auto const& messageWithHash = messages.front();
2124 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2127 BEAST_EXPECT(size == 108);
2128 auto const& expected = blobInfos.at(5);
2129 if (BEAST_EXPECT(msg))
2131 BEAST_EXPECT(msg->version() == 1);
2132 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2133 BEAST_EXPECT(msg->blob() == expected.blob);
2134 BEAST_EXPECT(msg->signature() == expected.signature);
2136 BEAST_EXPECT(messageWithHash.hash ==
sha512Half(*expected.manifest, expected.blob, expected.signature, 1));
2144 verifyBuildMessages(
2146 2, maxSequence * 2, maxSequence, version,
manifest, blobInfos, messages),
2149 BEAST_EXPECT(messages.size() == 0);
2155 messages.emplace_back();
2156 verifyBuildMessages(
2160 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2164 verifyBuildMessages(
2168 verifyMessage(version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2174 verifyBuildMessages(
2178 verifyMessage(version,
manifest, blobInfos, messages, {{212, {6, 7}}, {192, {10, 12}}});
2183 verifyBuildMessages(
2187 verifyMessage(version,
manifest, blobInfos, messages, {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2191 verifyBuildMessages(
2195 verifyMessage(version,
manifest, blobInfos, messages, {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2200 verifyBuildMessages(
2204 verifyMessage(version,
manifest, blobInfos, messages, {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2210 testcase(
"Test quorum disabled");
2212 std::string const siteUri =
"testQuorumDisabled.test";
2214 auto& app = env.
app();
2219 while (valKeys.
size() != maxKeys)
2236 auto makeValidatorList = [&,
this](
2246 valManifests, pubManifests, env.
timeKeeper(), app.config().legacy(
"database_path"), env.
journal);
2260 pubSigningKeys.first,
2261 pubSigningKeys.second,
2262 i < countRevoked ?
revoked : 1));
2263 publishers.push_back(Publisher{i < countRevoked, publisherPublic, pubSigningKeys,
manifest});
2271 BEAST_EXPECT(result->load(self->signingPublic, emptyCfgKeys, cfgPublishers, threshold));
2275 BEAST_EXPECT(result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2280 using namespace std::chrono_literals;
2281 publishers[i].expiry = env.
timeKeeper().
now() + (i == countTotal - 1 ? 60s : 3600s);
2282 auto const blob = makeList(valKeys, 1, publishers[i].expiry.time_since_epoch().count());
2283 auto const sig = signList(blob, publishers[i].signingKeys);
2286 result->applyLists(publishers[i].manifest, 1, {{blob, sig, {}}}, siteUri).bestDisposition() ==
2301 auto const self = randomValidator();
2302 auto const keysTotal = valKeys.
size() + 1;
2303 auto trustedKeys = makeValidatorList(
2311 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2312 for (
auto const& p : publishers)
2313 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2317 env.timeKeeper().now(),
2319 env.app().overlay(),
2320 env.app().getHashRouter());
2321 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2322 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2326 for (
auto const& val : valKeys)
2328 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2331 BEAST_EXPECT(changes.
added == added);
2332 BEAST_EXPECT(changes.
removed.empty());
2335 env.timeKeeper().set(publishers.
back().expiry);
2336 changes = trustedKeys->updateTrusted(
2338 env.timeKeeper().now(),
2340 env.app().overlay(),
2341 env.app().getHashRouter());
2342 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2343 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2346 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2347 for (
auto const& val : valKeys)
2349 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2350 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2353 BEAST_EXPECT(changes.
added.empty());
2354 BEAST_EXPECT(changes.
removed == removed);
2358 ManifestCache pubManifests;
2359 ManifestCache valManifests;
2361 auto const keysTotal = valKeys.
size();
2362 auto trustedKeys = makeValidatorList(
2370 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2371 for (
auto const& p : publishers)
2372 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2374 TrustChanges changes = trustedKeys->updateTrusted(
2376 env.timeKeeper().now(),
2378 env.app().overlay(),
2379 env.app().getHashRouter());
2380 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2381 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2383 hash_set<NodeID> added;
2384 for (
auto const& val : valKeys)
2386 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2389 BEAST_EXPECT(changes.added == added);
2390 BEAST_EXPECT(changes.removed.empty());
2393 env.timeKeeper().set(publishers.
back().expiry);
2394 changes = trustedKeys->updateTrusted(
2396 env.timeKeeper().now(),
2398 env.app().overlay(),
2399 env.app().getHashRouter());
2400 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2401 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2403 hash_set<NodeID> removed;
2404 for (
auto const& val : valKeys)
2406 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2407 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2408 removed.insert(
calcNodeID(val.masterPublic));
2410 BEAST_EXPECT(changes.added.empty());
2411 BEAST_EXPECT(changes.removed == removed);
2415 ManifestCache pubManifests;
2416 ManifestCache valManifests;
2419 auto const self = valKeys[1];
2420 auto const keysTotal = valKeys.
size();
2421 auto trustedKeys = makeValidatorList(
2429 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2430 int untrustedCount = 0;
2431 for (
auto const& p : publishers)
2433 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2434 BEAST_EXPECT(p.revoked ^ trusted);
2435 untrustedCount += trusted ? 0 : 1;
2437 BEAST_EXPECT(untrustedCount == 1);
2439 TrustChanges changes = trustedKeys->updateTrusted(
2441 env.timeKeeper().now(),
2443 env.app().overlay(),
2444 env.app().getHashRouter());
2445 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2446 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2448 hash_set<NodeID> added;
2449 for (
auto const& val : valKeys)
2451 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2454 BEAST_EXPECT(changes.added == added);
2455 BEAST_EXPECT(changes.removed.empty());
2458 env.timeKeeper().set(publishers.
back().expiry);
2459 changes = trustedKeys->updateTrusted(
2461 env.timeKeeper().now(),
2463 env.app().overlay(),
2464 env.app().getHashRouter());
2465 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2466 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2468 hash_set<NodeID> removed;
2469 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2470 for (
auto const& val : valKeys)
2472 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2473 if (val.masterPublic != self.masterPublic)
2475 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2476 removed.insert(
calcNodeID(val.masterPublic));
2479 BEAST_EXPECT(changes.added.empty());
2480 BEAST_EXPECT(changes.removed == removed);
2484 ManifestCache pubManifests;
2485 ManifestCache valManifests;
2488 auto const self = randomValidator();
2489 auto const keysTotal = valKeys.
size() + 1;
2490 auto trustedKeys = makeValidatorList(
2498 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2499 int untrustedCount = 0;
2500 for (
auto const& p : publishers)
2502 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2503 BEAST_EXPECT(p.revoked ^ trusted);
2504 untrustedCount += trusted ? 0 : 1;
2506 BEAST_EXPECT(untrustedCount == 2);
2508 TrustChanges changes = trustedKeys->updateTrusted(
2510 env.timeKeeper().now(),
2512 env.app().overlay(),
2513 env.app().getHashRouter());
2514 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2515 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2517 hash_set<NodeID> added;
2519 for (
auto const& val : valKeys)
2521 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2524 BEAST_EXPECT(changes.added == added);
2525 BEAST_EXPECT(changes.removed.empty());
2528 env.timeKeeper().set(publishers.
back().expiry);
2529 changes = trustedKeys->updateTrusted(
2531 env.timeKeeper().now(),
2533 env.app().overlay(),
2534 env.app().getHashRouter());
2535 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2536 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2538 hash_set<NodeID> removed;
2539 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2540 for (
auto const& val : valKeys)
2542 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2543 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2544 removed.insert(
calcNodeID(val.masterPublic));
2546 BEAST_EXPECT(changes.added.empty());
2547 BEAST_EXPECT(changes.removed == removed);
2551 ManifestCache pubManifests;
2552 ManifestCache valManifests;
2555 auto const self = valKeys[5];
2556 auto const keysTotal = valKeys.
size();
2557 auto trustedKeys = makeValidatorList(
2565 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2566 int untrustedCount = 0;
2567 for (
auto const& p : publishers)
2569 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2570 BEAST_EXPECT(p.revoked ^ trusted);
2571 untrustedCount += trusted ? 0 : 1;
2573 BEAST_EXPECT(untrustedCount == 2);
2575 TrustChanges changes = trustedKeys->updateTrusted(
2577 env.timeKeeper().now(),
2579 env.app().overlay(),
2580 env.app().getHashRouter());
2581 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2582 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2584 hash_set<NodeID> added;
2585 for (
auto const& val : valKeys)
2587 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2590 BEAST_EXPECT(changes.added == added);
2591 BEAST_EXPECT(changes.removed.empty());
2594 env.timeKeeper().set(publishers.
back().expiry);
2595 changes = trustedKeys->updateTrusted(
2597 env.timeKeeper().now(),
2599 env.app().overlay(),
2600 env.app().getHashRouter());
2601 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2602 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2604 hash_set<NodeID> removed;
2605 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2606 for (
auto const& val : valKeys)
2608 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2609 if (val.masterPublic != self.masterPublic)
2611 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2612 removed.insert(
calcNodeID(val.masterPublic));
2615 BEAST_EXPECT(changes.added.empty());
2616 BEAST_EXPECT(changes.removed == removed);
2620 ManifestCache pubManifests;
2621 ManifestCache valManifests;
2623 auto const keysTotal = valKeys.
size();
2624 auto trustedKeys = makeValidatorList(
2632 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2633 int untrustedCount = 0;
2634 for (
auto const& p : publishers)
2636 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2637 BEAST_EXPECT(p.revoked ^ trusted);
2638 untrustedCount += trusted ? 0 : 1;
2640 BEAST_EXPECT(untrustedCount == 2);
2642 TrustChanges changes = trustedKeys->updateTrusted(
2644 env.timeKeeper().now(),
2646 env.app().overlay(),
2647 env.app().getHashRouter());
2648 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2649 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2651 hash_set<NodeID> added;
2652 for (
auto const& val : valKeys)
2654 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2657 BEAST_EXPECT(changes.added == added);
2658 BEAST_EXPECT(changes.removed.empty());
2661 env.timeKeeper().set(publishers.
back().expiry);
2662 changes = trustedKeys->updateTrusted(
2664 env.timeKeeper().now(),
2666 env.app().overlay(),
2667 env.app().getHashRouter());
2668 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2669 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2671 hash_set<NodeID> removed;
2672 for (
auto const& val : valKeys)
2674 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2675 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2676 removed.insert(
calcNodeID(val.masterPublic));
2678 BEAST_EXPECT(changes.added.empty());
2679 BEAST_EXPECT(changes.removed == removed);
2683 ManifestCache pubManifests;
2684 ManifestCache valManifests;
2687 auto const self = randomValidator();
2688 auto const keysTotal = valKeys.
size() + 1;
2689 auto trustedKeys = makeValidatorList(
2697 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
2698 int untrustedCount = 0;
2699 for (
auto const& p : publishers)
2701 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2702 BEAST_EXPECT(p.revoked ^ trusted);
2703 untrustedCount += trusted ? 0 : 1;
2705 BEAST_EXPECT(untrustedCount == 1);
2707 TrustChanges changes = trustedKeys->updateTrusted(
2709 env.timeKeeper().now(),
2711 env.app().overlay(),
2712 env.app().getHashRouter());
2713 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2714 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2716 hash_set<NodeID> added;
2718 for (
auto const& val : valKeys)
2720 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2723 BEAST_EXPECT(changes.added == added);
2724 BEAST_EXPECT(changes.removed.empty());
2727 env.timeKeeper().set(publishers.
back().expiry);
2728 changes = trustedKeys->updateTrusted(
2730 env.timeKeeper().now(),
2732 env.app().overlay(),
2733 env.app().getHashRouter());
2734 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2735 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2737 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2738 for (
auto const& val : valKeys)
2740 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2741 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2743 BEAST_EXPECT(changes.added.empty());
2744 BEAST_EXPECT(changes.removed.empty());
2748 ManifestCache pubManifests;
2749 ManifestCache valManifests;
2752 auto const self = randomValidator();
2753 auto const keysTotal = valKeys.
size() + 1;
2754 auto trustedKeys = makeValidatorList(
2762 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
2763 for (
auto const& p : publishers)
2764 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2766 TrustChanges changes = trustedKeys->updateTrusted(
2768 env.timeKeeper().now(),
2770 env.app().overlay(),
2771 env.app().getHashRouter());
2772 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2773 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2775 hash_set<NodeID> added;
2777 for (
auto const& val : valKeys)
2779 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2782 BEAST_EXPECT(changes.added == added);
2783 BEAST_EXPECT(changes.removed.empty());
2786 env.timeKeeper().set(publishers.
back().expiry);
2787 changes = trustedKeys->updateTrusted(
2789 env.timeKeeper().now(),
2791 env.app().overlay(),
2792 env.app().getHashRouter());
2793 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2794 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2796 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2797 for (
auto const& val : valKeys)
2799 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2800 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2802 BEAST_EXPECT(changes.added.empty());
2803 BEAST_EXPECT(changes.removed.empty());
2807 ManifestCache pubManifests;
2808 ManifestCache valManifests;
2811 auto const self = valKeys[7];
2812 auto const keysTotal = valKeys.
size();
2813 auto trustedKeys = makeValidatorList(
2821 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
2822 for (
auto const& p : publishers)
2823 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2825 TrustChanges changes = trustedKeys->updateTrusted(
2827 env.timeKeeper().now(),
2829 env.app().overlay(),
2830 env.app().getHashRouter());
2831 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2832 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2834 hash_set<NodeID> added;
2835 for (
auto const& val : valKeys)
2837 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2840 BEAST_EXPECT(changes.added == added);
2841 BEAST_EXPECT(changes.removed.empty());
2844 env.timeKeeper().set(publishers.
back().expiry);
2845 changes = trustedKeys->updateTrusted(
2847 env.timeKeeper().now(),
2849 env.app().overlay(),
2850 env.app().getHashRouter());
2851 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2852 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2854 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2855 for (
auto const& val : valKeys)
2857 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2858 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2860 BEAST_EXPECT(changes.added.empty());
2861 BEAST_EXPECT(changes.removed.empty());
2865 ManifestCache pubManifests;
2866 ManifestCache valManifests;
2868 auto const keysTotal = valKeys.
size();
2869 auto trustedKeys = makeValidatorList(
2877 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
2878 for (
auto const& p : publishers)
2879 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2881 TrustChanges changes = trustedKeys->updateTrusted(
2883 env.timeKeeper().now(),
2885 env.app().overlay(),
2886 env.app().getHashRouter());
2887 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2888 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2890 hash_set<NodeID> added;
2891 for (
auto const& val : valKeys)
2893 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2896 BEAST_EXPECT(changes.added == added);
2897 BEAST_EXPECT(changes.removed.empty());
2900 env.timeKeeper().set(publishers.
back().expiry);
2901 changes = trustedKeys->updateTrusted(
2903 env.timeKeeper().now(),
2905 env.app().overlay(),
2906 env.app().getHashRouter());
2907 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2908 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2910 for (
auto const& val : valKeys)
2912 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2913 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2915 BEAST_EXPECT(changes.added.empty());
2916 BEAST_EXPECT(changes.removed.empty());
2922 ManifestCache pubManifests;
2923 ManifestCache valManifests;
2926 auto const self = randomValidator();
2927 auto const keysTotal = valKeys.
size() + 1;
2928 auto trustedKeys = makeValidatorList(
2936 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
2937 int untrustedCount = 0;
2938 for (
auto const& p : publishers)
2940 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2941 BEAST_EXPECT(p.revoked ^ trusted);
2942 untrustedCount += trusted ? 0 : 1;
2944 BEAST_EXPECT(untrustedCount == 1);
2946 TrustChanges changes = trustedKeys->updateTrusted(
2948 env.timeKeeper().now(),
2950 env.app().overlay(),
2951 env.app().getHashRouter());
2952 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2953 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2955 hash_set<NodeID> added;
2957 for (
auto const& val : valKeys)
2959 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2962 BEAST_EXPECT(changes.added == added);
2963 BEAST_EXPECT(changes.removed.empty());
2966 env.timeKeeper().set(publishers.
back().expiry);
2967 changes = trustedKeys->updateTrusted(
2969 env.timeKeeper().now(),
2971 env.app().overlay(),
2972 env.app().getHashRouter());
2973 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2974 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2976 hash_set<NodeID> removed;
2977 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2978 for (
auto const& val : valKeys)
2980 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
2981 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2982 removed.insert(
calcNodeID(val.masterPublic));
2984 BEAST_EXPECT(changes.added.empty());
2985 BEAST_EXPECT(changes.removed == removed);
2989 ManifestCache pubManifests;
2990 ManifestCache valManifests;
2993 auto const self = valKeys[5];
2994 auto const keysTotal = valKeys.
size();
2995 auto trustedKeys = makeValidatorList(
3003 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3004 int untrustedCount = 0;
3005 for (
auto const& p : publishers)
3007 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3008 BEAST_EXPECT(p.revoked ^ trusted);
3009 untrustedCount += trusted ? 0 : 1;
3011 BEAST_EXPECT(untrustedCount == 1);
3013 TrustChanges changes = trustedKeys->updateTrusted(
3015 env.timeKeeper().now(),
3017 env.app().overlay(),
3018 env.app().getHashRouter());
3019 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3020 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3022 hash_set<NodeID> added;
3023 for (
auto const& val : valKeys)
3025 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3028 BEAST_EXPECT(changes.added == added);
3029 BEAST_EXPECT(changes.removed.empty());
3032 env.timeKeeper().set(publishers.
back().expiry);
3033 changes = trustedKeys->updateTrusted(
3035 env.timeKeeper().now(),
3037 env.app().overlay(),
3038 env.app().getHashRouter());
3039 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3040 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3042 hash_set<NodeID> removed;
3043 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3044 for (
auto const& val : valKeys)
3046 if (val.masterPublic != self.masterPublic)
3048 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3049 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3050 removed.insert(
calcNodeID(val.masterPublic));
3053 BEAST_EXPECT(changes.added.empty());
3054 BEAST_EXPECT(changes.removed == removed);
3058 ManifestCache pubManifests;
3059 ManifestCache valManifests;
3061 auto const keysTotal = valKeys.
size();
3062 auto trustedKeys = makeValidatorList(
3070 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3071 int untrustedCount = 0;
3072 for (
auto const& p : publishers)
3074 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3075 BEAST_EXPECT(p.revoked ^ trusted);
3076 untrustedCount += trusted ? 0 : 1;
3078 BEAST_EXPECT(untrustedCount == 1);
3080 TrustChanges changes = trustedKeys->updateTrusted(
3082 env.timeKeeper().now(),
3084 env.app().overlay(),
3085 env.app().getHashRouter());
3086 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3087 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3089 hash_set<NodeID> added;
3090 for (
auto const& val : valKeys)
3092 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3095 BEAST_EXPECT(changes.added == added);
3096 BEAST_EXPECT(changes.removed.empty());
3099 env.timeKeeper().set(publishers.
back().expiry);
3100 changes = trustedKeys->updateTrusted(
3102 env.timeKeeper().now(),
3104 env.app().overlay(),
3105 env.app().getHashRouter());
3106 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3107 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3109 hash_set<NodeID> removed;
3110 for (
auto const& val : valKeys)
3112 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3113 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3114 removed.insert(
calcNodeID(val.masterPublic));
3116 BEAST_EXPECT(changes.added.empty());
3117 BEAST_EXPECT(changes.removed == removed);
3121 ManifestCache pubManifests;
3122 ManifestCache valManifests;
3125 auto const self = randomValidator();
3126 auto const keysTotal = valKeys.
size() + 1;
3127 auto trustedKeys = makeValidatorList(
3135 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3136 for (
auto const& p : publishers)
3137 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3139 TrustChanges changes = trustedKeys->updateTrusted(
3141 env.timeKeeper().now(),
3143 env.app().overlay(),
3144 env.app().getHashRouter());
3145 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3146 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3148 hash_set<NodeID> added;
3150 for (
auto const& val : valKeys)
3152 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3155 BEAST_EXPECT(changes.added == added);
3156 BEAST_EXPECT(changes.removed.empty());
3159 env.timeKeeper().set(publishers.
back().expiry);
3160 changes = trustedKeys->updateTrusted(
3162 env.timeKeeper().now(),
3164 env.app().overlay(),
3165 env.app().getHashRouter());
3166 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3167 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3169 hash_set<NodeID> removed;
3170 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3171 for (
auto const& val : valKeys)
3173 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3174 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3175 removed.insert(
calcNodeID(val.masterPublic));
3177 BEAST_EXPECT(changes.added.empty());
3178 BEAST_EXPECT(changes.removed == removed);
3182 ManifestCache pubManifests;
3183 ManifestCache valManifests;
3186 auto const self = valKeys[5];
3187 auto const keysTotal = valKeys.
size();
3188 auto trustedKeys = makeValidatorList(
3196 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3197 for (
auto const& p : publishers)
3198 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3200 TrustChanges changes = trustedKeys->updateTrusted(
3202 env.timeKeeper().now(),
3204 env.app().overlay(),
3205 env.app().getHashRouter());
3206 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3207 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3209 hash_set<NodeID> added;
3211 for (
auto const& val : valKeys)
3213 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3216 BEAST_EXPECT(changes.added == added);
3217 BEAST_EXPECT(changes.removed.empty());
3220 env.timeKeeper().set(publishers.
back().expiry);
3221 changes = trustedKeys->updateTrusted(
3223 env.timeKeeper().now(),
3225 env.app().overlay(),
3226 env.app().getHashRouter());
3227 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3228 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3230 hash_set<NodeID> removed;
3231 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3232 for (
auto const& val : valKeys)
3234 if (val.masterPublic != self.masterPublic)
3236 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3237 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3238 removed.insert(
calcNodeID(val.masterPublic));
3241 BEAST_EXPECT(changes.added.empty());
3242 BEAST_EXPECT(changes.removed == removed);
3246 ManifestCache pubManifests;
3247 ManifestCache valManifests;
3249 auto const keysTotal = valKeys.
size();
3250 auto trustedKeys = makeValidatorList(
3258 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3259 for (
auto const& p : publishers)
3260 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3262 TrustChanges changes = trustedKeys->updateTrusted(
3264 env.timeKeeper().now(),
3266 env.app().overlay(),
3267 env.app().getHashRouter());
3268 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3269 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3271 hash_set<NodeID> added;
3272 for (
auto const& val : valKeys)
3274 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3277 BEAST_EXPECT(changes.added == added);
3278 BEAST_EXPECT(changes.removed.empty());
3281 env.timeKeeper().set(publishers.
back().expiry);
3282 changes = trustedKeys->updateTrusted(
3284 env.timeKeeper().now(),
3286 env.app().overlay(),
3287 env.app().getHashRouter());
3288 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3289 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3291 hash_set<NodeID> removed;
3292 for (
auto const& val : valKeys)
3294 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3295 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3296 removed.insert(
calcNodeID(val.masterPublic));
3298 BEAST_EXPECT(changes.added.empty());
3299 BEAST_EXPECT(changes.removed == removed);
3305 ManifestCache pubManifests;
3306 ManifestCache valManifests;
3309 auto const self = randomValidator();
3310 auto const keysTotal = valKeys.
size() + 1;
3311 auto trustedKeys = makeValidatorList(
3319 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3320 for (
auto const& p : publishers)
3321 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3323 TrustChanges changes = trustedKeys->updateTrusted(
3325 env.timeKeeper().now(),
3327 env.app().overlay(),
3328 env.app().getHashRouter());
3329 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3330 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3332 hash_set<NodeID> added;
3334 for (
auto const& val : valKeys)
3336 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3339 BEAST_EXPECT(changes.added == added);
3340 BEAST_EXPECT(changes.removed.empty());
3343 env.timeKeeper().set(publishers.
back().expiry);
3344 changes = trustedKeys->updateTrusted(
3346 env.timeKeeper().now(),
3348 env.app().overlay(),
3349 env.app().getHashRouter());
3350 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3351 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3353 hash_set<NodeID> removed;
3354 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3355 for (
auto const& val : valKeys)
3357 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3358 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3359 removed.insert(
calcNodeID(val.masterPublic));
3361 BEAST_EXPECT(changes.added.empty());
3362 BEAST_EXPECT(changes.removed == removed);
3368 ManifestCache pubManifests;
3369 ManifestCache valManifests;
3372 auto const self = valKeys[2];
3373 auto const keysTotal = valKeys.
size();
3374 auto trustedKeys = makeValidatorList(
3382 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3383 for (
auto const& p : publishers)
3384 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3386 TrustChanges changes = trustedKeys->updateTrusted(
3388 env.timeKeeper().now(),
3390 env.app().overlay(),
3391 env.app().getHashRouter());
3392 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3393 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3395 hash_set<NodeID> added;
3396 for (
auto const& val : valKeys)
3398 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3401 BEAST_EXPECT(changes.added == added);
3402 BEAST_EXPECT(changes.removed.empty());
3408 ManifestCache pubManifests;
3409 ManifestCache valManifests;
3411 auto const keysTotal = valKeys.
size();
3412 auto trustedKeys = makeValidatorList(
3420 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3421 for (
auto const& p : publishers)
3422 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3424 TrustChanges changes = trustedKeys->updateTrusted(
3426 env.timeKeeper().now(),
3428 env.app().overlay(),
3429 env.app().getHashRouter());
3430 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3431 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3433 hash_set<NodeID> added;
3434 for (
auto const& val : valKeys)
3436 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3439 BEAST_EXPECT(changes.added == added);
3440 BEAST_EXPECT(changes.removed.empty());
3446 ManifestCache pubManifests;
3447 ManifestCache valManifests;
3450 auto const self = randomValidator();
3451 auto const keysTotal = valKeys.
size() + 1;
3452 auto trustedKeys = makeValidatorList(
3460 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3461 int untrustedCount = 0;
3462 for (
auto const& p : publishers)
3464 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3465 BEAST_EXPECT(p.revoked ^ trusted);
3466 untrustedCount += trusted ? 0 : 1;
3468 BEAST_EXPECT(untrustedCount == 2);
3470 TrustChanges changes = trustedKeys->updateTrusted(
3472 env.timeKeeper().now(),
3474 env.app().overlay(),
3475 env.app().getHashRouter());
3476 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3477 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3479 hash_set<NodeID> added;
3481 for (
auto const& val : valKeys)
3483 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3486 BEAST_EXPECT(changes.added == added);
3487 BEAST_EXPECT(changes.removed.empty());
3490 env.timeKeeper().set(publishers.
back().expiry);
3491 changes = trustedKeys->updateTrusted(
3493 env.timeKeeper().now(),
3495 env.app().overlay(),
3496 env.app().getHashRouter());
3497 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3498 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3500 hash_set<NodeID> removed;
3501 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3502 for (
auto const& val : valKeys)
3504 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3505 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3506 removed.insert(
calcNodeID(val.masterPublic));
3508 BEAST_EXPECT(changes.added.empty());
3509 BEAST_EXPECT(changes.removed == removed);
3515 ManifestCache pubManifests;
3516 ManifestCache valManifests;
3519 auto const self = valKeys[2];
3520 auto const keysTotal = valKeys.
size();
3521 auto trustedKeys = makeValidatorList(
3529 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3530 int untrustedCount = 0;
3531 for (
auto const& p : publishers)
3533 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3534 BEAST_EXPECT(p.revoked ^ trusted);
3535 untrustedCount += trusted ? 0 : 1;
3537 BEAST_EXPECT(untrustedCount == 3);
3539 TrustChanges changes = trustedKeys->updateTrusted(
3541 env.timeKeeper().now(),
3543 env.app().overlay(),
3544 env.app().getHashRouter());
3545 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3546 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3548 hash_set<NodeID> added;
3549 for (
auto const& val : valKeys)
3551 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3554 BEAST_EXPECT(changes.added == added);
3555 BEAST_EXPECT(changes.removed.empty());
3558 env.timeKeeper().set(publishers.
back().expiry);
3559 changes = trustedKeys->updateTrusted(
3561 env.timeKeeper().now(),
3563 env.app().overlay(),
3564 env.app().getHashRouter());
3565 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3566 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3568 hash_set<NodeID> removed;
3569 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3570 for (
auto const& val : valKeys)
3572 if (val.masterPublic != self.masterPublic)
3574 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3575 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3576 removed.insert(
calcNodeID(val.masterPublic));
3579 BEAST_EXPECT(changes.added.empty());
3580 BEAST_EXPECT(changes.removed == removed);