diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index c37fac0824..c572a4b4bf 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -37,7 +37,7 @@ void CActiveMasternode::ManageStatus() return; } } else { - service = CService(strMasterNodeAddr); + service = CService(strMasterNodeAddr); } LogPrintf("CActiveMasternode::ManageStatus() - Checking inbound connection to '%s'\n", service.ToString().c_str()); @@ -101,8 +101,8 @@ void CActiveMasternode::ManageStatus() if(!darkSendSigner.SetKey(strMasterNodePrivKey, errorMessage, keyMasternode, pubKeyMasternode)) { - LogPrintf("Register::ManageStatus() - Error upon calling SetKey: %s\n", errorMessage.c_str()); - return; + LogPrintf("Register::ManageStatus() - Error upon calling SetKey: %s\n", errorMessage.c_str()); + return; } /* donations are not supported in dash.conf */ @@ -128,63 +128,63 @@ void CActiveMasternode::ManageStatus() // Send stop dseep to network for remote Masternode bool CActiveMasternode::StopMasterNode(std::string strService, std::string strKeyMasternode, std::string& errorMessage) { - CTxIn vin; + CTxIn vin; CKey keyMasternode; CPubKey pubKeyMasternode; if(!darkSendSigner.SetKey(strKeyMasternode, errorMessage, keyMasternode, pubKeyMasternode)) { - LogPrintf("CActiveMasternode::StopMasterNode() - Error: %s\n", errorMessage.c_str()); - return false; - } + LogPrintf("CActiveMasternode::StopMasterNode() - Error: %s\n", errorMessage.c_str()); + return false; + } - return StopMasterNode(vin, CService(strService), keyMasternode, pubKeyMasternode, errorMessage); + return StopMasterNode(vin, CService(strService), keyMasternode, pubKeyMasternode, errorMessage); } // Send stop dseep to network for main Masternode bool CActiveMasternode::StopMasterNode(std::string& errorMessage) { - if(status != MASTERNODE_IS_CAPABLE && status != MASTERNODE_REMOTELY_ENABLED) { - errorMessage = "Masternode is not in a running status"; - LogPrintf("CActiveMasternode::StopMasterNode() - Error: %s\n", errorMessage.c_str()); - return false; - } + if(status != MASTERNODE_IS_CAPABLE && status != MASTERNODE_REMOTELY_ENABLED) { + errorMessage = "Masternode is not in a running status"; + LogPrintf("CActiveMasternode::StopMasterNode() - Error: %s\n", errorMessage.c_str()); + return false; + } - status = MASTERNODE_STOPPED; + status = MASTERNODE_STOPPED; CPubKey pubKeyMasternode; CKey keyMasternode; if(!darkSendSigner.SetKey(strMasterNodePrivKey, errorMessage, keyMasternode, pubKeyMasternode)) { - LogPrintf("Register::ManageStatus() - Error upon calling SetKey: %s\n", errorMessage.c_str()); - return false; + LogPrintf("Register::ManageStatus() - Error upon calling SetKey: %s\n", errorMessage.c_str()); + return false; } - return StopMasterNode(vin, service, keyMasternode, pubKeyMasternode, errorMessage); + return StopMasterNode(vin, service, keyMasternode, pubKeyMasternode, errorMessage); } // Send stop dseep to network for any Masternode bool CActiveMasternode::StopMasterNode(CTxIn vin, CService service, CKey keyMasternode, CPubKey pubKeyMasternode, std::string& errorMessage) { - pwalletMain->UnlockCoin(vin.prevout); - return Dseep(vin, service, keyMasternode, pubKeyMasternode, errorMessage, true); + pwalletMain->UnlockCoin(vin.prevout); + return Dseep(vin, service, keyMasternode, pubKeyMasternode, errorMessage, true); } bool CActiveMasternode::Dseep(std::string& errorMessage) { - if(status != MASTERNODE_IS_CAPABLE && status != MASTERNODE_REMOTELY_ENABLED) { - errorMessage = "Masternode is not in a running status"; - LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", errorMessage.c_str()); - return false; - } + if(status != MASTERNODE_IS_CAPABLE && status != MASTERNODE_REMOTELY_ENABLED) { + errorMessage = "Masternode is not in a running status"; + LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", errorMessage.c_str()); + return false; + } CPubKey pubKeyMasternode; CKey keyMasternode; if(!darkSendSigner.SetKey(strMasterNodePrivKey, errorMessage, keyMasternode, pubKeyMasternode)) { - LogPrintf("Register::ManageStatus() - Error upon calling SetKey: %s\n", errorMessage.c_str()); - return false; + LogPrintf("CActiveMasternode::Dseep() - Error upon calling SetKey: %s\n", errorMessage.c_str()); + return false; } - return Dseep(vin, service, keyMasternode, pubKeyMasternode, errorMessage, false); + return Dseep(vin, service, keyMasternode, pubKeyMasternode, errorMessage, false); } bool CActiveMasternode::Dseep(CTxIn vin, CService service, CKey keyMasternode, CPubKey pubKeyMasternode, std::string &retErrorMessage, bool stop) { @@ -196,14 +196,14 @@ bool CActiveMasternode::Dseep(CTxIn vin, CService service, CKey keyMasternode, C std::string strMessage = service.ToString() + boost::lexical_cast(masterNodeSignatureTime) + boost::lexical_cast(stop); if(!darkSendSigner.SignMessage(strMessage, errorMessage, vchMasterNodeSignature, keyMasternode)) { - retErrorMessage = "sign message failed: " + errorMessage; - LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", retErrorMessage.c_str()); + retErrorMessage = "sign message failed: " + errorMessage; + LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", retErrorMessage.c_str()); return false; } if(!darkSendSigner.VerifyMessage(pubKeyMasternode, vchMasterNodeSignature, strMessage, errorMessage)) { - retErrorMessage = "Verify message failed: " + errorMessage; - LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", retErrorMessage.c_str()); + retErrorMessage = "Verify message failed: " + errorMessage; + LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", retErrorMessage.c_str()); return false; } @@ -215,9 +215,9 @@ bool CActiveMasternode::Dseep(CTxIn vin, CService service, CKey keyMasternode, C } else { - // Seems like we are trying to send a ping while the Masternode is not registered in the network - retErrorMessage = "Darksend Masternode List doesn't include our Masternode, Shutting down Masternode pinging service! " + vin.ToString(); - LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", retErrorMessage.c_str()); + // Seems like we are trying to send a ping while the Masternode is not registered in the network + retErrorMessage = "Darksend Masternode List doesn't include our Masternode, Shutting down Masternode pinging service! " + vin.ToString(); + LogPrintf("CActiveMasternode::Dseep() - Error: %s\n", retErrorMessage.c_str()); status = MASTERNODE_NOT_CAPABLE; notCapableReason = retErrorMessage; return false; @@ -231,7 +231,7 @@ bool CActiveMasternode::Dseep(CTxIn vin, CService service, CKey keyMasternode, C } bool CActiveMasternode::Register(std::string strService, std::string strKeyMasternode, std::string txHash, std::string strOutputIndex, std::string strDonationAddress, std::string strDonationPercentage, std::string& errorMessage) { - CTxIn vin; + CTxIn vin; CPubKey pubKeyCollateralAddress; CKey keyCollateralAddress; CPubKey pubKeyMasternode; @@ -241,22 +241,22 @@ bool CActiveMasternode::Register(std::string strService, std::string strKeyMaste if(!darkSendSigner.SetKey(strKeyMasternode, errorMessage, keyMasternode, pubKeyMasternode)) { - LogPrintf("CActiveMasternode::Register() - Error upon calling SetKey: %s\n", errorMessage.c_str()); - return false; + LogPrintf("CActiveMasternode::Register() - Error upon calling SetKey: %s\n", errorMessage.c_str()); + return false; } if(!GetMasterNodeVin(vin, pubKeyCollateralAddress, keyCollateralAddress, txHash, strOutputIndex)) { - errorMessage = "could not allocate vin"; - LogPrintf("Register::Register() - Error: %s\n", errorMessage.c_str()); - return false; - } + errorMessage = "could not allocate vin"; + LogPrintf("CActiveMasternode::Register() - Error: %s\n", errorMessage.c_str()); + return false; + } CBitcoinAddress address; - if (strDonationAddress != "") + if (strDonationAddress != "") { if(!address.SetString(strDonationAddress)) { - LogPrintf("Register::Register - Invalid Donation Address\n"); + LogPrintf("CActiveMasternode::Register - Invalid Donation Address\n"); return false; } donationAddress.SetDestination(address.Get()); @@ -264,18 +264,18 @@ bool CActiveMasternode::Register(std::string strService, std::string strKeyMaste try { donationPercentage = boost::lexical_cast( strDonationPercentage ); } catch( boost::bad_lexical_cast const& ) { - LogPrintf("Register::Register - Invalid Donation Percentage (Couldn't cast)\n"); + LogPrintf("CActiveMasternode::Register - Invalid Donation Percentage (Couldn't cast)\n"); return false; } if(donationPercentage < 0 || donationPercentage > 100) { - LogPrintf("Register::Register - Donation Percentage Out Of Range\n"); + LogPrintf("CActiveMasternode::Register - Donation Percentage Out Of Range\n"); return false; } } - return Register(vin, CService(strService), keyCollateralAddress, pubKeyCollateralAddress, keyMasternode, pubKeyMasternode, donationAddress, donationPercentage, errorMessage); + return Register(vin, CService(strService), keyCollateralAddress, pubKeyCollateralAddress, keyMasternode, pubKeyMasternode, donationAddress, donationPercentage, errorMessage); } bool CActiveMasternode::Register(CTxIn vin, CService service, CKey keyCollateralAddress, CPubKey pubKeyCollateralAddress, CKey keyMasternode, CPubKey pubKeyMasternode, CScript donationAddress, int donationPercentage, std::string &retErrorMessage) { @@ -290,16 +290,16 @@ bool CActiveMasternode::Register(CTxIn vin, CService service, CKey keyCollateral std::string strMessage = service.ToString() + boost::lexical_cast(masterNodeSignatureTime) + vchPubKey + vchPubKey2 + boost::lexical_cast(PROTOCOL_VERSION) + donationAddress.ToString() + boost::lexical_cast(donationPercentage); if(!darkSendSigner.SignMessage(strMessage, errorMessage, vchMasterNodeSignature, keyCollateralAddress)) { - retErrorMessage = "sign message failed: " + errorMessage; - LogPrintf("CActiveMasternode::Register() - Error: %s\n", retErrorMessage.c_str()); - return false; + retErrorMessage = "sign message failed: " + errorMessage; + LogPrintf("CActiveMasternode::Register() - Error: %s\n", retErrorMessage.c_str()); + return false; } if(!darkSendSigner.VerifyMessage(pubKeyCollateralAddress, vchMasterNodeSignature, strMessage, errorMessage)) { - retErrorMessage = "Verify message failed: " + errorMessage; - LogPrintf("CActiveMasternode::Register() - Error: %s\n", retErrorMessage.c_str()); - return false; - } + retErrorMessage = "Verify message failed: " + errorMessage; + LogPrintf("CActiveMasternode::Register() - Error: %s\n", retErrorMessage.c_str()); + return false; + } CMasternode* pmn = mnodeman.Find(vin); if(pmn == NULL) @@ -318,7 +318,7 @@ bool CActiveMasternode::Register(CTxIn vin, CService service, CKey keyCollateral } bool CActiveMasternode::GetMasterNodeVin(CTxIn& vin, CPubKey& pubkey, CKey& secretKey) { - return GetMasterNodeVin(vin, pubkey, secretKey, "", ""); + return GetMasterNodeVin(vin, pubkey, secretKey, "", ""); } bool CActiveMasternode::GetMasterNodeVin(CTxIn& vin, CPubKey& pubkey, CKey& secretKey, std::string strTxHash, std::string strOutputIndex) { @@ -329,35 +329,35 @@ bool CActiveMasternode::GetMasterNodeVin(CTxIn& vin, CPubKey& pubkey, CKey& secr COutput *selectedOutput; // Find the vin - if(!strTxHash.empty()) { - // Let's find it - uint256 txHash(strTxHash); + if(!strTxHash.empty()) { + // Let's find it + uint256 txHash(strTxHash); int outputIndex = boost::lexical_cast(strOutputIndex); - bool found = false; - BOOST_FOREACH(COutput& out, possibleCoins) { - if(out.tx->GetHash() == txHash && out.i == outputIndex) - { - selectedOutput = &out; - found = true; - break; - } - } - if(!found) { - LogPrintf("CActiveMasternode::GetMasterNodeVin - Could not locate valid vin\n"); - return false; - } - } else { - // No output specified, Select the first one - if(possibleCoins.size() > 0) { - selectedOutput = &possibleCoins[0]; - } else { - LogPrintf("CActiveMasternode::GetMasterNodeVin - Could not locate specified vin from possible list\n"); - return false; - } + bool found = false; + BOOST_FOREACH(COutput& out, possibleCoins) { + if(out.tx->GetHash() == txHash && out.i == outputIndex) + { + selectedOutput = &out; + found = true; + break; + } + } + if(!found) { + LogPrintf("CActiveMasternode::GetMasterNodeVin - Could not locate valid vin\n"); + return false; + } + } else { + // No output specified, Select the first one + if(possibleCoins.size() > 0) { + selectedOutput = &possibleCoins[0]; + } else { + LogPrintf("CActiveMasternode::GetMasterNodeVin - Could not locate specified vin from possible list\n"); + return false; + } } - // At this point we have a selected output, retrieve the associated info - return GetVinFromOutput(*selectedOutput, vin, pubkey, secretKey); + // At this point we have a selected output, retrieve the associated info + return GetVinFromOutput(*selectedOutput, vin, pubkey, secretKey); } @@ -366,10 +366,10 @@ bool CActiveMasternode::GetVinFromOutput(COutput out, CTxIn& vin, CPubKey& pubke CScript pubScript; - vin = CTxIn(out.tx->GetHash(),out.i); + vin = CTxIn(out.tx->GetHash(),out.i); pubScript = out.tx->vout[out.i].scriptPubKey; // the inputs PubKey - CTxDestination address1; + CTxDestination address1; ExtractDestination(pubScript, address1); CBitcoinAddress address2(address1); @@ -401,7 +401,7 @@ vector CActiveMasternode::SelectCoinsMasternode() BOOST_FOREACH(const COutput& out, vCoins) { if(out.tx->vout[out.i].nValue == 1000*COIN) { //exactly - filteredCoins.push_back(out); + filteredCoins.push_back(out); } } return filteredCoins; diff --git a/src/darksend.cpp b/src/darksend.cpp index cc63168d3b..69f5d206a0 100644 --- a/src/darksend.cpp +++ b/src/darksend.cpp @@ -102,7 +102,8 @@ void CDarksendPool::ProcessMessageDarksend(CNode* pfrom, std::string& strCommand } } else if (strCommand == "dsq") { //Darksend Queue - LOCK(cs_darksend); + TRY_LOCK(cs_darksend, lockRecv); + if(!lockRecv) return; if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) { return; @@ -645,6 +646,7 @@ void CDarksendPool::SetNull(bool clearEverything){ } //automatically downgrade for 11.2, blinding will be supported in 11.3/12.0 + nTrickleInputsOutputs = INT_MAX; Downgrade(); // -- seed random number generator (used for ordering output lists) @@ -2508,7 +2510,6 @@ void CDarksendPool::RelayInAnon(std::vector& vin, std::vector& vo void CDarksendPool::RelayIn(const std::vector& vin, const int64_t& nAmount, const CTransaction& txCollateral, const std::vector& vout) { - LOCK(cs_vNodes); std::vector vin2; std::vector vout2; @@ -2519,6 +2520,7 @@ void CDarksendPool::RelayIn(const std::vector& vin, const int64_t& nAmo BOOST_FOREACH(CTxDSOut out, vout) vout2.push_back(out); + LOCK(cs_vNodes); BOOST_FOREACH(CNode* pnode, vNodes) { if(!pSubmittedToMasternode) return; diff --git a/src/darksend.h b/src/darksend.h index 9d25b7afa6..ea4b6aa7d9 100644 --- a/src/darksend.h +++ b/src/darksend.h @@ -7,6 +7,7 @@ #include "core.h" #include "main.h" +#include "sync.h" #include "activemasternode.h" #include "masternodeman.h" #include "darksend-relay.h" diff --git a/src/main.cpp b/src/main.cpp index 4358f2a0d2..130ad515ed 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2742,8 +2742,11 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd pos.nPos = infoLastBlockFile.nSize; } - infoLastBlockFile.nSize += nAddSize; infoLastBlockFile.AddBlock(nHeight, nTime); + if (fKnown) + infoLastBlockFile.nSize = std::max(pos.nPos + nAddSize, infoLastBlockFile.nSize); + else + infoLastBlockFile.nSize += nAddSize; if (!fKnown) { unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE; diff --git a/src/masternode.cpp b/src/masternode.cpp index 2bd0397794..5542c61738 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -7,6 +7,7 @@ #include "darksend.h" #include "core.h" #include "util.h" +#include "sync.h" #include "addrman.h" #include @@ -222,9 +223,11 @@ uint256 CMasternode::CalculateScore(int mod, int64_t nBlockHeight) void CMasternode::Check() { - LOCK(cs_main); + //TODO: Random segfault with this line removed + TRY_LOCK(cs_main, lockRecv); + if(!lockRecv) return; - if(nScanningErrorCount >= MASTERNODE_SCANNING_ERROR_THESHOLD) + if(nScanningErrorCount >= MASTERNODE_SCANNING_ERROR_THESHOLD) { activeState = MASTERNODE_POS_ERROR; return; @@ -396,7 +399,7 @@ bool CMasternodePayments::ProcessBlock(int nBlockHeight) if(!enabled) return false; CMasternodePaymentWinner newWinner; int nMinimumAge = mnodeman.CountEnabled(); - + uint256 hash; if(!GetBlockHash(hash, nBlockHeight-10)) return false; int nHash; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 261aa1686d..9f89dbe2b8 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -488,7 +488,7 @@ void CMasternodeMan::ProcessMasternodeConnections() LOCK(cs_vNodes); if(!darkSendPool.pSubmittedToMasternode) return; - + BOOST_FOREACH(CNode* pnode, vNodes) { if(darkSendPool.pSubmittedToMasternode->addr == pnode->addr) continue; @@ -557,7 +557,7 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData if(donationPercentage < 0 || donationPercentage > 100){ LogPrintf("dsee - donation percentage out of range %d\n", donationPercentage); - return; + return; } if(protocolVersion < nMasternodeMinProtocol) { diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index 93f8265140..eb664e7ca1 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -160,7 +160,7 @@ void OverviewPage::handleTransactionClicked(const QModelIndex &index) OverviewPage::~OverviewPage() { - disconnect(timer, SIGNAL(timeout()), this, SLOT(darkSendStatus())); + if(!fLiteMode) disconnect(timer, SIGNAL(timeout()), this, SLOT(darkSendStatus())); delete ui; }