225 auto& app = env.
app();
230 auto const localSigningPublicOuter = localSigningKeys.first;
231 auto const localSigningSecret = localSigningKeys.second;
233 auto const localMasterPublic =
239 localSigningPublicOuter,
243 auto format = [](
PublicKey const& publicKey,
244 char const* comment =
nullptr) {
256 while (configList.
size() != 8)
261 {format(configList[0]),
262 format(configList[1],
" Comment"),
263 format(configList[2],
" Multi Word Comment"),
264 format(configList[3],
" Leading Whitespace"),
265 format(configList[4],
" Trailing Whitespace "),
266 format(configList[5],
" Leading & Trailing Whitespace "),
269 " Leading, Trailing & Internal Whitespace "),
270 format(configList[7],
" ")});
278 app.config().legacy(
"database_path"),
283 trustedKeys->load({}, emptyCfgKeys, emptyCfgPublishers));
286 BEAST_EXPECT(trustedKeys->load(
287 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
288 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
291 BEAST_EXPECT(trustedKeys->load(
292 localSigningPublicOuter, emptyCfgKeys, emptyCfgPublishers));
294 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
295 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
304 app.config().legacy(
"database_path"),
307 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, emptyCfgPublishers));
309 for (
auto const& n : configList)
310 BEAST_EXPECT(trustedKeys->listed(n));
317 {format(masterNode1), format(masterNode2,
" Comment")});
319 trustedKeys->load({}, cfgMasterKeys, emptyCfgPublishers));
320 BEAST_EXPECT(trustedKeys->listed(masterNode1));
321 BEAST_EXPECT(trustedKeys->listed(masterNode2));
325 !trustedKeys->load({}, {
"NotAPublicKey"}, emptyCfgPublishers));
326 BEAST_EXPECT(!trustedKeys->load(
327 {}, {format(randomNode(),
"!")}, emptyCfgPublishers));
331 BEAST_EXPECT(!trustedKeys->load(
333 {format(randomNode(),
"!"), format(goodKey)},
334 emptyCfgPublishers));
335 BEAST_EXPECT(!trustedKeys->listed(goodKey));
344 app.config().legacy(
"database_path"),
347 auto const localSigningPublic =
350 BEAST_EXPECT(trustedKeys->load(
351 *localSigningPublic, cfgKeys, emptyCfgPublishers));
353 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
354 BEAST_EXPECT(trustedKeys->listed(*localSigningPublic));
355 for (
auto const& n : configList)
356 BEAST_EXPECT(trustedKeys->listed(n));
365 app.config().legacy(
"database_path"),
369 BEAST_EXPECT(trustedKeys->load(
370 localSigningPublic, cfgKeys, emptyCfgPublishers));
372 BEAST_EXPECT(trustedKeys->localPublicKey() == localSigningPublic);
373 BEAST_EXPECT(trustedKeys->listed(localSigningPublic));
374 for (
auto const& n : configList)
375 BEAST_EXPECT(trustedKeys->listed(n));
384 app.config().legacy(
"database_path"),
389 BEAST_EXPECT(trustedKeys->load(
390 localSigningPublicOuter, cfgKeys, emptyCfgPublishers));
392 BEAST_EXPECT(trustedKeys->localPublicKey() == localMasterPublic);
393 BEAST_EXPECT(trustedKeys->listed(localSigningPublicOuter));
394 BEAST_EXPECT(trustedKeys->listed(localMasterPublic));
395 for (
auto const& n : configList)
396 BEAST_EXPECT(trustedKeys->listed(n));
404 app.config().legacy(
"database_path"),
409 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
415 badPublishers.
clear();
416 for (
auto const& key : keys)
419 BEAST_EXPECT(!trustedKeys->load({}, emptyCfgKeys, badPublishers));
420 for (
auto const& key : keys)
421 BEAST_EXPECT(!trustedKeys->trustedPublisher(key));
425 for (
auto const& key : keys)
428 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
429 for (
auto const& key : keys)
430 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
432 trustedKeys->getListThreshold() == keys.size() / 2 + 1);
440 app.config().legacy(
"database_path"),
449 for (
auto const& key : keys)
453 BEAST_EXPECT(trustedKeys->load(
455 for (
auto const& key : keys)
456 BEAST_EXPECT(trustedKeys->trustedPublisher(key));
457 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
468 app.config().legacy(
"database_path"),
472 auto const pubRevokedPublic =
480 pubRevokedSigning.first,
481 pubRevokedSigning.second,
490 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
492 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
493 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey1));
494 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey2));
496 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
507 app.config().legacy(
"database_path"),
511 auto const pubRevokedPublic =
519 pubRevokedSigning.first,
520 pubRevokedSigning.second,
528 BEAST_EXPECT(trustedKeys->load(
531 BEAST_EXPECT(!trustedKeys->trustedPublisher(pubRevokedPublic));
532 BEAST_EXPECT(trustedKeys->trustedPublisher(legitKey));
534 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
542 using namespace std::chrono_literals;
546 auto checkAvailable =
548 auto const& trustedKeys,
549 auto const& hexPublic,
554 auto const available = trustedKeys->getAvailable(hexPublic);
560 BEAST_EXPECT(a[jss::public_key] == hexPublic);
561 BEAST_EXPECT(a[jss::manifest] ==
manifest);
564 BEAST_EXPECT(a[jss::version] == version);
567 BEAST_EXPECT(expected.size() == 1);
568 BEAST_EXPECT(a[jss::blob] == expected[0].first);
569 BEAST_EXPECT(a[jss::signature] == expected[0].second);
570 BEAST_EXPECT(!a.isMember(jss::blobs_v2));
572 else if (BEAST_EXPECT(a.isMember(jss::blobs_v2)))
574 BEAST_EXPECT(!a.isMember(jss::blob));
575 BEAST_EXPECT(!a.isMember(jss::signature));
576 auto const& blobs_v2 = a[jss::blobs_v2];
578 blobs_v2.isArray() &&
579 blobs_v2.size() == expected.size());
581 for (
unsigned int i = 0; i < expected.size(); ++i)
584 blobs_v2[i][jss::blob] == expected[i].first);
586 blobs_v2[i][jss::signature] ==
595 auto& app = env.
app();
600 app.config().legacy(
"database_path"),
605 for (
auto const& val : list)
607 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
608 BEAST_EXPECT(trustedKeys->listed(val.signingPublic));
612 auto expectUntrusted =
614 for (
auto const& val : list)
616 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
617 BEAST_EXPECT(!trustedKeys->listed(val.signingPublic));
622 auto const publisherPublic =
624 auto const hexPublic =
625 strHex(publisherPublic.begin(), publisherPublic.end());
630 pubSigningKeys1.first,
631 pubSigningKeys1.second,
637 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys1));
640 auto constexpr listSize = 20;
641 auto constexpr numLists = 9;
644 for (
auto i = 1; i <= numLists; ++i)
646 auto& list = lists[i];
647 list.reserve(listSize);
648 while (list.size() < listSize)
656 auto const version = 1;
657 auto const sequence1 = 1;
662 auto const expiredSig =
signList(expiredblob, pubSigningKeys1);
665 auto const sequence2 = 2;
668 auto const sig2 =
signList(blob2, pubSigningKeys1);
671 trustedKeys->applyLists(
674 {{expiredblob, expiredSig, {}}, {blob2, sig2, {}}},
680 expectTrusted(lists.at(2));
683 trustedKeys, hexPublic, manifest1, version, {{blob2, sig2}});
686 auto const version2 = 2;
687 auto const sequence7 = 7;
688 auto const effective7 = validUntil - 60s;
689 auto const expiration7 = effective7 + 3600s;
690 auto const blob7 = makeList(
693 expiration7.time_since_epoch().count(),
694 effective7.time_since_epoch().count());
695 auto const sig7 = signList(blob7, pubSigningKeys1);
697 auto const sequence8 = 8;
698 auto const effective8 = expiration7 - 60s;
699 auto const expiration8 = effective8 + 3600s;
700 auto const blob8 = makeList(
703 expiration8.time_since_epoch().count(),
704 effective8.time_since_epoch().count());
705 auto const sig8 = signList(blob8, pubSigningKeys1);
708 trustedKeys->applyLists(
711 {{blob7, sig7, {}}, {blob8, sig8, {}}},
714 ListDisposition::pending,
715 ListDisposition::pending);
717 expectUntrusted(lists.at(7));
718 expectUntrusted(lists.at(8));
721 auto const sequence6 = 6;
722 auto const effective6 = effective7 - 60s;
723 auto const expiration6 = effective6 + 3600s;
724 auto const blob6 = makeList(
727 expiration6.time_since_epoch().count(),
728 effective6.time_since_epoch().count());
729 auto const sig6 = signList(blob6, pubSigningKeys1);
732 auto const sequence6a = 5;
733 auto const effective6a = effective6 + 60s;
734 auto const expiration6a = effective6a + 3600s;
735 auto const blob6a = makeList(
738 expiration6a.time_since_epoch().count(),
739 effective6a.time_since_epoch().count());
740 auto const sig6a = signList(blob6a, pubSigningKeys1);
743 trustedKeys->applyLists(
746 {{blob6a, sig6a, {}}, {blob6, sig6, {}}},
749 ListDisposition::pending,
750 ListDisposition::pending);
752 expectUntrusted(lists.at(6));
753 expectTrusted(lists.at(2));
758 trustedKeys->applyLists(
761 {{blob7, sig7, {}}, {blob6, sig6, {}}},
764 ListDisposition::known_sequence,
765 ListDisposition::known_sequence);
767 expectUntrusted(lists.at(6));
768 expectUntrusted(lists.at(7));
769 expectTrusted(lists.at(2));
772 auto const untrustedManifest =
base64_encode(makeManifestString(
775 pubSigningKeys1.first,
776 pubSigningKeys1.second,
780 trustedKeys->applyLists(
781 untrustedManifest, version, {{blob2, sig2, {}}}, siteUri),
783 ListDisposition::untrusted,
784 ListDisposition::untrusted);
787 auto const badVersion = 666;
789 trustedKeys->applyLists(
790 manifest1, badVersion, {{blob2, sig2, {}}}, siteUri),
792 ListDisposition::unsupported_version,
793 ListDisposition::unsupported_version);
796 auto const sequence3 = 3;
797 auto const blob3 = makeList(
798 lists.at(3), sequence3, validUntil.time_since_epoch().count());
799 auto const sig3 = signList(blob3, pubSigningKeys1);
802 trustedKeys->applyLists(
803 manifest1, version, {{blob3, sig3, {}}}, siteUri),
805 ListDisposition::accepted,
806 ListDisposition::accepted);
808 expectUntrusted(lists.at(1));
809 expectUntrusted(lists.at(2));
810 expectTrusted(lists.at(3));
819 {{blob3, sig3}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
823 trustedKeys->applyLists(
826 {{blob2, sig2, {}}, {blob3, sig3, {}}},
829 ListDisposition::stale,
830 ListDisposition::same_sequence);
834 auto const pubSigningKeys2 =
randomKeyPair(KeyType::secp256k1);
838 pubSigningKeys2.first,
839 pubSigningKeys2.second,
842 auto const sequence4 = 4;
843 auto const blob4 = makeList(
844 lists.at(4), sequence4, validUntil.time_since_epoch().count());
845 auto const sig4 = signList(blob4, pubSigningKeys2);
848 trustedKeys->applyLists(
851 {{blob2, sig2, manifest1},
852 {blob3, sig3, manifest1},
856 ListDisposition::stale,
857 ListDisposition::accepted);
859 expectUntrusted(lists.at(2));
860 expectUntrusted(lists.at(3));
861 expectTrusted(lists.at(4));
868 {{blob4, sig4}, {blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
870 auto const sequence5 = 5;
871 auto const blob5 = makeList(
872 lists.at(5), sequence5, validUntil.time_since_epoch().count());
873 auto const badSig = signList(blob5, pubSigningKeys1);
875 trustedKeys->applyLists(
876 manifest1, version, {{blob5, badSig, {}}}, siteUri),
878 ListDisposition::invalid,
879 ListDisposition::invalid);
881 expectUntrusted(lists.at(2));
882 expectUntrusted(lists.at(3));
883 expectTrusted(lists.at(4));
884 expectUntrusted(lists.at(5));
888 trustedKeys->applyLists(
891 {{blob7, sig7, {}}, {blob8, sig8, {}}},
894 ListDisposition::invalid,
895 ListDisposition::invalid);
897 expectTrusted(lists.at(4));
898 expectUntrusted(lists.at(7));
899 expectUntrusted(lists.at(8));
904 trustedKeys->updateTrusted(
909 env.app().getHashRouter());
911 expectUntrusted(lists.at(3));
912 expectTrusted(lists.at(6));
919 {{blob6, sig6}, {blob7, sig7}, {blob8, sig8}});
925 env.timeKeeper().set(effective8);
926 trustedKeys->updateTrusted(
931 env.app().getHashRouter());
933 expectUntrusted(lists.at(6));
934 expectUntrusted(lists.at(7));
935 expectTrusted(lists.at(8));
937 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
943 auto const sig8_2 = signList(blob8, pubSigningKeys2);
946 trustedKeys->applyLists(
949 {{blob8, sig8, manifest1}, {blob8, sig8_2, {}}},
952 ListDisposition::invalid,
953 ListDisposition::same_sequence);
955 expectTrusted(lists.at(8));
957 checkAvailable(trustedKeys, hexPublic, manifest2, 2, {{blob8, sig8}});
961 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
963 makeRevocationString(publisherPublic, publisherSecret));
965 auto const sequence9 = 9;
966 auto const blob9 = makeList(
967 lists.at(9), sequence9, validUntil.time_since_epoch().count());
968 auto const sig9 = signList(blob9, signingKeysMax);
971 trustedKeys->applyLists(
972 maxManifest, version, {{blob9, sig9, {}}}, siteUri),
974 ListDisposition::untrusted,
975 ListDisposition::untrusted);
977 BEAST_EXPECT(!trustedKeys->trustedPublisher(publisherPublic));
978 for (
auto const& [num, list] : lists)
981 expectUntrusted(list);
984 checkAvailable(trustedKeys, hexPublic, manifest2, 0, {});
1126 testcase(
"Update trusted");
1128 std::string const siteUri =
"testUpdateTrusted.test";
1132 auto& app = env.
app();
1137 app.config().legacy(
"database_path"),
1149 while (cfgKeys.
size() != maxKeys)
1151 auto const valKey = randomNode();
1153 if (cfgKeys.
size() <= maxKeys - 5)
1160 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1164 TrustChanges changes = trustedKeysOuter->updateTrusted(
1165 activeValidatorsOuter,
1171 for (
auto const& val : unseenValidators)
1172 activeValidatorsOuter.
emplace(val);
1174 BEAST_EXPECT(changes.
added == activeValidatorsOuter);
1175 BEAST_EXPECT(changes.
removed.empty());
1177 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1178 for (
auto const& val : cfgKeys)
1180 if (
auto const valKey =
1181 parseBase58<PublicKey>(TokenType::NodePublic, val))
1183 BEAST_EXPECT(trustedKeysOuter->listed(*valKey));
1184 BEAST_EXPECT(trustedKeysOuter->trusted(*valKey));
1190 changes = trustedKeysOuter->updateTrusted(
1191 activeValidatorsOuter,
1196 BEAST_EXPECT(changes.
added.empty());
1197 BEAST_EXPECT(changes.
removed.empty());
1199 trustedKeysOuter->quorum() ==
std::ceil(cfgKeys.
size() * 0.8f));
1204 auto const masterPublic =
1208 {
toBase58(TokenType::NodePublic, masterPublic)});
1211 trustedKeysOuter->load({}, cfgKeys, cfgPublishersOuter));
1213 auto const signingKeys1 =
randomKeyPair(KeyType::secp256k1);
1214 auto const signingPublic1 = signingKeys1.first;
1218 TrustChanges changes = trustedKeysOuter->updateTrusted(
1219 activeValidatorsOuter,
1224 BEAST_EXPECT(changes.
added == asNodeIDs({masterPublic}));
1225 BEAST_EXPECT(changes.
removed.empty());
1227 trustedKeysOuter->quorum() ==
std::ceil((maxKeys + 1) * 0.8f));
1228 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1229 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1230 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1231 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1238 signingKeys1.second,
1243 ManifestDisposition::accepted);
1244 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1245 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1246 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic1));
1247 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic1));
1251 auto const signingKeys2 =
randomKeyPair(KeyType::secp256k1);
1252 auto const signingPublic2 = signingKeys2.first;
1257 signingKeys2.second,
1261 ManifestDisposition::accepted);
1262 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1263 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1264 BEAST_EXPECT(trustedKeysOuter->listed(signingPublic2));
1265 BEAST_EXPECT(trustedKeysOuter->trusted(signingPublic2));
1266 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1267 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1270 auto const signingKeysMax =
randomKeyPair(KeyType::secp256k1);
1271 auto const signingPublicMax = signingKeysMax.first;
1274 makeRevocationString(masterPublic, masterPrivate));
1276 BEAST_EXPECT(mMax->revoked());
1279 ManifestDisposition::accepted);
1281 manifestsOuter.
getSigningKey(masterPublic) == masterPublic);
1282 BEAST_EXPECT(manifestsOuter.
revoked(masterPublic));
1285 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1286 BEAST_EXPECT(trustedKeysOuter->trusted(masterPublic));
1288 changes = trustedKeysOuter->updateTrusted(
1289 activeValidatorsOuter,
1294 BEAST_EXPECT(changes.
removed == asNodeIDs({masterPublic}));
1295 BEAST_EXPECT(changes.
added.empty());
1297 trustedKeysOuter->quorum() ==
std::ceil(maxKeys * 0.8f));
1298 BEAST_EXPECT(trustedKeysOuter->listed(masterPublic));
1299 BEAST_EXPECT(!trustedKeysOuter->trusted(masterPublic));
1300 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublicMax));
1301 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublicMax));
1302 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic2));
1303 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic2));
1304 BEAST_EXPECT(!trustedKeysOuter->listed(signingPublic1));
1305 BEAST_EXPECT(!trustedKeysOuter->trusted(signingPublic1));
1314 app.config().legacy(
"database_path"),
1317 auto const publisherPublic =
1323 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1326 activeValidatorsOuter,
1331 BEAST_EXPECT(changes.
removed.empty());
1332 BEAST_EXPECT(changes.
added.empty());
1334 trustedKeys->quorum() ==
1344 app.config().legacy(
"database_path"),
1347 auto const masterPublic =
1350 {
toBase58(TokenType::NodePublic, masterPublic)});
1353 auto const publisher1Public =
1356 auto const publisher2Public =
1362 trustedKeys->load({}, cfgKeys, cfgPublishers,
std::size_t(2)));
1365 activeValidatorsOuter,
1370 BEAST_EXPECT(changes.
removed.empty());
1371 BEAST_EXPECT(changes.
added.size() == 1);
1372 BEAST_EXPECT(trustedKeys->listed(masterPublic));
1373 BEAST_EXPECT(trustedKeys->trusted(masterPublic));
1383 app.config().legacy(
"database_path"),
1394 while (cfgKeys.
size() < n)
1396 auto const valKey = randomNode();
1405 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishersOuter));
1413 BEAST_EXPECT(changes.
removed.empty());
1414 BEAST_EXPECT(changes.
added == expectedTrusted);
1415 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1418 activeValidators.
emplace(toBeSeen);
1419 changes = trustedKeys->updateTrusted(
1425 BEAST_EXPECT(changes.
removed.empty());
1426 BEAST_EXPECT(changes.
added.empty());
1427 BEAST_EXPECT(trustedKeys->quorum() == minQuorum);
1435 app.config().legacy(
"database_path"),
1439 auto const publisherKeys =
randomKeyPair(KeyType::secp256k1);
1440 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1442 publisherKeys.first,
1443 publisherKeys.second,
1444 pubSigningKeys.first,
1445 pubSigningKeys.second,
1450 BEAST_EXPECT(trustedKeys->load({}, emptyCfgKeys, cfgKeys));
1454 asNodeIDs({list[0].masterPublic, list[1].masterPublic}));
1457 auto const version = 1;
1458 auto const sequence = 1;
1459 using namespace std::chrono_literals;
1464 auto const sig = signList(blob, pubSigningKeys);
1467 ListDisposition::accepted ==
1469 ->applyLists(
manifest, version, {{blob,
sig, {}}}, siteUri)
1470 .bestDisposition());
1478 BEAST_EXPECT(changes.
removed.empty());
1479 BEAST_EXPECT(changes.
added == activeValidators);
1482 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1483 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1485 BEAST_EXPECT(trustedKeys->quorum() == 2);
1488 changes = trustedKeys->updateTrusted(
1494 BEAST_EXPECT(changes.
removed == activeValidators);
1495 BEAST_EXPECT(changes.
added.empty());
1496 BEAST_EXPECT(!trustedKeys->trusted(list[0].masterPublic));
1497 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1499 trustedKeys->quorum() ==
1505 auto const sequence2 = 2;
1508 auto const blob2 = makeList(
1510 auto const sig2 = signList(blob2, pubSigningKeys);
1513 ListDisposition::accepted ==
1516 manifest, version, {{blob2, sig2, {}}}, siteUri)
1517 .bestDisposition());
1519 changes = trustedKeys->updateTrusted(
1525 BEAST_EXPECT(changes.
removed.empty());
1528 asNodeIDs({list2[0].masterPublic, list2[1].masterPublic}));
1531 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1532 BEAST_EXPECT(trustedKeys->trusted(val.signingPublic));
1534 BEAST_EXPECT(!trustedKeys->trusted(list[1].masterPublic));
1535 BEAST_EXPECT(!trustedKeys->trusted(list[1].signingPublic));
1536 BEAST_EXPECT(trustedKeys->quorum() == 2);
1544 app.config().legacy(
"database_path"),
1556 auto const valKey = randomNode();
1560 BEAST_EXPECT(trustedKeys->load({}, cfgKeys, cfgPublishers));
1567 BEAST_EXPECT(changes.
removed.empty());
1568 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1571 for (
auto const& key : activeKeys)
1572 BEAST_EXPECT(trustedKeys->trusted(key));
1581 app.config().legacy(
"database_path"),
1584 auto const localKey = randomNode();
1589 toBase58(TokenType::NodePublic, localKey)};
1592 while (cfgKeys.size() < cfgKeys.capacity())
1594 auto const valKey = randomNode();
1595 cfgKeys.push_back(
toBase58(TokenType::NodePublic, valKey));
1600 trustedKeys->load(localKey, cfgKeys, cfgPublishers));
1607 BEAST_EXPECT(changes.
removed.empty());
1608 if (cfgKeys.size() > 2)
1609 BEAST_EXPECT(changes.
added == asNodeIDs({valKey}));
1612 changes.
added == asNodeIDs({localKey, valKey}));
1615 trustedKeys->quorum() ==
std::ceil(cfgKeys.size() * 0.8f));
1617 for (
auto const& key : activeKeys)
1618 BEAST_EXPECT(trustedKeys->trusted(key));
1628 app.config().legacy(
"database_path"),
1635 while (valKeys.
size() != maxKeys)
1645 constexpr static int publishers = 3;
1648 decltype(valKeys)::const_iterator,
1657 auto addPublishedList = [&,
this](
int i) {
1659 auto const publisherPublic =
1661 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1665 pubSigningKeys.first,
1666 pubSigningKeys.second,
1670 {
strHex(publisherPublic)});
1674 BEAST_EXPECT(trustedKeys->load(
1675 {}, emptyCfgKeys, cfgPublishers,
std::size_t(1)));
1677 auto const version = 1;
1678 auto const sequence = 1;
1679 using namespace std::chrono_literals;
1683 locals[i].first, locals[i].second};
1684 auto const blob = makeList(
1686 auto const sig = signList(blob, pubSigningKeys);
1689 ListDisposition::accepted ==
1693 .bestDisposition());
1697 for (
auto i = 0; i < publishers; ++i)
1698 addPublishedList(i);
1699 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
1712 for (
auto const& val : valKeys)
1714 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1717 BEAST_EXPECT(changes.
added == added);
1718 BEAST_EXPECT(changes.
removed.empty());
1727 app.config().legacy(
"database_path"),
1734 while (valKeys.
size() != maxKeys)
1746 constexpr static int publishers = 3;
1749 decltype(valKeys)::const_iterator,
1758 auto addPublishedList = [&,
this](
1763 auto const publisherPublic =
1765 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
1769 pubSigningKeys.first,
1770 pubSigningKeys.second,
1774 {
strHex(publisherPublic)});
1778 trustedKeys->load({}, emptyCfgKeys, cfgPublishers));
1780 auto const version = 1;
1781 auto const sequence = 1;
1782 using namespace std::chrono_literals;
1789 validUntil1 = validUntil;
1791 validUntil2 = validUntil;
1793 locals[i].first, locals[i].second};
1794 auto const blob = makeList(
1796 auto const sig = signList(blob, pubSigningKeys);
1799 ListDisposition::accepted ==
1803 .bestDisposition());
1809 for (
auto i = 0; i < publishers; ++i)
1810 addPublishedList(i, validUntil1, validUntil2);
1811 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
1821 trustedKeys->quorum() ==
1824 for (
auto const& val : valKeys)
1825 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1830 auto const& val = valKeys[i];
1831 if (i >= 1 && i < maxKeys - 2)
1833 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1837 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1839 BEAST_EXPECT(changes.
added == added);
1840 BEAST_EXPECT(changes.
removed.empty());
1844 changes = trustedKeys->updateTrusted(
1852 trustedKeys->quorum() ==
1855 for (
auto const& val : valKeys)
1856 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1861 auto const& val = valKeys[i];
1862 if (i >= 2 && i < maxKeys - 4)
1863 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
1866 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1867 if (i >= 1 && i < maxKeys - 2)
1872 BEAST_EXPECT(changes.
added.empty());
1873 BEAST_EXPECT(changes.
removed == removed);
1877 changes = trustedKeys->updateTrusted(
1885 trustedKeys->quorum() ==
1891 auto const& val = valKeys[i];
1892 if (i < maxKeys - 4)
1893 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
1895 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
1897 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
1898 if (i >= 2 && i < maxKeys - 4)
1902 BEAST_EXPECT(changes.
added.empty());
1903 BEAST_EXPECT(changes.
removed == removed);
2348 testcase(
"Build and split messages");
2351 auto extractHeader = [
this](
Message& message) {
2352 auto const& buffer =
2353 message.getBuffer(compression::Compressed::Off);
2355 boost::beast::multi_buffer buffers;
2358 auto start = buffer.begin();
2359 auto end = buffer.end();
2361 buffers.commit(boost::asio::buffer_copy(
2362 buffers.prepare(slice.
size()), boost::asio::buffer(slice)));
2364 boost::system::error_code ec;
2366 detail::parseMessageHeader(ec, buffers.data(), buffers.size());
2370 auto extractProtocolMessage1 = [
this,
2371 &extractHeader](
Message& message) {
2372 auto [header, buffers] = extractHeader(message);
2373 if (BEAST_EXPECT(header) &&
2374 BEAST_EXPECT(header->message_type == protocol::mtVALIDATORLIST))
2377 detail::parseMessageContent<protocol::TMValidatorList>(
2378 *header, buffers.data());
2384 auto extractProtocolMessage2 = [
this,
2385 &extractHeader](
Message& message) {
2386 auto [header, buffers] = extractHeader(message);
2387 if (BEAST_EXPECT(header) &&
2389 header->message_type ==
2390 protocol::mtVALIDATORLISTCOLLECTION))
2392 auto const msg = detail::parseMessageContent<
2393 protocol::TMValidatorListCollection>(
2394 *header, buffers.data());
2400 auto verifyMessage =
2403 &extractProtocolMessage1,
2404 &extractProtocolMessage2](
2407 auto const& blobInfos,
2408 auto const& messages,
2411 BEAST_EXPECT(messages.size() == expectedInfo.size());
2412 auto msgIter = expectedInfo.begin();
2413 for (
auto const& messageWithHash : messages)
2415 if (!BEAST_EXPECT(msgIter != expectedInfo.end()))
2417 if (!BEAST_EXPECT(messageWithHash.message))
2419 auto const& expectedSeqs = msgIter->second;
2420 auto seqIter = expectedSeqs.begin();
2422 messageWithHash.message
2423 ->getBuffer(compression::Compressed::Off)
2426 BEAST_EXPECT(size == msgIter->first);
2427 if (expectedSeqs.size() == 1)
2430 extractProtocolMessage1(*messageWithHash.message);
2431 auto const expectedVersion = 1;
2432 if (BEAST_EXPECT(msg))
2434 BEAST_EXPECT(msg->version() == expectedVersion);
2435 if (!BEAST_EXPECT(seqIter != expectedSeqs.end()))
2437 auto const& expectedBlob = blobInfos.at(*seqIter);
2439 (*seqIter < manifestCutoff) ==
2440 !!expectedBlob.manifest);
2441 auto const expectedManifest =
2442 *seqIter < manifestCutoff &&
2443 expectedBlob.manifest
2444 ? *expectedBlob.manifest
2446 BEAST_EXPECT(msg->manifest() == expectedManifest);
2447 BEAST_EXPECT(msg->blob() == expectedBlob.blob);
2449 msg->signature() == expectedBlob.signature);
2451 BEAST_EXPECT(seqIter == expectedSeqs.end());
2454 messageWithHash.hash ==
2458 expectedBlob.signature,
2465 hashingBlobs.
reserve(msgIter->second.size());
2468 extractProtocolMessage2(*messageWithHash.message);
2469 if (BEAST_EXPECT(msg))
2471 BEAST_EXPECT(msg->version() == version);
2472 BEAST_EXPECT(msg->manifest() ==
manifest);
2473 for (
auto const& blobInfo : msg->blobs())
2476 seqIter != expectedSeqs.end()))
2478 auto const& expectedBlob =
2479 blobInfos.at(*seqIter);
2482 blobInfo.has_manifest() ==
2483 !!expectedBlob.manifest);
2485 blobInfo.has_manifest() ==
2486 (*seqIter < manifestCutoff));
2488 if (*seqIter < manifestCutoff)
2490 blobInfo.manifest() ==
2491 *expectedBlob.manifest);
2493 blobInfo.blob() == expectedBlob.blob);
2495 blobInfo.signature() ==
2496 expectedBlob.signature);
2499 BEAST_EXPECT(seqIter == expectedSeqs.end());
2502 messageWithHash.hash ==
2507 BEAST_EXPECT(msgIter == expectedInfo.end());
2509 auto verifyBuildMessages =
2514 BEAST_EXPECT(result.
first == expectedSequence);
2515 BEAST_EXPECT(result.
second == expectedSize);
2521 auto const blobInfos = [manifestCutoff = manifestCutoff]() {
2524 for (
auto seq : {5, 6, 7, 10, 12})
2528 s <<
"This is not a blob with sequence " <<
seq;
2531 s <<
"This is not a signature for sequence " <<
seq;
2532 b.signature = s.
str();
2533 if (
seq < manifestCutoff)
2537 s <<
"This is not manifest " <<
seq;
2538 b.manifest = s.
str();
2543 auto const maxSequence = blobInfos.
rbegin()->first;
2544 BEAST_EXPECT(maxSequence == 12);
2551 verifyBuildMessages(
2552 ValidatorList::buildValidatorListMessages(
2553 1, 8, maxSequence, version,
manifest, blobInfos, messages),
2556 BEAST_EXPECT(messages.size() == 0);
2562 messages.emplace_back();
2563 verifyBuildMessages(
2564 ValidatorList::buildValidatorListMessages(
2565 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2568 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2572 verifyBuildMessages(
2573 ValidatorList::buildValidatorListMessages(
2574 1, 3, maxSequence, version,
manifest, blobInfos, messages),
2577 if (BEAST_EXPECT(messages.size() == 1) &&
2578 BEAST_EXPECT(messages.front().message))
2580 auto const& messageWithHash = messages.front();
2581 auto const msg = extractProtocolMessage1(*messageWithHash.message);
2583 messageWithHash.message->getBuffer(compression::Compressed::Off)
2586 BEAST_EXPECT(size == 108);
2587 auto const& expected = blobInfos.at(5);
2588 if (BEAST_EXPECT(msg))
2590 BEAST_EXPECT(msg->version() == 1);
2591 BEAST_EXPECT(msg->manifest() == *expected.manifest);
2592 BEAST_EXPECT(msg->blob() == expected.blob);
2593 BEAST_EXPECT(msg->signature() == expected.signature);
2596 messageWithHash.hash ==
2598 *expected.manifest, expected.blob, expected.signature, 1));
2606 verifyBuildMessages(
2607 ValidatorList::buildValidatorListMessages(
2617 BEAST_EXPECT(messages.size() == 0);
2623 messages.emplace_back();
2624 verifyBuildMessages(
2625 ValidatorList::buildValidatorListMessages(
2626 2, 3, maxSequence, version,
manifest, blobInfos, messages),
2629 BEAST_EXPECT(messages.size() == 1 && !messages.front().message);
2633 verifyBuildMessages(
2634 ValidatorList::buildValidatorListMessages(
2635 2, 5, maxSequence, version,
manifest, blobInfos, messages),
2639 version,
manifest, blobInfos, messages, {{372, {6, 7, 10, 12}}});
2645 verifyBuildMessages(
2646 ValidatorList::buildValidatorListMessages(
2647 2, 5, maxSequence, version,
manifest, blobInfos, messages, 300),
2655 {{212, {6, 7}}, {192, {10, 12}}});
2660 verifyBuildMessages(
2661 ValidatorList::buildValidatorListMessages(
2662 2, 5, maxSequence, version,
manifest, blobInfos, messages, 200),
2670 {{108, {6}}, {108, {7}}, {192, {10, 12}}});
2674 verifyBuildMessages(
2675 ValidatorList::buildValidatorListMessages(
2676 2, 5, maxSequence, version,
manifest, blobInfos, messages, 150),
2684 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2689 verifyBuildMessages(
2690 ValidatorList::buildValidatorListMessages(
2691 2, 5, maxSequence, version,
manifest, blobInfos, messages, 108),
2699 {{108, {6}}, {108, {7}}, {110, {10}}, {110, {12}}});
2705 testcase(
"Test quorum disabled");
2707 std::string const siteUri =
"testQuorumDisabled.test";
2709 auto& app = env.
app();
2714 while (valKeys.
size() != maxKeys)
2731 auto makeValidatorList = [&,
this](
2744 app.config().legacy(
"database_path"),
2751 auto const publisherPublic =
2753 auto const pubSigningKeys =
randomKeyPair(KeyType::secp256k1);
2761 pubSigningKeys.first,
2762 pubSigningKeys.second,
2763 i < countRevoked ?
revoked : 1));
2764 publishers.push_back(Publisher{
2776 valManifests.applyManifest(
2778 BEAST_EXPECT(result->load(
2779 self->signingPublic,
2787 result->load({}, emptyCfgKeys, cfgPublishers, threshold));
2792 using namespace std::chrono_literals;
2794 (i == countTotal - 1 ? 60s : 3600s);
2795 auto const blob = makeList(
2798 publishers[i].expiry.time_since_epoch().count());
2799 auto const sig = signList(blob, publishers[i].signingKeys);
2808 .bestDisposition() ==
2809 (publishers[i].
revoked ? ListDisposition::untrusted
2810 : ListDisposition::accepted));
2824 auto const self = randomValidator();
2825 auto const keysTotal = valKeys.
size() + 1;
2826 auto trustedKeys = makeValidatorList(
2834 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2835 for (
auto const& p : publishers)
2836 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2844 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2846 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2850 for (
auto const& val : valKeys)
2852 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2855 BEAST_EXPECT(changes.
added == added);
2856 BEAST_EXPECT(changes.
removed.empty());
2860 changes = trustedKeys->updateTrusted(
2866 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2867 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2870 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2871 for (
auto const& val : valKeys)
2873 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2874 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2877 BEAST_EXPECT(changes.
added.empty());
2878 BEAST_EXPECT(changes.
removed == removed);
2885 auto const keysTotal = valKeys.
size();
2886 auto trustedKeys = makeValidatorList(
2894 BEAST_EXPECT(trustedKeys->getListThreshold() == 5);
2895 for (
auto const& p : publishers)
2896 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
2904 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2906 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2909 for (
auto const& val : valKeys)
2911 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2914 BEAST_EXPECT(changes.
added == added);
2915 BEAST_EXPECT(changes.
removed.empty());
2919 changes = trustedKeys->updateTrusted(
2925 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2926 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
2929 for (
auto const& val : valKeys)
2931 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2932 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
2935 BEAST_EXPECT(changes.
added.empty());
2936 BEAST_EXPECT(changes.
removed == removed);
2944 auto const self = valKeys[1];
2945 auto const keysTotal = valKeys.
size();
2946 auto trustedKeys = makeValidatorList(
2954 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
2955 int untrustedCount = 0;
2956 for (
auto const& p : publishers)
2958 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
2959 BEAST_EXPECT(p.revoked ^ trusted);
2960 untrustedCount += trusted ? 0 : 1;
2962 BEAST_EXPECT(untrustedCount == 1);
2970 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
2972 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
2975 for (
auto const& val : valKeys)
2977 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
2980 BEAST_EXPECT(changes.
added == added);
2981 BEAST_EXPECT(changes.
removed.empty());
2985 changes = trustedKeys->updateTrusted(
2991 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
2992 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
2995 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
2996 for (
auto const& val : valKeys)
2998 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
2999 if (val.masterPublic != self.masterPublic)
3001 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3005 BEAST_EXPECT(changes.
added.empty());
3006 BEAST_EXPECT(changes.
removed == removed);
3014 auto const self = randomValidator();
3015 auto const keysTotal = valKeys.
size() + 1;
3016 auto trustedKeys = makeValidatorList(
3024 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3025 int untrustedCount = 0;
3026 for (
auto const& p : publishers)
3028 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3029 BEAST_EXPECT(p.revoked ^ trusted);
3030 untrustedCount += trusted ? 0 : 1;
3032 BEAST_EXPECT(untrustedCount == 2);
3040 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3042 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3046 for (
auto const& val : valKeys)
3048 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3051 BEAST_EXPECT(changes.
added == added);
3052 BEAST_EXPECT(changes.
removed.empty());
3056 changes = trustedKeys->updateTrusted(
3062 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3063 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3066 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3067 for (
auto const& val : valKeys)
3069 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3070 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3073 BEAST_EXPECT(changes.
added.empty());
3074 BEAST_EXPECT(changes.
removed == removed);
3082 auto const self = valKeys[5];
3083 auto const keysTotal = valKeys.
size();
3084 auto trustedKeys = makeValidatorList(
3092 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3093 int untrustedCount = 0;
3094 for (
auto const& p : publishers)
3096 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3097 BEAST_EXPECT(p.revoked ^ trusted);
3098 untrustedCount += trusted ? 0 : 1;
3100 BEAST_EXPECT(untrustedCount == 2);
3108 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3110 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3113 for (
auto const& val : valKeys)
3115 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3118 BEAST_EXPECT(changes.
added == added);
3119 BEAST_EXPECT(changes.
removed.empty());
3123 changes = trustedKeys->updateTrusted(
3129 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3130 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3133 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3134 for (
auto const& val : valKeys)
3136 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3137 if (val.masterPublic != self.masterPublic)
3139 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3143 BEAST_EXPECT(changes.
added.empty());
3144 BEAST_EXPECT(changes.
removed == removed);
3151 auto const keysTotal = valKeys.
size();
3152 auto trustedKeys = makeValidatorList(
3160 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3161 int untrustedCount = 0;
3162 for (
auto const& p : publishers)
3164 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3165 BEAST_EXPECT(p.revoked ^ trusted);
3166 untrustedCount += trusted ? 0 : 1;
3168 BEAST_EXPECT(untrustedCount == 2);
3176 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3178 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3181 for (
auto const& val : valKeys)
3183 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3186 BEAST_EXPECT(changes.
added == added);
3187 BEAST_EXPECT(changes.
removed.empty());
3191 changes = trustedKeys->updateTrusted(
3197 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3198 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3201 for (
auto const& val : valKeys)
3203 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3204 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3207 BEAST_EXPECT(changes.
added.empty());
3208 BEAST_EXPECT(changes.
removed == removed);
3216 auto const self = randomValidator();
3217 auto const keysTotal = valKeys.
size() + 1;
3218 auto trustedKeys = makeValidatorList(
3226 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3227 int untrustedCount = 0;
3228 for (
auto const& p : publishers)
3230 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3231 BEAST_EXPECT(p.revoked ^ trusted);
3232 untrustedCount += trusted ? 0 : 1;
3234 BEAST_EXPECT(untrustedCount == 1);
3242 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3244 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3248 for (
auto const& val : valKeys)
3250 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3253 BEAST_EXPECT(changes.
added == added);
3254 BEAST_EXPECT(changes.
removed.empty());
3258 changes = trustedKeys->updateTrusted(
3264 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3266 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3268 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3269 for (
auto const& val : valKeys)
3271 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3272 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3274 BEAST_EXPECT(changes.
added.empty());
3275 BEAST_EXPECT(changes.
removed.empty());
3283 auto const self = randomValidator();
3284 auto const keysTotal = valKeys.
size() + 1;
3285 auto trustedKeys = makeValidatorList(
3293 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3294 for (
auto const& p : publishers)
3295 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3303 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3305 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3309 for (
auto const& val : valKeys)
3311 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3314 BEAST_EXPECT(changes.
added == added);
3315 BEAST_EXPECT(changes.
removed.empty());
3319 changes = trustedKeys->updateTrusted(
3325 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3327 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3329 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3330 for (
auto const& val : valKeys)
3332 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3333 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3335 BEAST_EXPECT(changes.
added.empty());
3336 BEAST_EXPECT(changes.
removed.empty());
3344 auto const self = valKeys[7];
3345 auto const keysTotal = valKeys.
size();
3346 auto trustedKeys = makeValidatorList(
3354 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3355 for (
auto const& p : publishers)
3356 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3364 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3366 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3369 for (
auto const& val : valKeys)
3371 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3374 BEAST_EXPECT(changes.
added == added);
3375 BEAST_EXPECT(changes.
removed.empty());
3379 changes = trustedKeys->updateTrusted(
3385 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3387 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3389 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3390 for (
auto const& val : valKeys)
3392 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3393 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3395 BEAST_EXPECT(changes.
added.empty());
3396 BEAST_EXPECT(changes.
removed.empty());
3403 auto const keysTotal = valKeys.
size();
3404 auto trustedKeys = makeValidatorList(
3412 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3413 for (
auto const& p : publishers)
3414 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3422 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3424 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3427 for (
auto const& val : valKeys)
3429 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3432 BEAST_EXPECT(changes.
added == added);
3433 BEAST_EXPECT(changes.
removed.empty());
3437 changes = trustedKeys->updateTrusted(
3443 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3445 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3447 for (
auto const& val : valKeys)
3449 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3450 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3452 BEAST_EXPECT(changes.
added.empty());
3453 BEAST_EXPECT(changes.
removed.empty());
3463 auto const self = randomValidator();
3464 auto const keysTotal = valKeys.
size() + 1;
3465 auto trustedKeys = makeValidatorList(
3473 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3474 int untrustedCount = 0;
3475 for (
auto const& p : publishers)
3477 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3478 BEAST_EXPECT(p.revoked ^ trusted);
3479 untrustedCount += trusted ? 0 : 1;
3481 BEAST_EXPECT(untrustedCount == 1);
3489 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3491 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());
3505 changes = trustedKeys->updateTrusted(
3511 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3512 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3515 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3516 for (
auto const& val : valKeys)
3518 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3519 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3522 BEAST_EXPECT(changes.
added.empty());
3523 BEAST_EXPECT(changes.
removed == removed);
3531 auto const self = valKeys[5];
3532 auto const keysTotal = valKeys.
size();
3533 auto trustedKeys = makeValidatorList(
3541 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3542 int untrustedCount = 0;
3543 for (
auto const& p : publishers)
3545 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3546 BEAST_EXPECT(p.revoked ^ trusted);
3547 untrustedCount += trusted ? 0 : 1;
3549 BEAST_EXPECT(untrustedCount == 1);
3557 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3559 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3562 for (
auto const& val : valKeys)
3564 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3567 BEAST_EXPECT(changes.
added == added);
3568 BEAST_EXPECT(changes.
removed.empty());
3572 changes = trustedKeys->updateTrusted(
3578 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3579 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3582 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3583 for (
auto const& val : valKeys)
3585 if (val.masterPublic != self.masterPublic)
3587 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3588 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3592 BEAST_EXPECT(changes.
added.empty());
3593 BEAST_EXPECT(changes.
removed == removed);
3600 auto const keysTotal = valKeys.
size();
3601 auto trustedKeys = makeValidatorList(
3609 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3610 int untrustedCount = 0;
3611 for (
auto const& p : publishers)
3613 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
3614 BEAST_EXPECT(p.revoked ^ trusted);
3615 untrustedCount += trusted ? 0 : 1;
3617 BEAST_EXPECT(untrustedCount == 1);
3625 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3627 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3630 for (
auto const& val : valKeys)
3632 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3635 BEAST_EXPECT(changes.
added == added);
3636 BEAST_EXPECT(changes.
removed.empty());
3640 changes = trustedKeys->updateTrusted(
3646 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3647 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3650 for (
auto const& val : valKeys)
3652 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3653 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3656 BEAST_EXPECT(changes.
added.empty());
3657 BEAST_EXPECT(changes.
removed == removed);
3665 auto const self = randomValidator();
3666 auto const keysTotal = valKeys.
size() + 1;
3667 auto trustedKeys = makeValidatorList(
3675 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3676 for (
auto const& p : publishers)
3677 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3685 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3687 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3691 for (
auto const& val : valKeys)
3693 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3696 BEAST_EXPECT(changes.
added == added);
3697 BEAST_EXPECT(changes.
removed.empty());
3701 changes = trustedKeys->updateTrusted(
3707 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3708 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3711 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3712 for (
auto const& val : valKeys)
3714 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3715 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3718 BEAST_EXPECT(changes.
added.empty());
3719 BEAST_EXPECT(changes.
removed == removed);
3727 auto const self = valKeys[5];
3728 auto const keysTotal = valKeys.
size();
3729 auto trustedKeys = makeValidatorList(
3737 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3738 for (
auto const& p : publishers)
3739 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3747 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3749 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3753 for (
auto const& val : valKeys)
3755 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3758 BEAST_EXPECT(changes.
added == added);
3759 BEAST_EXPECT(changes.
removed.empty());
3763 changes = trustedKeys->updateTrusted(
3769 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3770 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3773 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3774 for (
auto const& val : valKeys)
3776 if (val.masterPublic != self.masterPublic)
3778 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3779 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3783 BEAST_EXPECT(changes.
added.empty());
3784 BEAST_EXPECT(changes.
removed == removed);
3791 auto const keysTotal = valKeys.
size();
3792 auto trustedKeys = makeValidatorList(
3800 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3801 for (
auto const& p : publishers)
3802 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3810 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3812 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3815 for (
auto const& val : valKeys)
3817 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3820 BEAST_EXPECT(changes.
added == added);
3821 BEAST_EXPECT(changes.
removed.empty());
3825 changes = trustedKeys->updateTrusted(
3831 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3832 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 0);
3835 for (
auto const& val : valKeys)
3837 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
3838 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3841 BEAST_EXPECT(changes.
added.empty());
3842 BEAST_EXPECT(changes.
removed == removed);
3852 auto const self = randomValidator();
3853 auto const keysTotal = valKeys.
size() + 1;
3854 auto trustedKeys = makeValidatorList(
3862 BEAST_EXPECT(trustedKeys->getListThreshold() == 1);
3863 for (
auto const& p : publishers)
3864 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3872 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3874 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3878 for (
auto const& val : valKeys)
3880 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3883 BEAST_EXPECT(changes.
added == added);
3884 BEAST_EXPECT(changes.
removed.empty());
3888 changes = trustedKeys->updateTrusted(
3894 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
3895 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
3898 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
3899 for (
auto const& val : valKeys)
3901 BEAST_EXPECT(!trustedKeys->listed(val.masterPublic));
3902 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
3905 BEAST_EXPECT(changes.
added.empty());
3906 BEAST_EXPECT(changes.
removed == removed);
3916 auto const self = valKeys[2];
3917 auto const keysTotal = valKeys.
size();
3918 auto trustedKeys = makeValidatorList(
3926 BEAST_EXPECT(trustedKeys->getListThreshold() == 2);
3927 for (
auto const& p : publishers)
3928 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3936 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3938 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3941 for (
auto const& val : valKeys)
3943 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3946 BEAST_EXPECT(changes.
added == added);
3947 BEAST_EXPECT(changes.
removed.empty());
3956 auto const keysTotal = valKeys.
size();
3957 auto trustedKeys = makeValidatorList(
3965 BEAST_EXPECT(trustedKeys->getListThreshold() == 3);
3966 for (
auto const& p : publishers)
3967 BEAST_EXPECT(trustedKeys->trustedPublisher(p.pubKey));
3975 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
3977 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
3980 for (
auto const& val : valKeys)
3982 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
3985 BEAST_EXPECT(changes.
added == added);
3986 BEAST_EXPECT(changes.
removed.empty());
3996 auto const self = randomValidator();
3997 auto const keysTotal = valKeys.
size() + 1;
3998 auto trustedKeys = makeValidatorList(
4006 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4007 int untrustedCount = 0;
4008 for (
auto const& p : publishers)
4010 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4011 BEAST_EXPECT(p.revoked ^ trusted);
4012 untrustedCount += trusted ? 0 : 1;
4014 BEAST_EXPECT(untrustedCount == 2);
4022 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4024 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4028 for (
auto const& val : valKeys)
4030 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4033 BEAST_EXPECT(changes.
added == added);
4034 BEAST_EXPECT(changes.
removed.empty());
4038 changes = trustedKeys->updateTrusted(
4044 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4045 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4048 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4049 for (
auto const& val : valKeys)
4051 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4052 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4055 BEAST_EXPECT(changes.
added.empty());
4056 BEAST_EXPECT(changes.
removed == removed);
4066 auto const self = valKeys[2];
4067 auto const keysTotal = valKeys.
size();
4068 auto trustedKeys = makeValidatorList(
4076 BEAST_EXPECT(trustedKeys->getListThreshold() == 4);
4077 int untrustedCount = 0;
4078 for (
auto const& p : publishers)
4080 bool const trusted = trustedKeys->trustedPublisher(p.pubKey);
4081 BEAST_EXPECT(p.revoked ^ trusted);
4082 untrustedCount += trusted ? 0 : 1;
4084 BEAST_EXPECT(untrustedCount == 3);
4092 BEAST_EXPECT(trustedKeys->quorum() ==
std::ceil(keysTotal * 0.8f));
4094 trustedKeys->getTrustedMasterKeys().size() == keysTotal);
4097 for (
auto const& val : valKeys)
4099 BEAST_EXPECT(trustedKeys->trusted(val.masterPublic));
4102 BEAST_EXPECT(changes.
added == added);
4103 BEAST_EXPECT(changes.
removed.empty());
4107 changes = trustedKeys->updateTrusted(
4113 BEAST_EXPECT(trustedKeys->quorum() == quorumDisabled);
4114 BEAST_EXPECT(trustedKeys->getTrustedMasterKeys().size() == 1);
4117 BEAST_EXPECT(trustedKeys->trusted(self.masterPublic));
4118 for (
auto const& val : valKeys)
4120 if (val.masterPublic != self.masterPublic)
4122 BEAST_EXPECT(trustedKeys->listed(val.masterPublic));
4123 BEAST_EXPECT(!trustedKeys->trusted(val.masterPublic));
4127 BEAST_EXPECT(changes.
added.empty());
4128 BEAST_EXPECT(changes.
removed == removed);