490 using namespace std::chrono_literals;
494 auto checkAvailable =
496 auto const& trustedKeys,
497 auto const& hexPublic,
501 auto const available = trustedKeys->getAvailable(hexPublic);
507 BEAST_EXPECT(a[jss::public_key] == hexPublic);
508 BEAST_EXPECT(a[jss::manifest] ==
manifest);
511 BEAST_EXPECT(a[jss::version] == version);
514 BEAST_EXPECT(expected.size() == 1);
515 BEAST_EXPECT(a[jss::blob] == expected[0].first);
516 BEAST_EXPECT(a[jss::signature] == expected[0].second);
517 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
519 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
521 BEAST_EXPECT(!a.isMember(jss::blob));
522 BEAST_EXPECT(!a.isMember(jss::signature));
523 auto const& blobs_v2 = a[jss::blobs_v2];
524 BEAST_EXPECT(blobs_v2.isArray() && blobs_v2.size() == expected.size());
526 for (
unsigned int i = 0; i < expected.size(); ++i)
528 BEAST_EXPECT(blobs_v2[i][jss::blob] == expected[i].first);
529 BEAST_EXPECT(blobs_v2[i][jss::signature] == expected[i].second);
537 auto& app = env.
app();
542 app.config().legacy(
"database_path"),
546 for (
auto const& val : list)
548 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
549 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
554 for (
auto const& val : list)
556 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
557 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
563 auto const hexPublic =
strHex(publisherPublic.begin(), publisherPublic.end());
566 publisherPublic, publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
571 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublisherKeys));
574 auto constexpr listSize = 20;
575 auto constexpr numLists = 9;
578 for (
auto i = 1; i <= numLists; ++i)
580 auto& list = lists[i];
581 list.reserve(listSize);
582 while (list.size() < listSize)
590 auto const version = 1;
591 auto const sequence1 = 1;
592 auto const expiredblob =
594 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
597 auto const sequence2 = 2;
599 auto const sig2 =
signList(blob2, pubSigningKeys1);
602 trustedKeys->applyLists(
603 manifest1, version, {{expiredblob, expiredSig, {}}, {blob2, sig2, {}}}, siteUri),
608 expectTrusted(lists.at(2));
610 checkAvailable(trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
613 auto const version2 = 2;
614 auto const sequence7 = 7;
615 auto const effective7 = validUntil - 60s;
616 auto const expiration7 = effective7 + 3600s;
617 auto const blob7 = makeList(
620 expiration7.time_since_epoch().count(),
621 effective7.time_since_epoch().count());
622 auto const sig7 = signList(blob7, pubSigningKeys1);
624 auto const sequence8 = 8;
625 auto const effective8 = expiration7 - 60s;
626 auto const expiration8 = effective8 + 3600s;
627 auto const blob8 = makeList(
630 expiration8.time_since_epoch().count(),
631 effective8.time_since_epoch().count());
632 auto const sig8 = signList(blob8, pubSigningKeys1);
635 trustedKeys->applyLists(
636 manifest1, version2, {{blob7, sig7, {}}, {blob8, sig8, {}}}, siteUri),
638 ListDisposition::pending,
639 ListDisposition::pending);
641 expectUntrusted(lists.at(7));
642 expectUntrusted(lists.at(8));
645 auto const sequence6 = 6;
646 auto const effective6 = effective7 - 60s;
647 auto const expiration6 = effective6 + 3600s;
648 auto const blob6 = makeList(
651 expiration6.time_since_epoch().count(),
652 effective6.time_since_epoch().count());
653 auto const sig6 = signList(blob6, pubSigningKeys1);
656 auto const sequence6a = 5;
657 auto const effective6a = effective6 + 60s;
658 auto const expiration6a = effective6a + 3600s;
659 auto const blob6a = makeList(
662 expiration6a.time_since_epoch().count(),
663 effective6a.time_since_epoch().count());
664 auto const sig6a = signList(blob6a, pubSigningKeys1);
667 trustedKeys->applyLists(
668 manifest1, version, {{blob6a, sig6a, {}}, {blob6, sig6, {}}}, siteUri),
670 ListDisposition::pending,
671 ListDisposition::pending);
673 expectUntrusted(lists.at(6));
674 expectTrusted(lists.at(2));
679 trustedKeys->applyLists(
680 manifest1, version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
682 ListDisposition::known_sequence,
683 ListDisposition::known_sequence);
685 expectUntrusted(lists.at(6));
686 expectUntrusted(lists.at(7));
687 expectTrusted(lists.at(2));
691 trustedKeys->applyLists(
"", version, {{blob7, sig7, {}}, {blob6, sig6, {}}}, siteUri),
693 ListDisposition::invalid,
694 ListDisposition::invalid);
697 trustedKeys->applyLists(
700 {{blob7, sig7, {}}, {blob6, sig6, {}}},
703 ListDisposition::invalid,
704 ListDisposition::invalid);
707 auto const untrustedManifest =
base64_encode(makeManifestString(
708 randomMasterKey(), publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
711 trustedKeys->applyLists(untrustedManifest, version, {{blob2, sig2, {}}}, siteUri),
713 ListDisposition::untrusted,
714 ListDisposition::untrusted);
717 auto const badVersion = 666;
719 trustedKeys->applyLists(manifest1, badVersion, {{blob2, sig2, {}}}, siteUri),
721 ListDisposition::unsupported_version,
722 ListDisposition::unsupported_version);
725 auto const sequence3 = 3;
726 auto const blob3 = makeList(lists.at(3), sequence3, validUntil.time_since_epoch().count());
727 auto const sig3 = signList(blob3, pubSigningKeys1);
730 trustedKeys->applyLists(manifest1, version, {{blob3, sig3, {}}}, siteUri),
732 ListDisposition::accepted,
733 ListDisposition::accepted);
735 expectUntrusted(lists.at(1));
736 expectUntrusted(lists.at(2));
737 expectTrusted(lists.at(3));
746 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
750 trustedKeys->applyLists(
751 manifest1, version, {{blob2, sig2, {}}, {blob3, sig3, {}}}, siteUri),
753 ListDisposition::stale,
754 ListDisposition::same_sequence);
758 auto const pubSigningKeys2 =
randomKeyPair(KeyType::secp256k1);
760 publisherPublic, publisherSecret, pubSigningKeys2.first, pubSigningKeys2.second, 2));
762 auto const sequence4 = 4;
763 auto const blob4 = makeList(lists.at(4), sequence4, validUntil.time_since_epoch().count());
764 auto const sig4 = signList(blob4, pubSigningKeys2);
767 trustedKeys->applyLists(
770 {{blob2, sig2, manifest1}, {blob3, sig3, manifest1}, {blob4, sig4, {}}},
773 ListDisposition::stale,
774 ListDisposition::accepted);
776 expectUntrusted(lists.at(2));
777 expectUntrusted(lists.at(3));
778 expectTrusted(lists.at(4));
785 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
787 auto const sequence5 = 5;
788 auto const blob5 = makeList(lists.at(5), sequence5, validUntil.time_since_epoch().count());
789 auto const badSig = signList(blob5, pubSigningKeys1);
791 trustedKeys->applyLists(manifest1, version, {{blob5, badSig, {}}}, siteUri),
793 ListDisposition::invalid,
794 ListDisposition::invalid);
796 expectUntrusted(lists.at(2));
797 expectUntrusted(lists.at(3));
798 expectTrusted(lists.at(4));
799 expectUntrusted(lists.at(5));
803 trustedKeys->applyLists(
804 manifest1, version, {{blob7, sig7, {}}, {blob8, sig8, {}}}, siteUri),
806 ListDisposition::invalid,
807 ListDisposition::invalid);
809 expectTrusted(lists.at(4));
810 expectUntrusted(lists.at(7));
811 expectUntrusted(lists.at(8));
816 trustedKeys->updateTrusted(
820 env.app().getOverlay(),
821 env.app().getHashRouter());
823 expectUntrusted(lists.at(3));
824 expectTrusted(lists.at(6));
827 trustedKeys, hexPublic, manifest2, 2, {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
833 env.timeKeeper().set(effective8);
834 trustedKeys->updateTrusted(
838 env.app().getOverlay(),
839 env.app().getHashRouter());
841 expectUntrusted(lists.at(6));
842 expectUntrusted(lists.at(7));
843 expectTrusted(lists.at(8));
845 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
851 auto const sig8_2 = signList(blob8, pubSigningKeys2);
854 trustedKeys->applyLists(
855 manifest2, version, {{blob8, sig8, manifest1}, {blob8, sig8_2, {}}}, siteUri),
857 ListDisposition::invalid,
858 ListDisposition::same_sequence);
860 expectTrusted(lists.at(8));
862 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
866 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
867 auto maxManifest =
base64_encode(makeRevocationString(publisherPublic, publisherSecret));
869 auto const sequence9 = 9;
870 auto const blob9 = makeList(lists.at(9), sequence9, validUntil.time_since_epoch().count());
871 auto const sig9 = signList(blob9, signingKeysMax);
874 trustedKeys->applyLists(maxManifest, version, {{blob9, sig9, {}}}, siteUri),
876 ListDisposition::untrusted,
877 ListDisposition::untrusted);
879 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
880 for (
auto const& [num, list] : lists)
883 expectUntrusted(list);
886 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
1024 testcase(
"Update trusted");
1026 std::string const siteUri =
"testUpdateTrusted.test";
1030 auto& app = env.
app();
1035 app.config().legacy(
"database_path"),
1047 while (cfgKeys.
size() != maxKeys)
1049 auto const valKey = randomNode();
1051 if (cfgKeys.
size() <= maxKeys - 5)
1061 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1065 TrustChanges changes = trustedKeysOuter->updateTrusted(
1066 activeValidatorsOuter,
1072 for (
auto const& val : unseenValidators)
1073 activeValidatorsOuter.
emplace(val);
1075 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1076 BEAST_EXPECT(changes.
removed.empty());
1077 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1078 for (
auto const& val : cfgKeys)
1080 if (
auto const valKey = parseBase58<PublicKey>(TokenType::NodePublic, val))
1082 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1083 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1091 changes = trustedKeysOuter->updateTrusted(
1092 activeValidatorsOuter,
1097 BEAST_EXPECT(changes.
added.empty());
1098 BEAST_EXPECT(changes.
removed.empty());
1099 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1104 auto const masterPublic =
derivePublicKey(KeyType::ed25519, masterPrivate);
1108 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1110 auto const signingKeys1 =
randomKeyPair(KeyType::secp256k1);
1111 auto const signingPublic1 = signingKeys1.first;
1115 TrustChanges changes = trustedKeysOuter->updateTrusted(
1116 activeValidatorsOuter,
1121 BEAST_EXPECT(changes.
added == asNodeIDs({masterPublic}));
1122 BEAST_EXPECT(changes.
removed.empty());
1123 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1124 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1125 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1126 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1127 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1131 masterPublic, masterPrivate, signingPublic1, signingKeys1.second, 1));
1135 manifestsOuter.
applyManifest(std::move(*m1)) == ManifestDisposition::accepted);
1136 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1137 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1138 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1139 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1143 auto const signingKeys2 =
randomKeyPair(KeyType::secp256k1);
1144 auto const signingPublic2 = signingKeys2.first;
1146 masterPublic, masterPrivate, signingPublic2, signingKeys2.second, 2));
1149 manifestsOuter.
applyManifest(std::move(*m2)) == ManifestDisposition::accepted);
1150 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1151 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1152 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1153 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1154 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1155 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1158 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
1159 auto const signingPublicMax = signingKeysMax.first;
1164 BEAST_EXPECT(mMax->revoked());
1166 manifestsOuter.
applyManifest(std::move(*mMax)) == ManifestDisposition::accepted);
1169 BEAST_EXPECT(manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1170 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1173 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1174 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1176 changes = trustedKeysOuter->updateTrusted(
1177 activeValidatorsOuter,
1182 BEAST_EXPECT(changes.
removed == asNodeIDs({masterPublic}));
1183 BEAST_EXPECT(changes.
added.empty());
1184 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1185 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1186 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1187 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1188 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1189 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1190 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1191 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1192 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1201 app.config().legacy(
"database_path"),
1204 auto const publisherPublic =
derivePublicKey(KeyType::ed25519, publisherSecret);
1209 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1211 TrustChanges const changes = trustedKeys->updateTrusted(
1212 activeValidatorsOuter,
1217 BEAST_EXPECT(changes.
removed.empty());
1218 BEAST_EXPECT(changes.
added.empty());
1228 app.config().legacy(
"database_path"),
1231 auto const masterPublic =
derivePublicKey(KeyType::ed25519, masterPrivate);
1235 auto const publisher1Public =
derivePublicKey(KeyType::ed25519, publisher1Secret);
1237 auto const publisher2Public =
derivePublicKey(KeyType::ed25519, publisher2Secret);
1241 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1243 TrustChanges const changes = trustedKeys->updateTrusted(
1244 activeValidatorsOuter,
1249 BEAST_EXPECT(changes.
removed.empty());
1250 BEAST_EXPECT(changes.
added.size() == 1);
1251 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1252 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1262 app.config().legacy(
"database_path"),
1273 while (cfgKeys.
size() < n)
1275 auto const valKey = randomNode();
1288 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1296 BEAST_EXPECT(changes.
removed.empty());
1297 BEAST_EXPECT(changes.
added == expectedTrusted);
1298 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1301 activeValidators.
emplace(toBeSeen);
1302 changes = trustedKeys->updateTrusted(
1308 BEAST_EXPECT(changes.
removed.empty());
1309 BEAST_EXPECT(changes.
added.empty());
1310 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1318 app.config().legacy(
"database_path"),
1322 auto const publisherKeys =
randomKeyPair(KeyType::secp256k1);
1323 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1325 publisherKeys.first,
1326 publisherKeys.second,
1327 pubSigningKeys.first,
1328 pubSigningKeys.second,
1333 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublisherKeys));
1337 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1340 auto const version = 1;
1341 auto const sequence = 1;
1342 using namespace std::chrono_literals;
1344 auto const blob = makeList(list, sequence, validUntil.
time_since_epoch().count());
1345 auto const sig = signList(blob, pubSigningKeys);
1348 ListDisposition::accepted ==
1349 trustedKeys->applyLists(
manifest, version, {{blob, sig, {}}}, siteUri)
1350 .bestDisposition());
1358 BEAST_EXPECT(changes.
removed.empty());
1359 BEAST_EXPECT(changes.
added == activeValidators);
1362 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1363 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1365 BEAST_EXPECT(trustedKeys->quorum() == 2);
1368 changes = trustedKeys->updateTrusted(
1374 BEAST_EXPECT(changes.
removed == activeValidators);
1375 BEAST_EXPECT(changes.
added.empty());
1376 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1377 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1383 auto const sequence2 = 2;
1385 auto const blob2 = makeList(list2, sequence2, expiration2.
time_since_epoch().count());
1386 auto const sig2 = signList(blob2, pubSigningKeys);
1389 ListDisposition::accepted ==
1390 trustedKeys->applyLists(
manifest, version, {{blob2, sig2, {}}}, siteUri)
1391 .bestDisposition());
1393 changes = trustedKeys->updateTrusted(
1395 env.timeKeeper().now(),
1397 env.app().getOverlay(),
1398 env.app().getHashRouter());
1399 BEAST_EXPECT(changes.removed.empty());
1401 changes.added == asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1402 for (Validator
const& val : list2)
1404 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1405 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1407 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1408 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1409 BEAST_EXPECT(trustedKeys->quorum() == 2);
1417 app.config().legacy(
"database_path"),
1421 hash_set<NodeID> activeValidators;
1422 hash_set<PublicKey> activeKeys;
1429 auto const valKey = randomNode();
1431 activeValidators.emplace(
calcNodeID(valKey));
1432 activeKeys.emplace(valKey);
1433 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1434 TrustChanges
const changes = trustedKeys->updateTrusted(
1436 env.timeKeeper().now(),
1438 env.app().getOverlay(),
1439 env.app().getHashRouter());
1440 BEAST_EXPECT(changes.removed.empty());
1441 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1442 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1443 for (
auto const& key : activeKeys)
1444 BEAST_EXPECT(trustedKeys->trusted(key));
1453 app.config().legacy(
"database_path"),
1456 auto const localKey = randomNode();
1458 hash_set<NodeID> activeValidators;
1459 hash_set<PublicKey> activeKeys;
1465 auto const valKey = randomNode();
1467 activeValidators.emplace(
calcNodeID(valKey));
1468 activeKeys.emplace(valKey);
1470 BEAST_EXPECT(trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1471 TrustChanges
const changes = trustedKeys->updateTrusted(
1473 env.timeKeeper().now(),
1475 env.app().getOverlay(),
1476 env.app().getHashRouter());
1477 BEAST_EXPECT(changes.removed.empty());
1478 if (cfgKeys.
size() > 2)
1480 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1484 BEAST_EXPECT(changes.added == asNodeIDs({localKey, valKey}));
1487 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1489 for (
auto const& key : activeKeys)
1490 BEAST_EXPECT(trustedKeys->trusted(key));
1495 ManifestCache manifests;
1500 app.config().legacy(
"database_path"),
1503 hash_set<NodeID> activeValidators;
1507 while (valKeys.
size() != maxKeys)
1510 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1516 constexpr static int publishers = 3;
1526 auto addPublishedList = [&,
this](
int i) {
1533 pubSigningKeys.first,
1534 pubSigningKeys.second,
1541 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers,
std::size_t(1)));
1543 auto const version = 1;
1544 auto const sequence = 1;
1545 using namespace std::chrono_literals;
1549 makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1550 auto const sig = signList(blob, pubSigningKeys);
1554 trustedKeys->applyLists(
manifest, version, {{blob, sig, {}}}, siteUri)
1555 .bestDisposition());
1559 for (
auto i = 0; i < publishers; ++i)
1560 addPublishedList(i);
1561 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1563 TrustChanges
const changes = trustedKeys->updateTrusted(
1565 env.timeKeeper().now(),
1567 env.app().getOverlay(),
1568 env.app().getHashRouter());
1570 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(valKeys.
size() * 0.8f));
1572 hash_set<NodeID> added;
1573 for (
auto const& val : valKeys)
1575 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1578 BEAST_EXPECT(changes.added == added);
1579 BEAST_EXPECT(changes.removed.empty());
1583 ManifestCache manifests;
1588 app.config().legacy(
"database_path"),
1591 hash_set<NodeID> activeValidators;
1595 while (valKeys.
size() != maxKeys)
1598 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1606 constexpr static int publishers = 3;
1616 auto addPublishedList =
1625 pubSigningKeys.first,
1626 pubSigningKeys.second,
1632 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1634 auto const version = 1;
1635 auto const sequence = 1;
1636 using namespace std::chrono_literals;
1654 validUntil1 = validUntil;
1658 validUntil2 = validUntil;
1662 makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1663 auto const sig = signList(blob, pubSigningKeys);
1667 trustedKeys->applyLists(
manifest, version, {{blob, sig, {}}}, siteUri)
1668 .bestDisposition());
1674 for (
auto i = 0; i < publishers; ++i)
1675 addPublishedList(i, validUntil1, validUntil2);
1676 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1678 TrustChanges changes = trustedKeys->updateTrusted(
1680 env.timeKeeper().now(),
1682 env.app().getOverlay(),
1683 env.app().getHashRouter());
1685 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.
size() - 3) * 0.8f));
1687 for (
auto const& val : valKeys)
1688 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1690 hash_set<NodeID> added;
1693 auto const& val = valKeys[i];
1694 if (i >= 1 && i < maxKeys - 2)
1696 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1701 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1704 BEAST_EXPECT(changes.added == added);
1705 BEAST_EXPECT(changes.removed.empty());
1708 env.timeKeeper().set(validUntil1);
1709 changes = trustedKeys->updateTrusted(
1711 env.timeKeeper().now(),
1713 env.app().getOverlay(),
1714 env.app().getHashRouter());
1716 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.
size() - 6) * 0.8f));
1718 for (
auto const& val : valKeys)
1719 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1721 hash_set<NodeID> removed;
1724 auto const& val = valKeys[i];
1725 if (i >= 2 && i < maxKeys - 4)
1727 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1731 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1732 if (i >= 1 && i < maxKeys - 2)
1733 removed.insert(
calcNodeID(val.masterPublic));
1737 BEAST_EXPECT(changes.added.empty());
1738 BEAST_EXPECT(changes.removed == removed);
1741 env.timeKeeper().set(validUntil2);
1742 changes = trustedKeys->updateTrusted(
1744 env.timeKeeper().now(),
1746 env.app().getOverlay(),
1747 env.app().getHashRouter());
1754 auto const& val = valKeys[i];
1755 if (i < maxKeys - 4)
1757 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1761 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1764 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1765 if (i >= 2 && i < maxKeys - 4)
1766 removed.insert(
calcNodeID(val.masterPublic));
1769 BEAST_EXPECT(changes.added.empty());
1770 BEAST_EXPECT(changes.removed == removed);
2204 testcase(
"Build and split messages");
2207 auto extractHeader = [
this](
Message& message) {
2210 boost::beast::multi_buffer buffers;
2213 auto start = buffer.begin();
2214 auto end = buffer.end();
2217 boost::asio::buffer_copy(
2218 buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
2220 boost::system::error_code ec;
2225 auto extractProtocolMessage1 = [
this, &extractHeader](
Message& message) {
2226 auto [header, buffers] = extractHeader(message);
2227 if (BEAST_EXPECT(header) &&
2228 BEAST_EXPECT(header->message_type == protocol::mtVALIDATOR_LIST))
2231 detail::parseMessageContent<protocol::TMValidatorList>(*header, buffers.data());
2237 auto extractProtocolMessage2 = [
this, &extractHeader](
Message& message) {
2238 auto [header, buffers] = extractHeader(message);
2239 if (BEAST_EXPECT(header) &&
2240 BEAST_EXPECT(header->message_type == protocol::mtVALIDATOR_LIST_COLLECTION))
2242 auto const msg = detail::parseMessageContent<protocol::TMValidatorListCollection>(
2243 *header, buffers.data());
2249 auto verifyMessage =
2250 [
this, manifestCutoff, &extractProtocolMessage1, &extractProtocolMessage2](
2253 auto const& blobInfos,
2254 auto const& messages,
2256 BEAST_EXPECT(messages.size() == expectedInfo.size());
2257 auto msgIter = expectedInfo.begin();
2258 for (
auto const& messageWithHash : messages)
2260 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2262 if (!BEAST_EXPECT(messageWithHash.message))
2264 auto const& expectedSeqs = msgIter->second;
2265 auto seqIter = expectedSeqs.begin();
2269 BEAST_EXPECT(size == msgIter->first);
2270 if (expectedSeqs.size() == 1)
2272 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2273 auto const expectedVersion = 1;
2274 if (BEAST_EXPECT(msg))
2276 BEAST_EXPECT(msg->version() == expectedVersion);
2277 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2279 auto const& expectedBlob = blobInfos.at(*seqIter);
2280 BEAST_EXPECT((*seqIter < manifestCutoff) == !!expectedBlob.manifest);
2281 auto const expectedManifest =
2282 *seqIter < manifestCutoff && expectedBlob.manifest
2283 ? *expectedBlob.manifest
2285 BEAST_EXPECT(msg->manifest() == expectedManifest);
2286 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2287 BEAST_EXPECT(msg->signature() == expectedBlob.signature);
2289 BEAST_EXPECT(seqIter == expectedSeqs.end());
2292 messageWithHash.hash ==
2296 expectedBlob.signature,
2303 hashingBlobs.
reserve(msgIter->second.size());
2305 auto const msg = extractProtocolMessage2(*messageWithHash.message);
2306 if (BEAST_EXPECT(msg))
2308 BEAST_EXPECT(msg->version() == version);
2309 BEAST_EXPECT(msg->manifest() ==
manifest);
2310 for (
auto const& blobInfo : msg->blobs())
2312 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2314 auto const& expectedBlob = blobInfos.at(*seqIter);
2316 BEAST_EXPECT(blobInfo.has_manifest() == !!expectedBlob.manifest);
2318 blobInfo.has_manifest() == (*seqIter < manifestCutoff));
2320 if (*seqIter < manifestCutoff)
2321 BEAST_EXPECT(blobInfo.manifest() == *expectedBlob.manifest);
2322 BEAST_EXPECT(blobInfo.blob() == expectedBlob.blob);
2323 BEAST_EXPECT(blobInfo.signature() == expectedBlob.signature);
2326 BEAST_EXPECT(seqIter == expectedSeqs.end());
2333 BEAST_EXPECT(msgIter == expectedInfo.end());
2335 auto verifyBuildMessages = [
this](
2339 BEAST_EXPECT(result.
first == expectedSequence);
2340 BEAST_EXPECT(result.
second == expectedSize);
2346 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2349 for (
auto seq : {5, 6, 7, 10, 12})
2353 s <<
"This is not a blob with sequence " <<
seq;
2356 s <<
"This is not a signature for sequence " <<
seq;
2357 b.signature = s.
str();
2358 if (
seq < manifestCutoff)
2362 s <<
"This is not manifest " <<
seq;
2363 b.manifest = s.
str();
2368 auto const maxSequence = blobInfos.
rbegin()->first;
2369 BEAST_EXPECT(maxSequence == 12);
2376 verifyBuildMessages(
2378 1, 8, maxSequence, version,
manifest, blobInfos, messages),
2381 BEAST_EXPECT(messages.empty());
2387 messages.emplace_back();
2388 verifyBuildMessages(
2390 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2393 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2397 verifyBuildMessages(
2399 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2402 if (BEAST_EXPECT(messages.size() == 1) && BEAST_EXPECT(messages.front().message))
2404 auto const& messageWithHash = messages.front();
2405 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2409 BEAST_EXPECT(size == 108);
2410 auto const& expected = blobInfos.at(5);
2411 if (BEAST_EXPECT(msg))
2413 BEAST_EXPECT(msg->version() == 1);
2415 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2416 BEAST_EXPECT(msg->blob() == expected.blob);
2417 BEAST_EXPECT(msg->signature() == expected.signature);
2420 messageWithHash.hash ==
2422 sha512Half(*expected.manifest, expected.blob, expected.signature, 1));
2430 verifyBuildMessages(
2432 2, maxSequence * 2, maxSequence, version,
manifest, blobInfos, messages),
2435 BEAST_EXPECT(messages.empty());
2441 messages.emplace_back();
2442 verifyBuildMessages(
2444 2, 3, maxSequence, version,
manifest, blobInfos, messages),
2447 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2451 verifyBuildMessages(
2453 2, 5, maxSequence, version,
manifest, blobInfos, messages),
2456 verifyMessage(version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2462 verifyBuildMessages(
2464 2, 5, maxSequence, version,
manifest, blobInfos, messages, 300),
2467 verifyMessage(version,
manifest, blobInfos, messages, {{212, {6, 7}}, {192, {10, 12}}});
2472 verifyBuildMessages(
2474 2, 5, maxSequence, version,
manifest, blobInfos, messages, 200),
2478 version,
manifest, blobInfos, messages, {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2482 verifyBuildMessages(
2484 2, 5, maxSequence, version,
manifest, blobInfos, messages, 150),
2492 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2497 verifyBuildMessages(
2499 2, 5, maxSequence, version,
manifest, blobInfos, messages, 108),
2507 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2513 testcase(
"Test quorum disabled");
2515 std::string const siteUri =
"testQuorumDisabled.test";
2517 auto& app = env.
app();
2522 while (valKeys.
size() != maxKeys)
2539 auto makeValidatorList = [&,
this](
2552 app.config().legacy(
"database_path"),
2567 pubSigningKeys.first,
2568 pubSigningKeys.second,
2569 i < countRevoked ?
revoked : 1));
2570 publishers.push_back(
2572 .revoked = i < countRevoked,
2573 .pubKey = publisherPublic,
2574 .signingKeys = pubSigningKeys,
2585 result->load(self->signingPublic, emptyCfgKeys, cfgPublishers, threshold));
2589 BEAST_EXPECT(result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2594 using namespace std::chrono_literals;
2595 publishers[i].expiry = env.
timeKeeper().
now() + (i == countTotal - 1 ? 60s : 3600s);
2597 makeList(valKeys, 1, publishers[i].expiry.time_since_epoch().count());
2598 auto const sig = signList(blob, publishers[i].signingKeys);
2601 result->applyLists(publishers[i].manifest, 1, {{blob, sig, {}}}, siteUri)
2602 .bestDisposition() ==
2618 auto const self = randomValidator();
2619 auto const keysTotal = valKeys.
size() + 1;
2620 auto trustedKeys = makeValidatorList(
2628 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2629 for (
auto const& p : publishers)
2630 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2634 env.timeKeeper().now(),
2636 env.app().getOverlay(),
2637 env.app().getHashRouter());
2638 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2639 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2643 for (
auto const& val : valKeys)
2645 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2648 BEAST_EXPECT(changes.
added == added);
2649 BEAST_EXPECT(changes.
removed.empty());
2652 env.timeKeeper().set(publishers.
back().expiry);
2653 changes = trustedKeys->updateTrusted(
2655 env.timeKeeper().now(),
2657 env.app().getOverlay(),
2658 env.app().getHashRouter());
2659 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2660 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2663 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2664 for (
auto const& val : valKeys)
2666 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2667 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2670 BEAST_EXPECT(changes.
added.empty());
2671 BEAST_EXPECT(changes.
removed == removed);
2675 ManifestCache pubManifests;
2676 ManifestCache valManifests;
2678 auto const keysTotal = valKeys.
size();
2679 auto trustedKeys = makeValidatorList(
2687 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2688 for (
auto const& p : publishers)
2689 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2691 TrustChanges changes = trustedKeys->updateTrusted(
2693 env.timeKeeper().now(),
2695 env.app().getOverlay(),
2696 env.app().getHashRouter());
2697 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2698 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2700 hash_set<NodeID> added;
2701 for (
auto const& val : valKeys)
2703 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2706 BEAST_EXPECT(changes.added == added);
2707 BEAST_EXPECT(changes.removed.empty());
2710 env.timeKeeper().set(publishers.
back().expiry);
2711 changes = trustedKeys->updateTrusted(
2713 env.timeKeeper().now(),
2715 env.app().getOverlay(),
2716 env.app().getHashRouter());
2717 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2718 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
2720 hash_set<NodeID> removed;
2721 for (
auto const& val : valKeys)
2723 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2724 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2725 removed.insert(
calcNodeID(val.masterPublic));
2727 BEAST_EXPECT(changes.added.empty());
2728 BEAST_EXPECT(changes.removed == removed);
2732 ManifestCache pubManifests;
2733 ManifestCache valManifests;
2736 auto const self = valKeys[1];
2737 auto const keysTotal = valKeys.
size();
2738 auto trustedKeys = makeValidatorList(
2746 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2747 int untrustedCount = 0;
2748 for (
auto const& p : publishers)
2750 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2751 BEAST_EXPECT(p.revoked ^ trusted);
2752 untrustedCount += trusted ? 0 : 1;
2754 BEAST_EXPECT(untrustedCount == 1);
2756 TrustChanges changes = trustedKeys->updateTrusted(
2758 env.timeKeeper().now(),
2760 env.app().getOverlay(),
2761 env.app().getHashRouter());
2762 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2763 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2765 hash_set<NodeID> added;
2766 for (
auto const& val : valKeys)
2768 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2771 BEAST_EXPECT(changes.added == added);
2772 BEAST_EXPECT(changes.removed.empty());
2775 env.timeKeeper().set(publishers.
back().expiry);
2776 changes = trustedKeys->updateTrusted(
2778 env.timeKeeper().now(),
2780 env.app().getOverlay(),
2781 env.app().getHashRouter());
2782 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2783 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2785 hash_set<NodeID> removed;
2786 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2787 for (
auto const& val : valKeys)
2789 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2790 if (val.masterPublic != self.masterPublic)
2792 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2793 removed.insert(
calcNodeID(val.masterPublic));
2796 BEAST_EXPECT(changes.added.empty());
2797 BEAST_EXPECT(changes.removed == removed);
2801 ManifestCache pubManifests;
2802 ManifestCache valManifests;
2805 auto const self = randomValidator();
2806 auto const keysTotal = valKeys.
size() + 1;
2807 auto trustedKeys = makeValidatorList(
2815 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2816 int untrustedCount = 0;
2817 for (
auto const& p : publishers)
2819 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2820 BEAST_EXPECT(p.revoked ^ trusted);
2821 untrustedCount += trusted ? 0 : 1;
2823 BEAST_EXPECT(untrustedCount == 2);
2825 TrustChanges changes = trustedKeys->updateTrusted(
2827 env.timeKeeper().now(),
2829 env.app().getOverlay(),
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;
2836 for (
auto const& val : valKeys)
2838 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2841 BEAST_EXPECT(changes.added == added);
2842 BEAST_EXPECT(changes.removed.empty());
2845 env.timeKeeper().set(publishers.
back().expiry);
2846 changes = trustedKeys->updateTrusted(
2848 env.timeKeeper().now(),
2850 env.app().getOverlay(),
2851 env.app().getHashRouter());
2852 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2853 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2855 hash_set<NodeID> removed;
2856 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2857 for (
auto const& val : valKeys)
2859 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2860 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2861 removed.insert(
calcNodeID(val.masterPublic));
2863 BEAST_EXPECT(changes.added.empty());
2864 BEAST_EXPECT(changes.removed == removed);
2868 ManifestCache pubManifests;
2869 ManifestCache valManifests;
2872 auto const self = valKeys[5];
2873 auto const keysTotal = valKeys.
size();
2874 auto trustedKeys = makeValidatorList(
2882 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2883 int untrustedCount = 0;
2884 for (
auto const& p : publishers)
2886 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2887 BEAST_EXPECT(p.revoked ^ trusted);
2888 untrustedCount += trusted ? 0 : 1;
2890 BEAST_EXPECT(untrustedCount == 2);
2892 TrustChanges changes = trustedKeys->updateTrusted(
2894 env.timeKeeper().now(),
2896 env.app().getOverlay(),
2897 env.app().getHashRouter());
2898 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2899 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2901 hash_set<NodeID> added;
2902 for (
auto const& val : valKeys)
2904 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2907 BEAST_EXPECT(changes.added == added);
2908 BEAST_EXPECT(changes.removed.empty());
2911 env.timeKeeper().set(publishers.
back().expiry);
2912 changes = trustedKeys->updateTrusted(
2914 env.timeKeeper().now(),
2916 env.app().getOverlay(),
2917 env.app().getHashRouter());
2918 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2919 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2921 hash_set<NodeID> removed;
2922 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2923 for (
auto const& val : valKeys)
2925 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2926 if (val.masterPublic != self.masterPublic)
2928 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2929 removed.insert(
calcNodeID(val.masterPublic));
2932 BEAST_EXPECT(changes.added.empty());
2933 BEAST_EXPECT(changes.removed == removed);
2937 ManifestCache pubManifests;
2938 ManifestCache valManifests;
2940 auto const keysTotal = valKeys.
size();
2941 auto trustedKeys = makeValidatorList(
2949 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2950 int untrustedCount = 0;
2951 for (
auto const& p : publishers)
2953 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2954 BEAST_EXPECT(p.revoked ^ trusted);
2955 untrustedCount += trusted ? 0 : 1;
2957 BEAST_EXPECT(untrustedCount == 2);
2959 TrustChanges changes = trustedKeys->updateTrusted(
2961 env.timeKeeper().now(),
2963 env.app().getOverlay(),
2964 env.app().getHashRouter());
2965 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2966 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2968 hash_set<NodeID> added;
2969 for (
auto const& val : valKeys)
2971 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2974 BEAST_EXPECT(changes.added == added);
2975 BEAST_EXPECT(changes.removed.empty());
2978 env.timeKeeper().set(publishers.
back().expiry);
2979 changes = trustedKeys->updateTrusted(
2981 env.timeKeeper().now(),
2983 env.app().getOverlay(),
2984 env.app().getHashRouter());
2985 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2986 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
2988 hash_set<NodeID> removed;
2989 for (
auto const& val : valKeys)
2991 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2992 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2993 removed.insert(
calcNodeID(val.masterPublic));
2995 BEAST_EXPECT(changes.added.empty());
2996 BEAST_EXPECT(changes.removed == removed);
3000 ManifestCache pubManifests;
3001 ManifestCache valManifests;
3004 auto const self = randomValidator();
3005 auto const keysTotal = valKeys.
size() + 1;
3006 auto trustedKeys = makeValidatorList(
3014 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3015 int untrustedCount = 0;
3016 for (
auto const& p : publishers)
3018 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3019 BEAST_EXPECT(p.revoked ^ trusted);
3020 untrustedCount += trusted ? 0 : 1;
3022 BEAST_EXPECT(untrustedCount == 1);
3024 TrustChanges changes = trustedKeys->updateTrusted(
3026 env.timeKeeper().now(),
3028 env.app().getOverlay(),
3029 env.app().getHashRouter());
3030 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3031 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3033 hash_set<NodeID> added;
3035 for (
auto const& val : valKeys)
3037 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3040 BEAST_EXPECT(changes.added == added);
3041 BEAST_EXPECT(changes.removed.empty());
3044 env.timeKeeper().set(publishers.
back().expiry);
3045 changes = trustedKeys->updateTrusted(
3047 env.timeKeeper().now(),
3049 env.app().getOverlay(),
3050 env.app().getHashRouter());
3051 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3052 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3054 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3055 for (
auto const& val : valKeys)
3057 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3058 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3060 BEAST_EXPECT(changes.added.empty());
3061 BEAST_EXPECT(changes.removed.empty());
3065 ManifestCache pubManifests;
3066 ManifestCache valManifests;
3069 auto const self = randomValidator();
3070 auto const keysTotal = valKeys.
size() + 1;
3071 auto trustedKeys = makeValidatorList(
3079 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3080 for (
auto const& p : publishers)
3081 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3083 TrustChanges changes = trustedKeys->updateTrusted(
3085 env.timeKeeper().now(),
3087 env.app().getOverlay(),
3088 env.app().getHashRouter());
3089 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3090 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3092 hash_set<NodeID> added;
3094 for (
auto const& val : valKeys)
3096 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3099 BEAST_EXPECT(changes.added == added);
3100 BEAST_EXPECT(changes.removed.empty());
3103 env.timeKeeper().set(publishers.
back().expiry);
3104 changes = trustedKeys->updateTrusted(
3106 env.timeKeeper().now(),
3108 env.app().getOverlay(),
3109 env.app().getHashRouter());
3110 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3111 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3113 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3114 for (
auto const& val : valKeys)
3116 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3117 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3119 BEAST_EXPECT(changes.added.empty());
3120 BEAST_EXPECT(changes.removed.empty());
3124 ManifestCache pubManifests;
3125 ManifestCache valManifests;
3128 auto const self = valKeys[7];
3129 auto const keysTotal = valKeys.
size();
3130 auto trustedKeys = makeValidatorList(
3138 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3139 for (
auto const& p : publishers)
3140 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3142 TrustChanges changes = trustedKeys->updateTrusted(
3144 env.timeKeeper().now(),
3146 env.app().getOverlay(),
3147 env.app().getHashRouter());
3148 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3149 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3151 hash_set<NodeID> added;
3152 for (
auto const& val : valKeys)
3154 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3157 BEAST_EXPECT(changes.added == added);
3158 BEAST_EXPECT(changes.removed.empty());
3161 env.timeKeeper().set(publishers.
back().expiry);
3162 changes = trustedKeys->updateTrusted(
3164 env.timeKeeper().now(),
3166 env.app().getOverlay(),
3167 env.app().getHashRouter());
3168 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3169 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3171 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3172 for (
auto const& val : valKeys)
3174 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3175 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3177 BEAST_EXPECT(changes.added.empty());
3178 BEAST_EXPECT(changes.removed.empty());
3182 ManifestCache pubManifests;
3183 ManifestCache valManifests;
3185 auto const keysTotal = valKeys.
size();
3186 auto trustedKeys = makeValidatorList(
3194 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3195 for (
auto const& p : publishers)
3196 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3198 TrustChanges changes = trustedKeys->updateTrusted(
3200 env.timeKeeper().now(),
3202 env.app().getOverlay(),
3203 env.app().getHashRouter());
3204 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3205 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3207 hash_set<NodeID> added;
3208 for (
auto const& val : valKeys)
3210 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3213 BEAST_EXPECT(changes.added == added);
3214 BEAST_EXPECT(changes.removed.empty());
3217 env.timeKeeper().set(publishers.
back().expiry);
3218 changes = trustedKeys->updateTrusted(
3220 env.timeKeeper().now(),
3222 env.app().getOverlay(),
3223 env.app().getHashRouter());
3224 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3225 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3227 for (
auto const& val : valKeys)
3229 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3230 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3232 BEAST_EXPECT(changes.added.empty());
3233 BEAST_EXPECT(changes.removed.empty());
3239 ManifestCache pubManifests;
3240 ManifestCache valManifests;
3243 auto const self = randomValidator();
3244 auto const keysTotal = valKeys.
size() + 1;
3245 auto trustedKeys = makeValidatorList(
3253 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3254 int untrustedCount = 0;
3255 for (
auto const& p : publishers)
3257 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3258 BEAST_EXPECT(p.revoked ^ trusted);
3259 untrustedCount += trusted ? 0 : 1;
3261 BEAST_EXPECT(untrustedCount == 1);
3263 TrustChanges changes = trustedKeys->updateTrusted(
3265 env.timeKeeper().now(),
3267 env.app().getOverlay(),
3268 env.app().getHashRouter());
3269 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3270 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3272 hash_set<NodeID> added;
3274 for (
auto const& val : valKeys)
3276 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3279 BEAST_EXPECT(changes.added == added);
3280 BEAST_EXPECT(changes.removed.empty());
3283 env.timeKeeper().set(publishers.
back().expiry);
3284 changes = trustedKeys->updateTrusted(
3286 env.timeKeeper().now(),
3288 env.app().getOverlay(),
3289 env.app().getHashRouter());
3290 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3291 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3293 hash_set<NodeID> removed;
3294 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3295 for (
auto const& val : valKeys)
3297 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3298 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3299 removed.insert(
calcNodeID(val.masterPublic));
3301 BEAST_EXPECT(changes.added.empty());
3302 BEAST_EXPECT(changes.removed == removed);
3306 ManifestCache pubManifests;
3307 ManifestCache valManifests;
3310 auto const self = valKeys[5];
3311 auto const keysTotal = valKeys.
size();
3312 auto trustedKeys = makeValidatorList(
3320 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3321 int untrustedCount = 0;
3322 for (
auto const& p : publishers)
3324 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3325 BEAST_EXPECT(p.revoked ^ trusted);
3326 untrustedCount += trusted ? 0 : 1;
3328 BEAST_EXPECT(untrustedCount == 1);
3330 TrustChanges changes = trustedKeys->updateTrusted(
3332 env.timeKeeper().now(),
3334 env.app().getOverlay(),
3335 env.app().getHashRouter());
3336 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3337 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3339 hash_set<NodeID> added;
3340 for (
auto const& val : valKeys)
3342 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3345 BEAST_EXPECT(changes.added == added);
3346 BEAST_EXPECT(changes.removed.empty());
3349 env.timeKeeper().set(publishers.
back().expiry);
3350 changes = trustedKeys->updateTrusted(
3352 env.timeKeeper().now(),
3354 env.app().getOverlay(),
3355 env.app().getHashRouter());
3356 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3357 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3359 hash_set<NodeID> removed;
3360 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3361 for (
auto const& val : valKeys)
3363 if (val.masterPublic != self.masterPublic)
3365 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3366 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3367 removed.insert(
calcNodeID(val.masterPublic));
3370 BEAST_EXPECT(changes.added.empty());
3371 BEAST_EXPECT(changes.removed == removed);
3375 ManifestCache pubManifests;
3376 ManifestCache valManifests;
3378 auto const keysTotal = valKeys.
size();
3379 auto trustedKeys = makeValidatorList(
3387 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3388 int untrustedCount = 0;
3389 for (
auto const& p : publishers)
3391 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3392 BEAST_EXPECT(p.revoked ^ trusted);
3393 untrustedCount += trusted ? 0 : 1;
3395 BEAST_EXPECT(untrustedCount == 1);
3397 TrustChanges changes = trustedKeys->updateTrusted(
3399 env.timeKeeper().now(),
3401 env.app().getOverlay(),
3402 env.app().getHashRouter());
3403 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3404 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3406 hash_set<NodeID> added;
3407 for (
auto const& val : valKeys)
3409 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3412 BEAST_EXPECT(changes.added == added);
3413 BEAST_EXPECT(changes.removed.empty());
3416 env.timeKeeper().set(publishers.
back().expiry);
3417 changes = trustedKeys->updateTrusted(
3419 env.timeKeeper().now(),
3421 env.app().getOverlay(),
3422 env.app().getHashRouter());
3423 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3424 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3426 hash_set<NodeID> removed;
3427 for (
auto const& val : valKeys)
3429 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3430 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3431 removed.insert(
calcNodeID(val.masterPublic));
3433 BEAST_EXPECT(changes.added.empty());
3434 BEAST_EXPECT(changes.removed == removed);
3438 ManifestCache pubManifests;
3439 ManifestCache valManifests;
3442 auto const self = randomValidator();
3443 auto const keysTotal = valKeys.
size() + 1;
3444 auto trustedKeys = makeValidatorList(
3452 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3453 for (
auto const& p : publishers)
3454 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3456 TrustChanges changes = trustedKeys->updateTrusted(
3458 env.timeKeeper().now(),
3460 env.app().getOverlay(),
3461 env.app().getHashRouter());
3462 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3463 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3465 hash_set<NodeID> added;
3467 for (
auto const& val : valKeys)
3469 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3472 BEAST_EXPECT(changes.added == added);
3473 BEAST_EXPECT(changes.removed.empty());
3476 env.timeKeeper().set(publishers.
back().expiry);
3477 changes = trustedKeys->updateTrusted(
3479 env.timeKeeper().now(),
3481 env.app().getOverlay(),
3482 env.app().getHashRouter());
3483 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3484 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3486 hash_set<NodeID> removed;
3487 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3488 for (
auto const& val : valKeys)
3490 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3491 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3492 removed.insert(
calcNodeID(val.masterPublic));
3494 BEAST_EXPECT(changes.added.empty());
3495 BEAST_EXPECT(changes.removed == removed);
3499 ManifestCache pubManifests;
3500 ManifestCache valManifests;
3503 auto const self = valKeys[5];
3504 auto const keysTotal = valKeys.
size();
3505 auto trustedKeys = makeValidatorList(
3513 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3514 for (
auto const& p : publishers)
3515 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3517 TrustChanges changes = trustedKeys->updateTrusted(
3519 env.timeKeeper().now(),
3521 env.app().getOverlay(),
3522 env.app().getHashRouter());
3523 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3524 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3526 hash_set<NodeID> added;
3528 for (
auto const& val : valKeys)
3530 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3533 BEAST_EXPECT(changes.added == added);
3534 BEAST_EXPECT(changes.removed.empty());
3537 env.timeKeeper().set(publishers.
back().expiry);
3538 changes = trustedKeys->updateTrusted(
3540 env.timeKeeper().now(),
3542 env.app().getOverlay(),
3543 env.app().getHashRouter());
3544 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3545 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3547 hash_set<NodeID> removed;
3548 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3549 for (
auto const& val : valKeys)
3551 if (val.masterPublic != self.masterPublic)
3553 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3554 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3555 removed.insert(
calcNodeID(val.masterPublic));
3558 BEAST_EXPECT(changes.added.empty());
3559 BEAST_EXPECT(changes.removed == removed);
3563 ManifestCache pubManifests;
3564 ManifestCache valManifests;
3566 auto const keysTotal = valKeys.
size();
3567 auto trustedKeys = makeValidatorList(
3575 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3576 for (
auto const& p : publishers)
3577 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3579 TrustChanges changes = trustedKeys->updateTrusted(
3581 env.timeKeeper().now(),
3583 env.app().getOverlay(),
3584 env.app().getHashRouter());
3585 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3586 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3588 hash_set<NodeID> added;
3589 for (
auto const& val : valKeys)
3591 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3594 BEAST_EXPECT(changes.added == added);
3595 BEAST_EXPECT(changes.removed.empty());
3598 env.timeKeeper().set(publishers.
back().expiry);
3599 changes = trustedKeys->updateTrusted(
3601 env.timeKeeper().now(),
3603 env.app().getOverlay(),
3604 env.app().getHashRouter());
3605 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3606 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3608 hash_set<NodeID> removed;
3609 for (
auto const& val : valKeys)
3611 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3612 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3613 removed.insert(
calcNodeID(val.masterPublic));
3615 BEAST_EXPECT(changes.added.empty());
3616 BEAST_EXPECT(changes.removed == removed);
3622 ManifestCache pubManifests;
3623 ManifestCache valManifests;
3626 auto const self = randomValidator();
3627 auto const keysTotal = valKeys.
size() + 1;
3628 auto trustedKeys = makeValidatorList(
3636 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3637 for (
auto const& p : publishers)
3638 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3640 TrustChanges changes = trustedKeys->updateTrusted(
3642 env.timeKeeper().now(),
3644 env.app().getOverlay(),
3645 env.app().getHashRouter());
3646 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3647 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3649 hash_set<NodeID> added;
3651 for (
auto const& val : valKeys)
3653 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3656 BEAST_EXPECT(changes.added == added);
3657 BEAST_EXPECT(changes.removed.empty());
3660 env.timeKeeper().set(publishers.
back().expiry);
3661 changes = trustedKeys->updateTrusted(
3663 env.timeKeeper().now(),
3665 env.app().getOverlay(),
3666 env.app().getHashRouter());
3667 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3668 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3670 hash_set<NodeID> removed;
3671 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3672 for (
auto const& val : valKeys)
3674 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3675 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3676 removed.insert(
calcNodeID(val.masterPublic));
3678 BEAST_EXPECT(changes.added.empty());
3679 BEAST_EXPECT(changes.removed == removed);
3685 ManifestCache pubManifests;
3686 ManifestCache valManifests;
3689 auto const self = valKeys[2];
3690 auto const keysTotal = valKeys.
size();
3691 auto trustedKeys = makeValidatorList(
3699 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3700 for (
auto const& p : publishers)
3701 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3703 TrustChanges
const changes = trustedKeys->updateTrusted(
3705 env.timeKeeper().now(),
3707 env.app().getOverlay(),
3708 env.app().getHashRouter());
3709 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3710 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3712 hash_set<NodeID> added;
3713 for (
auto const& val : valKeys)
3715 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3718 BEAST_EXPECT(changes.added == added);
3719 BEAST_EXPECT(changes.removed.empty());
3725 ManifestCache pubManifests;
3726 ManifestCache valManifests;
3728 auto const keysTotal = valKeys.
size();
3729 auto trustedKeys = makeValidatorList(
3737 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3738 for (
auto const& p : publishers)
3739 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3741 TrustChanges
const changes = trustedKeys->updateTrusted(
3743 env.timeKeeper().now(),
3745 env.app().getOverlay(),
3746 env.app().getHashRouter());
3747 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3748 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3750 hash_set<NodeID> added;
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());
3763 ManifestCache pubManifests;
3764 ManifestCache valManifests;
3767 auto const self = randomValidator();
3768 auto const keysTotal = valKeys.
size() + 1;
3769 auto trustedKeys = makeValidatorList(
3777 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3778 int untrustedCount = 0;
3779 for (
auto const& p : publishers)
3781 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3782 BEAST_EXPECT(p.revoked ^ trusted);
3783 untrustedCount += trusted ? 0 : 1;
3785 BEAST_EXPECT(untrustedCount == 2);
3787 TrustChanges changes = trustedKeys->updateTrusted(
3789 env.timeKeeper().now(),
3791 env.app().getOverlay(),
3792 env.app().getHashRouter());
3793 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3794 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3796 hash_set<NodeID> added;
3798 for (
auto const& val : valKeys)
3800 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3803 BEAST_EXPECT(changes.added == added);
3804 BEAST_EXPECT(changes.removed.empty());
3807 env.timeKeeper().set(publishers.
back().expiry);
3808 changes = trustedKeys->updateTrusted(
3810 env.timeKeeper().now(),
3812 env.app().getOverlay(),
3813 env.app().getHashRouter());
3814 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3815 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3817 hash_set<NodeID> removed;
3818 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3819 for (
auto const& val : valKeys)
3821 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3822 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3823 removed.insert(
calcNodeID(val.masterPublic));
3825 BEAST_EXPECT(changes.added.empty());
3826 BEAST_EXPECT(changes.removed == removed);
3832 ManifestCache pubManifests;
3833 ManifestCache valManifests;
3836 auto const self = valKeys[2];
3837 auto const keysTotal = valKeys.
size();
3838 auto trustedKeys = makeValidatorList(
3846 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3847 int untrustedCount = 0;
3848 for (
auto const& p : publishers)
3850 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3851 BEAST_EXPECT(p.revoked ^ trusted);
3852 untrustedCount += trusted ? 0 : 1;
3854 BEAST_EXPECT(untrustedCount == 3);
3856 TrustChanges changes = trustedKeys->updateTrusted(
3858 env.timeKeeper().now(),
3860 env.app().getOverlay(),
3861 env.app().getHashRouter());
3862 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3863 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3865 hash_set<NodeID> added;
3866 for (
auto const& val : valKeys)
3868 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3871 BEAST_EXPECT(changes.added == added);
3872 BEAST_EXPECT(changes.removed.empty());
3875 env.timeKeeper().set(publishers.
back().expiry);
3876 changes = trustedKeys->updateTrusted(
3878 env.timeKeeper().now(),
3880 env.app().getOverlay(),
3881 env.app().getHashRouter());
3882 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3883 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3885 hash_set<NodeID> removed;
3886 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3887 for (
auto const& val : valKeys)
3889 if (val.masterPublic != self.masterPublic)
3891 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3892 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3893 removed.insert(
calcNodeID(val.masterPublic));
3896 BEAST_EXPECT(changes.added.empty());
3897 BEAST_EXPECT(changes.removed == removed);