fixed ranking issues for PoSe

This commit is contained in:
Evan Duffield 2015-03-23 05:59:22 -07:00
parent 0e35ed5cb6
commit 4152eea1c1
4 changed files with 26 additions and 8 deletions

View File

@ -197,7 +197,7 @@ void CDarksendPool::ProcessMessageDarksend(CNode* pfrom, std::string& strCommand
For added DDOS protection, clients can only relay through 20 nodes per block.
*/
int rank = mnodeman.GetMasternodeRank(activeMasternode.vin, dsr.nBlockHeight, MIN_POOL_PEER_PROTO_VERSION);
if(rank > 20){
if(rank == -1 || rank > 20){
LogPrintf("dsr -- invalid relay Masternode! %s \n", activeMasternode.vin.ToString().c_str());
return;
}

View File

@ -78,16 +78,22 @@ void ProcessMessageMasternodePOS(CNode* pfrom, std::string& strCommand, CDataStr
return;
}
int nBlockHeight = chainActive.Tip()->nHeight;
if(nBlockHeight - mnse.nBlockHeight > 10){
LogPrintf("MasternodePOS::mnse - Too old\n");
return;
}
// Lowest masternodes in rank check the highest each block
int a = mnodeman.GetMasternodeRank(mnse.vinMasternodeA, mnse.nBlockHeight, MIN_MASTERNODE_POS_PROTO_VERSION);
if(a > GetCountScanningPerBlock())
if(a == -1 || a > GetCountScanningPerBlock())
{
LogPrintf("MasternodePOS::mnse - MasternodeA ranking is too high\n");
return;
}
int b = mnodeman.GetMasternodeRank(mnse.vinMasternodeB, mnse.nBlockHeight, MIN_MASTERNODE_POS_PROTO_VERSION, false);
if(b < mnodeman.CountMasternodesAboveProtocol(MIN_MASTERNODE_POS_PROTO_VERSION)-GetCountScanningPerBlock())
if(b == -1 || b < mnodeman.CountMasternodesAboveProtocol(MIN_MASTERNODE_POS_PROTO_VERSION)-GetCountScanningPerBlock())
{
LogPrintf("MasternodePOS::mnse - MasternodeB ranking is too low\n");
return;
@ -139,28 +145,30 @@ void CMasternodeScanning::DoMasternodePOSChecks()
if(!IsSporkActive(SPORK_7_MASTERNODE_SCANNING)) return;
if(IsInitialBlockDownload()) return;
int a = mnodeman.GetMasternodeRank(activeMasternode.vin, chainActive.Tip()->nHeight, MIN_MASTERNODE_POS_PROTO_VERSION);
if(a > GetCountScanningPerBlock()){
int nBlockHeight = chainActive.Tip()->nHeight-5;
int a = mnodeman.GetMasternodeRank(activeMasternode.vin, nBlockHeight, MIN_MASTERNODE_POS_PROTO_VERSION);
if(a == -1 || a > GetCountScanningPerBlock()){
// we don't need to do anything this block
return;
}
// The lowest ranking nodes (Masternode A) check the highest ranking nodes (Masternode B)
CMasternode* pmn = mnodeman.GetMasternodeByRank(mnodeman.CountMasternodesAboveProtocol(MIN_MASTERNODE_POS_PROTO_VERSION)-a, chainActive.Tip()->nHeight, MIN_MASTERNODE_POS_PROTO_VERSION, false);
CMasternode* pmn = mnodeman.GetMasternodeByRank(mnodeman.CountMasternodesAboveProtocol(MIN_MASTERNODE_POS_PROTO_VERSION)-a, nBlockHeight, MIN_MASTERNODE_POS_PROTO_VERSION, false);
if(pmn == NULL) return;
// -- first check : Port is open
if(!ConnectNode((CAddress)pmn->addr, NULL, true)){
// we couldn't connect to the node, let's send a scanning error
CMasternodeScanningError mnse(activeMasternode.vin, pmn->vin, SCANNING_ERROR_NO_RESPONSE, chainActive.Tip()->nHeight);
CMasternodeScanningError mnse(activeMasternode.vin, pmn->vin, SCANNING_ERROR_NO_RESPONSE, nBlockHeight);
mnse.Sign();
mapMasternodeScanningErrors.insert(make_pair(mnse.GetHash(), mnse));
mnse.Relay();
}
// success
CMasternodeScanningError mnse(activeMasternode.vin, pmn->vin, SCANNING_SUCCESS, chainActive.Tip()->nHeight);
CMasternodeScanningError mnse(activeMasternode.vin, pmn->vin, SCANNING_SUCCESS, nBlockHeight);
mnse.Sign();
mapMasternodeScanningErrors.insert(make_pair(mnse.GetHash(), mnse));
mnse.Relay();

View File

@ -52,6 +52,7 @@ enum masternodeState {
};
void ProcessMessageMasternodePayments(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);
bool GetBlockHash(uint256& hash, int nBlockHeight);
//
// The Masternode Class. For managing the Darksend process. It contains the input of the 1000DRK, signature to prove

View File

@ -3,6 +3,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "masternodeman.h"
#include "masternode.h"
#include "activemasternode.h"
#include "darksend.h"
#include "core.h"
@ -383,6 +384,10 @@ int CMasternodeMan::GetMasternodeRank(const CTxIn& vin, int64_t nBlockHeight, in
{
std::vector<pair<unsigned int, CTxIn> > vecMasternodeScores;
//make sure we know about this block
uint256 hash = 0;
if(!GetBlockHash(hash, nBlockHeight)) return -1;
// scan for winner
BOOST_FOREACH(CMasternode& mn, vMasternodes) {
@ -418,6 +423,10 @@ std::vector<pair<int, CMasternode> > CMasternodeMan::GetMasternodeRanks(int64_t
std::vector<pair<unsigned int, CMasternode> > vecMasternodeScores;
std::vector<pair<int, CMasternode> > vecMasternodeRanks;
//make sure we know about this block
uint256 hash = 0;
if(!GetBlockHash(hash, nBlockHeight)) return vecMasternodeRanks;
// scan for winner
BOOST_FOREACH(CMasternode& mn, vMasternodes) {