Files
rippled/src/LedgerTiming.cpp
2012-06-29 03:54:43 -07:00

62 lines
2.4 KiB
C++

#include "LedgerTiming.h"
// Returns the number of seconds the ledger should be be open.
int ContinuousLedgerTiming::shouldClose( // How many:
bool anyTransactions,
int previousProposers, // proposers there were in the last closing
int proposersClosed, // proposers who have currently closed their ledgers
int previousOpenSeconds, // seconds the previous ledger was open
int currentOpenSeconds) // seconds since the previous ledger closed
{
if (!anyTransactions)
{ // no transactions so far this interval
if (proposersClosed > (previousProposers / 4)) // did we miss a transaction?
return currentOpenSeconds;
if (previousOpenSeconds > (LEDGER_IDLE_INTERVAL + 2)) // the last ledger was very slow to close
return previousOpenSeconds - 1;
return LEDGER_IDLE_INTERVAL; // normal idle
}
if (previousOpenSeconds == LEDGER_IDLE_INTERVAL) // coming out of idle, close now
return currentOpenSeconds;
// If the network is slow, try to synchronize close times
if (previousOpenSeconds > 8)
return (currentOpenSeconds - currentOpenSeconds % 4);
else if (previousOpenSeconds > 4)
return (currentOpenSeconds - currentOpenSeconds % 2);
return currentOpenSeconds; // this ledger should close now
}
// Returns whether we have a consensus or not. If so, we expect all honest nodes
// to already have everything they need to accept a consensus. Our vote is 'locked in'.
bool ContinuousLedgerTiming::haveConsensus(
int previousProposers, // proposers in the last closing (not including us)
int currentProposers, // proposers in this closing so far (not including us)
int currentAgree, // proposers who agree with us
int currentClosed, // proposers who have currently closed their ledgers
int previousAgreeTime, // how long it took to agree on the last ledger
int currentAgreeTime) // how long we've been trying to agree
{
if (currentProposers < (previousProposers * 3 / 4))
{ // Less than 3/4 of the validators are present, slow down
if (currentAgreeTime < (previousAgreeTime + 2))
return false;
}
// If 80% of current proposers (plus us) agree on a set, we have consensus
int agreeWeight = (currentAgree * 100 + 100) / (currentProposers + 1);
if (agreeWeight > 80)
return true;
// If 50% of the nodes on your UNL (minus us) have closed, you should close
int closeWeight = (currentClosed * 100 - 100) / (currentProposers + 1);
if (closeWeight > 50)
return true;
return false;
}