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;
49 true, 10, 10, 10, -10s, 10s, 1s, 1s, p,
journal_));
51 true, 10, 10, 10, 100h, 10s, 1s, 1s, p,
journal_));
53 true, 10, 10, 10, 10s, 100h, 1s, 1s, p,
journal_));
80 using namespace std::chrono_literals;
121 using namespace std::chrono_literals;
125 PeerGroup peers = s.createGroup(1);
126 Peer* peer = peers[0];
127 peer->targetLedgers = 1;
134 auto const& lcl = peer->lastClosedLedger;
135 BEAST_EXPECT(peer->prevLedgerID() == lcl.
id());
136 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
137 BEAST_EXPECT(lcl.txs().size() == 1);
138 BEAST_EXPECT(lcl.txs().find(Tx{1}) != lcl.txs().end());
139 BEAST_EXPECT(peer->prevProposers == 0);
150 PeerGroup peers = sim.createGroup(5);
153 peers.trustAndConnect(
154 peers, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
157 for (
Peer* p : peers)
163 if (BEAST_EXPECT(sim.synchronized()))
165 for (
Peer const* peer : peers)
167 auto const& lcl = peer->lastClosedLedger;
168 BEAST_EXPECT(lcl.id() == peer->prevLedgerID());
169 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
171 BEAST_EXPECT(peer->prevProposers == peers.size() - 1);
174 BEAST_EXPECT(lcl.txs().find(Tx{i}) != lcl.txs().end());
193 PeerGroup slow = sim.createGroup(1);
194 PeerGroup fast = sim.createGroup(4);
195 PeerGroup network = fast + slow;
198 network.trust(network);
202 fast, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
205 network, round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
208 for (
Peer* peer : network)
215 if (BEAST_EXPECT(sim.synchronized()))
217 for (
Peer* peer : network)
219 auto const& lcl = peer->lastClosedLedger;
220 BEAST_EXPECT(lcl.id() == peer->prevLedgerID());
221 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
223 BEAST_EXPECT(peer->prevProposers == network.size() - 1);
225 peer->prevRoundTime == network[0]->prevRoundTime);
227 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
229 BEAST_EXPECT(lcl.txs().find(Tx{i}) != lcl.txs().end());
233 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
244 for (
auto isParticipant : {
true,
false})
249 PeerGroup slow = sim.createGroup(2);
250 PeerGroup fast = sim.createGroup(4);
251 PeerGroup network = fast + slow;
254 network.trust(network);
258 fast, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
262 round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
264 for (
Peer* peer : slow)
265 peer->runAsValidator = isParticipant;
269 for (
Peer* peer : network)
274 if (BEAST_EXPECT(sim.synchronized()))
279 for (
Peer* peer : network)
282 auto const& lcl = peer->lastClosedLedger;
283 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
284 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
285 BEAST_EXPECT(lcl.txs().find(Tx{1}) == lcl.txs().end());
289 lcl.txs().find(Tx{i}) != lcl.txs().end());
293 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
295 peer->openTxs.find(Tx{1}) != peer->openTxs.end());
298 Peer const* slowPeer = slow[0];
301 slowPeer->prevProposers == network.size() - 1);
303 BEAST_EXPECT(slowPeer->prevProposers == fast.size());
305 for (
Peer* peer : fast)
326 peer->prevProposers == network.size() - 1);
328 peer->prevRoundTime > slowPeer->prevRoundTime);
333 peer->prevProposers == fast.size() - 1);
336 peer->prevRoundTime == slowPeer->prevRoundTime);
378 PeerGroup groupA = sim.createGroup(2);
379 PeerGroup groupB = sim.createGroup(2);
380 PeerGroup groupC = sim.createGroup(2);
381 PeerGroup network = groupA + groupB + groupC;
383 network.trust(network);
385 network, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
389 Peer* firstPeer = *groupA.begin();
390 while (firstPeer->lastClosedLedger.closeTimeResolution() >=
391 parms.proposeFRESHNESS)
395 for (
Peer* peer : groupA)
396 peer->clockSkew = parms.proposeFRESHNESS / 2;
397 for (
Peer* peer : groupB)
398 peer->clockSkew = parms.proposeFRESHNESS;
403 if (BEAST_EXPECT(sim.synchronized()))
405 for (
Peer* peer : network)
406 BEAST_EXPECT(!peer->lastClosedLedger.closeAgree());
422 for (
auto validationDelay : {0ms, parms.ledgerMIN_CLOSE})
447 PeerGroup minority = sim.createGroup(2);
448 PeerGroup majorityA = sim.createGroup(3);
449 PeerGroup majorityB = sim.createGroup(5);
451 PeerGroup majority = majorityA + majorityB;
452 PeerGroup network = minority + majority;
455 round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
456 minority.trustAndConnect(minority + majorityA, delay);
457 majority.trustAndConnect(majority, delay);
459 CollectByNode<JumpCollector> jumps;
460 sim.collectors.add(jumps);
462 BEAST_EXPECT(sim.trustGraph.canFork(parms.minCONSENSUS_PCT / 100.));
469 for (
Peer* peer : network)
470 peer->delays.recvValidation = validationDelay;
471 for (
Peer* peer : (minority + majorityA))
472 peer->openTxs.insert(Tx{0});
473 for (
Peer* peer : majorityB)
474 peer->openTxs.insert(Tx{1});
500 if (BEAST_EXPECT(sim.branches() == 1))
502 for (
Peer const* peer : majority)
505 BEAST_EXPECT(jumps[peer->id].closeJumps.empty());
506 BEAST_EXPECT(jumps[peer->id].fullyValidatedJumps.empty());
508 for (
Peer const* peer : minority)
510 auto& peerJumps = jumps[peer->id];
513 if (BEAST_EXPECT(peerJumps.closeJumps.size() == 1))
515 JumpCollector::Jump
const& jump =
516 peerJumps.closeJumps.front();
518 BEAST_EXPECT(jump.from.seq() <= jump.to.seq());
519 BEAST_EXPECT(!jump.to.isAncestor(jump.from));
525 peerJumps.fullyValidatedJumps.size() == 1))
527 JumpCollector::Jump
const& jump =
528 peerJumps.fullyValidatedJumps.front();
530 BEAST_EXPECT(jump.from.seq() < jump.to.seq());
531 BEAST_EXPECT(jump.to.isAncestor(jump.from));
550 PeerGroup loner = sim.createGroup(1);
551 PeerGroup friends = sim.createGroup(3);
552 loner.trust(loner + friends);
554 PeerGroup others = sim.createGroup(6);
555 PeerGroup clique = friends + others;
556 clique.trust(clique);
558 PeerGroup network = loner + clique;
560 network, round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
564 for (
Peer* peer : (loner + friends))
565 peer->openTxs.insert(Tx(0));
566 for (
Peer* peer : others)
567 peer->openTxs.insert(Tx(1));
570 for (
Peer* peer : network)
571 peer->delays.recvValidation = parms.ledgerGRANULARITY;
577 for (
Peer* p : network)
578 BEAST_EXPECT(p->prevLedgerID() == network[0]->prevLedgerID());
598 PeerGroup slow = sim.createGroup(2);
599 PeerGroup fast = sim.createGroup(4);
600 PeerGroup network = fast + slow;
602 for (
Peer* peer : network)
603 peer->consensusParms = parms;
606 network.trust(network);
634 network[0]->lastClosedLedger.closeTimeResolution();
646 if (BEAST_EXPECT(sim.synchronized()))
650 for (
Peer* peer : network)
652 BEAST_EXPECT(peer->lastClosedLedger.closeTime() > peer->now());
653 BEAST_EXPECT(peer->lastClosedLedger.closeAgree());
658 for (
Peer* peer : network)
682 BEAST_EXPECT(sim.synchronized());
693 for (
std::uint32_t overlap = 0; overlap <= numPeers; ++overlap)
701 PeerGroup aOnly = sim.createGroup(numA);
702 PeerGroup bOnly = sim.createGroup(numB);
703 PeerGroup commonOnly = sim.createGroup(overlap);
705 PeerGroup a = aOnly + commonOnly;
706 PeerGroup b = bOnly + commonOnly;
708 PeerGroup network = a + b;
711 round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
712 a.trustAndConnect(a, delay);
713 b.trustAndConnect(b, delay);
717 for (
Peer* peer : network)
720 peer->openTxs.insert(Tx{
static_cast<std::uint32_t>(peer->id)});
721 for (
Peer* to : sim.trustGraph.trustedPeers(peer))
722 peer->openTxs.insert(
730 if (overlap > 0.4 * numPeers)
731 BEAST_EXPECT(sim.synchronized());
736 BEAST_EXPECT(sim.branches() <= 3);
752 PeerGroup validators = sim.createGroup(5);
753 PeerGroup center = sim.createGroup(1);
754 validators.trust(validators);
755 center.trust(validators);
757 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
758 validators.connect(center, delay);
760 center[0]->runAsValidator =
false;
766 for (
Peer* p : validators)
772 BEAST_EXPECT(sim.synchronized());
783 bool reconnected =
false;
790 : network(net), groupCfast(c), groupCsplit(split), delay(d)
807 if (who == groupCfast[0]->
id &&
823 network.
connect(groupCsplit, delay);
868 PeerGroup groupABD = sim.createGroup(2);
870 PeerGroup groupCfast = sim.createGroup(1);
872 PeerGroup groupCsplit = sim.createGroup(7);
874 PeerGroup groupNotFastC = groupABD + groupCsplit;
875 PeerGroup network = groupABD + groupCsplit + groupCfast;
877 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
878 SimDuration fDelay = round<milliseconds>(0.1 * parms.ledgerGRANULARITY);
880 network.trust(network);
883 network.connect(groupCfast, fDelay);
885 groupNotFastC.connect(groupNotFastC, delay);
887 Disruptor dc(network, groupCfast, groupCsplit, delay);
888 sim.collectors.add(dc);
892 BEAST_EXPECT(sim.synchronized());
896 for (
Peer* peer : groupABD)
898 peer->txInjections.emplace(peer->lastClosedLedger.seq(), Tx{42});
906 BEAST_EXPECT(!sim.synchronized());
907 BEAST_EXPECT(sim.branches() == 1);
910 for (
Peer* p : network)
915 BEAST_EXPECT(!sim.synchronized());
916 BEAST_EXPECT(sim.branches() == 1);
921 if (BEAST_EXPECT(sim.branches() == 1))
923 BEAST_EXPECT(sim.synchronized());
927 BEAST_EXPECT(sim.branches(groupNotFastC) == 1);
928 BEAST_EXPECT(sim.synchronized(groupNotFastC) == 1);
988 SimDuration delay = round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
990 PeerGroup behind = sim.createGroup(3);
991 PeerGroup ahead = sim.createGroup(2);
992 PeerGroup network = ahead + behind;
995 for (
Peer* p : network)
996 trustedKeys.
insert(p->key);
997 for (
Peer* p : network)
998 p->trustedKeys = trustedKeys;
1000 network.trustAndConnect(network, delay);
1007 for (
Peer* p : behind)
1008 p->delays.ledgerAccept = 20s;
1013 sim.collectors.add(undoDelay);
1017 for (
Peer* p : network)
1022 sim.collectors.add(sc);
1030 auto peerSelector = makeSelector(
1035 auto txSubmitter = makeSubmitter(
1036 ConstantDistribution{
rate.inv()},
1037 sim.scheduler.now(),
1038 sim.scheduler.now() + simDuration,
1044 sim.run(simDuration);
1047 BEAST_EXPECT(sim.synchronized());