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, 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);
380 PeerGroup groupA = sim.createGroup(2);
381 PeerGroup groupB = sim.createGroup(2);
382 PeerGroup groupC = sim.createGroup(2);
383 PeerGroup network = groupA + groupB + groupC;
385 network.trust(network);
387 network, date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
391 Peer* firstPeer = *groupA.begin();
392 while (firstPeer->lastClosedLedger.closeTimeResolution() >=
393 parms.proposeFRESHNESS)
397 for (
Peer* peer : groupA)
398 peer->clockSkew = parms.proposeFRESHNESS / 2;
399 for (
Peer* peer : groupB)
400 peer->clockSkew = parms.proposeFRESHNESS;
405 if (BEAST_EXPECT(sim.synchronized()))
407 for (
Peer* peer : network)
408 BEAST_EXPECT(!peer->lastClosedLedger.closeAgree());
424 for (
auto validationDelay : {0ms, parms.ledgerMIN_CLOSE})
449 PeerGroup minority = sim.createGroup(2);
450 PeerGroup majorityA = sim.createGroup(3);
451 PeerGroup majorityB = sim.createGroup(5);
453 PeerGroup majority = majorityA + majorityB;
454 PeerGroup network = minority + majority;
457 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
458 minority.trustAndConnect(minority + majorityA, delay);
459 majority.trustAndConnect(majority, delay);
461 CollectByNode<JumpCollector> jumps;
462 sim.collectors.add(jumps);
464 BEAST_EXPECT(sim.trustGraph.canFork(parms.minCONSENSUS_PCT / 100.));
471 for (
Peer* peer : network)
472 peer->delays.recvValidation = validationDelay;
473 for (
Peer* peer : (minority + majorityA))
474 peer->openTxs.insert(Tx{0});
475 for (
Peer* peer : majorityB)
476 peer->openTxs.insert(Tx{1});
502 if (BEAST_EXPECT(sim.branches() == 1))
504 for (
Peer const* peer : majority)
507 BEAST_EXPECT(jumps[peer->id].closeJumps.empty());
508 BEAST_EXPECT(jumps[peer->id].fullyValidatedJumps.empty());
510 for (
Peer const* peer : minority)
512 auto& peerJumps = jumps[peer->id];
515 if (BEAST_EXPECT(peerJumps.closeJumps.size() == 1))
517 JumpCollector::Jump
const& jump =
518 peerJumps.closeJumps.front();
520 BEAST_EXPECT(jump.from.seq() <= jump.to.seq());
521 BEAST_EXPECT(!jump.to.isAncestor(jump.from));
527 peerJumps.fullyValidatedJumps.size() == 1))
529 JumpCollector::Jump
const& jump =
530 peerJumps.fullyValidatedJumps.front();
532 BEAST_EXPECT(jump.from.seq() < jump.to.seq());
533 BEAST_EXPECT(jump.to.isAncestor(jump.from));
552 PeerGroup loner = sim.createGroup(1);
553 PeerGroup friends = sim.createGroup(3);
554 loner.trust(loner + friends);
556 PeerGroup others = sim.createGroup(6);
557 PeerGroup clique = friends + others;
558 clique.trust(clique);
560 PeerGroup network = loner + clique;
563 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY));
567 for (
Peer* peer : (loner + friends))
568 peer->openTxs.insert(Tx(0));
569 for (
Peer* peer : others)
570 peer->openTxs.insert(Tx(1));
573 for (
Peer* peer : network)
574 peer->delays.recvValidation = parms.ledgerGRANULARITY;
580 for (
Peer* p : network)
581 BEAST_EXPECT(p->prevLedgerID() == network[0]->prevLedgerID());
601 PeerGroup slow = sim.createGroup(2);
602 PeerGroup fast = sim.createGroup(4);
603 PeerGroup network = fast + slow;
605 for (
Peer* peer : network)
606 peer->consensusParms = parms;
609 network.trust(network);
638 network[0]->lastClosedLedger.closeTimeResolution();
650 if (BEAST_EXPECT(sim.synchronized()))
654 for (
Peer* peer : network)
656 BEAST_EXPECT(peer->lastClosedLedger.closeTime() > peer->now());
657 BEAST_EXPECT(peer->lastClosedLedger.closeAgree());
662 for (
Peer* peer : network)
686 BEAST_EXPECT(sim.synchronized());
697 for (
std::uint32_t overlap = 0; overlap <= numPeers; ++overlap)
705 PeerGroup aOnly = sim.createGroup(numA);
706 PeerGroup bOnly = sim.createGroup(numB);
707 PeerGroup commonOnly = sim.createGroup(overlap);
709 PeerGroup a = aOnly + commonOnly;
710 PeerGroup b = bOnly + commonOnly;
712 PeerGroup network = a + b;
715 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
716 a.trustAndConnect(a, delay);
717 b.trustAndConnect(b, delay);
721 for (
Peer* peer : network)
724 peer->openTxs.insert(Tx{
static_cast<std::uint32_t>(peer->id)});
725 for (
Peer* to : sim.trustGraph.trustedPeers(peer))
726 peer->openTxs.insert(
734 if (overlap > 0.4 * numPeers)
735 BEAST_EXPECT(sim.synchronized());
740 BEAST_EXPECT(sim.branches() <= 3);
756 PeerGroup validators = sim.createGroup(5);
757 PeerGroup center = sim.createGroup(1);
758 validators.trust(validators);
759 center.trust(validators);
762 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
763 validators.connect(center, delay);
765 center[0]->runAsValidator =
false;
771 for (
Peer* p : validators)
777 BEAST_EXPECT(sim.synchronized());
788 bool reconnected =
false;
795 : network(net), groupCfast(c), groupCsplit(split), delay(d)
812 if (who == groupCfast[0]->
id &&
828 network.
connect(groupCsplit, delay);
873 PeerGroup groupABD = sim.createGroup(2);
875 PeerGroup groupCfast = sim.createGroup(1);
877 PeerGroup groupCsplit = sim.createGroup(7);
879 PeerGroup groupNotFastC = groupABD + groupCsplit;
880 PeerGroup network = groupABD + groupCsplit + groupCfast;
883 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
885 date::round<milliseconds>(0.1 * parms.ledgerGRANULARITY);
887 network.trust(network);
890 network.connect(groupCfast, fDelay);
892 groupNotFastC.connect(groupNotFastC, delay);
894 Disruptor dc(network, groupCfast, groupCsplit, delay);
895 sim.collectors.add(dc);
899 BEAST_EXPECT(sim.synchronized());
903 for (
Peer* peer : groupABD)
905 peer->txInjections.emplace(peer->lastClosedLedger.seq(), Tx{42});
913 BEAST_EXPECT(!sim.synchronized());
914 BEAST_EXPECT(sim.branches() == 1);
917 for (
Peer* p : network)
922 BEAST_EXPECT(!sim.synchronized());
923 BEAST_EXPECT(sim.branches() == 1);
928 if (BEAST_EXPECT(sim.branches() == 1))
930 BEAST_EXPECT(sim.synchronized());
934 BEAST_EXPECT(sim.branches(groupNotFastC) == 1);
935 BEAST_EXPECT(sim.synchronized(groupNotFastC) == 1);
996 date::round<milliseconds>(0.2 * parms.ledgerGRANULARITY);
998 PeerGroup behind = sim.createGroup(3);
999 PeerGroup ahead = sim.createGroup(2);
1000 PeerGroup network = ahead + behind;
1003 for (
Peer* p : network)
1004 trustedKeys.
insert(p->key);
1005 for (
Peer* p : network)
1006 p->trustedKeys = trustedKeys;
1008 network.trustAndConnect(network, delay);
1015 for (
Peer* p : behind)
1016 p->delays.ledgerAccept = 20s;
1021 sim.collectors.add(undoDelay);
1025 for (
Peer* p : network)
1030 sim.collectors.add(sc);
1038 auto peerSelector = makeSelector(
1043 auto txSubmitter = makeSubmitter(
1044 ConstantDistribution{
rate.inv()},
1045 sim.scheduler.now(),
1046 sim.scheduler.now() + simDuration,
1052 sim.run(simDuration);
1055 BEAST_EXPECT(sim.synchronized());