diff --git a/DigitalNote.pro b/DigitalNote.pro index 187da1d7..db2d12cb 100644 --- a/DigitalNote.pro +++ b/DigitalNote.pro @@ -1,6 +1,6 @@ TEMPLATE = app TARGET = DigitalNote-qt -VERSION = 1.0.1.4 +VERSION = 1.0.1.5 INCLUDEPATH += src src/json src/qt src/qt/plugins/mrichtexteditor QT += core gui widgets network printsupport DEFINES += ENABLE_WALLET diff --git a/src/blockparams.cpp b/src/blockparams.cpp index 8e02d5a3..60cfe589 100644 --- a/src/blockparams.cpp +++ b/src/blockparams.cpp @@ -47,6 +47,7 @@ double VRFup2 = 1.5; double VRFup3 = 2; double TerminalAverage = 0; double TerminalFactor = 10000; +double debugTerminalAverage = 0; CBigNum newBN = 0; CBigNum oldBN = 0; int64_t VLrate1 = 0; @@ -68,16 +69,23 @@ int64_t scantime_1 = 0; int64_t scantime_2 = 0; int64_t prevPoW = 0; // hybrid value int64_t prevPoS = 0; // hybrid value +uint64_t blkTime = 0; +uint64_t cntTime = 0; +uint64_t prvTime = 0; +uint64_t difTime = 0; +uint64_t hourRounds = 0; +uint64_t difCurve = 0; +uint64_t debugHourRounds = 0; +uint64_t debugDifCurve = 0; +bool fDryRun; +bool fCRVreset; const CBlockIndex* pindexPrev = 0; const CBlockIndex* BlockVelocityType = 0; +CBigNum bnVelocity = 0; CBigNum bnOld; CBigNum bnNew; +std::string difType (""); unsigned int retarget = DIFF_VRX; // Default with VRX -uint64_t cntTime = 0; -uint64_t prvTime = 0; -uint64_t difTimePoS = 0; -uint64_t difTimePoW = 0; -string loggedpayee = ""; ////////////////////////////////////////////////////////////////////////////// @@ -89,29 +97,35 @@ string loggedpayee = ""; // Debug log printing // -void VRXswngPoSdebug() +void VRXswngdebug() { // Print for debugging - LogPrintf("Previously discovered PoS block: %u: \n",prvTime); - LogPrintf("Current block-time: %u: \n",cntTime); - LogPrintf("Time since last PoS block: %u: \n",difTimePoS); - if(difTimePoS > 1 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoS is greater than 1 Hours: %u \n",cntTime);} - if(difTimePoS > 2 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoS is greater than 2 Hours: %u \n",cntTime);} - if(difTimePoS > 3 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoS is greater than 3 Hours: %u \n",cntTime);} - if(difTimePoS > 4 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoS is greater than 4 Hours: %u \n",cntTime);} - return; -} + LogPrintf("Previously discovered %s block: %u: \n",difType.c_str(),prvTime); + LogPrintf("Current block-time: %u: \n",difType.c_str(),cntTime); + LogPrintf("Time since last %s block: %u: \n",difType.c_str(),difTime); + // Handle updated versions as well as legacy + if(GetTime() > nPaymentUpdate_2) { + debugHourRounds = hourRounds; + debugTerminalAverage = TerminalAverage; + debugDifCurve = difCurve; + while(difTime > (debugHourRounds * 60 * 60)) { + debugTerminalAverage /= debugDifCurve; + LogPrintf("diffTime%s is greater than %u Hours: %u \n",difType.c_str(),debugHourRounds,cntTime); + LogPrintf("Difficulty will be multiplied by: %d \n",debugTerminalAverage); + // Break loop after 5 hours, otherwise time threshold will auto-break loop + if (debugHourRounds > 5){ + break; + } + debugDifCurve ++; + debugHourRounds ++; + } + } else { + if(difTime > (hourRounds+0) * 60 * 60) {LogPrintf("diffTime%s is greater than 1 Hours: %u \n",difType.c_str(),cntTime);} + if(difTime > (hourRounds+1) * 60 * 60) {LogPrintf("diffTime%s is greater than 2 Hours: %u \n",difType.c_str(),cntTime);} + if(difTime > (hourRounds+2) * 60 * 60) {LogPrintf("diffTime%s is greater than 3 Hours: %u \n",difType.c_str(),cntTime);} + if(difTime > (hourRounds+3) * 60 * 60) {LogPrintf("diffTime%s is greater than 4 Hours: %u \n",difType.c_str(),cntTime);} + } -void VRXswngPoWdebug() -{ - // Print for debugging - LogPrintf("Previously discovered PoW block: %u: \n",prvTime); - LogPrintf("Current block-time: %u: \n",cntTime); - LogPrintf("Time since last PoW block: %u: \n",difTimePoW); - if(difTimePoW > 1 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoW is greater than 1 Hours: %u \n",cntTime);} - if(difTimePoW > 2 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoW is greater than 2 Hours: %u \n",cntTime);} - if(difTimePoW > 3 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoW is greater than 3 Hours: %u \n",cntTime);} - if(difTimePoW > 4 * 60 * 60) { TerminalAverage /= 2; LogPrintf("diffTimePoW is greater than 4 Hours: %u \n",cntTime);} return; } @@ -161,9 +175,9 @@ void GNTdebug() // // -// This is VRX revised implementation +// This is VRX (v3.5) revised implementation // -// Terminal-Velocity-RateX, v10-Beta-R7, written by Jonathan Dan Zaretsky - cryptocoderz@gmail.com +// Terminal-Velocity-RateX, v10-Beta-R9, written by Jonathan Dan Zaretsky - cryptocoderz@gmail.com void VRX_BaseEngine(const CBlockIndex* pindexLast, bool fProofOfStake) { // Set base values @@ -231,14 +245,8 @@ void VRX_BaseEngine(const CBlockIndex* pindexLast, bool fProofOfStake) // v1.1 if(pindexBest->GetBlockTime() > 1520198278) // ON Sunday, March 4, 2018 9:17:58 PM { - if(pindexPrev->IsProofOfStake()) - { - prevPoS ++; - } - else if(pindexPrev->IsProofOfWork()) - { - prevPoW ++; - } + if(pindexPrev->IsProofOfStake()) { prevPoS ++; } + else if(pindexPrev->IsProofOfWork()) { prevPoW ++; } } // move up per scan round @@ -249,6 +257,19 @@ void VRX_BaseEngine(const CBlockIndex* pindexLast, bool fProofOfStake) return; } +void VRX_Simulate_Retarget() +{ + // Perform retarget simulation + TerminalFactor *= TerminalAverage; + difficultyfactor = TerminalFactor; + bnOld.SetCompact(BlockVelocityType->nBits); + bnNew = bnOld / difficultyfactor; + bnNew *= 10000; + // Reset TerminalFactor for actual retarget + TerminalFactor = 10000; + return; +} + void VRX_ThreadCurve(const CBlockIndex* pindexLast, bool fProofOfStake) { // Run VRX engine @@ -270,78 +291,110 @@ void VRX_ThreadCurve(const CBlockIndex* pindexLast, bool fProofOfStake) if(pindexBest->GetBlockTime() > 1520198278) // ON Sunday, March 4, 2018 9:17:58 PM { // Define time values + blkTime = pindexLast->GetBlockTime(); cntTime = BlockVelocityType->GetBlockTime(); prvTime = BlockVelocityType->pprev->GetBlockTime(); - - if(fProofOfStake) - { - difTimePoS = cntTime - prvTime; - - // Debug print toggle - if(fDebug) VRXswngPoSdebug(); - // Normal Run - else if(!fDebug) - { - if(difTimePoS > 1 * 60 * 60) { TerminalAverage /= 2; } - if(difTimePoS > 2 * 60 * 60) { TerminalAverage /= 2; } - if(difTimePoS > 3 * 60 * 60) { TerminalAverage /= 2; } - if(difTimePoS > 4 * 60 * 60) { TerminalAverage /= 2; } - } + difTime = cntTime - prvTime; + hourRounds = 1; + difCurve = 2; + fCRVreset = false; + + // Debug print toggle + if(fProofOfStake) { + difType = "PoS"; + } else { + difType = "PoW"; } - else if(!fProofOfStake) - { - difTimePoW = cntTime - prvTime; - - // Debug print toggle - if(fDebug) VRXswngPoWdebug(); - // Normal Run - else if(!fDebug) - { - if(difTimePoW > 1 * 60 * 60) { TerminalAverage /= 2; } - if(difTimePoW > 2 * 60 * 60) { TerminalAverage /= 2; } - if(difTimePoW > 3 * 60 * 60) { TerminalAverage /= 2; } - if(difTimePoW > 4 * 60 * 60) { TerminalAverage /= 2; } + if(fDebug) VRXswngdebug(); + + // Version 1.2 Extended Curve Run Upgrade + if(pindexLast->GetBlockTime() > nPaymentUpdate_2) {// ON Monday, Jun 24, 2019 12:00:00 PM PDT + // Set unbiased comparison + difTime = blkTime - cntTime; + // Run Curve + while(difTime > (hourRounds * 60 * 60)) { + // Break loop after 5 hours, otherwise time threshold will auto-break loop + if (hourRounds > 5){ + fCRVreset = true; + break; + } + // Drop difficulty per round + TerminalAverage /= difCurve; + // Simulate retarget for sanity + VRX_Simulate_Retarget(); + // Increase Curve per round + difCurve ++; + // Move up an hour per round + hourRounds ++; } + } else {// Version 1.1 Standard Curve Run + if(difTime > (hourRounds+0) * 60 * 60) { TerminalAverage /= difCurve; } + if(difTime > (hourRounds+1) * 60 * 60) { TerminalAverage /= difCurve; } + if(difTime > (hourRounds+2) * 60 * 60) { TerminalAverage /= difCurve; } + if(difTime > (hourRounds+3) * 60 * 60) { TerminalAverage /= difCurve; } } } return; } -unsigned int VRX_Retarget(const CBlockIndex* pindexLast, bool fProofOfStake) +void VRX_Dry_Run(const CBlockIndex* pindexLast) { - const CBigNum bnVelocity = fProofOfStake ? Params().ProofOfStakeLimit() : Params().ProofOfWorkLimit(); - // Check for blocks to index | Allowing for initial chain start - if (pindexLast->nHeight < scanheight+124) - return bnVelocity.GetCompact(); // can't index prevblock + if (pindexLast->nHeight < scanheight+124) { + fDryRun = true; + return; // can't index prevblock + } - // Live fork toggle diff reset + // Reset difficulty for payments update if(pindexLast->GetBlockTime() > 0) { - if(pindexLast->GetBlockTime() > nPaymentUpdate_1) // Monday, May 20, 2019 12:00:00 AM + if(pindexLast->GetBlockTime() > nPaymentUpdate_1) // ON Monday, May 20, 2019 12:00:00 AM { if(pindexLast->GetBlockTime() < nPaymentUpdate_1+480) { - return bnVelocity.GetCompact(); // diff reset + fDryRun = true; + return; // diff reset + } + } + if(pindexLast->GetBlockTime() > nPaymentUpdate_2) // ON Monday, Jun 24, 2019 12:00:00 PM PDT + { + if(pindexLast->GetBlockTime() < nPaymentUpdate_2+480) { + fDryRun = true; + return; // diff reset } } } + // Test Fork + if (nLiveForkToggle != 0) { + // Do nothing + }// TODO setup next testing fork + + // Standard, non-Dry Run + fDryRun = false; + return; +} + +unsigned int VRX_Retarget(const CBlockIndex* pindexLast, bool fProofOfStake) +{ + // Set base values + bnVelocity = fProofOfStake ? Params().ProofOfStakeLimit() : Params().ProofOfWorkLimit(); + // Differentiate PoW/PoS prev block BlockVelocityType = GetLastBlockIndex(pindexLast, fProofOfStake); + // Check for a dry run + VRX_Dry_Run(pindexLast); + if(fDryRun) { return bnVelocity.GetCompact(); } + // Run VRX threadcurve VRX_ThreadCurve(pindexLast, fProofOfStake); + if (fCRVreset) { return bnVelocity.GetCompact(); } - // Retarget - TerminalFactor *= TerminalAverage; - difficultyfactor = TerminalFactor; - bnOld.SetCompact(BlockVelocityType->nBits); - bnNew = bnOld / difficultyfactor; - bnNew *= 10000; + // Retarget using simulation + VRX_Simulate_Retarget(); // Limit - if (bnNew > bnVelocity) - bnNew = bnVelocity; + if (bnNew > bnVelocity) { bnNew = bnVelocity; } // Final log oldBN = bnOld.GetCompact(); @@ -479,7 +532,7 @@ int64_t GetMasternodePayment(int nHeight, int64_t blockValue) { // Define values int64_t ret = 0; - int64_t swingSubsidy = blockValue - (100 * COIN); // 200 XDN ceiling + int64_t swingSubsidy = 200 * COIN; // 200 XDN ceiling int64_t seesawHeight = nHeight; int64_t seesawInterval = seesawHeight / 30; int64_t seesawEpoch = seesawInterval / 15; @@ -561,7 +614,7 @@ int64_t GetMasternodePayment(int nHeight, int64_t blockValue) int64_t GetDevOpsPayment(int nHeight, int64_t blockValue) { int64_t ret2 = 0; - ret2 = blockValue - (250 * COIN); // 50 XDN per block + ret2 = 50 * COIN; // 50 XDN per block return ret2; } diff --git a/src/blockparams.h b/src/blockparams.h index 630f2a2c..f382ff88 100644 --- a/src/blockparams.h +++ b/src/blockparams.h @@ -31,12 +31,13 @@ enum DiffMode { DIFF_VRX = 1, // Retarget using Terminal-Velocity-RateX }; -void VRXswngPoSdebug(); -void VRXswngPoWdebug(); +void VRXswngdebug(); void VRXdebug(); void GNTdebug(); void VRX_BaseEngine(const CBlockIndex* pindexLast, bool fProofOfStake); +void VRX_Simulate_Retarget(); void VRX_ThreadCurve(const CBlockIndex* pindexLast, bool fProofOfStake); +void VRX_Dry_Run(const CBlockIndex* pindexLast); unsigned int VRX_Retarget(const CBlockIndex* pindexLast, bool fProofOfStake); unsigned int GetNextTargetRequired(const CBlockIndex* pindexLast, bool fProofOfStake); int64_t GetProofOfWorkReward(int nHeight, int64_t nFees); diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 9d424ab1..15cc8856 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -102,8 +102,7 @@ class CMainParams : public CChainParams { nPoolMaxTransactions = 9; strMNenginePoolDummyAddress = "dUnVN6zz2apaoWkb5krGoBCwwo8ZD3axue"; - strDevOpsAddress = "dSCXLHTZJJqTej8ZRszZxbLrS6dDGVJhw7"; - strDevOpsScriptPubKey = "76a9148c2fad4e8bdfdc047ad5ad5378084de415e1538988ac"; + strDevOpsAddress = "dHy3LZvqX5B2rAAoLiA7Y7rpvkLXKTkD18"; nEndPoWBlock = 0x7fffffff; nStartPoSBlock = 0; } diff --git a/src/chainparams.h b/src/chainparams.h index b6b194ea..60b94bf7 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -73,7 +73,6 @@ class CChainParams int PoolMaxTransactions() const { return nPoolMaxTransactions; } std::string MNenginePoolDummyAddress() const { return strMNenginePoolDummyAddress; } std::string DevOpsAddress() const { return strDevOpsAddress; } - std::string DevOpsPubKey() const { return strDevOpsScriptPubKey; } protected: CChainParams() {}; @@ -93,7 +92,6 @@ class CChainParams int nPoolMaxTransactions; std::string strMNenginePoolDummyAddress; std::string strDevOpsAddress; - std::string strDevOpsScriptPubKey; }; /** diff --git a/src/clientversion.h b/src/clientversion.h index eaf0b25f..447ced82 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -9,7 +9,7 @@ #define CLIENT_VERSION_MAJOR 1 #define CLIENT_VERSION_MINOR 0 #define CLIENT_VERSION_REVISION 1 -#define CLIENT_VERSION_BUILD 4 +#define CLIENT_VERSION_BUILD 5 // Set to true for release, false for prerelease or test build #define CLIENT_VERSION_IS_RELEASE true diff --git a/src/fork.h b/src/fork.h index 090546a7..57d4bb18 100644 --- a/src/fork.h +++ b/src/fork.h @@ -12,6 +12,8 @@ static const int64_t nReservePhaseStart = 1; /** Masternode/Devops Payment Update 1 **/ static const int64_t nPaymentUpdate_1 = 1558310400; +/** Masternode/Devops Payment Update 2 **/ +static const int64_t nPaymentUpdate_2 = 1561402800; /** Velocity toggle block */ static const int64_t VELOCITY_TOGGLE = 175; // Implementation of the Velocity system into the chain. /** Velocity retarget toggle block */ diff --git a/src/init.cpp b/src/init.cpp index b5a0b224..8a631133 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -548,6 +548,9 @@ bool AppInit2(boost::thread_group& threadGroup) //ignore masternodes below protocol version nMasternodeMinProtocol = GetArg("-masternodeminprotocol", MIN_POOL_PEER_PROTO_VERSION); + //log startup time for advanced Masternode checks delay (required for proper sync) + nMasterNodeChecksDelayBaseTime = GetTime(); + if (fDaemon) fprintf(stdout, "DigitalNote server starting\n"); diff --git a/src/main.cpp b/src/main.cpp index c5192d2c..c74ecad8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2629,9 +2629,12 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c int64_t nDevopsPayment = 0; int64_t nProofOfIndexMasternode = 0; int64_t nProofOfIndexDevops = 0; + int64_t nMasterNodeChecksDelay = 30 * 60; + int64_t nMasterNodeChecksEngageTime = 0; const CBlockIndex* pindexPrev = pindexBest->pprev; bool isProofOfStake = !IsProofOfWork(); bool fBlockHasPayments = true; + // Define primitives depending if PoW/PoS if (isProofOfStake) { nProofOfIndexMasternode = 2; nProofOfIndexDevops = 3; @@ -2654,9 +2657,16 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c } nStandardPayment = GetProofOfWorkReward(nBestHeight, 0); } + // Set payout values depending if PoW/PoS nMasternodePayment = GetMasternodePayment(pindexBest->nHeight, nStandardPayment) / COIN; nDevopsPayment = GetDevOpsPayment(pindexBest->nHeight, nStandardPayment) / COIN; LogPrintf("Hardset MasternodePayment: %lu | Hardset DevOpsPayment: %lu \n", nMasternodePayment, nDevopsPayment); + // Increase time for Masternode checks delay during sync per-block + if (fIsInitialDownload) { + nMasterNodeChecksDelayBaseTime = GetTime(); + } else { + nMasterNodeChecksEngageTime = nMasterNodeChecksDelayBaseTime + nMasterNodeChecksDelay; + } // Check PoW or PoS payments for current block for (unsigned int i=0; i < vtx[isProofOfStake].vout.size(); i++) { // Define values @@ -2677,10 +2687,13 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c } else if (addressOut.ToString() == Params().DevOpsAddress()) { LogPrintf("CheckBlock() : PoS Recipient masternode address validity succesfully verified\n"); } else { - LogPrintf("CheckBlock() : PoS Recipient masternode address validity could not be verified\n"); - if (!fIsInitialDownload) { - LogPrintf("CheckBlock() : PoS Recipient masternode address validity disabled at this time...\n"); - // fBlockHasPayments = false; + if (nMasterNodeChecksEngageTime != 0) { + if (nMasterNodeChecksEngageTime < GetTime()) { + LogPrintf("CheckBlock() : PoS Recipient masternode address validity could not be verified\n"); + fBlockHasPayments = false; + } else { + LogPrintf("CheckBlock() : PoS Recipient masternode address validity skipping, Checks delay still active!\n"); + } } else { LogPrintf("CheckBlock() : PoS Recipient masternode address validity skipping, syncing in progress!\n"); } @@ -2697,14 +2710,27 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c if (addressOut.ToString() == Params().DevOpsAddress()) { LogPrintf("CheckBlock() : PoS Recipient devops address validity succesfully verified\n"); } else { - LogPrintf("CheckBlock() : PoS Recipient devops address validity could not be verified\n"); - fBlockHasPayments = false; + if (pindexBest->GetBlockTime() > nPaymentUpdate_2) { + LogPrintf("CheckBlock() : PoS Recipient devops address validity could not be verified\n"); + fBlockHasPayments = false; + } else { + LogPrintf("CheckBlock() : PoS Recipient devops address validity skipped, pre-enforcement phase\n"); + } } if (nIndexedDevopsPayment == nDevopsPayment) { LogPrintf("CheckBlock() : PoS Recipient devops amount validity succesfully verified\n"); } else { - LogPrintf("CheckBlock() : PoS Recipient devops amount validity could not be verified\n"); - fBlockHasPayments = false; + if (pindexBest->GetBlockTime() < nPaymentUpdate_2) { + LogPrintf("CheckBlock() : PoS Recipient devops amount validity could not be verified\n"); + fBlockHasPayments = false; + } else { + if (nIndexedDevopsPayment >= nDevopsPayment) { + LogPrintf("CheckBlock() : PoS Reciepient devops amount is abnormal due to large fee paid"); + } else { + LogPrintf("CheckBlock() : PoS Reciepient devops amount validity could not be verified"); + fBlockHasPayments = false; + } + } } } } @@ -2717,10 +2743,13 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c } else if (addressOut.ToString() == Params().DevOpsAddress()) { LogPrintf("CheckBlock() : PoW Recipient masternode address validity succesfully verified\n"); } else { - LogPrintf("CheckBlock() : PoW Recipient masternode address validity could not be verified\n"); - if (!fIsInitialDownload) { - LogPrintf("CheckBlock() : PoW Recipient masternode address validity disabled at this time...\n"); - // fBlockHasPayments = false; + if (nMasterNodeChecksEngageTime != 0) { + if (nMasterNodeChecksEngageTime < GetTime()) { + LogPrintf("CheckBlock() : PoW Recipient masternode address validity could not be verified\n"); + fBlockHasPayments = false; + } else { + LogPrintf("CheckBlock() : PoW Recipient masternode address validity skipping, Checks delay still active!\n"); + } } else { LogPrintf("CheckBlock() : PoW Recipient masternode address validity skipping, syncing in progress!\n"); } @@ -2737,14 +2766,27 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c if (addressOut.ToString() == Params().DevOpsAddress()) { LogPrintf("CheckBlock() : PoW Recipient devops address validity succesfully verified\n"); } else { - LogPrintf("CheckBlock() : PoW Recipient devops address validity could not be verified\n"); - fBlockHasPayments = false; + if (pindexBest->GetBlockTime() > nPaymentUpdate_2) { + LogPrintf("CheckBlock() : PoW Recipient devops address validity could not be verified\n"); + fBlockHasPayments = false; + } else { + LogPrintf("CheckBlock() : PoW Recipient devops address validity skipped, pre-enforcement phase\n"); + } } if (nAmount == nDevopsPayment) { LogPrintf("CheckBlock() : PoW Recipient devops amount validity succesfully verified\n"); } else { - LogPrintf("CheckBlock() : PoW Recipient devops amount validity could not be verified\n"); - fBlockHasPayments = false; + if (pindexBest->GetBlockTime() < nPaymentUpdate_2) { + LogPrintf("CheckBlock() : PoW Recipient devops amount validity could not be verified\n"); + fBlockHasPayments = false; + } else { + if (nIndexedDevopsPayment >= nDevopsPayment) { + LogPrintf("CheckBlock() : PoW Reciepient devops amount is abnormal due to large fee paid"); + } else { + LogPrintf("CheckBlock() : PoW Reciepient devops amount validity could not be verified"); + fBlockHasPayments = false; + } + } } } } diff --git a/src/miner.cpp b/src/miner.cpp index e4975ad7..9be986df 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -396,7 +396,7 @@ CBlock* CreateNewBlock(CReserveKey& reservekey, bool fProofOfStake, int64_t* pFe // CBitcoinAddress devopaddress; if (Params().NetworkID() == CChainParams::MAIN) - devopaddress = CBitcoinAddress("dSCXLHTZJJqTej8ZRszZxbLrS6dDGVJhw7"); // TODO: nothing, already set to a valid DigitalNote address + devopaddress = CBitcoinAddress("dHy3LZvqX5B2rAAoLiA7Y7rpvkLXKTkD18"); // TODO: nothing, already set to a valid DigitalNote address else if (Params().NetworkID() == CChainParams::TESTNET) devopaddress = CBitcoinAddress(""); else if (Params().NetworkID() == CChainParams::REGTEST) diff --git a/src/net.cpp b/src/net.cpp index bda0b318..52c4e22e 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1267,24 +1267,35 @@ void ThreadSocketHandler() if (GetTime() - pnode->nTimeConnected > IDLE_TIMEOUT) { + // First see if we've received/sent anything if (pnode->nLastRecv == 0 || pnode->nLastSend == 0) { + // Disconnect if we have a completely stale connection LogPrint("net", "socket no message in timeout, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0); pnode->fDisconnect = true; pnode->CloseSocketDisconnect(); } + // Send timeout else if (GetTime() - pnode->nLastSend > DATA_TIMEOUT) { LogPrintf("socket not sending\n"); pnode->fDisconnect = true; pnode->CloseSocketDisconnect(); } + // Receive timeout else if (GetTime() - pnode->nLastRecv > DATA_TIMEOUT) { LogPrintf("socket inactivity timeout\n"); pnode->fDisconnect = true; pnode->CloseSocketDisconnect(); } + // Ping timeout + else if (pnode->nPingNonceSent && pnode->nPingUsecStart + TIMEOUT_INTERVAL * 1000000 < GetTimeMicros()) + { + LogPrintf("ping timeout: %fs\n", 0.000001 * (GetTimeMicros() - pnode->nPingUsecStart)); + pnode->fDisconnect = true; + pnode->CloseSocketDisconnect(); + } } } { diff --git a/src/net.h b/src/net.h index f98e7ef6..5a32667b 100644 --- a/src/net.h +++ b/src/net.h @@ -42,11 +42,11 @@ namespace boost { /** Time between pings automatically sent out for latency probing and keepalive (in seconds). */ static const int PING_INTERVAL = 1 * 60; /** Time after which to disconnect, after waiting for a ping response (or inactivity). */ -static const int TIMEOUT_INTERVAL = 20 * 60; +static const int TIMEOUT_INTERVAL = 30 * 60; /** Time between cycles to check for idle nodes, force disconnect (seconds) **/ -static const int IDLE_TIMEOUT = 4 * 60; +static const int IDLE_TIMEOUT = 15 * 60; /** Time between cycles to check for idle nodes, force disconnect (seconds) **/ -static const int DATA_TIMEOUT = 3 * 60; +static const int DATA_TIMEOUT = 30 * 60; /** Maximum length of strSubVer in `version` message */ static const unsigned int MAX_SUBVERSION_LENGTH = 256; /** The maximum number of entries in an 'inv' protocol message */ diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 0ef7622d..d0a44cfa 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -656,59 +656,61 @@ Value getblocktemplate(const Array& params, bool fHelp) } Array aVotes; - Object result; + + // Define coinbase payment + int64_t networkPayment = pblock->vtx[0].vout[0].nValue; + + // Standard values result.push_back(Pair("version", pblock->nVersion)); result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); result.push_back(Pair("transactions", transactions)); - result.push_back(Pair("coinbaseaux", aux)); - result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue)); - result.push_back(Pair("target", hashTarget.GetHex())); - result.push_back(Pair("mintime", (int64_t)pindexPrev->GetPastTimeLimit()+1)); - result.push_back(Pair("mutable", aMutable)); - result.push_back(Pair("noncerange", "00000000ffffffff")); - result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS)); - result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SIZE)); - result.push_back(Pair("curtime", (int64_t)pblock->nTime)); - result.push_back(Pair("bits", strprintf("%08x", pblock->nBits))); - result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); - result.push_back(Pair("votes", aVotes)); - // Check for payment upgrade fork if (pindexBest->GetBlockTime() > 0) { if (pindexBest->GetBlockTime() > nPaymentUpdate_1) // Monday, May 20, 2019 12:00:00 AM { // Set Masternode / DevOps payments - int64_t masternodePayment = GetMasternodePayment(pindexPrev->nHeight+1, (int64_t)pblock->vtx[0].vout[0].nValue); - int64_t devopsPayment = GetDevOpsPayment(pindexPrev->nHeight+1, (int64_t)pblock->vtx[0].vout[0].nValue); + int64_t masternodePayment = GetMasternodePayment(pindexPrev->nHeight+1, networkPayment); + int64_t devopsPayment = GetDevOpsPayment(pindexPrev->nHeight+1, networkPayment); // Include DevOps payments CAmount devopsSplit = devopsPayment; - Object devopsReward; - devopsReward.push_back(Pair("devopspayee", Params().DevOpsAddress())); - devopsReward.push_back(Pair("amount", devopsSplit)); - result.push_back(Pair("devopsreward", devopsReward)); - result.push_back(Pair("devops_reward_enforced", true)); + result.push_back(Pair("devops_payee", Params().DevOpsAddress())); + result.push_back(Pair("payee_amount", (int64_t)devopsSplit)); + result.push_back(Pair("devops_payments", true)); + result.push_back(Pair("enforce_devops_payments", true)); // Include Masternode payments CAmount masternodeSplit = masternodePayment; CMasternode* winningNode = mnodeman.GetCurrentMasterNode(1); - if (winningNode) { CScript payee = GetScriptForDestination(winningNode->pubkey.GetID()); CTxDestination address1; ExtractDestination(payee, address1); CBitcoinAddress address2(address1); - result.push_back(Pair("payee", address2.ToString().c_str())); + result.push_back(Pair("masternode_payee", address2.ToString().c_str())); } else { - result.push_back(Pair("payee", Params().DevOpsAddress().c_str())); + result.push_back(Pair("masternode_payee", Params().DevOpsAddress().c_str())); } result.push_back(Pair("payee_amount", (int64_t)masternodeSplit)); result.push_back(Pair("masternode_payments", true)); result.push_back(Pair("enforce_masternode_payments", true)); } } + // Standard values cont... + result.push_back(Pair("coinbaseaux", aux)); + result.push_back(Pair("coinbasevalue", networkPayment)); + result.push_back(Pair("target", hashTarget.GetHex())); + result.push_back(Pair("mintime", (int64_t)pindexPrev->GetPastTimeLimit()+1)); + result.push_back(Pair("mutable", aMutable)); + result.push_back(Pair("noncerange", "00000000ffffffff")); + result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS)); + result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SIZE)); + result.push_back(Pair("curtime", (int64_t)pblock->nTime)); + result.push_back(Pair("bits", strprintf("%08x", pblock->nBits))); + result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); + result.push_back(Pair("votes", aVotes)); return result; } diff --git a/src/util.cpp b/src/util.cpp index 10e74bf0..dcf10799 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -90,7 +90,7 @@ int64_t enforceMasternodePaymentsTime = 4085657524; int nMasternodeMinProtocol = 0; bool fSucessfullyLoaded = false; bool fEnableMNengine = false; - +//Standard features map mapArgs; map > mapMultiArgs; bool fDebug = false; @@ -105,10 +105,11 @@ string strMiscWarning; bool fNoListen = false; bool fLogTimestamps = false; volatile bool fReopenDebugLog = false; - //Live fork toggle string strLiveForkToggle = ""; int64_t nLiveForkToggle = 0; +//MasterNode recipient verification delay base time +int64_t nMasterNodeChecksDelayBaseTime = 0; // Init OpenSSL library multithreading support static CCriticalSection** ppmutexOpenSSL; diff --git a/src/util.h b/src/util.h index 802eeb9c..df8705bd 100644 --- a/src/util.h +++ b/src/util.h @@ -145,6 +145,8 @@ extern volatile bool fReopenDebugLog; //Live fork toggle extern std::string strLiveForkToggle; extern int64_t nLiveForkToggle; +//MasterNode recipient verification delay base time +extern int64_t nMasterNodeChecksDelayBaseTime; void RandAddSeed(); void RandAddSeedPerfmon(); diff --git a/src/version.h b/src/version.h index 28a8fed2..830b0aac 100644 --- a/src/version.h +++ b/src/version.h @@ -30,7 +30,7 @@ static const int DATABASE_VERSION = 70509; // // network protocol versioning // -static const int PROTOCOL_VERSION = 62011; +static const int PROTOCOL_VERSION = 62012; // intial proto version, to be increased after version/verack negotiation static const int INIT_PROTO_VERSION = 209; @@ -57,7 +57,7 @@ static const int NOBLKS_VERSION_START = 0; static const int NOBLKS_VERSION_END = 62008; // hard cutoff time for legacy network connections -static const int64_t HRD_LEGACY_CUTOFF = 9993058800; // OFF (NOT TOGGLED) +static const int64_t HRD_LEGACY_CUTOFF = 1561402800; // ON (Monday, Jun 24, 2019 12:00:00 PM PDT) // hard cutoff time for future network connections static const int64_t HRD_FUTURE_CUTOFF = 9993058800; // OFF (NOT TOGGLED) diff --git a/src/wallet.cpp b/src/wallet.cpp index 3592dc97..5d02a9c1 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -3053,7 +3053,7 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int // define address CBitcoinAddress devopaddress; if (Params().NetworkID() == CChainParams::MAIN) - devopaddress = CBitcoinAddress("dSCXLHTZJJqTej8ZRszZxbLrS6dDGVJhw7"); // TODO: nothing, already set to a valid DigitalNote address + devopaddress = CBitcoinAddress("dHy3LZvqX5B2rAAoLiA7Y7rpvkLXKTkD18"); // TODO: nothing, already set to a valid DigitalNote address else if (Params().NetworkID() == CChainParams::TESTNET) devopaddress = CBitcoinAddress(""); else if (Params().NetworkID() == CChainParams::REGTEST)