523 using namespace std::chrono_literals;
527 auto checkAvailable =
529 auto const& trustedKeys,
530 auto const& hexPublic,
531 auto const& manifest,
534 auto const available = trustedKeys->getAvailable(hexPublic);
536 BEAST_EXPECT(!version || available);
539 auto const& a = *available;
540 BEAST_EXPECT(a[jss::public_key] == hexPublic);
541 BEAST_EXPECT(a[jss::manifest] == manifest);
544 BEAST_EXPECT(a[jss::version] == version);
547 BEAST_EXPECT(expected.size() == 1);
548 BEAST_EXPECT(a[jss::blob] == expected[0].first);
549 BEAST_EXPECT(a[jss::signature] == expected[0].second);
550 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
552 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
554 BEAST_EXPECT(!a.isMember(jss::blob));
555 BEAST_EXPECT(!a.isMember(jss::signature));
556 auto const& blobsV2 = a[jss::blobs_v2];
557 BEAST_EXPECT(blobsV2.isArray() && blobsV2.size() == expected.size());
559 for (
unsigned int i = 0; i < expected.size(); ++i)
561 BEAST_EXPECT(blobsV2[i][jss::blob] == expected[i].first);
562 BEAST_EXPECT(blobsV2[i][jss::signature] == expected[i].second);
570 auto& app = env.
app();
579 for (
auto const& val : list)
581 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
582 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
587 for (
auto const& val : list)
589 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
590 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
596 auto const hexPublic =
strHex(publisherPublic.begin(), publisherPublic.end());
599 publisherPublic, publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
604 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublisherKeys));
607 static constexpr auto kListSize = 20;
608 static constexpr auto kNumLists = 9;
611 for (
auto i = 1; i <= kNumLists; ++i)
613 auto& list = lists[i];
614 list.reserve(kListSize);
615 while (list.size() < kListSize)
623 auto const version = 1;
624 auto const sequence1 = 1;
625 auto const expiredblob =
627 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
630 auto const sequence2 = 2;
632 auto const sig2 =
signList(blob2, pubSigningKeys1);
635 trustedKeys->applyLists(
638 {{.blob = expiredblob, .signature = expiredSig, .manifest = {}},
639 {.blob = blob2, .signature = sig2, .manifest = {}}},
645 expectTrusted(lists.at(2));
647 checkAvailable(trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
650 auto const version2 = 2;
651 auto const sequence7 = 7;
652 auto const effective7 = validUntil - 60s;
653 auto const expiration7 = effective7 + 3600s;
657 expiration7.time_since_epoch().count(),
658 effective7.time_since_epoch().count());
659 auto const sig7 = signList(blob7, pubSigningKeys1);
661 auto const sequence8 = 8;
662 auto const effective8 = expiration7 - 60s;
663 auto const expiration8 = effective8 + 3600s;
667 expiration8.time_since_epoch().count(),
668 effective8.time_since_epoch().count());
669 auto const sig8 = signList(blob8, pubSigningKeys1);
672 trustedKeys->applyLists(
675 {{.blob = blob7, .signature = sig7, .manifest = {}},
676 {.blob = blob8, .signature = sig8, .manifest = {}}},
679 ListDisposition::Pending,
680 ListDisposition::Pending);
682 expectUntrusted(lists.at(7));
683 expectUntrusted(lists.at(8));
686 auto const sequence6 = 6;
687 auto const effective6 = effective7 - 60s;
688 auto const expiration6 = effective6 + 3600s;
692 expiration6.time_since_epoch().count(),
693 effective6.time_since_epoch().count());
694 auto const sig6 = signList(blob6, pubSigningKeys1);
697 auto const sequence6a = 5;
698 auto const effective6a = effective6 + 60s;
699 auto const expiration6a = effective6a + 3600s;
703 expiration6a.time_since_epoch().count(),
704 effective6a.time_since_epoch().count());
705 auto const sig6a = signList(blob6a, pubSigningKeys1);
708 trustedKeys->applyLists(
711 {{.blob = blob6a, .signature = sig6a, .manifest = {}},
712 {.blob = blob6, .signature = sig6, .manifest = {}}},
715 ListDisposition::Pending,
716 ListDisposition::Pending);
718 expectUntrusted(lists.at(6));
719 expectTrusted(lists.at(2));
724 trustedKeys->applyLists(
727 {{.blob = blob7, .signature = sig7, .manifest = {}},
728 {.blob = blob6, .signature = sig6, .manifest = {}}},
731 ListDisposition::KnownSequence,
732 ListDisposition::KnownSequence);
734 expectUntrusted(lists.at(6));
735 expectUntrusted(lists.at(7));
736 expectTrusted(lists.at(2));
740 trustedKeys->applyLists(
743 {{.blob = blob7, .signature = sig7, .manifest = {}},
744 {.blob = blob6, .signature = sig6, .manifest = {}}},
747 ListDisposition::Invalid,
748 ListDisposition::Invalid);
751 trustedKeys->applyLists(
754 {{.blob = blob7, .signature = sig7, .manifest = {}},
755 {.blob = blob6, .signature = sig6, .manifest = {}}},
758 ListDisposition::Invalid,
759 ListDisposition::Invalid);
762 auto const untrustedManifest =
base64Encode(makeManifestString(
763 randomMasterKey(), publisherSecret, pubSigningKeys1.first, pubSigningKeys1.second, 1));
766 trustedKeys->applyLists(
769 {{.blob = blob2, .signature = sig2, .manifest = {}}},
772 ListDisposition::Untrusted,
773 ListDisposition::Untrusted);
776 auto const badVersion = 666;
778 trustedKeys->applyLists(
781 {{.blob = blob2, .signature = sig2, .manifest = {}}},
784 ListDisposition::UnsupportedVersion,
785 ListDisposition::UnsupportedVersion);
788 auto const sequence3 = 3;
789 auto const blob3 =
makeList(lists.at(3), sequence3, validUntil.time_since_epoch().count());
790 auto const sig3 = signList(blob3, pubSigningKeys1);
793 trustedKeys->applyLists(
794 manifest1, version, {{.blob = blob3, .signature = sig3, .manifest = {}}}, siteUri),
796 ListDisposition::Accepted,
797 ListDisposition::Accepted);
799 expectUntrusted(lists.at(1));
800 expectUntrusted(lists.at(2));
801 expectTrusted(lists.at(3));
810 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
814 trustedKeys->applyLists(
817 {{.blob = blob2, .signature = sig2, .manifest = {}},
818 {.blob = blob3, .signature = sig3, .manifest = {}}},
821 ListDisposition::Stale,
822 ListDisposition::SameSequence);
826 auto const pubSigningKeys2 =
randomKeyPair(KeyType::Secp256k1);
828 publisherPublic, publisherSecret, pubSigningKeys2.first, pubSigningKeys2.second, 2));
830 auto const sequence4 = 4;
831 auto const blob4 =
makeList(lists.at(4), sequence4, validUntil.time_since_epoch().count());
832 auto const sig4 = signList(blob4, pubSigningKeys2);
835 trustedKeys->applyLists(
838 {{.blob = blob2, .signature = sig2, .manifest = manifest1},
839 {.blob = blob3, .signature = sig3, .manifest = manifest1},
840 {.blob = blob4, .signature = sig4, .manifest = {}}},
843 ListDisposition::Stale,
844 ListDisposition::Accepted);
846 expectUntrusted(lists.at(2));
847 expectUntrusted(lists.at(3));
848 expectTrusted(lists.at(4));
855 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
857 auto const sequence5 = 5;
858 auto const blob5 =
makeList(lists.at(5), sequence5, validUntil.time_since_epoch().count());
859 auto const badSig = signList(blob5, pubSigningKeys1);
861 trustedKeys->applyLists(
864 {{.blob = blob5, .signature = badSig, .manifest = {}}},
867 ListDisposition::Invalid,
868 ListDisposition::Invalid);
870 expectUntrusted(lists.at(2));
871 expectUntrusted(lists.at(3));
872 expectTrusted(lists.at(4));
873 expectUntrusted(lists.at(5));
877 trustedKeys->applyLists(
880 {{.blob = blob7, .signature = sig7, .manifest = {}},
881 {.blob = blob8, .signature = sig8, .manifest = {}}},
884 ListDisposition::Invalid,
885 ListDisposition::Invalid);
887 expectTrusted(lists.at(4));
888 expectUntrusted(lists.at(7));
889 expectUntrusted(lists.at(8));
894 trustedKeys->updateTrusted(
898 env.app().getOverlay(),
899 env.app().getHashRouter());
901 expectUntrusted(lists.at(3));
902 expectTrusted(lists.at(6));
905 trustedKeys, hexPublic, manifest2, 2, {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
911 env.timeKeeper().set(effective8);
912 trustedKeys->updateTrusted(
916 env.app().getOverlay(),
917 env.app().getHashRouter());
919 expectUntrusted(lists.at(6));
920 expectUntrusted(lists.at(7));
921 expectTrusted(lists.at(8));
923 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
929 auto const sig82 = signList(blob8, pubSigningKeys2);
932 trustedKeys->applyLists(
935 {{.blob = blob8, .signature = sig8, .manifest = manifest1},
936 {.blob = blob8, .signature = sig82, .manifest = {}}},
939 ListDisposition::Invalid,
940 ListDisposition::SameSequence);
942 expectTrusted(lists.at(8));
944 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
948 auto const signingKeysMax =
randomKeyPair(KeyType::Secp256k1);
949 auto maxManifest =
base64Encode(makeRevocationString(publisherPublic, publisherSecret));
951 auto const sequence9 = 9;
952 auto const blob9 =
makeList(lists.at(9), sequence9, validUntil.time_since_epoch().count());
953 auto const sig9 = signList(blob9, signingKeysMax);
956 trustedKeys->applyLists(
959 {{.blob = blob9, .signature = sig9, .manifest = {}}},
962 ListDisposition::Untrusted,
963 ListDisposition::Untrusted);
965 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
966 for (
auto const& [num, list] : lists)
969 expectUntrusted(list);
972 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
1112 std::string const siteUri =
"testUpdateTrusted.test";
1116 auto& app = env.
app();
1133 while (cfgKeys.
size() != maxKeys)
1137 if (cfgKeys.
size() <= maxKeys - 5)
1147 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1151 TrustChanges changes = trustedKeysOuter->updateTrusted(
1152 activeValidatorsOuter,
1158 for (
auto const& val : unseenValidators)
1159 activeValidatorsOuter.
emplace(val);
1161 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1162 BEAST_EXPECT(changes.
removed.empty());
1163 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1164 for (
auto const& val : cfgKeys)
1168 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1169 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1177 changes = trustedKeysOuter->updateTrusted(
1178 activeValidatorsOuter,
1183 BEAST_EXPECT(changes.
added.empty());
1184 BEAST_EXPECT(changes.
removed.empty());
1185 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1194 BEAST_EXPECT(trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1197 auto const signingPublic1 = signingKeys1.first;
1201 TrustChanges changes = trustedKeysOuter->updateTrusted(
1202 activeValidatorsOuter,
1208 BEAST_EXPECT(changes.
removed.empty());
1209 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1210 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1211 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1212 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1213 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1217 masterPublic, masterPrivate, signingPublic1, signingKeys1.second, 1));
1222 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1223 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1224 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1225 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1230 auto const signingPublic2 = signingKeys2.first;
1232 masterPublic, masterPrivate, signingPublic2, signingKeys2.second, 2));
1236 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1237 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1238 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1239 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1240 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1241 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1245 auto const signingPublicMax = signingKeysMax.first;
1250 BEAST_EXPECT(max->revoked());
1255 BEAST_EXPECT(manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1256 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1259 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1260 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1262 changes = trustedKeysOuter->updateTrusted(
1263 activeValidatorsOuter,
1269 BEAST_EXPECT(changes.
added.empty());
1270 BEAST_EXPECT(trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1271 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1272 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1273 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1274 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1275 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1276 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1277 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1278 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1295 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1297 TrustChanges const changes = trustedKeys->updateTrusted(
1298 activeValidatorsOuter,
1303 BEAST_EXPECT(changes.
removed.empty());
1304 BEAST_EXPECT(changes.
added.empty());
1327 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1329 TrustChanges const changes = trustedKeys->updateTrusted(
1330 activeValidatorsOuter,
1335 BEAST_EXPECT(changes.
removed.empty());
1336 BEAST_EXPECT(changes.
added.size() == 1);
1337 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1338 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1359 while (cfgKeys.
size() < n)
1374 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1382 BEAST_EXPECT(changes.
removed.empty());
1383 BEAST_EXPECT(changes.
added == expectedTrusted);
1384 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1387 activeValidators.
emplace(toBeSeen);
1388 changes = trustedKeys->updateTrusted(
1394 BEAST_EXPECT(changes.
removed.empty());
1395 BEAST_EXPECT(changes.
added.empty());
1396 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1411 publisherKeys.first,
1412 publisherKeys.second,
1413 pubSigningKeys.first,
1414 pubSigningKeys.second,
1419 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublisherKeys));
1423 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1426 auto const version = 1;
1427 auto const sequence = 1;
1428 using namespace std::chrono_literals;
1431 auto const sig =
signList(blob, pubSigningKeys);
1435 trustedKeys->applyLists(manifest, version, {{blob, sig, {}}}, siteUri)
1436 .bestDisposition());
1444 BEAST_EXPECT(changes.
removed.empty());
1445 BEAST_EXPECT(changes.
added == activeValidators);
1448 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1449 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1451 BEAST_EXPECT(trustedKeys->quorum() == 2);
1454 changes = trustedKeys->updateTrusted(
1460 BEAST_EXPECT(changes.
removed == activeValidators);
1461 BEAST_EXPECT(changes.
added.empty());
1462 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1463 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1469 auto const sequence2 = 2;
1472 auto const sig2 =
signList(blob2, pubSigningKeys);
1476 trustedKeys->applyLists(manifest, version, {{blob2, sig2, {}}}, siteUri)
1477 .bestDisposition());
1479 changes = trustedKeys->updateTrusted(
1481 env.timeKeeper().now(),
1483 env.app().getOverlay(),
1484 env.app().getHashRouter());
1485 BEAST_EXPECT(changes.removed.empty());
1487 changes.added == asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1488 for (Validator
const& val : list2)
1490 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1491 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1493 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1494 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1495 BEAST_EXPECT(trustedKeys->quorum() == 2);
1503 app.config().legacy(Sections::kDatabasePath),
1507 hash_set<NodeID> activeValidators;
1508 hash_set<PublicKey> activeKeys;
1515 auto const valKey = randomNode();
1517 activeValidators.emplace(
calcNodeID(valKey));
1518 activeKeys.emplace(valKey);
1519 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1520 TrustChanges
const changes = trustedKeys->updateTrusted(
1522 env.timeKeeper().now(),
1524 env.app().getOverlay(),
1525 env.app().getHashRouter());
1526 BEAST_EXPECT(changes.removed.empty());
1527 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1528 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1529 for (
auto const& key : activeKeys)
1530 BEAST_EXPECT(trustedKeys->trusted(key));
1539 app.config().legacy(Sections::kDatabasePath),
1542 auto const localKey = randomNode();
1544 hash_set<NodeID> activeValidators;
1545 hash_set<PublicKey> activeKeys;
1551 auto const valKey = randomNode();
1553 activeValidators.emplace(
calcNodeID(valKey));
1554 activeKeys.emplace(valKey);
1556 BEAST_EXPECT(trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1557 TrustChanges
const changes = trustedKeys->updateTrusted(
1559 env.timeKeeper().now(),
1561 env.app().getOverlay(),
1562 env.app().getHashRouter());
1563 BEAST_EXPECT(changes.removed.empty());
1564 if (cfgKeys.
size() > 2)
1566 BEAST_EXPECT(changes.added == asNodeIDs({valKey}));
1570 BEAST_EXPECT(changes.added == asNodeIDs({localKey, valKey}));
1573 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1575 for (
auto const& key : activeKeys)
1576 BEAST_EXPECT(trustedKeys->trusted(key));
1581 ManifestCache manifests;
1586 app.config().legacy(Sections::kDatabasePath),
1589 hash_set<NodeID> activeValidators;
1593 while (valKeys.
size() != maxKeys)
1596 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1602 static constexpr int kPublishers = 3;
1612 auto addPublishedList = [&,
this](
int i) {
1619 pubSigningKeys.first,
1620 pubSigningKeys.second,
1623 std::vector<std::string>
const cfgPublishers({
strHex(publisherPublic)});
1624 std::vector<std::string>
const emptyCfgKeys;
1627 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers, std::size_t(1)));
1629 auto const version = 1;
1630 auto const sequence = 1;
1631 using namespace std::chrono_literals;
1633 std::vector<Validator>
const localKeys{locals[i].first, locals[i].second};
1635 makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1636 auto const sig = signList(blob, pubSigningKeys);
1640 trustedKeys->applyLists(manifest, version, {{blob, sig, {}}}, siteUri)
1641 .bestDisposition());
1645 for (
auto i = 0; i < kPublishers; ++i)
1646 addPublishedList(i);
1647 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1649 TrustChanges
const changes = trustedKeys->updateTrusted(
1651 env.timeKeeper().now(),
1653 env.app().getOverlay(),
1654 env.app().getHashRouter());
1656 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(valKeys.
size() * 0.8f));
1659 for (
auto const& val : valKeys)
1661 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1664 BEAST_EXPECT(changes.added == added);
1665 BEAST_EXPECT(changes.removed.empty());
1669 ManifestCache manifests;
1678 std::vector<Validator> valKeys;
1681 while (valKeys.
size() != maxKeys)
1684 activeValidators.emplace(
calcNodeID(valKeys.
back().masterPublic));
1692 static constexpr int kPublishers = 3;
1702 auto addPublishedList =
1711 pubSigningKeys.first,
1712 pubSigningKeys.second,
1715 std::vector<std::string>
const cfgPublishers({
strHex(publisherPublic)});
1716 std::vector<std::string>
const emptyCfgKeys;
1718 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1720 auto const version = 1;
1721 auto const sequence = 1;
1722 using namespace std::chrono_literals;
1740 validUntil1 = validUntil;
1744 validUntil2 = validUntil;
1746 std::vector<Validator>
const localKeys{locals[i].first, locals[i].second};
1748 makeList(localKeys, sequence, validUntil.time_since_epoch().count());
1749 auto const sig = signList(blob, pubSigningKeys);
1753 trustedKeys->applyLists(manifest, version, {{blob, sig, {}}}, siteUri)
1754 .bestDisposition());
1760 for (
auto i = 0; i < kPublishers; ++i)
1761 addPublishedList(i, validUntil1, validUntil2);
1762 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1764 TrustChanges changes = trustedKeys->updateTrusted(
1766 env.timeKeeper().now(),
1768 env.app().getOverlay(),
1769 env.app().getHashRouter());
1771 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.
size() - 3) * 0.8f));
1773 for (
auto const& val : valKeys)
1774 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1777 for (std::size_t i = 0; i < maxKeys; ++i)
1779 auto const& val = valKeys[i];
1780 if (i >= 1 && i < maxKeys - 2)
1782 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1787 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1790 BEAST_EXPECT(changes.added == added);
1791 BEAST_EXPECT(changes.removed.empty());
1794 env.timeKeeper().set(validUntil1);
1795 changes = trustedKeys->updateTrusted(
1797 env.timeKeeper().now(),
1799 env.app().getOverlay(),
1800 env.app().getHashRouter());
1802 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil((valKeys.size() - 6) * 0.8f));
1804 for (
auto const& val : valKeys)
1805 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1808 for (std::size_t i = 0; i < maxKeys; ++i)
1810 auto const& val = valKeys[i];
1811 if (i >= 2 && i < maxKeys - 4)
1813 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1817 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1818 if (i >= 1 && i < maxKeys - 2)
1819 removed.insert(
calcNodeID(val.masterPublic));
1823 BEAST_EXPECT(changes.added.empty());
1824 BEAST_EXPECT(changes.removed == removed);
1827 env.timeKeeper().set(validUntil2);
1828 changes = trustedKeys->updateTrusted(
1830 env.timeKeeper().now(),
1832 env.app().getOverlay(),
1833 env.app().getHashRouter());
1838 for (std::size_t i = 0; i < maxKeys; ++i)
1840 auto const& val = valKeys[i];
1841 if (i < maxKeys - 4)
1843 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1847 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1850 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1851 if (i >= 2 && i < maxKeys - 4)
1852 removed.insert(
calcNodeID(val.masterPublic));
1855 BEAST_EXPECT(changes.added.empty());
1856 BEAST_EXPECT(changes.removed == removed);
2292 testcase(
"Build and split messages");
2295 auto extractHeader = [
this](
Message& message) {
2298 boost::beast::multi_buffer buffers;
2301 auto start = buffer.begin();
2302 auto end = buffer.end();
2305 boost::asio::buffer_copy(
2306 buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
2308 boost::system::error_code ec;
2313 auto extractProtocolMessage1 = [
this, &extractHeader](
Message& message) {
2314 auto [header, buffers] = extractHeader(message);
2315 if (BEAST_EXPECT(header) &&
2316 BEAST_EXPECT(header->messageType == protocol::mtVALIDATOR_LIST))
2325 auto extractProtocolMessage2 = [
this, &extractHeader](
Message& message) {
2326 auto [header, buffers] = extractHeader(message);
2327 if (BEAST_EXPECT(header) &&
2328 BEAST_EXPECT(header->messageType == protocol::mtVALIDATOR_LIST_COLLECTION))
2331 *header, buffers.data());
2337 auto verifyMessage =
2338 [
this, manifestCutoff, &extractProtocolMessage1, &extractProtocolMessage2](
2340 auto const& manifest,
2341 auto const& blobInfos,
2342 auto const& messages,
2344 BEAST_EXPECT(messages.size() == expectedInfo.size());
2345 auto msgIter = expectedInfo.begin();
2346 for (
auto const& messageWithHash : messages)
2348 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2350 if (!BEAST_EXPECT(messageWithHash.message))
2352 auto const& expectedSeqs = msgIter->second;
2353 auto seqIter = expectedSeqs.begin();
2357 BEAST_EXPECT(size == msgIter->first);
2358 if (expectedSeqs.size() == 1)
2360 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2361 auto const expectedVersion = 1;
2362 if (BEAST_EXPECT(msg))
2364 BEAST_EXPECT(msg->version() == expectedVersion);
2365 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2367 auto const& expectedBlob = blobInfos.at(*seqIter);
2368 BEAST_EXPECT((*seqIter < manifestCutoff) == !!expectedBlob.manifest);
2369 auto const expectedManifest =
2370 *seqIter < manifestCutoff && expectedBlob.manifest
2371 ? *expectedBlob.manifest
2373 BEAST_EXPECT(msg->manifest() == expectedManifest);
2374 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2375 BEAST_EXPECT(msg->signature() == expectedBlob.signature);
2377 BEAST_EXPECT(seqIter == expectedSeqs.end());
2380 messageWithHash.hash ==
2384 expectedBlob.signature,
2391 hashingBlobs.
reserve(msgIter->second.size());
2393 auto const msg = extractProtocolMessage2(*messageWithHash.message);
2394 if (BEAST_EXPECT(msg))
2396 BEAST_EXPECT(msg->version() == version);
2397 BEAST_EXPECT(msg->manifest() == manifest);
2398 for (
auto const& blobInfo : msg->blobs())
2400 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2402 auto const& expectedBlob = blobInfos.at(*seqIter);
2404 BEAST_EXPECT(blobInfo.has_manifest() == !!expectedBlob.manifest);
2406 blobInfo.has_manifest() == (*seqIter < manifestCutoff));
2408 if (*seqIter < manifestCutoff)
2409 BEAST_EXPECT(blobInfo.manifest() == *expectedBlob.manifest);
2410 BEAST_EXPECT(blobInfo.blob() == expectedBlob.blob);
2411 BEAST_EXPECT(blobInfo.signature() == expectedBlob.signature);
2414 BEAST_EXPECT(seqIter == expectedSeqs.end());
2417 messageWithHash.hash ==
sha512Half(manifest, hashingBlobs, version));
2421 BEAST_EXPECT(msgIter == expectedInfo.end());
2423 auto verifyBuildMessages = [
this](
2427 BEAST_EXPECT(result.
first == expectedSequence);
2428 BEAST_EXPECT(result.
second == expectedSize);
2431 std::string const manifest =
"This is not a manifest";
2434 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2437 for (
auto seq : {5, 6, 7, 10, 12})
2441 s <<
"This is not a blob with sequence " << seq;
2444 s <<
"This is not a signature for sequence " << seq;
2445 b.signature = s.
str();
2446 if (seq < manifestCutoff)
2450 s <<
"This is not manifest " << seq;
2451 b.manifest = s.
str();
2456 auto const maxSequence = blobInfos.rbegin()->first;
2457 BEAST_EXPECT(maxSequence == 12);
2464 verifyBuildMessages(
2466 1, 8, maxSequence, version, manifest, blobInfos, messages),
2469 BEAST_EXPECT(messages.empty());
2475 messages.emplace_back();
2476 verifyBuildMessages(
2478 1, 3, maxSequence, version, manifest, blobInfos, messages),
2481 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2485 verifyBuildMessages(
2487 1, 3, maxSequence, version, manifest, blobInfos, messages),
2490 if (BEAST_EXPECT(messages.size() == 1) && BEAST_EXPECT(messages.front().message))
2492 auto const& messageWithHash = messages.front();
2493 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2497 BEAST_EXPECT(size == 108);
2498 auto const& expected = blobInfos.at(5);
2499 if (BEAST_EXPECT(msg))
2501 BEAST_EXPECT(msg->version() == 1);
2503 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2504 BEAST_EXPECT(msg->blob() == expected.blob);
2505 BEAST_EXPECT(msg->signature() == expected.signature);
2508 messageWithHash.hash ==
2510 sha512Half(*expected.manifest, expected.blob, expected.signature, 1));
2518 verifyBuildMessages(
2520 2, maxSequence * 2, maxSequence, version, manifest, blobInfos, messages),
2523 BEAST_EXPECT(messages.empty());
2529 messages.emplace_back();
2530 verifyBuildMessages(
2532 2, 3, maxSequence, version, manifest, blobInfos, messages),
2535 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2539 verifyBuildMessages(
2541 2, 5, maxSequence, version, manifest, blobInfos, messages),
2544 verifyMessage(version, manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2550 verifyBuildMessages(
2552 2, 5, maxSequence, version, manifest, blobInfos, messages, 300),
2555 verifyMessage(version, manifest, blobInfos, messages, {{212, {6, 7}}, {192, {10, 12}}});
2560 verifyBuildMessages(
2562 2, 5, maxSequence, version, manifest, blobInfos, messages, 200),
2566 version, manifest, blobInfos, messages, {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2570 verifyBuildMessages(
2572 2, 5, maxSequence, version, manifest, blobInfos, messages, 150),
2580 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2585 verifyBuildMessages(
2587 2, 5, maxSequence, version, manifest, blobInfos, messages, 108),
2595 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2603 std::string const siteUri =
"testQuorumDisabled.test";
2605 auto& app = env.
app();
2610 while (valKeys.
size() != kMaxKeys)
2627 auto makeValidatorList = [&,
this](
2655 pubSigningKeys.first,
2656 pubSigningKeys.second,
2657 i < countRevoked ? kRevoked : 1));
2658 publishers.push_back(
2660 .revoked = i < countRevoked,
2661 .pubKey = publisherPublic,
2662 .signingKeys = pubSigningKeys,
2663 .manifest = manifest,
2668 auto threshold = listThreshold > 0 ?
std::optional(listThreshold) : std::nullopt;
2673 result->load(self->signingPublic, emptyCfgKeys, cfgPublishers, threshold));
2677 BEAST_EXPECT(result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2682 using namespace std::chrono_literals;
2683 publishers[i].expiry = env.
timeKeeper().
now() + (i == countTotal - 1 ? 60s : 3600s);
2685 makeList(valKeys, 1, publishers[i].expiry.time_since_epoch().count());
2686 auto const sig =
signList(blob, publishers[i].signingKeys);
2689 result->applyLists(publishers[i].manifest, 1, {{blob, sig, {}}}, siteUri)
2690 .bestDisposition() ==
2706 auto const self = randomValidator();
2707 auto const keysTotal = valKeys.size() + 1;
2708 auto trustedKeys = makeValidatorList(
2716 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2717 for (
auto const& p : publishers)
2718 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2722 env.timeKeeper().now(),
2724 env.app().getOverlay(),
2725 env.app().getHashRouter());
2726 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2727 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2731 for (
auto const& val : valKeys)
2733 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2736 BEAST_EXPECT(changes.
added == added);
2737 BEAST_EXPECT(changes.
removed.empty());
2740 env.timeKeeper().set(publishers.back().expiry);
2741 changes = trustedKeys->updateTrusted(
2743 env.timeKeeper().now(),
2745 env.app().getOverlay(),
2746 env.app().getHashRouter());
2747 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2748 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2751 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2752 for (
auto const& val : valKeys)
2754 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2755 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2758 BEAST_EXPECT(changes.
added.empty());
2759 BEAST_EXPECT(changes.
removed == removed);
2763 ManifestCache pubManifests;
2764 ManifestCache valManifests;
2765 std::vector<Publisher> publishers;
2766 auto const keysTotal = valKeys.size();
2767 auto trustedKeys = makeValidatorList(
2775 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2776 for (
auto const& p : publishers)
2777 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2779 TrustChanges changes = trustedKeys->updateTrusted(
2781 env.timeKeeper().now(),
2783 env.app().getOverlay(),
2784 env.app().getHashRouter());
2785 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2786 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2789 for (
auto const& val : valKeys)
2791 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2794 BEAST_EXPECT(changes.added == added);
2795 BEAST_EXPECT(changes.removed.empty());
2798 env.timeKeeper().set(publishers.back().expiry);
2799 changes = trustedKeys->updateTrusted(
2801 env.timeKeeper().now(),
2803 env.app().getOverlay(),
2804 env.app().getHashRouter());
2805 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2806 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
2809 for (
auto const& val : valKeys)
2811 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2812 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2813 removed.insert(
calcNodeID(val.masterPublic));
2815 BEAST_EXPECT(changes.added.empty());
2816 BEAST_EXPECT(changes.removed == removed);
2820 ManifestCache pubManifests;
2821 ManifestCache valManifests;
2822 std::vector<Publisher> publishers;
2824 auto const self = valKeys[1];
2825 auto const keysTotal = valKeys.size();
2826 auto trustedKeys = makeValidatorList(
2834 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2835 int untrustedCount = 0;
2836 for (
auto const& p : publishers)
2838 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2839 BEAST_EXPECT(p.revoked ^ trusted);
2840 untrustedCount += trusted ? 0 : 1;
2842 BEAST_EXPECT(untrustedCount == 1);
2844 TrustChanges changes = trustedKeys->updateTrusted(
2846 env.timeKeeper().now(),
2848 env.app().getOverlay(),
2849 env.app().getHashRouter());
2850 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2851 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2854 for (
auto const& val : valKeys)
2856 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2859 BEAST_EXPECT(changes.added == added);
2860 BEAST_EXPECT(changes.removed.empty());
2863 env.timeKeeper().set(publishers.back().expiry);
2864 changes = trustedKeys->updateTrusted(
2866 env.timeKeeper().now(),
2868 env.app().getOverlay(),
2869 env.app().getHashRouter());
2870 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2871 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2874 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2875 for (
auto const& val : valKeys)
2877 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2878 if (val.masterPublic != self.masterPublic)
2880 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2881 removed.insert(
calcNodeID(val.masterPublic));
2884 BEAST_EXPECT(changes.added.empty());
2885 BEAST_EXPECT(changes.removed == removed);
2889 ManifestCache pubManifests;
2890 ManifestCache valManifests;
2891 std::vector<Publisher> publishers;
2893 auto const self = randomValidator();
2894 auto const keysTotal = valKeys.size() + 1;
2895 auto trustedKeys = makeValidatorList(
2903 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2904 int untrustedCount = 0;
2905 for (
auto const& p : publishers)
2907 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2908 BEAST_EXPECT(p.revoked ^ trusted);
2909 untrustedCount += trusted ? 0 : 1;
2911 BEAST_EXPECT(untrustedCount == 2);
2913 TrustChanges changes = trustedKeys->updateTrusted(
2915 env.timeKeeper().now(),
2917 env.app().getOverlay(),
2918 env.app().getHashRouter());
2919 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2920 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2924 for (
auto const& val : valKeys)
2926 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2929 BEAST_EXPECT(changes.added == added);
2930 BEAST_EXPECT(changes.removed.empty());
2933 env.timeKeeper().set(publishers.back().expiry);
2934 changes = trustedKeys->updateTrusted(
2936 env.timeKeeper().now(),
2938 env.app().getOverlay(),
2939 env.app().getHashRouter());
2940 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
2941 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2944 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2945 for (
auto const& val : valKeys)
2947 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2948 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2949 removed.insert(
calcNodeID(val.masterPublic));
2951 BEAST_EXPECT(changes.added.empty());
2952 BEAST_EXPECT(changes.removed == removed);
2956 ManifestCache pubManifests;
2957 ManifestCache valManifests;
2958 std::vector<Publisher> publishers;
2960 auto const self = valKeys[5];
2961 auto const keysTotal = valKeys.size();
2962 auto trustedKeys = makeValidatorList(
2970 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
2971 int untrustedCount = 0;
2972 for (
auto const& p : publishers)
2974 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2975 BEAST_EXPECT(p.revoked ^ trusted);
2976 untrustedCount += trusted ? 0 : 1;
2978 BEAST_EXPECT(untrustedCount == 2);
2980 TrustChanges changes = trustedKeys->updateTrusted(
2982 env.timeKeeper().now(),
2984 env.app().getOverlay(),
2985 env.app().getHashRouter());
2986 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2987 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2990 for (
auto const& val : valKeys)
2992 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2995 BEAST_EXPECT(changes.added == added);
2996 BEAST_EXPECT(changes.removed.empty());
2999 env.timeKeeper().set(publishers.back().expiry);
3000 changes = trustedKeys->updateTrusted(
3002 env.timeKeeper().now(),
3004 env.app().getOverlay(),
3005 env.app().getHashRouter());
3006 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3007 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3010 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3011 for (
auto const& val : valKeys)
3013 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3014 if (val.masterPublic != self.masterPublic)
3016 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3017 removed.insert(
calcNodeID(val.masterPublic));
3020 BEAST_EXPECT(changes.added.empty());
3021 BEAST_EXPECT(changes.removed == removed);
3025 ManifestCache pubManifests;
3026 ManifestCache valManifests;
3027 std::vector<Publisher> publishers;
3028 auto const keysTotal = valKeys.size();
3029 auto trustedKeys = makeValidatorList(
3037 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3038 int untrustedCount = 0;
3039 for (
auto const& p : publishers)
3041 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3042 BEAST_EXPECT(p.revoked ^ trusted);
3043 untrustedCount += trusted ? 0 : 1;
3045 BEAST_EXPECT(untrustedCount == 2);
3047 TrustChanges changes = trustedKeys->updateTrusted(
3049 env.timeKeeper().now(),
3051 env.app().getOverlay(),
3052 env.app().getHashRouter());
3053 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3054 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3057 for (
auto const& val : valKeys)
3059 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3062 BEAST_EXPECT(changes.added == added);
3063 BEAST_EXPECT(changes.removed.empty());
3066 env.timeKeeper().set(publishers.back().expiry);
3067 changes = trustedKeys->updateTrusted(
3069 env.timeKeeper().now(),
3071 env.app().getOverlay(),
3072 env.app().getHashRouter());
3073 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3074 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3077 for (
auto const& val : valKeys)
3079 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3080 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3081 removed.insert(
calcNodeID(val.masterPublic));
3083 BEAST_EXPECT(changes.added.empty());
3084 BEAST_EXPECT(changes.removed == removed);
3088 ManifestCache pubManifests;
3089 ManifestCache valManifests;
3090 std::vector<Publisher> publishers;
3092 auto const self = randomValidator();
3093 auto const keysTotal = valKeys.size() + 1;
3094 auto trustedKeys = makeValidatorList(
3102 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3103 int untrustedCount = 0;
3104 for (
auto const& p : publishers)
3106 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3107 BEAST_EXPECT(p.revoked ^ trusted);
3108 untrustedCount += trusted ? 0 : 1;
3110 BEAST_EXPECT(untrustedCount == 1);
3112 TrustChanges changes = trustedKeys->updateTrusted(
3114 env.timeKeeper().now(),
3116 env.app().getOverlay(),
3117 env.app().getHashRouter());
3118 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3119 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3123 for (
auto const& val : valKeys)
3125 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3128 BEAST_EXPECT(changes.added == added);
3129 BEAST_EXPECT(changes.removed.empty());
3132 env.timeKeeper().set(publishers.back().expiry);
3133 changes = trustedKeys->updateTrusted(
3135 env.timeKeeper().now(),
3137 env.app().getOverlay(),
3138 env.app().getHashRouter());
3139 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3140 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3142 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3143 for (
auto const& val : valKeys)
3145 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3146 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3148 BEAST_EXPECT(changes.added.empty());
3149 BEAST_EXPECT(changes.removed.empty());
3153 ManifestCache pubManifests;
3154 ManifestCache valManifests;
3155 std::vector<Publisher> publishers;
3157 auto const self = randomValidator();
3158 auto const keysTotal = valKeys.size() + 1;
3159 auto trustedKeys = makeValidatorList(
3167 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3168 for (
auto const& p : publishers)
3169 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3171 TrustChanges changes = trustedKeys->updateTrusted(
3173 env.timeKeeper().now(),
3175 env.app().getOverlay(),
3176 env.app().getHashRouter());
3177 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3178 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3182 for (
auto const& val : valKeys)
3184 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3187 BEAST_EXPECT(changes.added == added);
3188 BEAST_EXPECT(changes.removed.empty());
3191 env.timeKeeper().set(publishers.back().expiry);
3192 changes = trustedKeys->updateTrusted(
3194 env.timeKeeper().now(),
3196 env.app().getOverlay(),
3197 env.app().getHashRouter());
3198 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3199 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3201 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
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());
3212 ManifestCache pubManifests;
3213 ManifestCache valManifests;
3214 std::vector<Publisher> publishers;
3216 auto const self = valKeys[7];
3217 auto const keysTotal = valKeys.size();
3218 auto trustedKeys = makeValidatorList(
3226 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3227 for (
auto const& p : publishers)
3228 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3230 TrustChanges changes = trustedKeys->updateTrusted(
3232 env.timeKeeper().now(),
3234 env.app().getOverlay(),
3235 env.app().getHashRouter());
3236 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3237 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3240 for (
auto const& val : valKeys)
3242 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3245 BEAST_EXPECT(changes.added == added);
3246 BEAST_EXPECT(changes.removed.empty());
3249 env.timeKeeper().set(publishers.back().expiry);
3250 changes = trustedKeys->updateTrusted(
3252 env.timeKeeper().now(),
3254 env.app().getOverlay(),
3255 env.app().getHashRouter());
3256 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3257 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3259 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3260 for (
auto const& val : valKeys)
3262 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3263 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3265 BEAST_EXPECT(changes.added.empty());
3266 BEAST_EXPECT(changes.removed.empty());
3270 ManifestCache pubManifests;
3271 ManifestCache valManifests;
3272 std::vector<Publisher> publishers;
3273 auto const keysTotal = valKeys.size();
3274 auto trustedKeys = makeValidatorList(
3282 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3283 for (
auto const& p : publishers)
3284 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3286 TrustChanges changes = trustedKeys->updateTrusted(
3288 env.timeKeeper().now(),
3290 env.app().getOverlay(),
3291 env.app().getHashRouter());
3292 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3293 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3296 for (
auto const& val : valKeys)
3298 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3301 BEAST_EXPECT(changes.added == added);
3302 BEAST_EXPECT(changes.removed.empty());
3305 env.timeKeeper().set(publishers.back().expiry);
3306 changes = trustedKeys->updateTrusted(
3308 env.timeKeeper().now(),
3310 env.app().getOverlay(),
3311 env.app().getHashRouter());
3312 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3313 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3315 for (
auto const& val : valKeys)
3317 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3318 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3320 BEAST_EXPECT(changes.added.empty());
3321 BEAST_EXPECT(changes.removed.empty());
3327 ManifestCache pubManifests;
3328 ManifestCache valManifests;
3329 std::vector<Publisher> publishers;
3331 auto const self = randomValidator();
3332 auto const keysTotal = valKeys.size() + 1;
3333 auto trustedKeys = makeValidatorList(
3341 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3342 int untrustedCount = 0;
3343 for (
auto const& p : publishers)
3345 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3346 BEAST_EXPECT(p.revoked ^ trusted);
3347 untrustedCount += trusted ? 0 : 1;
3349 BEAST_EXPECT(untrustedCount == 1);
3351 TrustChanges changes = trustedKeys->updateTrusted(
3353 env.timeKeeper().now(),
3355 env.app().getOverlay(),
3356 env.app().getHashRouter());
3357 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3358 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3362 for (
auto const& val : valKeys)
3364 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3367 BEAST_EXPECT(changes.added == added);
3368 BEAST_EXPECT(changes.removed.empty());
3371 env.timeKeeper().set(publishers.back().expiry);
3372 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() == 1);
3382 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3383 for (
auto const& val : valKeys)
3385 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3386 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3387 removed.insert(
calcNodeID(val.masterPublic));
3389 BEAST_EXPECT(changes.added.empty());
3390 BEAST_EXPECT(changes.removed == removed);
3394 ManifestCache pubManifests;
3395 ManifestCache valManifests;
3396 std::vector<Publisher> publishers;
3398 auto const self = valKeys[5];
3399 auto const keysTotal = valKeys.size();
3400 auto trustedKeys = makeValidatorList(
3408 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3409 int untrustedCount = 0;
3410 for (
auto const& p : publishers)
3412 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3413 BEAST_EXPECT(p.revoked ^ trusted);
3414 untrustedCount += trusted ? 0 : 1;
3416 BEAST_EXPECT(untrustedCount == 1);
3418 TrustChanges changes = trustedKeys->updateTrusted(
3420 env.timeKeeper().now(),
3422 env.app().getOverlay(),
3423 env.app().getHashRouter());
3424 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3425 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3428 for (
auto const& val : valKeys)
3430 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3433 BEAST_EXPECT(changes.added == added);
3434 BEAST_EXPECT(changes.removed.empty());
3437 env.timeKeeper().set(publishers.back().expiry);
3438 changes = trustedKeys->updateTrusted(
3440 env.timeKeeper().now(),
3442 env.app().getOverlay(),
3443 env.app().getHashRouter());
3444 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3445 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3448 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3449 for (
auto const& val : valKeys)
3451 if (val.masterPublic != self.masterPublic)
3453 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3454 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3455 removed.insert(
calcNodeID(val.masterPublic));
3458 BEAST_EXPECT(changes.added.empty());
3459 BEAST_EXPECT(changes.removed == removed);
3463 ManifestCache pubManifests;
3464 ManifestCache valManifests;
3465 std::vector<Publisher> publishers;
3466 auto const keysTotal = valKeys.size();
3467 auto trustedKeys = makeValidatorList(
3475 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3476 int untrustedCount = 0;
3477 for (
auto const& p : publishers)
3479 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3480 BEAST_EXPECT(p.revoked ^ trusted);
3481 untrustedCount += trusted ? 0 : 1;
3483 BEAST_EXPECT(untrustedCount == 1);
3485 TrustChanges changes = trustedKeys->updateTrusted(
3487 env.timeKeeper().now(),
3489 env.app().getOverlay(),
3490 env.app().getHashRouter());
3491 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3492 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3495 for (
auto const& val : valKeys)
3497 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3500 BEAST_EXPECT(changes.added == added);
3501 BEAST_EXPECT(changes.removed.empty());
3504 env.timeKeeper().set(publishers.back().expiry);
3505 changes = trustedKeys->updateTrusted(
3507 env.timeKeeper().now(),
3509 env.app().getOverlay(),
3510 env.app().getHashRouter());
3511 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3512 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3515 for (
auto const& val : valKeys)
3517 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3518 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3519 removed.insert(
calcNodeID(val.masterPublic));
3521 BEAST_EXPECT(changes.added.empty());
3522 BEAST_EXPECT(changes.removed == removed);
3526 ManifestCache pubManifests;
3527 ManifestCache valManifests;
3528 std::vector<Publisher> publishers;
3530 auto const self = randomValidator();
3531 auto const keysTotal = valKeys.size() + 1;
3532 auto trustedKeys = makeValidatorList(
3540 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3541 for (
auto const& p : publishers)
3542 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3544 TrustChanges changes = trustedKeys->updateTrusted(
3546 env.timeKeeper().now(),
3548 env.app().getOverlay(),
3549 env.app().getHashRouter());
3550 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3551 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3555 for (
auto const& val : valKeys)
3557 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3560 BEAST_EXPECT(changes.added == added);
3561 BEAST_EXPECT(changes.removed.empty());
3564 env.timeKeeper().set(publishers.back().expiry);
3565 changes = trustedKeys->updateTrusted(
3567 env.timeKeeper().now(),
3569 env.app().getOverlay(),
3570 env.app().getHashRouter());
3571 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3572 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3575 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3576 for (
auto const& val : valKeys)
3578 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3579 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3580 removed.insert(
calcNodeID(val.masterPublic));
3582 BEAST_EXPECT(changes.added.empty());
3583 BEAST_EXPECT(changes.removed == removed);
3587 ManifestCache pubManifests;
3588 ManifestCache valManifests;
3589 std::vector<Publisher> publishers;
3591 auto const self = valKeys[5];
3592 auto const keysTotal = valKeys.size();
3593 auto trustedKeys = makeValidatorList(
3601 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3602 for (
auto const& p : publishers)
3603 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3605 TrustChanges changes = trustedKeys->updateTrusted(
3607 env.timeKeeper().now(),
3609 env.app().getOverlay(),
3610 env.app().getHashRouter());
3611 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3612 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3616 for (
auto const& val : valKeys)
3618 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3621 BEAST_EXPECT(changes.added == added);
3622 BEAST_EXPECT(changes.removed.empty());
3625 env.timeKeeper().set(publishers.back().expiry);
3626 changes = trustedKeys->updateTrusted(
3628 env.timeKeeper().now(),
3630 env.app().getOverlay(),
3631 env.app().getHashRouter());
3632 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3633 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3636 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3637 for (
auto const& val : valKeys)
3639 if (val.masterPublic != self.masterPublic)
3641 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3642 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3643 removed.insert(
calcNodeID(val.masterPublic));
3646 BEAST_EXPECT(changes.added.empty());
3647 BEAST_EXPECT(changes.removed == removed);
3651 ManifestCache pubManifests;
3652 ManifestCache valManifests;
3653 std::vector<Publisher> publishers;
3654 auto const keysTotal = valKeys.size();
3655 auto trustedKeys = makeValidatorList(
3663 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3664 for (
auto const& p : publishers)
3665 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3667 TrustChanges changes = trustedKeys->updateTrusted(
3669 env.timeKeeper().now(),
3671 env.app().getOverlay(),
3672 env.app().getHashRouter());
3673 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3674 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3677 for (
auto const& val : valKeys)
3679 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3682 BEAST_EXPECT(changes.added == added);
3683 BEAST_EXPECT(changes.removed.empty());
3686 env.timeKeeper().set(publishers.back().expiry);
3687 changes = trustedKeys->updateTrusted(
3689 env.timeKeeper().now(),
3691 env.app().getOverlay(),
3692 env.app().getHashRouter());
3693 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3694 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().empty());
3697 for (
auto const& val : valKeys)
3699 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3700 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3701 removed.insert(
calcNodeID(val.masterPublic));
3703 BEAST_EXPECT(changes.added.empty());
3704 BEAST_EXPECT(changes.removed == removed);
3710 ManifestCache pubManifests;
3711 ManifestCache valManifests;
3712 std::vector<Publisher> publishers;
3714 auto const self = randomValidator();
3715 auto const keysTotal = valKeys.size() + 1;
3716 auto trustedKeys = makeValidatorList(
3724 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3725 for (
auto const& p : publishers)
3726 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3728 TrustChanges changes = trustedKeys->updateTrusted(
3730 env.timeKeeper().now(),
3732 env.app().getOverlay(),
3733 env.app().getHashRouter());
3734 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3735 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3739 for (
auto const& val : valKeys)
3741 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3744 BEAST_EXPECT(changes.added == added);
3745 BEAST_EXPECT(changes.removed.empty());
3748 env.timeKeeper().set(publishers.back().expiry);
3749 changes = trustedKeys->updateTrusted(
3751 env.timeKeeper().now(),
3753 env.app().getOverlay(),
3754 env.app().getHashRouter());
3755 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3756 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3759 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3760 for (
auto const& val : valKeys)
3762 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3763 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3764 removed.insert(
calcNodeID(val.masterPublic));
3766 BEAST_EXPECT(changes.added.empty());
3767 BEAST_EXPECT(changes.removed == removed);
3773 ManifestCache pubManifests;
3774 ManifestCache valManifests;
3775 std::vector<Publisher> publishers;
3777 auto const self = valKeys[2];
3778 auto const keysTotal = valKeys.size();
3779 auto trustedKeys = makeValidatorList(
3787 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3788 for (
auto const& p : publishers)
3789 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3791 TrustChanges
const changes = trustedKeys->updateTrusted(
3793 env.timeKeeper().now(),
3795 env.app().getOverlay(),
3796 env.app().getHashRouter());
3797 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3798 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3801 for (
auto const& val : valKeys)
3803 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3806 BEAST_EXPECT(changes.added == added);
3807 BEAST_EXPECT(changes.removed.empty());
3813 ManifestCache pubManifests;
3814 ManifestCache valManifests;
3815 std::vector<Publisher> publishers;
3816 auto const keysTotal = valKeys.size();
3817 auto trustedKeys = makeValidatorList(
3825 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3826 for (
auto const& p : publishers)
3827 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3829 TrustChanges
const changes = trustedKeys->updateTrusted(
3831 env.timeKeeper().now(),
3833 env.app().getOverlay(),
3834 env.app().getHashRouter());
3835 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3836 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3839 for (
auto const& val : valKeys)
3841 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3844 BEAST_EXPECT(changes.added == added);
3845 BEAST_EXPECT(changes.removed.empty());
3851 ManifestCache pubManifests;
3852 ManifestCache valManifests;
3853 std::vector<Publisher> publishers;
3855 auto const self = randomValidator();
3856 auto const keysTotal = valKeys.size() + 1;
3857 auto trustedKeys = makeValidatorList(
3865 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3866 int untrustedCount = 0;
3867 for (
auto const& p : publishers)
3869 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3870 BEAST_EXPECT(p.revoked ^ trusted);
3871 untrustedCount += trusted ? 0 : 1;
3873 BEAST_EXPECT(untrustedCount == 2);
3875 TrustChanges changes = trustedKeys->updateTrusted(
3877 env.timeKeeper().now(),
3879 env.app().getOverlay(),
3880 env.app().getHashRouter());
3881 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3882 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3886 for (
auto const& val : valKeys)
3888 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3891 BEAST_EXPECT(changes.added == added);
3892 BEAST_EXPECT(changes.removed.empty());
3895 env.timeKeeper().set(publishers.back().expiry);
3896 changes = trustedKeys->updateTrusted(
3898 env.timeKeeper().now(),
3900 env.app().getOverlay(),
3901 env.app().getHashRouter());
3902 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3903 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3906 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3907 for (
auto const& val : valKeys)
3909 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3910 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3911 removed.insert(
calcNodeID(val.masterPublic));
3913 BEAST_EXPECT(changes.added.empty());
3914 BEAST_EXPECT(changes.removed == removed);
3920 ManifestCache pubManifests;
3921 ManifestCache valManifests;
3922 std::vector<Publisher> publishers;
3924 auto const self = valKeys[2];
3925 auto const keysTotal = valKeys.size();
3926 auto trustedKeys = makeValidatorList(
3934 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
3935 int untrustedCount = 0;
3936 for (
auto const& p : publishers)
3938 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3939 BEAST_EXPECT(p.revoked ^ trusted);
3940 untrustedCount += trusted ? 0 : 1;
3942 BEAST_EXPECT(untrustedCount == 3);
3944 TrustChanges changes = trustedKeys->updateTrusted(
3946 env.timeKeeper().now(),
3948 env.app().getOverlay(),
3949 env.app().getHashRouter());
3950 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3951 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3954 for (
auto const& val : valKeys)
3956 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3959 BEAST_EXPECT(changes.added == added);
3960 BEAST_EXPECT(changes.removed.empty());
3963 env.timeKeeper().set(publishers.back().expiry);
3964 changes = trustedKeys->updateTrusted(
3966 env.timeKeeper().now(),
3968 env.app().getOverlay(),
3969 env.app().getHashRouter());
3970 BEAST_EXPECT(trustedKeys->quorum() == kQuorumDisabled);
3971 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3974 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3975 for (
auto const& val : valKeys)
3977 if (val.masterPublic != self.masterPublic)
3979 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3980 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3981 removed.insert(
calcNodeID(val.masterPublic));
3984 BEAST_EXPECT(changes.added.empty());
3985 BEAST_EXPECT(changes.removed == removed);