533 using namespace std::chrono_literals;
537 auto checkAvailable =
539 auto const& trustedKeys,
540 auto const& hexPublic,
541 auto const& manifest,
544 auto const available = trustedKeys->getAvailable(hexPublic);
546 BEAST_EXPECT(!version || available);
549 auto const& a = *available;
550 BEAST_EXPECT(a[jss::public_key] == hexPublic);
551 BEAST_EXPECT(a[jss::manifest] == manifest);
554 BEAST_EXPECT(a[jss::version] == version);
557 BEAST_EXPECT(expected.size() == 1);
558 BEAST_EXPECT(a[jss::blob] == expected[0].first);
559 BEAST_EXPECT(a[jss::signature] == expected[0].second);
560 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
562 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
564 BEAST_EXPECT(!a.isMember(jss::blob));
565 BEAST_EXPECT(!a.isMember(jss::signature));
566 auto const& blobsV2 = a[jss::blobs_v2];
567 BEAST_EXPECT(blobsV2.isArray() && blobsV2.size() == expected.size());
569 for (
unsigned int i = 0; i < expected.size(); ++i)
571 BEAST_EXPECT(blobsV2[i][jss::blob] == expected[i].first);
572 BEAST_EXPECT(blobsV2[i][jss::signature] == expected[i].second);
580 auto& app = env.
app();
589 for (
auto const& val : list)
591 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
592 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
597 for (
auto const& val : list)
599 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
600 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
606 auto const hexPublic =
strHex(publisherPublic.begin(), publisherPublic.end());
609 publisherPublic, publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
614 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublisherKeys));
617 static constexpr auto kListSize = 20;
618 static constexpr auto kNumLists = 9;
621 for (
auto i = 1; i <= kNumLists; ++i)
623 auto& list = lists[i];
624 list.reserve(kListSize);
625 while (list.size() < kListSize)
633 auto const version = 1;
634 auto const sequence1 = 1;
635 auto const expiredblob =
637 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
640 auto const sequence2 = 2;
642 auto const sig2 =
signList(blob2, pubSigningKeys1);
645 trustedKeys->applyLists(
648 {{.blob = expiredblob, .signature = expiredSig, .manifest = {}},
649 {.blob = blob2, .signature = sig2, .manifest = {}}},
655 expectTrusted(lists.at(2));
657 checkAvailable(trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
660 auto const version2 = 2;
661 auto const sequence7 = 7;
662 auto const effective7 = validUntil - 60s;
663 auto const expiration7 = effective7 + 3600s;
667 expiration7.time_since_epoch().count(),
668 effective7.time_since_epoch().count());
669 auto const sig7 = signList(blob7, pubSigningKeys1);
671 auto const sequence8 = 8;
672 auto const effective8 = expiration7 - 60s;
673 auto const expiration8 = effective8 + 3600s;
677 expiration8.time_since_epoch().count(),
678 effective8.time_since_epoch().count());
679 auto const sig8 = signList(blob8, pubSigningKeys1);
682 trustedKeys->applyLists(
685 {{.blob = blob7, .signature = sig7, .manifest = {}},
686 {.blob = blob8, .signature = sig8, .manifest = {}}},
689 ListDisposition::Pending,
690 ListDisposition::Pending);
692 expectUntrusted(lists.at(7));
693 expectUntrusted(lists.at(8));
696 auto const sequence6 = 6;
697 auto const effective6 = effective7 - 60s;
698 auto const expiration6 = effective6 + 3600s;
702 expiration6.time_since_epoch().count(),
703 effective6.time_since_epoch().count());
704 auto const sig6 = signList(blob6, pubSigningKeys1);
707 auto const sequence6a = 5;
708 auto const effective6a = effective6 + 60s;
709 auto const expiration6a = effective6a + 3600s;
713 expiration6a.time_since_epoch().count(),
714 effective6a.time_since_epoch().count());
715 auto const sig6a = signList(blob6a, pubSigningKeys1);
718 trustedKeys->applyLists(
721 {{.blob = blob6a, .signature = sig6a, .manifest = {}},
722 {.blob = blob6, .signature = sig6, .manifest = {}}},
725 ListDisposition::Pending,
726 ListDisposition::Pending);
728 expectUntrusted(lists.at(6));
729 expectTrusted(lists.at(2));
734 trustedKeys->applyLists(
737 {{.blob = blob7, .signature = sig7, .manifest = {}},
738 {.blob = blob6, .signature = sig6, .manifest = {}}},
741 ListDisposition::KnownSequence,
742 ListDisposition::KnownSequence);
744 expectUntrusted(lists.at(6));
745 expectUntrusted(lists.at(7));
746 expectTrusted(lists.at(2));
750 trustedKeys->applyLists(
753 {{.blob = blob7, .signature = sig7, .manifest = {}},
754 {.blob = blob6, .signature = sig6, .manifest = {}}},
757 ListDisposition::Invalid,
758 ListDisposition::Invalid);
761 trustedKeys->applyLists(
764 {{.blob = blob7, .signature = sig7, .manifest = {}},
765 {.blob = blob6, .signature = sig6, .manifest = {}}},
768 ListDisposition::Invalid,
769 ListDisposition::Invalid);
772 auto const untrustedManifest =
base64Encode(makeManifestString(
773 randomMasterKey(), publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
776 trustedKeys->applyLists(
779 {{.blob = blob2, .signature = sig2, .manifest = {}}},
782 ListDisposition::Untrusted,
783 ListDisposition::Untrusted);
786 auto const badVersion = 666;
788 trustedKeys->applyLists(
791 {{.blob = blob2, .signature = sig2, .manifest = {}}},
794 ListDisposition::UnsupportedVersion,
795 ListDisposition::UnsupportedVersion);
798 auto const sequence3 = 3;
799 auto const blob3 =
makeList(lists.at(3), sequence3, validUntil.time_since_epoch().count());
800 auto const sig3 = signList(blob3, pubSigningKeys1);
803 trustedKeys->applyLists(
804 manifest1, version, {{.blob = blob3, .signature = sig3, .manifest = {}}}, siteUri),
806 ListDisposition::Accepted,
807 ListDisposition::Accepted);
809 expectUntrusted(lists.at(1));
810 expectUntrusted(lists.at(2));
811 expectTrusted(lists.at(3));
820 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
824 trustedKeys->applyLists(
827 {{.blob = blob2, .signature = sig2, .manifest = {}},
828 {.blob = blob3, .signature = sig3, .manifest = {}}},
831 ListDisposition::Stale,
832 ListDisposition::SameSequence);
836 auto const pubSigningKeys2 =
randomKeyPair(KeyType::Secp256k1);
838 publisherPublic, publisherSecret, pubSigningKeys2.first, pubSigningKeys2.second, 2));
840 auto const sequence4 = 4;
841 auto const blob4 =
makeList(lists.at(4), sequence4, validUntil.time_since_epoch().count());
842 auto const sig4 = signList(blob4, pubSigningKeys2);
845 trustedKeys->applyLists(
848 {{.blob = blob2, .signature = sig2, .manifest = manifest1},
849 {.blob = blob3, .signature = sig3, .manifest = manifest1},
850 {.blob = blob4, .signature = sig4, .manifest = {}}},
853 ListDisposition::Stale,
854 ListDisposition::Accepted);
856 expectUntrusted(lists.at(2));
857 expectUntrusted(lists.at(3));
858 expectTrusted(lists.at(4));
865 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
867 auto const sequence5 = 5;
868 auto const blob5 =
makeList(lists.at(5), sequence5, validUntil.time_since_epoch().count());
869 auto const badSig = signList(blob5, pubSigningKeys1);
871 trustedKeys->applyLists(
874 {{.blob = blob5, .signature = badSig, .manifest = {}}},
877 ListDisposition::Invalid,
878 ListDisposition::Invalid);
880 expectUntrusted(lists.at(2));
881 expectUntrusted(lists.at(3));
882 expectTrusted(lists.at(4));
883 expectUntrusted(lists.at(5));
887 trustedKeys->applyLists(
890 {{.blob = blob7, .signature = sig7, .manifest = {}},
891 {.blob = blob8, .signature = sig8, .manifest = {}}},
894 ListDisposition::Invalid,
895 ListDisposition::Invalid);
897 expectTrusted(lists.at(4));
898 expectUntrusted(lists.at(7));
899 expectUntrusted(lists.at(8));
904 trustedKeys->updateTrusted(
908 env.app().getOverlay(),
909 env.app().getHashRouter());
911 expectUntrusted(lists.at(3));
912 expectTrusted(lists.at(6));
915 trustedKeys, hexPublic, manifest2, 2, {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
921 env.timeKeeper().set(effective8);
922 trustedKeys->updateTrusted(
926 env.app().getOverlay(),
927 env.app().getHashRouter());
929 expectUntrusted(lists.at(6));
930 expectUntrusted(lists.at(7));
931 expectTrusted(lists.at(8));
933 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
939 auto const sig82 = signList(blob8, pubSigningKeys2);
942 trustedKeys->applyLists(
945 {{.blob = blob8, .signature = sig8, .manifest = manifest1},
946 {.blob = blob8, .signature = sig82, .manifest = {}}},
949 ListDisposition::Invalid,
950 ListDisposition::SameSequence);
952 expectTrusted(lists.at(8));
954 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
958 auto const signingKeysMax =
randomKeyPair(KeyType::Secp256k1);
959 auto maxManifest =
base64Encode(makeRevocationString(publisherPublic, publisherSecret));
961 auto const sequence9 = 9;
962 auto const blob9 =
makeList(lists.at(9), sequence9, validUntil.time_since_epoch().count());
963 auto const sig9 = signList(blob9, signingKeysMax);
966 trustedKeys->applyLists(
969 {{.blob = blob9, .signature = sig9, .manifest = {}}},
972 ListDisposition::Untrusted,
973 ListDisposition::Untrusted);
975 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
976 for (
auto const& [num, list] : lists)
979 expectUntrusted(list);
982 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
1122 std::string const siteUri =
"testUpdateTrusted.test";
1126 auto& app = env.
app();
1143 while (cfgKeys.
size() != maxKeys)
1147 if (cfgKeys.
size() <= maxKeys - 5)
1157 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1161 TrustChanges changes = trustedKeysOuter->updateTrusted(
1162 activeValidatorsOuter,
1168 for (
auto const& val : unseenValidators)
1169 activeValidatorsOuter.
emplace(val);
1171 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1172 BEAST_EXPECT(changes.
removed.empty());
1173 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1174 for (
auto const& val : cfgKeys)
1178 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1179 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1187 changes = trustedKeysOuter->updateTrusted(
1188 activeValidatorsOuter,
1193 BEAST_EXPECT(changes.
added.empty());
1194 BEAST_EXPECT(changes.
removed.empty());
1195 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1204 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1207 auto const signingPublic1 = signingKeys1.first;
1211 TrustChanges changes = trustedKeysOuter->updateTrusted(
1212 activeValidatorsOuter,
1218 BEAST_EXPECT(changes.
removed.empty());
1219 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1220 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1221 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1222 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1223 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1227 masterPublic, masterPrivate, signingPublic1, signingKeys1.second, 1));
1233 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1234 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1235 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1236 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1241 auto const signingPublic2 = signingKeys2.first;
1243 masterPublic, masterPrivate, signingPublic2, signingKeys2.second, 2));
1248 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1249 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1250 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1251 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1252 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1253 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1257 auto const signingPublicMax = signingKeysMax.first;
1262 BEAST_EXPECT(max->revoked());
1268 BEAST_EXPECT(manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1269 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1272 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1273 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1275 changes = trustedKeysOuter->updateTrusted(
1276 activeValidatorsOuter,
1282 BEAST_EXPECT(changes.
added.empty());
1283 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1284 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1285 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1286 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1287 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1288 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1289 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1290 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1291 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1308 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1310 TrustChanges const changes = trustedKeys->updateTrusted(
1311 activeValidatorsOuter,
1316 BEAST_EXPECT(changes.
removed.empty());
1317 BEAST_EXPECT(changes.
added.empty());
1340 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1342 TrustChanges const changes = trustedKeys->updateTrusted(
1343 activeValidatorsOuter,
1348 BEAST_EXPECT(changes.
removed.empty());
1349 BEAST_EXPECT(changes.
added.size() == 1);
1350 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1351 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1372 while (cfgKeys.
size() < n)
1387 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1395 BEAST_EXPECT(changes.
removed.empty());
1396 BEAST_EXPECT(changes.
added == expectedTrusted);
1397 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1400 activeValidators.
emplace(toBeSeen);
1401 changes = trustedKeys->updateTrusted(
1407 BEAST_EXPECT(changes.
removed.empty());
1408 BEAST_EXPECT(changes.
added.empty());
1409 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1424 publisherKeys.first,
1425 publisherKeys.second,
1426 pubSigningKeys.first,
1427 pubSigningKeys.second,
1432 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublisherKeys));
1436 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1439 auto const version = 1;
1440 auto const sequence = 1;
1441 using namespace std::chrono_literals;
1444 auto const sig =
signList(blob, pubSigningKeys);
1448 trustedKeys->applyLists(manifest, version, {{blob, sig, {}}}, siteUri)
1449 .bestDisposition());
1457 BEAST_EXPECT(changes.
removed.empty());
1458 BEAST_EXPECT(changes.
added == activeValidators);
1461 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1462 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1464 BEAST_EXPECT(trustedKeys->quorum() == 2);
1467 changes = trustedKeys->updateTrusted(
1473 BEAST_EXPECT(changes.
removed == activeValidators);
1474 BEAST_EXPECT(changes.
added.empty());
1475 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1476 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1482 auto const sequence2 = 2;
1485 auto const sig2 =
signList(blob2, pubSigningKeys);
1489 trustedKeys->applyLists(manifest, version, {{blob2, sig2, {}}}, siteUri)
1490 .bestDisposition());
1492 changes = trustedKeys->updateTrusted(
1494 env.timeKeeper().now(),
1496 env.app().getOverlay(),
1497 env.app().getHashRouter());
1498 BEAST_EXPECT(changes.removed.empty());
1500 changes.added == asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1501 for (Validator
const& val : list2)
1503 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1504 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1506 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1507 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1508 BEAST_EXPECT(trustedKeys->quorum() == 2);
1516 app.config().legacy(Sections::kDatabasePath),
1520 hash_set<NodeID> activeValidators;
1521 hash_set<PublicKey> activeKeys;
1528 auto const valKey = randomNode();
1530 activeValidators.emplace(
calcNodeID(valKey));
1531 activeKeys.emplace(valKey);
1532 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1533 TrustChanges
const changes = trustedKeys->updateTrusted(
1535 env.timeKeeper().now(),
1537 env.app().getOverlay(),
1538 env.app().getHashRouter());
1539 BEAST_EXPECT(changes.removed.empty());
1540 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1541 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1542 for (
auto const& key : activeKeys)
1543 BEAST_EXPECT(trustedKeys->trusted(key));
1552 app.config().legacy(Sections::kDatabasePath),
1555 auto const localKey = randomNode();
1557 hash_set<NodeID> activeValidators;
1558 hash_set<PublicKey> activeKeys;
1564 auto const valKey = randomNode();
1566 activeValidators.emplace(
calcNodeID(valKey));
1567 activeKeys.emplace(valKey);
1569 BEAST_EXPECT(trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1570 TrustChanges
const changes = trustedKeys->updateTrusted(
1572 env.timeKeeper().now(),
1574 env.app().getOverlay(),
1575 env.app().getHashRouter());
1576 BEAST_EXPECT(changes.removed.empty());
1577 if (cfgKeys.
size() > 2)
1579 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1583 BEAST_EXPECT(changes.added == asNodeIDs({localKey, valKey}));
1586 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1588 for (
auto const& key : activeKeys)
1589 BEAST_EXPECT(trustedKeys->trusted(key));
1594 ManifestCache manifests;
1599 app.config().legacy(Sections::kDatabasePath),
1602 hash_set<NodeID> activeValidators;
1606 while (valKeys.
size() != maxKeys)
1609 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1615 static constexpr int kPublishers = 3;
1625 auto addPublishedList = [&,
this](
int i) {
1632 pubSigningKeys.first,
1633 pubSigningKeys.second,
1636 std::vector<std::string>
const cfgPublishers({
strHex(publisherPublic)});
1637 std::vector<std::string>
const emptyCfgKeys;
1640 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers, std::size_t(1)));
1642 auto const version = 1;
1643 auto const sequence = 1;
1644 using namespace std::chrono_literals;
1646 std::vector<Validator>
const localKeys{locals[i].first, locals[i].second};
1648 makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1649 auto const sig = signList(blob, pubSigningKeys);
1653 trustedKeys->applyLists(manifest, version, {{blob, sig, {}}}, siteUri)
1654 .bestDisposition());
1658 for (
auto i = 0; i < kPublishers; ++i)
1659 addPublishedList(i);
1660 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1662 TrustChanges
const changes = trustedKeys->updateTrusted(
1664 env.timeKeeper().now(),
1666 env.app().getOverlay(),
1667 env.app().getHashRouter());
1669 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(valKeys.
size() * 0.8f));
1672 for (
auto const& val : valKeys)
1674 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1677 BEAST_EXPECT(changes.added == added);
1678 BEAST_EXPECT(changes.removed.empty());
1682 ManifestCache manifests;
1691 std::vector<Validator> valKeys;
1694 while (valKeys.
size() != maxKeys)
1697 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1705 static constexpr int kPublishers = 3;
1715 auto addPublishedList =
1724 pubSigningKeys.first,
1725 pubSigningKeys.second,
1728 std::vector<std::string>
const cfgPublishers({
strHex(publisherPublic)});
1729 std::vector<std::string>
const emptyCfgKeys;
1731 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1733 auto const version = 1;
1734 auto const sequence = 1;
1735 using namespace std::chrono_literals;
1753 validUntil1 = validUntil;
1757 validUntil2 = validUntil;
1759 std::vector<Validator>
const localKeys{locals[i].first, locals[i].second};
1761 makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1762 auto const sig = signList(blob, pubSigningKeys);
1766 trustedKeys->applyLists(manifest, version, {{blob, sig, {}}}, siteUri)
1767 .bestDisposition());
1773 for (
auto i = 0; i < kPublishers; ++i)
1774 addPublishedList(i, validUntil1, validUntil2);
1775 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1777 TrustChanges changes = trustedKeys->updateTrusted(
1779 env.timeKeeper().now(),
1781 env.app().getOverlay(),
1782 env.app().getHashRouter());
1784 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.
size() - 3) * 0.8f));
1786 for (
auto const& val : valKeys)
1787 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1790 for (std::size_t i = 0; i < maxKeys; ++i)
1792 auto const& val = valKeys[i];
1793 if (i >= 1 && i < maxKeys - 2)
1795 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1800 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1803 BEAST_EXPECT(changes.added == added);
1804 BEAST_EXPECT(changes.removed.empty());
1807 env.timeKeeper().set(validUntil1);
1808 changes = trustedKeys->updateTrusted(
1810 env.timeKeeper().now(),
1812 env.app().getOverlay(),
1813 env.app().getHashRouter());
1815 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.size() - 6) * 0.8f));
1817 for (
auto const& val : valKeys)
1818 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1821 for (std::size_t i = 0; i < maxKeys; ++i)
1823 auto const& val = valKeys[i];
1824 if (i >= 2 && i < maxKeys - 4)
1826 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1830 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1831 if (i >= 1 && i < maxKeys - 2)
1832 removed.insert(
calcNodeID(val.masterPublic));
1836 BEAST_EXPECT(changes.added.empty());
1837 BEAST_EXPECT(changes.removed == removed);
1840 env.timeKeeper().set(validUntil2);
1841 changes = trustedKeys->updateTrusted(
1843 env.timeKeeper().now(),
1845 env.app().getOverlay(),
1846 env.app().getHashRouter());
1851 for (std::size_t i = 0; i < maxKeys; ++i)
1853 auto const& val = valKeys[i];
1854 if (i < maxKeys - 4)
1856 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1860 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1863 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1864 if (i >= 2 && i < maxKeys - 4)
1865 removed.insert(
calcNodeID(val.masterPublic));
1868 BEAST_EXPECT(changes.added.empty());
1869 BEAST_EXPECT(changes.removed == removed);
2488 std::string const siteUri =
"testQuorumDisabled.test";
2490 auto& app = env.
app();
2495 while (valKeys.
size() != kMaxKeys)
2512 auto makeValidatorList = [&,
this](
2540 pubSigningKeys.first,
2541 pubSigningKeys.second,
2542 i < countRevoked ? kRevoked : 1));
2543 publishers.push_back(
2545 .revoked = i < countRevoked,
2546 .pubKey = publisherPublic,
2547 .signingKeys = pubSigningKeys,
2548 .manifest = manifest,
2553 auto threshold = listThreshold > 0 ?
std::optional(listThreshold) : std::nullopt;
2556 valManifests.applyManifest(
2560 result->load(self->signingPublic, emptyCfgKeys, cfgPublishers, threshold));
2564 BEAST_EXPECT(result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2569 using namespace std::chrono_literals;
2570 publishers[i].expiry = env.
timeKeeper().
now() + (i == countTotal - 1 ? 60s : 3600s);
2572 makeList(valKeys, 1, publishers[i].expiry.time_since_epoch().count());
2573 auto const sig =
signList(blob, publishers[i].signingKeys);
2576 result->applyLists(publishers[i].manifest, 1, {{blob, sig, {}}}, siteUri)
2577 .bestDisposition() ==
2593 auto const self = randomValidator();
2594 auto const keysTotal = valKeys.size() + 1;
2595 auto trustedKeys = makeValidatorList(
2603 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2604 for (
auto const& p : publishers)
2605 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2609 env.timeKeeper().now(),
2611 env.app().getOverlay(),
2612 env.app().getHashRouter());
2613 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2614 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2618 for (
auto const& val : valKeys)
2620 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2623 BEAST_EXPECT(changes.
added == added);
2624 BEAST_EXPECT(changes.
removed.empty());
2627 env.timeKeeper().set(publishers.back().expiry);
2628 changes = trustedKeys->updateTrusted(
2630 env.timeKeeper().now(),
2632 env.app().getOverlay(),
2633 env.app().getHashRouter());
2634 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2635 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2638 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2639 for (
auto const& val : valKeys)
2641 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2642 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2645 BEAST_EXPECT(changes.
added.empty());
2646 BEAST_EXPECT(changes.
removed == removed);
2650 ManifestCache pubManifests;
2651 ManifestCache valManifests;
2652 std::vector<Publisher> publishers;
2653 auto const keysTotal = valKeys.size();
2654 auto trustedKeys = makeValidatorList(
2662 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2663 for (
auto const& p : publishers)
2664 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2666 TrustChanges changes = trustedKeys->updateTrusted(
2668 env.timeKeeper().now(),
2670 env.app().getOverlay(),
2671 env.app().getHashRouter());
2672 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2673 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2676 for (
auto const& val : valKeys)
2678 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2681 BEAST_EXPECT(changes.added == added);
2682 BEAST_EXPECT(changes.removed.empty());
2685 env.timeKeeper().set(publishers.back().expiry);
2686 changes = trustedKeys->updateTrusted(
2688 env.timeKeeper().now(),
2690 env.app().getOverlay(),
2691 env.app().getHashRouter());
2692 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2693 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
2696 for (
auto const& val : valKeys)
2698 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2699 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2700 removed.insert(
calcNodeID(val.masterPublic));
2702 BEAST_EXPECT(changes.added.empty());
2703 BEAST_EXPECT(changes.removed == removed);
2707 ManifestCache pubManifests;
2708 ManifestCache valManifests;
2709 std::vector<Publisher> publishers;
2711 auto const self = valKeys[1];
2712 auto const keysTotal = valKeys.size();
2713 auto trustedKeys = makeValidatorList(
2721 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2722 int untrustedCount = 0;
2723 for (
auto const& p : publishers)
2725 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2726 BEAST_EXPECT(p.revoked ^ trusted);
2727 untrustedCount += trusted ? 0 : 1;
2729 BEAST_EXPECT(untrustedCount == 1);
2731 TrustChanges changes = trustedKeys->updateTrusted(
2733 env.timeKeeper().now(),
2735 env.app().getOverlay(),
2736 env.app().getHashRouter());
2737 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2738 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2741 for (
auto const& val : valKeys)
2743 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2746 BEAST_EXPECT(changes.added == added);
2747 BEAST_EXPECT(changes.removed.empty());
2750 env.timeKeeper().set(publishers.back().expiry);
2751 changes = trustedKeys->updateTrusted(
2753 env.timeKeeper().now(),
2755 env.app().getOverlay(),
2756 env.app().getHashRouter());
2757 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2758 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2761 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2762 for (
auto const& val : valKeys)
2764 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2765 if (val.masterPublic != self.masterPublic)
2767 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2768 removed.insert(
calcNodeID(val.masterPublic));
2771 BEAST_EXPECT(changes.added.empty());
2772 BEAST_EXPECT(changes.removed == removed);
2776 ManifestCache pubManifests;
2777 ManifestCache valManifests;
2778 std::vector<Publisher> publishers;
2780 auto const self = randomValidator();
2781 auto const keysTotal = valKeys.size() + 1;
2782 auto trustedKeys = makeValidatorList(
2790 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2791 int untrustedCount = 0;
2792 for (
auto const& p : publishers)
2794 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2795 BEAST_EXPECT(p.revoked ^ trusted);
2796 untrustedCount += trusted ? 0 : 1;
2798 BEAST_EXPECT(untrustedCount == 2);
2800 TrustChanges changes = trustedKeys->updateTrusted(
2802 env.timeKeeper().now(),
2804 env.app().getOverlay(),
2805 env.app().getHashRouter());
2806 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2807 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2811 for (
auto const& val : valKeys)
2813 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2816 BEAST_EXPECT(changes.added == added);
2817 BEAST_EXPECT(changes.removed.empty());
2820 env.timeKeeper().set(publishers.back().expiry);
2821 changes = trustedKeys->updateTrusted(
2823 env.timeKeeper().now(),
2825 env.app().getOverlay(),
2826 env.app().getHashRouter());
2827 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2828 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2831 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2832 for (
auto const& val : valKeys)
2834 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2835 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2836 removed.insert(
calcNodeID(val.masterPublic));
2838 BEAST_EXPECT(changes.added.empty());
2839 BEAST_EXPECT(changes.removed == removed);
2843 ManifestCache pubManifests;
2844 ManifestCache valManifests;
2845 std::vector<Publisher> publishers;
2847 auto const self = valKeys[5];
2848 auto const keysTotal = valKeys.size();
2849 auto trustedKeys = makeValidatorList(
2857 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2858 int untrustedCount = 0;
2859 for (
auto const& p : publishers)
2861 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2862 BEAST_EXPECT(p.revoked ^ trusted);
2863 untrustedCount += trusted ? 0 : 1;
2865 BEAST_EXPECT(untrustedCount == 2);
2867 TrustChanges changes = trustedKeys->updateTrusted(
2869 env.timeKeeper().now(),
2871 env.app().getOverlay(),
2872 env.app().getHashRouter());
2873 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2874 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2877 for (
auto const& val : valKeys)
2879 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2882 BEAST_EXPECT(changes.added == added);
2883 BEAST_EXPECT(changes.removed.empty());
2886 env.timeKeeper().set(publishers.back().expiry);
2887 changes = trustedKeys->updateTrusted(
2889 env.timeKeeper().now(),
2891 env.app().getOverlay(),
2892 env.app().getHashRouter());
2893 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2894 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2897 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2898 for (
auto const& val : valKeys)
2900 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2901 if (val.masterPublic != self.masterPublic)
2903 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2904 removed.insert(
calcNodeID(val.masterPublic));
2907 BEAST_EXPECT(changes.added.empty());
2908 BEAST_EXPECT(changes.removed == removed);
2912 ManifestCache pubManifests;
2913 ManifestCache valManifests;
2914 std::vector<Publisher> publishers;
2915 auto const keysTotal = valKeys.size();
2916 auto trustedKeys = makeValidatorList(
2924 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2925 int untrustedCount = 0;
2926 for (
auto const& p : publishers)
2928 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2929 BEAST_EXPECT(p.revoked ^ trusted);
2930 untrustedCount += trusted ? 0 : 1;
2932 BEAST_EXPECT(untrustedCount == 2);
2934 TrustChanges changes = trustedKeys->updateTrusted(
2936 env.timeKeeper().now(),
2938 env.app().getOverlay(),
2939 env.app().getHashRouter());
2940 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2941 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2944 for (
auto const& val : valKeys)
2946 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2949 BEAST_EXPECT(changes.added == added);
2950 BEAST_EXPECT(changes.removed.empty());
2953 env.timeKeeper().set(publishers.back().expiry);
2954 changes = trustedKeys->updateTrusted(
2956 env.timeKeeper().now(),
2958 env.app().getOverlay(),
2959 env.app().getHashRouter());
2960 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2961 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
2964 for (
auto const& val : valKeys)
2966 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2967 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2968 removed.insert(
calcNodeID(val.masterPublic));
2970 BEAST_EXPECT(changes.added.empty());
2971 BEAST_EXPECT(changes.removed == removed);
2975 ManifestCache pubManifests;
2976 ManifestCache valManifests;
2977 std::vector<Publisher> publishers;
2979 auto const self = randomValidator();
2980 auto const keysTotal = valKeys.size() + 1;
2981 auto trustedKeys = makeValidatorList(
2989 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
2990 int untrustedCount = 0;
2991 for (
auto const& p : publishers)
2993 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2994 BEAST_EXPECT(p.revoked ^ trusted);
2995 untrustedCount += trusted ? 0 : 1;
2997 BEAST_EXPECT(untrustedCount == 1);
2999 TrustChanges changes = trustedKeys->updateTrusted(
3001 env.timeKeeper().now(),
3003 env.app().getOverlay(),
3004 env.app().getHashRouter());
3005 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3006 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3010 for (
auto const& val : valKeys)
3012 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3015 BEAST_EXPECT(changes.added == added);
3016 BEAST_EXPECT(changes.removed.empty());
3019 env.timeKeeper().set(publishers.back().expiry);
3020 changes = trustedKeys->updateTrusted(
3022 env.timeKeeper().now(),
3024 env.app().getOverlay(),
3025 env.app().getHashRouter());
3026 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3027 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3029 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3030 for (
auto const& val : valKeys)
3032 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3033 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3035 BEAST_EXPECT(changes.added.empty());
3036 BEAST_EXPECT(changes.removed.empty());
3040 ManifestCache pubManifests;
3041 ManifestCache valManifests;
3042 std::vector<Publisher> publishers;
3044 auto const self = randomValidator();
3045 auto const keysTotal = valKeys.size() + 1;
3046 auto trustedKeys = makeValidatorList(
3054 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3055 for (
auto const& p : publishers)
3056 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3058 TrustChanges changes = trustedKeys->updateTrusted(
3060 env.timeKeeper().now(),
3062 env.app().getOverlay(),
3063 env.app().getHashRouter());
3064 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3065 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3069 for (
auto const& val : valKeys)
3071 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3074 BEAST_EXPECT(changes.added == added);
3075 BEAST_EXPECT(changes.removed.empty());
3078 env.timeKeeper().set(publishers.back().expiry);
3079 changes = trustedKeys->updateTrusted(
3081 env.timeKeeper().now(),
3083 env.app().getOverlay(),
3084 env.app().getHashRouter());
3085 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3086 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3088 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3089 for (
auto const& val : valKeys)
3091 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3092 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3094 BEAST_EXPECT(changes.added.empty());
3095 BEAST_EXPECT(changes.removed.empty());
3099 ManifestCache pubManifests;
3100 ManifestCache valManifests;
3101 std::vector<Publisher> publishers;
3103 auto const self = valKeys[7];
3104 auto const keysTotal = valKeys.size();
3105 auto trustedKeys = makeValidatorList(
3113 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3114 for (
auto const& p : publishers)
3115 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3117 TrustChanges changes = trustedKeys->updateTrusted(
3119 env.timeKeeper().now(),
3121 env.app().getOverlay(),
3122 env.app().getHashRouter());
3123 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3124 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3127 for (
auto const& val : valKeys)
3129 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3132 BEAST_EXPECT(changes.added == added);
3133 BEAST_EXPECT(changes.removed.empty());
3136 env.timeKeeper().set(publishers.back().expiry);
3137 changes = trustedKeys->updateTrusted(
3139 env.timeKeeper().now(),
3141 env.app().getOverlay(),
3142 env.app().getHashRouter());
3143 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3144 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3146 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3147 for (
auto const& val : valKeys)
3149 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3150 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3152 BEAST_EXPECT(changes.added.empty());
3153 BEAST_EXPECT(changes.removed.empty());
3157 ManifestCache pubManifests;
3158 ManifestCache valManifests;
3159 std::vector<Publisher> publishers;
3160 auto const keysTotal = valKeys.size();
3161 auto trustedKeys = makeValidatorList(
3169 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3170 for (
auto const& p : publishers)
3171 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3173 TrustChanges changes = trustedKeys->updateTrusted(
3175 env.timeKeeper().now(),
3177 env.app().getOverlay(),
3178 env.app().getHashRouter());
3179 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3180 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3183 for (
auto const& val : valKeys)
3185 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3188 BEAST_EXPECT(changes.added == added);
3189 BEAST_EXPECT(changes.removed.empty());
3192 env.timeKeeper().set(publishers.back().expiry);
3193 changes = trustedKeys->updateTrusted(
3195 env.timeKeeper().now(),
3197 env.app().getOverlay(),
3198 env.app().getHashRouter());
3199 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3200 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3202 for (
auto const& val : valKeys)
3204 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3205 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3207 BEAST_EXPECT(changes.added.empty());
3208 BEAST_EXPECT(changes.removed.empty());
3214 ManifestCache pubManifests;
3215 ManifestCache valManifests;
3216 std::vector<Publisher> publishers;
3218 auto const self = randomValidator();
3219 auto const keysTotal = valKeys.size() + 1;
3220 auto trustedKeys = makeValidatorList(
3228 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3229 int untrustedCount = 0;
3230 for (
auto const& p : publishers)
3232 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3233 BEAST_EXPECT(p.revoked ^ trusted);
3234 untrustedCount += trusted ? 0 : 1;
3236 BEAST_EXPECT(untrustedCount == 1);
3238 TrustChanges changes = trustedKeys->updateTrusted(
3240 env.timeKeeper().now(),
3242 env.app().getOverlay(),
3243 env.app().getHashRouter());
3244 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3245 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3249 for (
auto const& val : valKeys)
3251 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3254 BEAST_EXPECT(changes.added == added);
3255 BEAST_EXPECT(changes.removed.empty());
3258 env.timeKeeper().set(publishers.back().expiry);
3259 changes = trustedKeys->updateTrusted(
3261 env.timeKeeper().now(),
3263 env.app().getOverlay(),
3264 env.app().getHashRouter());
3265 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3266 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3269 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3270 for (
auto const& val : valKeys)
3272 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3273 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3274 removed.insert(
calcNodeID(val.masterPublic));
3276 BEAST_EXPECT(changes.added.empty());
3277 BEAST_EXPECT(changes.removed == removed);
3281 ManifestCache pubManifests;
3282 ManifestCache valManifests;
3283 std::vector<Publisher> publishers;
3285 auto const self = valKeys[5];
3286 auto const keysTotal = valKeys.size();
3287 auto trustedKeys = makeValidatorList(
3295 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3296 int untrustedCount = 0;
3297 for (
auto const& p : publishers)
3299 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3300 BEAST_EXPECT(p.revoked ^ trusted);
3301 untrustedCount += trusted ? 0 : 1;
3303 BEAST_EXPECT(untrustedCount == 1);
3305 TrustChanges changes = trustedKeys->updateTrusted(
3307 env.timeKeeper().now(),
3309 env.app().getOverlay(),
3310 env.app().getHashRouter());
3311 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3312 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3315 for (
auto const& val : valKeys)
3317 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3320 BEAST_EXPECT(changes.added == added);
3321 BEAST_EXPECT(changes.removed.empty());
3324 env.timeKeeper().set(publishers.back().expiry);
3325 changes = trustedKeys->updateTrusted(
3327 env.timeKeeper().now(),
3329 env.app().getOverlay(),
3330 env.app().getHashRouter());
3331 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3332 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3335 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3336 for (
auto const& val : valKeys)
3338 if (val.masterPublic != self.masterPublic)
3340 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3341 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3342 removed.insert(
calcNodeID(val.masterPublic));
3345 BEAST_EXPECT(changes.added.empty());
3346 BEAST_EXPECT(changes.removed == removed);
3350 ManifestCache pubManifests;
3351 ManifestCache valManifests;
3352 std::vector<Publisher> publishers;
3353 auto const keysTotal = valKeys.size();
3354 auto trustedKeys = makeValidatorList(
3362 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3363 int untrustedCount = 0;
3364 for (
auto const& p : publishers)
3366 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3367 BEAST_EXPECT(p.revoked ^ trusted);
3368 untrustedCount += trusted ? 0 : 1;
3370 BEAST_EXPECT(untrustedCount == 1);
3372 TrustChanges changes = trustedKeys->updateTrusted(
3374 env.timeKeeper().now(),
3376 env.app().getOverlay(),
3377 env.app().getHashRouter());
3378 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3379 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3382 for (
auto const& val : valKeys)
3384 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3387 BEAST_EXPECT(changes.added == added);
3388 BEAST_EXPECT(changes.removed.empty());
3391 env.timeKeeper().set(publishers.back().expiry);
3392 changes = trustedKeys->updateTrusted(
3394 env.timeKeeper().now(),
3396 env.app().getOverlay(),
3397 env.app().getHashRouter());
3398 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3399 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3402 for (
auto const& val : valKeys)
3404 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3405 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3406 removed.insert(
calcNodeID(val.masterPublic));
3408 BEAST_EXPECT(changes.added.empty());
3409 BEAST_EXPECT(changes.removed == removed);
3413 ManifestCache pubManifests;
3414 ManifestCache valManifests;
3415 std::vector<Publisher> publishers;
3417 auto const self = randomValidator();
3418 auto const keysTotal = valKeys.size() + 1;
3419 auto trustedKeys = makeValidatorList(
3427 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3428 for (
auto const& p : publishers)
3429 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3431 TrustChanges changes = trustedKeys->updateTrusted(
3433 env.timeKeeper().now(),
3435 env.app().getOverlay(),
3436 env.app().getHashRouter());
3437 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3438 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3442 for (
auto const& val : valKeys)
3444 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3447 BEAST_EXPECT(changes.added == added);
3448 BEAST_EXPECT(changes.removed.empty());
3451 env.timeKeeper().set(publishers.back().expiry);
3452 changes = trustedKeys->updateTrusted(
3454 env.timeKeeper().now(),
3456 env.app().getOverlay(),
3457 env.app().getHashRouter());
3458 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3459 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3462 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3463 for (
auto const& val : valKeys)
3465 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3466 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3467 removed.insert(
calcNodeID(val.masterPublic));
3469 BEAST_EXPECT(changes.added.empty());
3470 BEAST_EXPECT(changes.removed == removed);
3474 ManifestCache pubManifests;
3475 ManifestCache valManifests;
3476 std::vector<Publisher> publishers;
3478 auto const self = valKeys[5];
3479 auto const keysTotal = valKeys.size();
3480 auto trustedKeys = makeValidatorList(
3488 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3489 for (
auto const& p : publishers)
3490 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3492 TrustChanges changes = trustedKeys->updateTrusted(
3494 env.timeKeeper().now(),
3496 env.app().getOverlay(),
3497 env.app().getHashRouter());
3498 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3499 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3503 for (
auto const& val : valKeys)
3505 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3508 BEAST_EXPECT(changes.added == added);
3509 BEAST_EXPECT(changes.removed.empty());
3512 env.timeKeeper().set(publishers.back().expiry);
3513 changes = trustedKeys->updateTrusted(
3515 env.timeKeeper().now(),
3517 env.app().getOverlay(),
3518 env.app().getHashRouter());
3519 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3520 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3523 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3524 for (
auto const& val : valKeys)
3526 if (val.masterPublic != self.masterPublic)
3528 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3529 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3530 removed.insert(
calcNodeID(val.masterPublic));
3533 BEAST_EXPECT(changes.added.empty());
3534 BEAST_EXPECT(changes.removed == removed);
3538 ManifestCache pubManifests;
3539 ManifestCache valManifests;
3540 std::vector<Publisher> publishers;
3541 auto const keysTotal = valKeys.size();
3542 auto trustedKeys = makeValidatorList(
3550 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3551 for (
auto const& p : publishers)
3552 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3554 TrustChanges changes = trustedKeys->updateTrusted(
3556 env.timeKeeper().now(),
3558 env.app().getOverlay(),
3559 env.app().getHashRouter());
3560 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3561 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3564 for (
auto const& val : valKeys)
3566 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3569 BEAST_EXPECT(changes.added == added);
3570 BEAST_EXPECT(changes.removed.empty());
3573 env.timeKeeper().set(publishers.back().expiry);
3574 changes = trustedKeys->updateTrusted(
3576 env.timeKeeper().now(),
3578 env.app().getOverlay(),
3579 env.app().getHashRouter());
3580 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3581 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3584 for (
auto const& val : valKeys)
3586 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3587 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3588 removed.insert(
calcNodeID(val.masterPublic));
3590 BEAST_EXPECT(changes.added.empty());
3591 BEAST_EXPECT(changes.removed == removed);
3597 ManifestCache pubManifests;
3598 ManifestCache valManifests;
3599 std::vector<Publisher> publishers;
3601 auto const self = randomValidator();
3602 auto const keysTotal = valKeys.size() + 1;
3603 auto trustedKeys = makeValidatorList(
3611 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3612 for (
auto const& p : publishers)
3613 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3615 TrustChanges changes = trustedKeys->updateTrusted(
3617 env.timeKeeper().now(),
3619 env.app().getOverlay(),
3620 env.app().getHashRouter());
3621 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3622 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3626 for (
auto const& val : valKeys)
3628 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3631 BEAST_EXPECT(changes.added == added);
3632 BEAST_EXPECT(changes.removed.empty());
3635 env.timeKeeper().set(publishers.back().expiry);
3636 changes = trustedKeys->updateTrusted(
3638 env.timeKeeper().now(),
3640 env.app().getOverlay(),
3641 env.app().getHashRouter());
3642 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3643 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3646 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3647 for (
auto const& val : valKeys)
3649 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3650 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3651 removed.insert(
calcNodeID(val.masterPublic));
3653 BEAST_EXPECT(changes.added.empty());
3654 BEAST_EXPECT(changes.removed == removed);
3660 ManifestCache pubManifests;
3661 ManifestCache valManifests;
3662 std::vector<Publisher> publishers;
3664 auto const self = valKeys[2];
3665 auto const keysTotal = valKeys.size();
3666 auto trustedKeys = makeValidatorList(
3674 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3675 for (
auto const& p : publishers)
3676 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3678 TrustChanges
const changes = trustedKeys->updateTrusted(
3680 env.timeKeeper().now(),
3682 env.app().getOverlay(),
3683 env.app().getHashRouter());
3684 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3685 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3688 for (
auto const& val : valKeys)
3690 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3693 BEAST_EXPECT(changes.added == added);
3694 BEAST_EXPECT(changes.removed.empty());
3700 ManifestCache pubManifests;
3701 ManifestCache valManifests;
3702 std::vector<Publisher> publishers;
3703 auto const keysTotal = valKeys.size();
3704 auto trustedKeys = makeValidatorList(
3712 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3713 for (
auto const& p : publishers)
3714 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3716 TrustChanges
const changes = trustedKeys->updateTrusted(
3718 env.timeKeeper().now(),
3720 env.app().getOverlay(),
3721 env.app().getHashRouter());
3722 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3723 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3726 for (
auto const& val : valKeys)
3728 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3731 BEAST_EXPECT(changes.added == added);
3732 BEAST_EXPECT(changes.removed.empty());
3738 ManifestCache pubManifests;
3739 ManifestCache valManifests;
3740 std::vector<Publisher> publishers;
3742 auto const self = randomValidator();
3743 auto const keysTotal = valKeys.size() + 1;
3744 auto trustedKeys = makeValidatorList(
3752 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3753 int untrustedCount = 0;
3754 for (
auto const& p : publishers)
3756 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3757 BEAST_EXPECT(p.revoked ^ trusted);
3758 untrustedCount += trusted ? 0 : 1;
3760 BEAST_EXPECT(untrustedCount == 2);
3762 TrustChanges changes = trustedKeys->updateTrusted(
3764 env.timeKeeper().now(),
3766 env.app().getOverlay(),
3767 env.app().getHashRouter());
3768 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3769 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3773 for (
auto const& val : valKeys)
3775 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3778 BEAST_EXPECT(changes.added == added);
3779 BEAST_EXPECT(changes.removed.empty());
3782 env.timeKeeper().set(publishers.back().expiry);
3783 changes = trustedKeys->updateTrusted(
3785 env.timeKeeper().now(),
3787 env.app().getOverlay(),
3788 env.app().getHashRouter());
3789 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3790 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3793 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3794 for (
auto const& val : valKeys)
3796 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3797 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3798 removed.insert(
calcNodeID(val.masterPublic));
3800 BEAST_EXPECT(changes.added.empty());
3801 BEAST_EXPECT(changes.removed == removed);
3807 ManifestCache pubManifests;
3808 ManifestCache valManifests;
3809 std::vector<Publisher> publishers;
3811 auto const self = valKeys[2];
3812 auto const keysTotal = valKeys.size();
3813 auto trustedKeys = makeValidatorList(
3821 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3822 int untrustedCount = 0;
3823 for (
auto const& p : publishers)
3825 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3826 BEAST_EXPECT(p.revoked ^ trusted);
3827 untrustedCount += trusted ? 0 : 1;
3829 BEAST_EXPECT(untrustedCount == 3);
3831 TrustChanges changes = trustedKeys->updateTrusted(
3833 env.timeKeeper().now(),
3835 env.app().getOverlay(),
3836 env.app().getHashRouter());
3837 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3838 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3841 for (
auto const& val : valKeys)
3843 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3846 BEAST_EXPECT(changes.added == added);
3847 BEAST_EXPECT(changes.removed.empty());
3850 env.timeKeeper().set(publishers.back().expiry);
3851 changes = trustedKeys->updateTrusted(
3853 env.timeKeeper().now(),
3855 env.app().getOverlay(),
3856 env.app().getHashRouter());
3857 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3858 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3861 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3862 for (
auto const& val : valKeys)
3864 if (val.masterPublic != self.masterPublic)
3866 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3867 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3868 removed.insert(
calcNodeID(val.masterPublic));
3871 BEAST_EXPECT(changes.added.empty());
3872 BEAST_EXPECT(changes.removed == removed);