Remove dkgRndSleepTime from consensus params and make sleeping it non-random
This commit is contained in:
parent
0dae46c2fb
commit
5958f8b81d
@ -118,7 +118,6 @@ static Consensus::LLMQParams llmq10_60 = {
|
|||||||
.dkgPhaseBlocks = 2,
|
.dkgPhaseBlocks = 2,
|
||||||
.dkgMiningWindowStart = 10, // dkgPhaseBlocks * 5 = after finalization
|
.dkgMiningWindowStart = 10, // dkgPhaseBlocks * 5 = after finalization
|
||||||
.dkgMiningWindowEnd = 18,
|
.dkgMiningWindowEnd = 18,
|
||||||
.dkgRndSleepTime = 0,
|
|
||||||
.dkgBadVotesThreshold = 8,
|
.dkgBadVotesThreshold = 8,
|
||||||
|
|
||||||
.neighborConnections = 2,
|
.neighborConnections = 2,
|
||||||
@ -137,7 +136,6 @@ static Consensus::LLMQParams llmq50_60 = {
|
|||||||
.dkgPhaseBlocks = 2,
|
.dkgPhaseBlocks = 2,
|
||||||
.dkgMiningWindowStart = 10, // dkgPhaseBlocks * 5 = after finalization
|
.dkgMiningWindowStart = 10, // dkgPhaseBlocks * 5 = after finalization
|
||||||
.dkgMiningWindowEnd = 18,
|
.dkgMiningWindowEnd = 18,
|
||||||
.dkgRndSleepTime = 1 * 60 * 1000,
|
|
||||||
.dkgBadVotesThreshold = 40,
|
.dkgBadVotesThreshold = 40,
|
||||||
|
|
||||||
.neighborConnections = 2,
|
.neighborConnections = 2,
|
||||||
@ -156,7 +154,6 @@ static Consensus::LLMQParams llmq400_60 = {
|
|||||||
.dkgPhaseBlocks = 4,
|
.dkgPhaseBlocks = 4,
|
||||||
.dkgMiningWindowStart = 20, // dkgPhaseBlocks * 5 = after finalization
|
.dkgMiningWindowStart = 20, // dkgPhaseBlocks * 5 = after finalization
|
||||||
.dkgMiningWindowEnd = 28,
|
.dkgMiningWindowEnd = 28,
|
||||||
.dkgRndSleepTime = 2 * 60 * 1000,
|
|
||||||
.dkgBadVotesThreshold = 300,
|
.dkgBadVotesThreshold = 300,
|
||||||
|
|
||||||
.neighborConnections = 4,
|
.neighborConnections = 4,
|
||||||
@ -176,7 +173,6 @@ static Consensus::LLMQParams llmq400_85 = {
|
|||||||
.dkgPhaseBlocks = 4,
|
.dkgPhaseBlocks = 4,
|
||||||
.dkgMiningWindowStart = 20, // dkgPhaseBlocks * 5 = after finalization
|
.dkgMiningWindowStart = 20, // dkgPhaseBlocks * 5 = after finalization
|
||||||
.dkgMiningWindowEnd = 48, // give it a larger mining window to make sure it is mined
|
.dkgMiningWindowEnd = 48, // give it a larger mining window to make sure it is mined
|
||||||
.dkgRndSleepTime = 2 * 60 * 1000,
|
|
||||||
.dkgBadVotesThreshold = 300,
|
.dkgBadVotesThreshold = 300,
|
||||||
|
|
||||||
.neighborConnections = 4,
|
.neighborConnections = 4,
|
||||||
|
@ -98,10 +98,6 @@ struct LLMQParams {
|
|||||||
// session failed.
|
// session failed.
|
||||||
int dkgMiningWindowEnd;
|
int dkgMiningWindowEnd;
|
||||||
|
|
||||||
// Each member will sleep for a random time between 0 and dkgRndSleepTime milliseconds. The purpose of this is to
|
|
||||||
// avoid overloading the network due to all members sending out expensive-to-verify DKG messages at once
|
|
||||||
int dkgRndSleepTime;
|
|
||||||
|
|
||||||
// In the complaint phase, members will vote on other members being bad (missing valid contribution). If at least
|
// In the complaint phase, members will vote on other members being bad (missing valid contribution). If at least
|
||||||
// dkgBadVotesThreshold have voted for another member to be bad, it will considered to be bad by all other members
|
// dkgBadVotesThreshold have voted for another member to be bad, it will considered to be bad by all other members
|
||||||
// as well. This serves as a protection against late-comers who send their contribution on the bring of
|
// as well. This serves as a protection against late-comers who send their contribution on the bring of
|
||||||
|
@ -293,6 +293,8 @@ public:
|
|||||||
|
|
||||||
bool Init(int _height, const uint256& _quorumHash, const std::vector<CDeterministicMNCPtr>& mns, const uint256& _myProTxHash);
|
bool Init(int _height, const uint256& _quorumHash, const std::vector<CDeterministicMNCPtr>& mns, const uint256& _myProTxHash);
|
||||||
|
|
||||||
|
size_t GetMyMemberIndex() const { return myIdx; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The following sets of methods are for the first 4 phases handled in the session. The flow of message calls
|
* The following sets of methods are for the first 4 phases handled in the session. The flow of message calls
|
||||||
* is identical for all phases:
|
* is identical for all phases:
|
||||||
|
@ -236,13 +236,27 @@ void CDKGSessionHandler::WaitForNewQuorum(const uint256& oldQuorumHash)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDKGSessionHandler::RandomSleep(QuorumPhase curPhase,
|
// Sleep some time to not fully overload the whole network
|
||||||
uint256& expectedQuorumHash,
|
void CDKGSessionHandler::SleepBeforePhase(QuorumPhase curPhase,
|
||||||
double randomSleepFactor,
|
uint256& expectedQuorumHash,
|
||||||
const WhileWaitFunc& runWhileWaiting)
|
double randomSleepFactor,
|
||||||
|
const WhileWaitFunc& runWhileWaiting)
|
||||||
{
|
{
|
||||||
// Randomly sleep some time to not fully overload the whole network
|
// expected time for a full phase
|
||||||
int64_t endTime = GetTimeMillis() + GetRandInt((int)(params.dkgRndSleepTime * randomSleepFactor));
|
double phaseTime = params.dkgPhaseBlocks * Params().GetConsensus().nPowTargetSpacing * 1000;
|
||||||
|
// expected time per member
|
||||||
|
phaseTime = phaseTime / params.size;
|
||||||
|
// Don't expect perfect block times and thus reduce the phase time to be on the secure side (caller chooses factor)
|
||||||
|
phaseTime *= randomSleepFactor;
|
||||||
|
|
||||||
|
if (Params().MineBlocksOnDemand()) {
|
||||||
|
// on regtest, blocks can be mined on demand without any significant time passing between these. We shouldn't
|
||||||
|
// wait before phases in this case
|
||||||
|
phaseTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t sleepTime = (int64_t)(phaseTime * curSession->GetMyMemberIndex());
|
||||||
|
int64_t endTime = GetTimeMillis() + sleepTime;
|
||||||
while (GetTimeMillis() < endTime) {
|
while (GetTimeMillis() < endTime) {
|
||||||
if (stopRequested || ShutdownRequested()) {
|
if (stopRequested || ShutdownRequested()) {
|
||||||
throw AbortPhaseException();
|
throw AbortPhaseException();
|
||||||
@ -264,7 +278,7 @@ void CDKGSessionHandler::HandlePhase(QuorumPhase curPhase,
|
|||||||
const StartPhaseFunc& startPhaseFunc,
|
const StartPhaseFunc& startPhaseFunc,
|
||||||
const WhileWaitFunc& runWhileWaiting)
|
const WhileWaitFunc& runWhileWaiting)
|
||||||
{
|
{
|
||||||
RandomSleep(curPhase, expectedQuorumHash, randomSleepFactor, runWhileWaiting);
|
SleepBeforePhase(curPhase, expectedQuorumHash, randomSleepFactor, runWhileWaiting);
|
||||||
startPhaseFunc();
|
startPhaseFunc();
|
||||||
WaitForNextPhase(curPhase, nextPhase, expectedQuorumHash, runWhileWaiting);
|
WaitForNextPhase(curPhase, nextPhase, expectedQuorumHash, runWhileWaiting);
|
||||||
}
|
}
|
||||||
@ -501,7 +515,7 @@ void CDKGSessionHandler::HandleDKGRound()
|
|||||||
auto fContributeWait = [this] {
|
auto fContributeWait = [this] {
|
||||||
return ProcessPendingMessageBatch<CDKGContribution>(*curSession, pendingContributions, 8);
|
return ProcessPendingMessageBatch<CDKGContribution>(*curSession, pendingContributions, 8);
|
||||||
};
|
};
|
||||||
HandlePhase(QuorumPhase_Contribute, QuorumPhase_Complain, curQuorumHash, 1, fContributeStart, fContributeWait);
|
HandlePhase(QuorumPhase_Contribute, QuorumPhase_Complain, curQuorumHash, 0.5, fContributeStart, fContributeWait);
|
||||||
|
|
||||||
// Complain
|
// Complain
|
||||||
auto fComplainStart = [this]() {
|
auto fComplainStart = [this]() {
|
||||||
@ -510,7 +524,7 @@ void CDKGSessionHandler::HandleDKGRound()
|
|||||||
auto fComplainWait = [this] {
|
auto fComplainWait = [this] {
|
||||||
return ProcessPendingMessageBatch<CDKGComplaint>(*curSession, pendingComplaints, 8);
|
return ProcessPendingMessageBatch<CDKGComplaint>(*curSession, pendingComplaints, 8);
|
||||||
};
|
};
|
||||||
HandlePhase(QuorumPhase_Complain, QuorumPhase_Justify, curQuorumHash, 0, fComplainStart, fComplainWait);
|
HandlePhase(QuorumPhase_Complain, QuorumPhase_Justify, curQuorumHash, 0.1, fComplainStart, fComplainWait);
|
||||||
|
|
||||||
// Justify
|
// Justify
|
||||||
auto fJustifyStart = [this]() {
|
auto fJustifyStart = [this]() {
|
||||||
@ -519,7 +533,7 @@ void CDKGSessionHandler::HandleDKGRound()
|
|||||||
auto fJustifyWait = [this] {
|
auto fJustifyWait = [this] {
|
||||||
return ProcessPendingMessageBatch<CDKGJustification>(*curSession, pendingJustifications, 8);
|
return ProcessPendingMessageBatch<CDKGJustification>(*curSession, pendingJustifications, 8);
|
||||||
};
|
};
|
||||||
HandlePhase(QuorumPhase_Justify, QuorumPhase_Commit, curQuorumHash, 0, fJustifyStart, fJustifyWait);
|
HandlePhase(QuorumPhase_Justify, QuorumPhase_Commit, curQuorumHash, 0.1, fJustifyStart, fJustifyWait);
|
||||||
|
|
||||||
// Commit
|
// Commit
|
||||||
auto fCommitStart = [this]() {
|
auto fCommitStart = [this]() {
|
||||||
@ -528,7 +542,7 @@ void CDKGSessionHandler::HandleDKGRound()
|
|||||||
auto fCommitWait = [this] {
|
auto fCommitWait = [this] {
|
||||||
return ProcessPendingMessageBatch<CDKGPrematureCommitment>(*curSession, pendingPrematureCommitments, 8);
|
return ProcessPendingMessageBatch<CDKGPrematureCommitment>(*curSession, pendingPrematureCommitments, 8);
|
||||||
};
|
};
|
||||||
HandlePhase(QuorumPhase_Commit, QuorumPhase_Finalize, curQuorumHash, 1, fCommitStart, fCommitWait);
|
HandlePhase(QuorumPhase_Commit, QuorumPhase_Finalize, curQuorumHash, 0.5, fCommitStart, fCommitWait);
|
||||||
|
|
||||||
auto finalCommitments = curSession->FinalizeCommitments();
|
auto finalCommitments = curSession->FinalizeCommitments();
|
||||||
for (auto& fqc : finalCommitments) {
|
for (auto& fqc : finalCommitments) {
|
||||||
|
@ -127,7 +127,7 @@ private:
|
|||||||
typedef std::function<bool()> WhileWaitFunc;
|
typedef std::function<bool()> WhileWaitFunc;
|
||||||
void WaitForNextPhase(QuorumPhase curPhase, QuorumPhase nextPhase, uint256& expectedQuorumHash, const WhileWaitFunc& runWhileWaiting);
|
void WaitForNextPhase(QuorumPhase curPhase, QuorumPhase nextPhase, uint256& expectedQuorumHash, const WhileWaitFunc& runWhileWaiting);
|
||||||
void WaitForNewQuorum(const uint256& oldQuorumHash);
|
void WaitForNewQuorum(const uint256& oldQuorumHash);
|
||||||
void RandomSleep(QuorumPhase curPhase, uint256& expectedQuorumHash, double randomSleepFactor, const WhileWaitFunc& runWhileWaiting);
|
void SleepBeforePhase(QuorumPhase curPhase, uint256& expectedQuorumHash, double randomSleepFactor, const WhileWaitFunc& runWhileWaiting);
|
||||||
void HandlePhase(QuorumPhase curPhase, QuorumPhase nextPhase, uint256& expectedQuorumHash, double randomSleepFactor, const StartPhaseFunc& startPhaseFunc, const WhileWaitFunc& runWhileWaiting);
|
void HandlePhase(QuorumPhase curPhase, QuorumPhase nextPhase, uint256& expectedQuorumHash, double randomSleepFactor, const StartPhaseFunc& startPhaseFunc, const WhileWaitFunc& runWhileWaiting);
|
||||||
void HandleDKGRound();
|
void HandleDKGRound();
|
||||||
void PhaseHandlerThread();
|
void PhaseHandlerThread();
|
||||||
|
Loading…
Reference in New Issue
Block a user