19 #include <ripple/beast/clock/manual_clock.h>
20 #include <ripple/beast/unit_test.h>
21 #include <ripple/consensus/Consensus.h>
22 #include <ripple/consensus/ConsensusProposal.h>
24 #include <test/unit_test/SuiteJournal.h>
42 using namespace std::chrono_literals;
50 true, 10, 10, 10, -10s, 10s, 1s, delay, 1s, p,
journal_));
52 true, 10, 10, 10, 100h, 10s, 1s, delay, 1s, p,
journal_));
54 true, 10, 10, 10, 10s, 100h, 1s, delay, 1s, p,
journal_));
58 true, 10, 3, 5, 10s, 10s, 10s, delay, 10s, p,
journal_));
62 false, 10, 0, 0, 1s, 1s, 1s, delay, 10s, p,
journal_));
64 false, 10, 0, 0, 1s, 10s, 1s, delay, 10s, p,
journal_));
68 true, 10, 0, 0, 10s, 10s, 1s, delay, 10s, p,
journal_));
72 true, 10, 0, 0, 10s, 10s, 3s, delay, 10s, p,
journal_));
75 true, 10, 0, 0, 10s, 10s, 10s, delay, 10s, p,
journal_));
81 using namespace std::chrono_literals;
122 using namespace std::chrono_literals;
126 PeerGroup peers = s.createGroup(1);
127 Peer* peer = peers[0];
128 peer->targetLedgers = 1;
135 auto const& lcl = peer->lastClosedLedger;
136 BEAST_EXPECT(peer->prevLedgerID() == lcl.
id());
137 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
138 BEAST_EXPECT(lcl.txs().size() == 1);
139 BEAST_EXPECT(lcl.txs().find(Tx{1}) != lcl.txs().end());
140 BEAST_EXPECT(peer->prevProposers == 0);
151 PeerGroup peers = sim.createGroup(5);
154 peers.trustAndConnect(
155 peers, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
158 for (
Peer* p : peers)
164 if (BEAST_EXPECT(sim.synchronized()))
166 for (
Peer const* peer : peers)
168 auto const& lcl = peer->lastClosedLedger;
169 BEAST_EXPECT(lcl.id() == peer->prevLedgerID());
170 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
172 BEAST_EXPECT(peer->prevProposers == peers.size() - 1);
175 BEAST_EXPECT(lcl.txs().find(Tx{i}) != lcl.txs().end());
194 PeerGroup slow = sim.createGroup(1);
195 PeerGroup fast = sim.createGroup(4);
196 PeerGroup network = fast + slow;
199 network.trust(network);
203 fast, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
206 network, round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
209 for (
Peer* peer : network)
216 if (BEAST_EXPECT(sim.synchronized()))
218 for (
Peer* peer : network)
220 auto const& lcl = peer->lastClosedLedger;
221 BEAST_EXPECT(lcl.id() == peer->prevLedgerID());
222 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
224 BEAST_EXPECT(peer->prevProposers == network.size() - 1);
226 peer->prevRoundTime == network[0]->prevRoundTime);
228 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
230 BEAST_EXPECT(lcl.txs().find(Tx{i}) != lcl.txs().end());
234 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
245 for (
auto isParticipant : {
true,
false})
250 PeerGroup slow = sim.createGroup(2);
251 PeerGroup fast = sim.createGroup(4);
252 PeerGroup network = fast + slow;
255 network.trust(network);
259 fast, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
263 round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
265 for (
Peer* peer : slow)
266 peer->runAsValidator = isParticipant;
270 for (
Peer* peer : network)
275 if (BEAST_EXPECT(sim.synchronized()))
280 for (
Peer* peer : network)
283 auto const& lcl = peer->lastClosedLedger;
284 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
285 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
286 BEAST_EXPECT(lcl.txs().find(Tx{1}) == lcl.txs().end());
290 lcl.txs().find(Tx{i}) != lcl.txs().end());
294 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
296 peer->openTxs.find(Tx{1}) != peer->openTxs.end());
299 Peer const* slowPeer = slow[0];
302 slowPeer->prevProposers == network.size() - 1);
304 BEAST_EXPECT(slowPeer->prevProposers == fast.size());
306 for (
Peer* peer : fast)
327 peer->prevProposers == network.size() - 1);
329 peer->prevRoundTime > slowPeer->prevRoundTime);
334 peer->prevProposers == fast.size() - 1);
337 peer->prevRoundTime == slowPeer->prevRoundTime);
379 PeerGroup groupA = sim.createGroup(2);
380 PeerGroup groupB = sim.createGroup(2);
381 PeerGroup groupC = sim.createGroup(2);
382 PeerGroup network = groupA + groupB + groupC;
384 network.trust(network);
386 network, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
390 Peer* firstPeer = *groupA.begin();
391 while (firstPeer->lastClosedLedger.closeTimeResolution() >=
392 parms.proposeFRESHNESS)
396 for (
Peer* peer : groupA)
397 peer->clockSkew = parms.proposeFRESHNESS / 2;
398 for (
Peer* peer : groupB)
399 peer->clockSkew = parms.proposeFRESHNESS;
404 if (BEAST_EXPECT(sim.synchronized()))
406 for (
Peer* peer : network)
407 BEAST_EXPECT(!peer->lastClosedLedger.closeAgree());
423 for (
auto validationDelay : {0ms, parms.ledgerMIN_CLOSE})
448 PeerGroup minority = sim.createGroup(2);
449 PeerGroup majorityA = sim.createGroup(3);
450 PeerGroup majorityB = sim.createGroup(5);
452 PeerGroup majority = majorityA + majorityB;
453 PeerGroup network = minority + majority;
456 round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
457 minority.trustAndConnect(minority + majorityA, delay);
458 majority.trustAndConnect(majority, delay);
460 CollectByNode<JumpCollector> jumps;
461 sim.collectors.add(jumps);
463 BEAST_EXPECT(sim.trustGraph.canFork(parms.minCONSENSUS_PCT / 100.));
470 for (
Peer* peer : network)
471 peer->delays.recvValidation = validationDelay;
472 for (
Peer* peer : (minority + majorityA))
473 peer->openTxs.insert(Tx{0});
474 for (
Peer* peer : majorityB)
475 peer->openTxs.insert(Tx{1});
501 if (BEAST_EXPECT(sim.branches() == 1))
503 for (
Peer const* peer : majority)
506 BEAST_EXPECT(jumps[peer->id].closeJumps.empty());
507 BEAST_EXPECT(jumps[peer->id].fullyValidatedJumps.empty());
509 for (
Peer const* peer : minority)
511 auto& peerJumps = jumps[peer->id];
514 if (BEAST_EXPECT(peerJumps.closeJumps.size() == 1))
516 JumpCollector::Jump
const& jump =
517 peerJumps.closeJumps.front();
519 BEAST_EXPECT(jump.from.seq() <= jump.to.seq());
520 BEAST_EXPECT(!jump.to.isAncestor(jump.from));
526 peerJumps.fullyValidatedJumps.size() == 1))
528 JumpCollector::Jump
const& jump =
529 peerJumps.fullyValidatedJumps.front();
531 BEAST_EXPECT(jump.from.seq() < jump.to.seq());
532 BEAST_EXPECT(jump.to.isAncestor(jump.from));
551 PeerGroup loner = sim.createGroup(1);
552 PeerGroup friends = sim.createGroup(3);
553 loner.trust(loner + friends);
555 PeerGroup others = sim.createGroup(6);
556 PeerGroup clique = friends + others;
557 clique.trust(clique);
559 PeerGroup network = loner + clique;
561 network, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
565 for (
Peer* peer : (loner + friends))
566 peer->openTxs.insert(Tx(0));
567 for (
Peer* peer : others)
568 peer->openTxs.insert(Tx(1));
571 for (
Peer* peer : network)
572 peer->delays.recvValidation = parms.ledgerGRANULARITY;
578 for (
Peer* p : network)
579 BEAST_EXPECT(p->prevLedgerID() == network[0]->prevLedgerID());
599 PeerGroup slow = sim.createGroup(2);
600 PeerGroup fast = sim.createGroup(4);
601 PeerGroup network = fast + slow;
603 for (
Peer* peer : network)
604 peer->consensusParms = parms;
607 network.trust(network);
635 network[0]->lastClosedLedger.closeTimeResolution();
647 if (BEAST_EXPECT(sim.synchronized()))
651 for (
Peer* peer : network)
653 BEAST_EXPECT(peer->lastClosedLedger.closeTime() > peer->now());
654 BEAST_EXPECT(peer->lastClosedLedger.closeAgree());
659 for (
Peer* peer : network)
683 BEAST_EXPECT(sim.synchronized());
694 for (
std::uint32_t overlap = 0; overlap <= numPeers; ++overlap)
702 PeerGroup aOnly = sim.createGroup(numA);
703 PeerGroup bOnly = sim.createGroup(numB);
704 PeerGroup commonOnly = sim.createGroup(overlap);
706 PeerGroup a = aOnly + commonOnly;
707 PeerGroup b = bOnly + commonOnly;
709 PeerGroup network = a + b;
712 round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
713 a.trustAndConnect(a, delay);
714 b.trustAndConnect(b, delay);
718 for (
Peer* peer : network)
721 peer->openTxs.insert(Tx{
static_cast<std::uint32_t>(peer->id)});
722 for (
Peer* to : sim.trustGraph.trustedPeers(peer))
723 peer->openTxs.insert(
731 if (overlap > 0.4 * numPeers)
732 BEAST_EXPECT(sim.synchronized());
737 BEAST_EXPECT(sim.branches() <= 3);
753 PeerGroup validators = sim.createGroup(5);
754 PeerGroup center = sim.createGroup(1);
755 validators.trust(validators);
756 center.trust(validators);
758 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
759 validators.connect(center, delay);
761 center[0]->runAsValidator =
false;
767 for (
Peer* p : validators)
773 BEAST_EXPECT(sim.synchronized());
784 bool reconnected =
false;
791 : network(net), groupCfast(c), groupCsplit(split), delay(d)
808 if (who == groupCfast[0]->
id &&
824 network.
connect(groupCsplit, delay);
869 PeerGroup groupABD = sim.createGroup(2);
871 PeerGroup groupCfast = sim.createGroup(1);
873 PeerGroup groupCsplit = sim.createGroup(7);
875 PeerGroup groupNotFastC = groupABD + groupCsplit;
876 PeerGroup network = groupABD + groupCsplit + groupCfast;
878 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
879 SimDuration fDelay = round<milliseconds>(0.1 * parms.ledgerGRANULARITY);
881 network.trust(network);
884 network.connect(groupCfast, fDelay);
886 groupNotFastC.connect(groupNotFastC, delay);
888 Disruptor dc(network, groupCfast, groupCsplit, delay);
889 sim.collectors.add(dc);
893 BEAST_EXPECT(sim.synchronized());
897 for (
Peer* peer : groupABD)
899 peer->txInjections.emplace(peer->lastClosedLedger.seq(), Tx{42});
907 BEAST_EXPECT(!sim.synchronized());
908 BEAST_EXPECT(sim.branches() == 1);
911 for (
Peer* p : network)
916 BEAST_EXPECT(!sim.synchronized());
917 BEAST_EXPECT(sim.branches() == 1);
922 if (BEAST_EXPECT(sim.branches() == 1))
924 BEAST_EXPECT(sim.synchronized());
928 BEAST_EXPECT(sim.branches(groupNotFastC) == 1);
929 BEAST_EXPECT(sim.synchronized(groupNotFastC) == 1);
989 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
991 PeerGroup behind = sim.createGroup(3);
992 PeerGroup ahead = sim.createGroup(2);
993 PeerGroup network = ahead + behind;
996 for (
Peer* p : network)
997 trustedKeys.
insert(p->key);
998 for (
Peer* p : network)
999 p->trustedKeys = trustedKeys;
1001 network.trustAndConnect(network, delay);
1008 for (
Peer* p : behind)
1009 p->delays.ledgerAccept = 20s;
1014 sim.collectors.add(undoDelay);
1018 for (
Peer* p : network)
1023 sim.collectors.add(sc);
1031 auto peerSelector = makeSelector(
1036 auto txSubmitter = makeSubmitter(
1037 ConstantDistribution{
rate.inv()},
1038 sim.scheduler.now(),
1039 sim.scheduler.now() + simDuration,
1045 sim.run(simDuration);
1048 BEAST_EXPECT(sim.synchronized());