21#include <test/unit_test/SuiteJournal.h>
23#include <xrpld/consensus/Consensus.h>
25#include <xrpl/beast/unit_test.h>
26#include <xrpl/json/to_string.h>
43 using namespace std::chrono_literals;
51 true, 10, 10, 10, -10s, 10s, 1s, 1s, p,
journal_));
53 true, 10, 10, 10, 100h, 10s, 1s, 1s, p,
journal_));
55 true, 10, 10, 10, 10s, 100h, 1s, 1s, p,
journal_));
82 using namespace std::chrono_literals;
184 using namespace std::chrono_literals;
189 PeerGroup peers = s.createGroup(1);
190 Peer* peer = peers[0];
191 peer->targetLedgers = 1;
198 auto const& lcl = peer->lastClosedLedger;
199 BEAST_EXPECT(peer->prevLedgerID() == lcl.
id());
200 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
201 BEAST_EXPECT(lcl.txs().size() == 1);
202 BEAST_EXPECT(lcl.txs().find(Tx{1}) != lcl.txs().end());
203 BEAST_EXPECT(peer->prevProposers == 0);
215 PeerGroup peers = sim.createGroup(5);
218 peers.trustAndConnect(
219 peers, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
222 for (
Peer* p : peers)
228 if (BEAST_EXPECT(sim.synchronized()))
230 for (
Peer const* peer : peers)
232 auto const& lcl = peer->lastClosedLedger;
233 BEAST_EXPECT(lcl.id() == peer->prevLedgerID());
234 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
236 BEAST_EXPECT(peer->prevProposers == peers.size() - 1);
239 BEAST_EXPECT(lcl.txs().find(Tx{i}) != lcl.txs().end());
259 PeerGroup slow = sim.createGroup(1);
260 PeerGroup fast = sim.createGroup(4);
261 PeerGroup network = fast + slow;
264 network.trust(network);
268 fast, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
271 network, round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
274 for (
Peer* peer : network)
281 if (BEAST_EXPECT(sim.synchronized()))
283 for (
Peer* peer : network)
285 auto const& lcl = peer->lastClosedLedger;
286 BEAST_EXPECT(lcl.id() == peer->prevLedgerID());
287 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
289 BEAST_EXPECT(peer->prevProposers == network.size() - 1);
291 peer->prevRoundTime == network[0]->prevRoundTime);
293 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
295 BEAST_EXPECT(lcl.txs().find(Tx{i}) != lcl.txs().end());
299 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
310 for (
auto isParticipant : {
true,
false})
315 PeerGroup slow = sim.createGroup(2);
316 PeerGroup fast = sim.createGroup(4);
317 PeerGroup network = fast + slow;
320 network.trust(network);
324 fast, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
328 round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
330 for (
Peer* peer : slow)
331 peer->runAsValidator = isParticipant;
335 for (
Peer* peer : network)
340 if (BEAST_EXPECT(sim.synchronized()))
345 for (
Peer* peer : network)
348 auto const& lcl = peer->lastClosedLedger;
349 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
350 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
351 BEAST_EXPECT(lcl.txs().find(Tx{1}) == lcl.txs().end());
355 lcl.txs().find(Tx{i}) != lcl.txs().end());
359 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
361 peer->openTxs.find(Tx{1}) != peer->openTxs.end());
364 Peer const* slowPeer = slow[0];
367 slowPeer->prevProposers == network.size() - 1);
369 BEAST_EXPECT(slowPeer->prevProposers == fast.size());
371 for (
Peer* peer : fast)
392 peer->prevProposers == network.size() - 1);
394 peer->prevRoundTime > slowPeer->prevRoundTime);
399 peer->prevProposers == fast.size() - 1);
402 peer->prevRoundTime == slowPeer->prevRoundTime);
445 PeerGroup groupA = sim.createGroup(2);
446 PeerGroup groupB = sim.createGroup(2);
447 PeerGroup groupC = sim.createGroup(2);
448 PeerGroup network = groupA + groupB + groupC;
450 network.trust(network);
452 network, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
456 Peer* firstPeer = *groupA.begin();
457 while (firstPeer->lastClosedLedger.closeTimeResolution() >=
458 parms.proposeFRESHNESS)
462 for (
Peer* peer : groupA)
463 peer->clockSkew = parms.proposeFRESHNESS / 2;
464 for (
Peer* peer : groupB)
465 peer->clockSkew = parms.proposeFRESHNESS;
470 if (BEAST_EXPECT(sim.synchronized()))
472 for (
Peer* peer : network)
473 BEAST_EXPECT(!peer->lastClosedLedger.closeAgree());
491 for (
auto validationDelay : {0ms, parms.ledgerMIN_CLOSE})
516 PeerGroup minority = sim.createGroup(2);
517 PeerGroup majorityA = sim.createGroup(3);
518 PeerGroup majorityB = sim.createGroup(5);
520 PeerGroup majority = majorityA + majorityB;
521 PeerGroup network = minority + majority;
524 round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
525 minority.trustAndConnect(minority + majorityA, delay);
526 majority.trustAndConnect(majority, delay);
528 CollectByNode<JumpCollector> jumps;
529 sim.collectors.add(jumps);
531 BEAST_EXPECT(sim.trustGraph.canFork(parms.minCONSENSUS_PCT / 100.));
538 for (
Peer* peer : network)
539 peer->delays.recvValidation = validationDelay;
540 for (
Peer* peer : (minority + majorityA))
541 peer->openTxs.insert(Tx{0});
542 for (
Peer* peer : majorityB)
543 peer->openTxs.insert(Tx{1});
569 if (BEAST_EXPECT(sim.branches() == 1))
571 for (
Peer const* peer : majority)
574 BEAST_EXPECT(jumps[peer->id].closeJumps.empty());
575 BEAST_EXPECT(jumps[peer->id].fullyValidatedJumps.empty());
577 for (
Peer const* peer : minority)
579 auto& peerJumps = jumps[peer->id];
582 if (BEAST_EXPECT(peerJumps.closeJumps.size() == 1))
584 JumpCollector::Jump
const& jump =
585 peerJumps.closeJumps.front();
587 BEAST_EXPECT(jump.from.seq() <= jump.to.seq());
588 BEAST_EXPECT(!jump.to.isAncestor(jump.from));
594 peerJumps.fullyValidatedJumps.size() == 1))
596 JumpCollector::Jump
const& jump =
597 peerJumps.fullyValidatedJumps.front();
599 BEAST_EXPECT(jump.from.seq() < jump.to.seq());
600 BEAST_EXPECT(jump.to.isAncestor(jump.from));
619 PeerGroup loner = sim.createGroup(1);
620 PeerGroup friends = sim.createGroup(3);
621 loner.trust(loner + friends);
623 PeerGroup others = sim.createGroup(6);
624 PeerGroup clique = friends + others;
625 clique.trust(clique);
627 PeerGroup network = loner + clique;
629 network, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
633 for (
Peer* peer : (loner + friends))
634 peer->openTxs.insert(Tx(0));
635 for (
Peer* peer : others)
636 peer->openTxs.insert(Tx(1));
639 for (
Peer* peer : network)
640 peer->delays.recvValidation = parms.ledgerGRANULARITY;
646 for (
Peer* p : network)
647 BEAST_EXPECT(p->prevLedgerID() == network[0]->prevLedgerID());
656 testcase(
"consensus close time rounding");
668 PeerGroup slow = sim.createGroup(2);
669 PeerGroup fast = sim.createGroup(4);
670 PeerGroup network = fast + slow;
673 network.trust(network);
701 network[0]->lastClosedLedger.closeTimeResolution();
713 if (BEAST_EXPECT(sim.synchronized()))
717 for (
Peer* peer : network)
719 BEAST_EXPECT(peer->lastClosedLedger.closeTime() > peer->now());
720 BEAST_EXPECT(peer->lastClosedLedger.closeAgree());
725 for (
Peer* peer : network)
749 BEAST_EXPECT(sim.synchronized());
761 for (
std::uint32_t overlap = 0; overlap <= numPeers; ++overlap)
769 PeerGroup aOnly = sim.createGroup(numA);
770 PeerGroup bOnly = sim.createGroup(numB);
771 PeerGroup commonOnly = sim.createGroup(overlap);
773 PeerGroup a = aOnly + commonOnly;
774 PeerGroup b = bOnly + commonOnly;
776 PeerGroup network = a + b;
779 round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
780 a.trustAndConnect(a, delay);
781 b.trustAndConnect(b, delay);
785 for (
Peer* peer : network)
788 peer->openTxs.insert(Tx{
static_cast<std::uint32_t>(peer->id)});
789 for (
Peer* to : sim.trustGraph.trustedPeers(peer))
790 peer->openTxs.insert(
798 if (overlap > 0.4 * numPeers)
799 BEAST_EXPECT(sim.synchronized());
804 BEAST_EXPECT(sim.branches() <= 3);
814 testcase(
"hub network");
821 PeerGroup validators = sim.createGroup(5);
822 PeerGroup center = sim.createGroup(1);
823 validators.trust(validators);
824 center.trust(validators);
826 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
827 validators.connect(center, delay);
829 center[0]->runAsValidator =
false;
835 for (
Peer* p : validators)
841 BEAST_EXPECT(sim.synchronized());
852 bool reconnected =
false;
859 : network(net), groupCfast(c), groupCsplit(split), delay(d)
876 if (who == groupCfast[0]->
id &&
892 network.
connect(groupCsplit, delay);
902 testcase(
"preferred by branch");
938 PeerGroup groupABD = sim.createGroup(2);
940 PeerGroup groupCfast = sim.createGroup(1);
942 PeerGroup groupCsplit = sim.createGroup(7);
944 PeerGroup groupNotFastC = groupABD + groupCsplit;
945 PeerGroup network = groupABD + groupCsplit + groupCfast;
947 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
948 SimDuration fDelay = round<milliseconds>(0.1 * parms.ledgerGRANULARITY);
950 network.trust(network);
953 network.connect(groupCfast, fDelay);
955 groupNotFastC.connect(groupNotFastC, delay);
957 Disruptor dc(network, groupCfast, groupCsplit, delay);
958 sim.collectors.add(dc);
962 BEAST_EXPECT(sim.synchronized());
966 for (
Peer* peer : groupABD)
968 peer->txInjections.emplace(peer->lastClosedLedger.seq(), Tx{42});
976 BEAST_EXPECT(!sim.synchronized());
977 BEAST_EXPECT(sim.branches() == 1);
980 for (
Peer* p : network)
985 BEAST_EXPECT(!sim.synchronized());
986 BEAST_EXPECT(sim.branches() == 1);
991 if (BEAST_EXPECT(sim.branches() == 1))
993 BEAST_EXPECT(sim.synchronized());
997 BEAST_EXPECT(sim.branches(groupNotFastC) == 1);
998 BEAST_EXPECT(sim.synchronized(groupNotFastC) == 1);
1033 using namespace csf;
1035 testcase(
"pause for laggards");
1059 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
1061 PeerGroup behind = sim.createGroup(3);
1062 PeerGroup ahead = sim.createGroup(2);
1063 PeerGroup network = ahead + behind;
1066 for (
Peer* p : network)
1067 trustedKeys.
insert(p->key);
1068 for (
Peer* p : network)
1069 p->trustedKeys = trustedKeys;
1071 network.trustAndConnect(network, delay);
1078 for (
Peer* p : behind)
1079 p->delays.ledgerAccept = 20s;
1084 sim.collectors.add(undoDelay);
1088 for (
Peer* p : network)
1093 sim.collectors.add(sc);
1101 auto peerSelector = makeSelector(
1106 auto txSubmitter = makeSubmitter(
1107 ConstantDistribution{
rate.inv()},
1108 sim.scheduler.now(),
1109 sim.scheduler.now() + simDuration,
1115 sim.run(simDuration);
1118 BEAST_EXPECT(sim.synchronized());
1124 testcase(
"disputes");
1126 using namespace csf;
1131 Tx
const txTrue{99};
1132 Tx
const txFalse{98};
1133 Tx
const txFollowingTrue{97};
1134 Tx
const txFollowingFalse{96};
1135 int const numPeers = 100;
1145 Dispute proposingTrue{txTrue.id(),
true, numPeers, journal_};
1146 Dispute proposingFalse{txFalse.id(),
false, numPeers, journal_};
1147 Dispute followingTrue{
1148 txFollowingTrue.id(),
true, numPeers, journal_};
1149 Dispute followingFalse{
1150 txFollowingFalse.id(),
false, numPeers, journal_};
1151 BEAST_EXPECT(proposingTrue.ID() == 99);
1152 BEAST_EXPECT(proposingFalse.ID() == 98);
1153 BEAST_EXPECT(followingTrue.ID() == 97);
1154 BEAST_EXPECT(followingFalse.ID() == 96);
1157 for (
int i = 0; i < numPeers; ++i)
1159 BEAST_EXPECT(proposingTrue.setVote(PeerID(i), i < 50));
1160 BEAST_EXPECT(proposingFalse.setVote(PeerID(i), i < 50));
1161 BEAST_EXPECT(followingTrue.setVote(PeerID(i), i < 50));
1162 BEAST_EXPECT(followingFalse.setVote(PeerID(i), i < 50));
1165 BEAST_EXPECT(proposingTrue.setVote(PeerID(50),
true));
1166 BEAST_EXPECT(proposingFalse.setVote(PeerID(49),
false));
1167 BEAST_EXPECT(followingTrue.setVote(PeerID(50),
true));
1168 BEAST_EXPECT(followingFalse.setVote(PeerID(49),
false));
1171 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1172 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1173 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1174 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1175 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged));
1176 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged));
1177 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged));
1178 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged));
1181 BEAST_EXPECT(!proposingTrue.updateVote(5,
true, p));
1182 BEAST_EXPECT(!proposingFalse.updateVote(5,
true, p));
1183 BEAST_EXPECT(!followingTrue.updateVote(5,
false, p));
1184 BEAST_EXPECT(!followingFalse.updateVote(5,
false, p));
1186 BEAST_EXPECT(!proposingTrue.updateVote(10,
true, p));
1187 BEAST_EXPECT(!proposingFalse.updateVote(10,
true, p));
1188 BEAST_EXPECT(!followingTrue.updateVote(10,
false, p));
1189 BEAST_EXPECT(!followingFalse.updateVote(10,
false, p));
1192 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged));
1193 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged));
1194 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged));
1195 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged));
1199 BEAST_EXPECT(proposingTrue.updateVote(55,
true, p));
1200 BEAST_EXPECT(!proposingFalse.updateVote(55,
true, p));
1201 BEAST_EXPECT(!followingTrue.updateVote(55,
false, p));
1202 BEAST_EXPECT(!followingFalse.updateVote(55,
false, p));
1204 BEAST_EXPECT(proposingTrue.getOurVote() ==
false);
1205 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1206 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1207 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1209 for (
int i = 0; i < 16; ++i)
1211 auto pTrue = PeerID(numPeers - i - 1);
1212 auto pFalse = PeerID(i);
1213 BEAST_EXPECT(proposingTrue.setVote(pTrue,
true));
1214 BEAST_EXPECT(proposingFalse.setVote(pFalse,
false));
1215 BEAST_EXPECT(followingTrue.setVote(pTrue,
true));
1216 BEAST_EXPECT(followingFalse.setVote(pFalse,
false));
1219 BEAST_EXPECT(proposingTrue.updateVote(60,
true, p));
1220 BEAST_EXPECT(!proposingFalse.updateVote(60,
true, p));
1221 BEAST_EXPECT(!followingTrue.updateVote(60,
false, p));
1222 BEAST_EXPECT(!followingFalse.updateVote(60,
false, p));
1224 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1225 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1226 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1227 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1230 BEAST_EXPECT(proposingTrue.updateVote(86,
true, p));
1231 BEAST_EXPECT(!proposingFalse.updateVote(86,
true, p));
1232 BEAST_EXPECT(!followingTrue.updateVote(86,
false, p));
1233 BEAST_EXPECT(!followingFalse.updateVote(86,
false, p));
1235 BEAST_EXPECT(proposingTrue.getOurVote() ==
false);
1236 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1237 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1238 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1241 for (
int i = 16; i < 21; ++i)
1243 auto pTrue = PeerID(numPeers - i - 1);
1244 auto pFalse = PeerID(i);
1245 BEAST_EXPECT(proposingTrue.setVote(pTrue,
true));
1246 BEAST_EXPECT(proposingFalse.setVote(pFalse,
false));
1247 BEAST_EXPECT(followingTrue.setVote(pTrue,
true));
1248 BEAST_EXPECT(followingFalse.setVote(pFalse,
false));
1252 BEAST_EXPECT(proposingTrue.updateVote(90,
true, p));
1253 BEAST_EXPECT(!proposingFalse.updateVote(90,
true, p));
1254 BEAST_EXPECT(!followingTrue.updateVote(90,
false, p));
1255 BEAST_EXPECT(!followingFalse.updateVote(90,
false, p));
1257 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1258 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1259 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1260 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1263 BEAST_EXPECT(!proposingTrue.updateVote(150,
true, p));
1264 BEAST_EXPECT(!proposingFalse.updateVote(150,
true, p));
1265 BEAST_EXPECT(!followingTrue.updateVote(150,
false, p));
1266 BEAST_EXPECT(!followingFalse.updateVote(150,
false, p));
1268 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1269 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1270 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1271 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1274 BEAST_EXPECT(!proposingTrue.updateVote(190,
true, p));
1275 BEAST_EXPECT(!proposingFalse.updateVote(190,
true, p));
1276 BEAST_EXPECT(!followingTrue.updateVote(190,
false, p));
1277 BEAST_EXPECT(!followingFalse.updateVote(190,
false, p));
1279 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1280 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1281 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1282 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1285 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged));
1286 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged));
1287 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged));
1288 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged));
1291 BEAST_EXPECT(proposingTrue.updateVote(220,
true, p));
1292 BEAST_EXPECT(!proposingFalse.updateVote(220,
true, p));
1293 BEAST_EXPECT(!followingTrue.updateVote(220,
false, p));
1294 BEAST_EXPECT(!followingFalse.updateVote(220,
false, p));
1296 BEAST_EXPECT(proposingTrue.getOurVote() ==
false);
1297 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1298 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1299 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1302 for (
int i = 21; i < 46; ++i)
1304 auto pTrue = PeerID(numPeers - i - 1);
1305 auto pFalse = PeerID(i);
1306 BEAST_EXPECT(proposingTrue.setVote(pTrue,
true));
1307 BEAST_EXPECT(proposingFalse.setVote(pFalse,
false));
1308 BEAST_EXPECT(followingTrue.setVote(pTrue,
true));
1309 BEAST_EXPECT(followingFalse.setVote(pFalse,
false));
1313 BEAST_EXPECT(proposingTrue.updateVote(250,
true, p));
1314 BEAST_EXPECT(!proposingFalse.updateVote(250,
true, p));
1315 BEAST_EXPECT(!followingTrue.updateVote(250,
false, p));
1316 BEAST_EXPECT(!followingFalse.updateVote(250,
false, p));
1318 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1319 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1320 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1321 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1323 for (peersUnchanged = 0; peersUnchanged < 6; ++peersUnchanged)
1325 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged));
1326 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged));
1327 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged));
1328 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged));
1331 for (
int i = 0; i < 1; ++i)
1333 BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i,
true, p));
1334 BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i,
true, p));
1335 BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i,
false, p));
1337 !followingFalse.updateVote(250 + 10 * i,
false, p));
1339 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1340 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1341 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1342 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1345 BEAST_EXPECT(!proposingTrue.stalled(p,
true, 0));
1349 BEAST_EXPECT(proposingFalse.stalled(p,
true, 0));
1350 BEAST_EXPECT(followingTrue.stalled(p,
false, 0));
1351 BEAST_EXPECT(followingFalse.stalled(p,
false, 0));
1354 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged));
1358 BEAST_EXPECT(proposingFalse.stalled(p,
true, peersUnchanged));
1359 BEAST_EXPECT(followingTrue.stalled(p,
false, peersUnchanged));
1360 BEAST_EXPECT(followingFalse.stalled(p,
false, peersUnchanged));
1362 for (
int i = 1; i < 3; ++i)
1364 BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i,
true, p));
1365 BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i,
true, p));
1366 BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i,
false, p));
1368 !followingFalse.updateVote(250 + 10 * i,
false, p));
1370 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1371 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1372 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1373 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1377 BEAST_EXPECT(!proposingTrue.stalled(p,
true, 0));
1379 BEAST_EXPECT(proposingFalse.stalled(p,
true, 0));
1380 BEAST_EXPECT(followingTrue.stalled(p,
false, 0));
1381 BEAST_EXPECT(followingFalse.stalled(p,
false, 0));
1385 BEAST_EXPECT(proposingTrue.stalled(p,
true, peersUnchanged));
1387 BEAST_EXPECT(proposingFalse.stalled(p,
true, peersUnchanged));
1388 BEAST_EXPECT(followingTrue.stalled(p,
false, peersUnchanged));
1389 BEAST_EXPECT(followingFalse.stalled(p,
false, peersUnchanged));
1391 for (
int i = 3; i < 5; ++i)
1393 BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i,
true, p));
1394 BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i,
true, p));
1395 BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i,
false, p));
1397 !followingFalse.updateVote(250 + 10 * i,
false, p));
1399 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1400 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1401 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1402 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1404 BEAST_EXPECT(proposingTrue.stalled(p,
true, 0));
1405 BEAST_EXPECT(proposingFalse.stalled(p,
true, 0));
1406 BEAST_EXPECT(followingTrue.stalled(p,
false, 0));
1407 BEAST_EXPECT(followingFalse.stalled(p,
false, 0));
1409 BEAST_EXPECT(proposingTrue.stalled(p,
true, peersUnchanged));
1410 BEAST_EXPECT(proposingFalse.stalled(p,
true, peersUnchanged));
1411 BEAST_EXPECT(followingTrue.stalled(p,
false, peersUnchanged));
1412 BEAST_EXPECT(followingFalse.stalled(p,
false, peersUnchanged));
1420 testShouldCloseLedger();
1421 testCheckConsensus();
1426 testCloseTimeDisagree();
1428 testConsensusCloseTimeRounding();
1431 testPreferredByBranch();
1432 testPauseForLaggards();
testcase_t testcase
Memberspace for declaring test cases.
Generic implementation of consensus algorithm.
A transaction discovered to be in dispute during consensus.
Represents a peer connection in the overlay.
virtual id_t id() const =0
void testCloseTimeDisagree()
void testPauseForLaggards()
void run() override
Runs the suite.
void testConsensusCloseTimeRounding()
void testPreferredByBranch()
void testCheckConsensus()
void testShouldCloseLedger()
A group of simulation Peers.
void disconnect(PeerGroup const &o)
Destroy network connection.
void connect(PeerGroup const &o, SimDuration delay)
Establish network connection.
typename SimClock::duration SimDuration
typename SimClock::time_point SimTime
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
ConsensusState checkConsensus(std::size_t prevProposers, std::size_t currentProposers, std::size_t currentAgree, std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, bool stalled, ConsensusParms const &parms, bool proposing, beast::Journal j, std::unique_ptr< std::stringstream > const &clog)
Determine whether the network reached consensus and whether we joined.
@ Expired
Consensus time limit has hard-expired.
@ MovedOn
The network has consensus without us.
@ Yes
We have consensus along with the network.
@ No
We do not have consensus.
bool shouldCloseLedger(bool anyTransactions, std::size_t prevProposers, std::size_t proposersClosed, std::size_t proposersValidated, std::chrono::milliseconds prevRoundTime, std::chrono::milliseconds timeSincePrevClose, std::chrono::milliseconds openTime, std::chrono::milliseconds idleInterval, ConsensusParms const &parms, beast::Journal j, std::unique_ptr< std::stringstream > const &clog)
Determines whether the current ledger should close at this time.
auto constexpr increaseLedgerTimeResolutionEvery
How often we increase the close time resolution (in numbers of ledgers)
Consensus algorithm parameters.
std::chrono::milliseconds const ledgerGRANULARITY
How often we check state or change positions.
Represents a transfer rate.
csf::PeerGroup & groupCsplit
csf::PeerGroup & groupCfast
void on(csf::PeerID, csf::SimTime, E const &)
Disruptor(csf::PeerGroup &net, csf::PeerGroup &c, csf::PeerGroup &split, csf::SimDuration d)
void on(csf::PeerID who, csf::SimTime, csf::AcceptLedger const &e)
void on(csf::PeerID who, csf::SimTime, csf::FullyValidateLedger const &e)
void on(csf::PeerID, csf::SimTime, E const &)
void on(csf::PeerID who, csf::SimTime, csf::AcceptLedger const &e)
UndoDelay(csf::PeerGroup &a)
Peer accepted consensus results.
Peer fully validated a new ledger.
Ledger ledger
The new fully validated ledger.
A single peer in the simulation.