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;
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, date::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, date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
206 date::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);
260 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
264 date::round<milliseconds>(1.1 * parms.ledgerGRANULARITY));
266 for (
Peer* peer : slow)
267 peer->runAsValidator = isParticipant;
271 for (
Peer* peer : network)
276 if (BEAST_EXPECT(sim.synchronized()))
281 for (
Peer* peer : network)
284 auto const& lcl = peer->lastClosedLedger;
285 BEAST_EXPECT(lcl.seq() == Ledger::Seq{1});
286 BEAST_EXPECT(lcl.txs().find(Tx{0}) == lcl.txs().end());
287 BEAST_EXPECT(lcl.txs().find(Tx{1}) == lcl.txs().end());
291 lcl.txs().find(Tx{i}) != lcl.txs().end());
295 peer->openTxs.find(Tx{0}) != peer->openTxs.end());
297 peer->openTxs.find(Tx{1}) != peer->openTxs.end());
300 Peer const* slowPeer = slow[0];
303 slowPeer->prevProposers == network.size() - 1);
305 BEAST_EXPECT(slowPeer->prevProposers == fast.size());
307 for (
Peer* peer : fast)
328 peer->prevProposers == network.size() - 1);
330 peer->prevRoundTime > slowPeer->prevRoundTime);
335 peer->prevProposers == fast.size() - 1);
338 peer->prevRoundTime == slowPeer->prevRoundTime);
381 PeerGroup groupA = sim.createGroup(2);
382 PeerGroup groupB = sim.createGroup(2);
383 PeerGroup groupC = sim.createGroup(2);
384 PeerGroup network = groupA + groupB + groupC;
386 network.trust(network);
388 network, date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
392 Peer* firstPeer = *groupA.begin();
393 while (firstPeer->lastClosedLedger.closeTimeResolution() >=
394 parms.proposeFRESHNESS)
398 for (
Peer* peer : groupA)
399 peer->clockSkew = parms.proposeFRESHNESS / 2;
400 for (
Peer* peer : groupB)
401 peer->clockSkew = parms.proposeFRESHNESS;
406 if (BEAST_EXPECT(sim.synchronized()))
408 for (
Peer* peer : network)
409 BEAST_EXPECT(!peer->lastClosedLedger.closeAgree());
425 for (
auto validationDelay : {0ms, parms.ledgerMIN_CLOSE})
450 PeerGroup minority = sim.createGroup(2);
451 PeerGroup majorityA = sim.createGroup(3);
452 PeerGroup majorityB = sim.createGroup(5);
454 PeerGroup majority = majorityA + majorityB;
455 PeerGroup network = minority + majority;
458 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
459 minority.trustAndConnect(minority + majorityA, delay);
460 majority.trustAndConnect(majority, delay);
462 CollectByNode<JumpCollector> jumps;
463 sim.collectors.add(jumps);
465 BEAST_EXPECT(sim.trustGraph.canFork(parms.minCONSENSUS_PCT / 100.));
472 for (
Peer* peer : network)
473 peer->delays.recvValidation = validationDelay;
474 for (
Peer* peer : (minority + majorityA))
475 peer->openTxs.insert(Tx{0});
476 for (
Peer* peer : majorityB)
477 peer->openTxs.insert(Tx{1});
503 if (BEAST_EXPECT(sim.branches() == 1))
505 for(
Peer const* peer : majority)
508 BEAST_EXPECT(jumps[peer->id].closeJumps.empty());
509 BEAST_EXPECT(jumps[peer->id].fullyValidatedJumps.empty());
511 for(
Peer const* peer : minority)
513 auto & peerJumps = jumps[peer->id];
516 if (BEAST_EXPECT(peerJumps.closeJumps.size() == 1))
518 JumpCollector::Jump
const& jump =
519 peerJumps.closeJumps.front();
521 BEAST_EXPECT(jump.from.seq() <= jump.to.seq());
522 BEAST_EXPECT(!jump.to.isAncestor(jump.from));
528 peerJumps.fullyValidatedJumps.size() == 1))
530 JumpCollector::Jump
const& jump =
531 peerJumps.fullyValidatedJumps.front();
533 BEAST_EXPECT(jump.from.seq() < jump.to.seq());
534 BEAST_EXPECT(jump.to.isAncestor(jump.from));
553 PeerGroup loner = sim.createGroup(1);
554 PeerGroup friends = sim.createGroup(3);
555 loner.trust(loner + friends);
557 PeerGroup others = sim.createGroup(6);
558 PeerGroup clique = friends + others;
559 clique.trust(clique);
561 PeerGroup network = loner + clique;
564 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
568 for (
Peer* peer : (loner + friends))
569 peer->openTxs.insert(Tx(0));
570 for (
Peer* peer : others)
571 peer->openTxs.insert(Tx(1));
574 for (
Peer* peer : network)
575 peer->delays.recvValidation = parms.ledgerGRANULARITY;
581 for (
Peer * p: network)
582 BEAST_EXPECT(p->prevLedgerID() == network[0]->prevLedgerID());
602 PeerGroup slow = sim.createGroup(2);
603 PeerGroup fast = sim.createGroup(4);
604 PeerGroup network = fast + slow;
606 for (
Peer* peer : network)
607 peer->consensusParms = parms;
610 network.trust(network);
640 network[0]->lastClosedLedger.closeTimeResolution();
649 sim.scheduler.step_for(
654 if (BEAST_EXPECT(sim.synchronized()))
658 for (
Peer* peer : network)
661 peer->lastClosedLedger.closeTime() > peer->now());
662 BEAST_EXPECT(peer->lastClosedLedger.closeAgree());
667 for (
Peer* peer : network)
691 BEAST_EXPECT(sim.synchronized());
702 for (
std::uint32_t overlap = 0; overlap <= numPeers; ++overlap)
710 PeerGroup aOnly = sim.createGroup(numA);
711 PeerGroup bOnly = sim.createGroup(numB);
712 PeerGroup commonOnly = sim.createGroup(overlap);
714 PeerGroup a = aOnly + commonOnly;
715 PeerGroup b = bOnly + commonOnly;
717 PeerGroup network = a + b;
720 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
721 a.trustAndConnect(a, delay);
722 b.trustAndConnect(b, delay);
726 for (
Peer* peer : network)
729 peer->openTxs.insert(Tx{
static_cast<std::uint32_t>(peer->id)});
730 for (
Peer* to : sim.trustGraph.trustedPeers(peer))
731 peer->openTxs.insert(
739 if (overlap > 0.4 * numPeers)
740 BEAST_EXPECT(sim.synchronized());
745 BEAST_EXPECT(sim.branches() <= 3);
761 PeerGroup validators = sim.createGroup(5);
762 PeerGroup center = sim.createGroup(1);
763 validators.trust(validators);
764 center.trust(validators);
767 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
768 validators.connect(center, delay);
770 center[0]->runAsValidator =
false;
776 for (
Peer * p : validators)
782 BEAST_EXPECT(sim.synchronized());
794 bool reconnected =
false;
801 : network(net), groupCfast(c), groupCsplit(split), delay(d)
819 if (who == groupCfast[0]->
id &&
835 network.
connect(groupCsplit, delay);
882 PeerGroup groupABD = sim.createGroup(2);
884 PeerGroup groupCfast = sim.createGroup(1);
886 PeerGroup groupCsplit = sim.createGroup(7);
888 PeerGroup groupNotFastC = groupABD + groupCsplit;
889 PeerGroup network = groupABD + groupCsplit + groupCfast;
891 SimDuration delay = date::round<milliseconds>(
892 0.2 * parms.ledgerGRANULARITY);
893 SimDuration fDelay = date::round<milliseconds>(
894 0.1 * parms.ledgerGRANULARITY);
896 network.trust(network);
899 network.connect(groupCfast, fDelay);
901 groupNotFastC.connect(groupNotFastC, delay);
903 Disruptor dc(network, groupCfast, groupCsplit, delay);
904 sim.collectors.add(dc);
908 BEAST_EXPECT(sim.synchronized());
912 for(
Peer * peer : groupABD)
914 peer->txInjections.emplace(
915 peer->lastClosedLedger.seq(), Tx{42});
923 BEAST_EXPECT(!sim.synchronized());
924 BEAST_EXPECT(sim.branches() == 1);
927 for (
Peer * p : network)
932 BEAST_EXPECT(!sim.synchronized());
933 BEAST_EXPECT(sim.branches() == 1);
938 if(BEAST_EXPECT(sim.branches() == 1))
940 BEAST_EXPECT(sim.synchronized());
944 BEAST_EXPECT(sim.branches(groupNotFastC) == 1);
945 BEAST_EXPECT(sim.synchronized(groupNotFastC) == 1);
1006 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
1008 PeerGroup behind = sim.createGroup(3);
1009 PeerGroup ahead = sim.createGroup(2);
1010 PeerGroup network = ahead + behind;
1013 for (
Peer* p : network)
1014 trustedKeys.
insert(p->key);
1015 for (
Peer* p : network)
1016 p->trustedKeys = trustedKeys;
1018 network.trustAndConnect(network, delay);
1025 for (
Peer* p : behind)
1026 p->delays.ledgerAccept = 20s;
1031 sim.collectors.add(undoDelay);
1035 for (
Peer* p : network)
1040 sim.collectors.add(sc);
1048 auto peerSelector = makeSelector(
1053 auto txSubmitter = makeSubmitter(
1054 ConstantDistribution{
rate.inv()},
1055 sim.scheduler.now(),
1056 sim.scheduler.now() + simDuration,
1062 sim.run(simDuration);
1065 BEAST_EXPECT(sim.synchronized());