Merge remote-tracking branch 'upstream/v0.11.2.x' into v0.11.2.x

This commit is contained in:
snogcel 2015-02-26 22:02:04 -07:00
commit 8001c48c71
13 changed files with 124 additions and 93 deletions

View File

@ -51,9 +51,10 @@ int RequestedMasterNodeList = 0;
void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream& vRecv) void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream& vRecv)
{ {
if(fLiteMode) return; //disable all darksend/masternode related functionality if(fLiteMode) return; //disable all darksend/masternode related functionality
if(IsInitialBlockDownload()) return;
if (strCommand == "dsf") { //DarkSend Final tx if (strCommand == "dsf") { //DarkSend Final tx
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
return; return;
} }
@ -76,7 +77,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
} }
else if (strCommand == "dsc") { //DarkSend Complete else if (strCommand == "dsc") { //DarkSend Complete
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
return; return;
} }
@ -100,7 +101,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
else if (strCommand == "dsa") { //DarkSend Acceptable else if (strCommand == "dsa") { //DarkSend Acceptable
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
std::string strError = _("Incompatible version."); std::string strError = _("Incompatible version.");
LogPrintf("dsa -- incompatible version! \n"); LogPrintf("dsa -- incompatible version! \n");
pfrom->PushMessage("dssu", darkSendPool.sessionID, darkSendPool.GetState(), darkSendPool.GetEntriesCount(), MASTERNODE_REJECTED, strError); pfrom->PushMessage("dssu", darkSendPool.sessionID, darkSendPool.GetState(), darkSendPool.GetEntriesCount(), MASTERNODE_REJECTED, strError);
@ -131,7 +132,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
if(darkSendPool.sessionUsers == 0) { if(darkSendPool.sessionUsers == 0) {
if(pmn->nLastDsq != 0 && if(pmn->nLastDsq != 0 &&
pmn->nLastDsq + mnodeman.CountMasternodesAboveProtocol(darkSendPool.MIN_PEER_PROTO_VERSION)/5 > darkSendPool.nDsqCount){ pmn->nLastDsq + mnodeman.CountMasternodesAboveProtocol(MIN_POOL_PEER_PROTO_VERSION)/5 > darkSendPool.nDsqCount){
LogPrintf("dsa -- last dsq too recent, must wait. %s \n", pmn->addr.ToString().c_str()); LogPrintf("dsa -- last dsq too recent, must wait. %s \n", pmn->addr.ToString().c_str());
std::string strError = _("Last Darksend was too recent."); std::string strError = _("Last Darksend was too recent.");
pfrom->PushMessage("dssu", darkSendPool.sessionID, darkSendPool.GetState(), darkSendPool.GetEntriesCount(), MASTERNODE_REJECTED, strError); pfrom->PushMessage("dssu", darkSendPool.sessionID, darkSendPool.GetState(), darkSendPool.GetEntriesCount(), MASTERNODE_REJECTED, strError);
@ -151,7 +152,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
} }
} else if (strCommand == "dsq") { //DarkSend Queue } else if (strCommand == "dsq") { //DarkSend Queue
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
return; return;
} }
@ -185,7 +186,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
if(fDebug) LogPrintf("dsq last %d last2 %d count %d\n", pmn->nLastDsq, pmn->nLastDsq + mnodeman.size()/5, darkSendPool.nDsqCount); if(fDebug) LogPrintf("dsq last %d last2 %d count %d\n", pmn->nLastDsq, pmn->nLastDsq + mnodeman.size()/5, darkSendPool.nDsqCount);
//don't allow a few nodes to dominate the queuing process //don't allow a few nodes to dominate the queuing process
if(pmn->nLastDsq != 0 && if(pmn->nLastDsq != 0 &&
pmn->nLastDsq + mnodeman.CountMasternodesAboveProtocol(darkSendPool.MIN_PEER_PROTO_VERSION)/5 > darkSendPool.nDsqCount){ pmn->nLastDsq + mnodeman.CountMasternodesAboveProtocol(MIN_POOL_PEER_PROTO_VERSION)/5 > darkSendPool.nDsqCount){
if(fDebug) LogPrintf("dsq -- masternode sending too many dsq messages. %s \n", pmn->addr.ToString().c_str()); if(fDebug) LogPrintf("dsq -- masternode sending too many dsq messages. %s \n", pmn->addr.ToString().c_str());
return; return;
} }
@ -201,7 +202,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
} else if (strCommand == "dsi") { //DarkSend vIn } else if (strCommand == "dsi") { //DarkSend vIn
std::string error = ""; std::string error = "";
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
LogPrintf("dsi -- incompatible version! \n"); LogPrintf("dsi -- incompatible version! \n");
error = _("Incompatible version."); error = _("Incompatible version.");
pfrom->PushMessage("dssu", darkSendPool.sessionID, darkSendPool.GetState(), darkSendPool.GetEntriesCount(), MASTERNODE_REJECTED, error); pfrom->PushMessage("dssu", darkSendPool.sessionID, darkSendPool.GetState(), darkSendPool.GetEntriesCount(), MASTERNODE_REJECTED, error);
@ -323,7 +324,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
} }
else if (strCommand == "dssub") { //DarkSend Subscribe To else if (strCommand == "dssub") { //DarkSend Subscribe To
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
return; return;
} }
@ -336,7 +337,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
else if (strCommand == "dssu") { //DarkSend status update else if (strCommand == "dssu") { //DarkSend status update
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
return; return;
} }
@ -364,7 +365,7 @@ void ProcessMessageDarksend(CNode* pfrom, std::string& strCommand, CDataStream&
} }
else if (strCommand == "dss") { //DarkSend Sign Final Tx else if (strCommand == "dss") { //DarkSend Sign Final Tx
if (pfrom->nVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if (pfrom->nVersion < MIN_POOL_PEER_PROTO_VERSION) {
return; return;
} }
@ -1543,7 +1544,7 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
int protocolVersion; int protocolVersion;
if(!dsq.GetProtocolVersion(protocolVersion)) continue; if(!dsq.GetProtocolVersion(protocolVersion)) continue;
if(protocolVersion < MIN_PEER_PROTO_VERSION) continue; if(protocolVersion < MIN_POOL_PEER_PROTO_VERSION) continue;
//non-denom's are incompatible //non-denom's are incompatible
if((dsq.nDenom & (1 << 4))) continue; if((dsq.nDenom & (1 << 4))) continue;
@ -1563,12 +1564,11 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
// connect to masternode and submit the queue request // connect to masternode and submit the queue request
if(ConnectNode((CAddress)addr, NULL, true)){ if(ConnectNode((CAddress)addr, NULL, true)){
submittedToMasternode = addr;
LOCK(cs_vNodes); LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes) BOOST_FOREACH(CNode* pnode, vNodes)
{ {
if((CNetAddr)pnode->addr != (CNetAddr)submittedToMasternode) continue; if((CNetAddr)pnode->addr != (CNetAddr)addr) continue;
std::string strReason; std::string strReason;
if(txCollateral == CTransaction()){ if(txCollateral == CTransaction()){
@ -1578,6 +1578,7 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
} }
} }
submittedToMasternode = addr;
vecMasternodesUsed.push_back(dsq.vin); vecMasternodesUsed.push_back(dsq.vin);
sessionDenom = dsq.nDenom; sessionDenom = dsq.nDenom;
@ -1601,34 +1602,38 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
// otherwise, try one randomly // otherwise, try one randomly
while(i < 10) while(i < 10)
{ {
CMasternode* mn = mnodeman.FindRandom(); CMasternode* pmn = mnodeman.FindRandom();
if(pmn == NULL)
{
LogPrintf("DoAutomaticDenominating --- masternode list is empty!\n");
return false;
}
//don't reuse masternodes //don't reuse masternodes
BOOST_FOREACH(CTxIn usedVin, vecMasternodesUsed) { BOOST_FOREACH(CTxIn usedVin, vecMasternodesUsed) {
if(mn->vin == usedVin){ if(pmn->vin == usedVin){
i++; i++;
continue; continue;
} }
} }
if(mn->protocolVersion < darkSendPool.MIN_PEER_PROTO_VERSION) { if(pmn->protocolVersion < MIN_POOL_PEER_PROTO_VERSION) {
i++; i++;
continue; continue;
} }
if(mn->nLastDsq != 0 && if(pmn->nLastDsq != 0 &&
mn->nLastDsq + mnodeman.CountMasternodesAboveProtocol(darkSendPool.MIN_PEER_PROTO_VERSION)/5 > darkSendPool.nDsqCount){ pmn->nLastDsq + mnodeman.CountMasternodesAboveProtocol(MIN_POOL_PEER_PROTO_VERSION)/5 > darkSendPool.nDsqCount){
i++; i++;
continue; continue;
} }
lastTimeChanged = GetTimeMillis(); lastTimeChanged = GetTimeMillis();
submittedToMasternode = mn->addr; LogPrintf("DoAutomaticDenominating -- attempt %d connection to masternode %s\n", i, pmn->addr.ToString().c_str());
LogPrintf("DoAutomaticDenominating -- attempt %d connection to masternode %s\n", i, mn->addr.ToString().c_str()); if(ConnectNode((CAddress)pmn->addr, NULL, true)){
if(ConnectNode((CAddress)mn->addr, NULL, true)){
LOCK(cs_vNodes); LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes) BOOST_FOREACH(CNode* pnode, vNodes)
{ {
if((CNetAddr)pnode->addr != (CNetAddr)mn->addr) continue; if((CNetAddr)pnode->addr != (CNetAddr)pmn->addr) continue;
std::string strReason; std::string strReason;
if(txCollateral == CTransaction()){ if(txCollateral == CTransaction()){
@ -1638,7 +1643,8 @@ bool CDarkSendPool::DoAutomaticDenominating(bool fDryRun, bool ready)
} }
} }
vecMasternodesUsed.push_back(mn->vin); submittedToMasternode = pmn->addr;
vecMasternodesUsed.push_back(pmn->vin);
std::vector<int64_t> vecAmounts; std::vector<int64_t> vecAmounts;
pwalletMain->ConvertList(vCoins, vecAmounts); pwalletMain->ConvertList(vCoins, vecAmounts);
@ -2193,7 +2199,7 @@ void ThreadCheckDarkSendPool()
LOCK(cs_vNodes); LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes) BOOST_FOREACH(CNode* pnode, vNodes)
{ {
if (pnode->nVersion >= darkSendPool.MIN_PEER_PROTO_VERSION) { if (pnode->nVersion >= MIN_POOL_PEER_PROTO_VERSION) {
//keep track of who we've asked for the list //keep track of who we've asked for the list
if(pnode->HasFulfilledRequest("mnsync")) continue; if(pnode->HasFulfilledRequest("mnsync")) continue;

View File

@ -38,6 +38,8 @@ class CActiveMasternode;
#define DARKSEND_QUEUE_TIMEOUT 120 #define DARKSEND_QUEUE_TIMEOUT 120
#define DARKSEND_SIGNING_TIMEOUT 30 #define DARKSEND_SIGNING_TIMEOUT 30
static const int MIN_POOL_PEER_PROTO_VERSION = 70067; // minimum peer version accepted by DarkSendPool
extern CDarkSendPool darkSendPool; extern CDarkSendPool darkSendPool;
extern CDarkSendSigner darkSendSigner; extern CDarkSendSigner darkSendSigner;
extern std::vector<CDarksendQueue> vecDarksendQueue; extern std::vector<CDarksendQueue> vecDarksendQueue;
@ -222,7 +224,6 @@ class CDarksendSession
class CDarkSendPool class CDarkSendPool
{ {
public: public:
static const int MIN_PEER_PROTO_VERSION = 70066;
// clients entries // clients entries
std::vector<CDarkSendEntry> myEntries; std::vector<CDarkSendEntry> myEntries;

View File

@ -37,6 +37,7 @@ void ProcessMessageInstantX(CNode* pfrom, std::string& strCommand, CDataStream&
{ {
if(fLiteMode) return; //disable all darksend/masternode related functionality if(fLiteMode) return; //disable all darksend/masternode related functionality
if(!IsSporkActive(SPORK_2_INSTANTX)) return; if(!IsSporkActive(SPORK_2_INSTANTX)) return;
if(IsInitialBlockDownload()) return;
if (strCommand == "txlreq") if (strCommand == "txlreq")
{ {

View File

@ -4826,6 +4826,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
//probably one the extensions //probably one the extensions
ProcessMessageDarksend(pfrom, strCommand, vRecv); ProcessMessageDarksend(pfrom, strCommand, vRecv);
mnodeman.ProcessMessage(pfrom, strCommand, vRecv); mnodeman.ProcessMessage(pfrom, strCommand, vRecv);
ProcessMessageMasternodePayments(pfrom, strCommand, vRecv);
ProcessMessageInstantX(pfrom, strCommand, vRecv); ProcessMessageInstantX(pfrom, strCommand, vRecv);
ProcessSpork(pfrom, strCommand, vRecv); ProcessSpork(pfrom, strCommand, vRecv);
} }

View File

@ -21,6 +21,8 @@ std::map<int64_t, uint256> mapCacheBlockHashes;
void ProcessMessageMasternodePayments(CNode* pfrom, std::string& strCommand, CDataStream& vRecv) void ProcessMessageMasternodePayments(CNode* pfrom, std::string& strCommand, CDataStream& vRecv)
{ {
if(IsInitialBlockDownload()) return;
if (strCommand == "mnget") { //Masternode Payments Request Sync if (strCommand == "mnget") { //Masternode Payments Request Sync
if(fLiteMode) return; //disable all darksend/masternode related functionality if(fLiteMode) return; //disable all darksend/masternode related functionality

View File

@ -276,47 +276,5 @@ public:
bool GetBlockPayee(int nBlockHeight, CScript& payee); bool GetBlockPayee(int nBlockHeight, CScript& payee);
}; };
/*//
// Masternode Scanning Error
// Enforces proof-of-service by scanning the masternode network
//
class CMasternodePayments
{
private:
std::vector<CMasternodePaymentWinner> vWinning;
int nSyncedFromPeer;
std::string strMasterPrivKey;
std::string strTestPubKey;
std::string strMainPubKey;
public:
CMasternodePayments() {
strMainPubKey = "04549ac134f694c0243f503e8c8a9a986f5de6610049c40b07816809b0d1d06a21b07be27b9bb555931773f62ba6cf35a25fd52f694d4e1106ccd237a7bb899fdd";
strTestPubKey = "046f78dcf911fbd61910136f7f0f8d90578f68d0b3ac973b5040fb7afb501b5939f39b108b0569dca71488f5bbf498d92e4d1194f6f941307ffd95f75e76869f0e";
}
bool SetPrivKey(std::string strPrivKey);
bool CheckSignature(CMasternodePaymentWinner& winner);
bool Sign(CMasternodePaymentWinner& winner);
// Deterministically calculate a given "score" for a masternode depending on how close it's hash is
// to the blockHeight. The further away they are the better, the furthest will win the election
// and get paid this block
//
uint64_t CalculateScore(uint256 blockHash, CTxIn& vin);
bool GetWinningMasternode(int nBlockHeight, CTxIn& vinOut);
bool AddWinningMasternode(CMasternodePaymentWinner& winner);
bool ProcessBlock(int nBlockHeight);
void Relay(CMasternodePaymentWinner& winner);
void Sync(CNode* node);
void CleanPaymentList();
int LastPayment(CMasterNode& mn);
//slow
bool GetBlockPayee(int nBlockHeight, CScript& payee);
};*/
#endif #endif

View File

@ -175,25 +175,31 @@ void CMasternodeMan::CheckAndRemove()
// check who's asked for the masternode list // check who's asked for the masternode list
map<CNetAddr, int64_t>::iterator it1 = mAskedUsForMasternodeList.begin(); map<CNetAddr, int64_t>::iterator it1 = mAskedUsForMasternodeList.begin();
while(it1 != mAskedUsForMasternodeList.end()){ while(it1 != mAskedUsForMasternodeList.end()){
if((*it1).second < GetTime()) if((*it1).second < GetTime()) {
it1 = mAskedUsForMasternodeList.erase(it1); mAskedUsForMasternodeList.erase(it1++);
else ++it1; } else {
++it1;
}
} }
// check who we asked for the masternode list // check who we asked for the masternode list
it1 = mWeAskedForMasternodeList.begin(); it1 = mWeAskedForMasternodeList.begin();
while(it1 != mWeAskedForMasternodeList.end()){ while(it1 != mWeAskedForMasternodeList.end()){
if((*it1).second < GetTime()) if((*it1).second < GetTime()){
it1 = mWeAskedForMasternodeList.erase(it1); mWeAskedForMasternodeList.erase(it1++);
else ++it1; } else {
++it1;
}
} }
// check which masternodes we've asked for // check which masternodes we've asked for
map<COutPoint, int64_t>::iterator it2 = mWeAskedForMasternodeListEntry.begin(); map<COutPoint, int64_t>::iterator it2 = mWeAskedForMasternodeListEntry.begin();
while(it2 != mWeAskedForMasternodeListEntry.end()){ while(it2 != mWeAskedForMasternodeListEntry.end()){
if((*it2).second < GetTime()) if((*it2).second < GetTime()){
it2 = mWeAskedForMasternodeListEntry.erase(it2); mWeAskedForMasternodeListEntry.erase(it2++);
else ++it2; } else {
++it2;
}
} }
} }
@ -225,6 +231,8 @@ int CMasternodeMan::CountMasternodesAboveProtocol(int protocolVersion)
void CMasternodeMan::DsegUpdate(CNode* pnode) void CMasternodeMan::DsegUpdate(CNode* pnode)
{ {
LOCK(cs);
std::map<CNetAddr, int64_t>::iterator it = mWeAskedForMasternodeList.find(pnode->addr); std::map<CNetAddr, int64_t>::iterator it = mWeAskedForMasternodeList.find(pnode->addr);
if (it != mWeAskedForMasternodeList.end()) if (it != mWeAskedForMasternodeList.end())
{ {

View File

@ -84,7 +84,7 @@ public:
void CheckAndRemove(); void CheckAndRemove();
// Clear masternode vector // Clear masternode vector
void Clear() { vMasternodes.clear(); } void Clear() { LOCK(cs); vMasternodes.clear(); }
int CountEnabled(); int CountEnabled();

View File

@ -95,7 +95,28 @@ Value masternode(const Array& params, bool fHelp)
(strCommand != "start" && strCommand != "start-alias" && strCommand != "start-many" && strCommand != "stop" && strCommand != "stop-alias" && strCommand != "stop-many" && strCommand != "list" && strCommand != "list-conf" && strCommand != "count" && strCommand != "enforce" (strCommand != "start" && strCommand != "start-alias" && strCommand != "start-many" && strCommand != "stop" && strCommand != "stop-alias" && strCommand != "stop-many" && strCommand != "list" && strCommand != "list-conf" && strCommand != "count" && strCommand != "enforce"
&& strCommand != "debug" && strCommand != "current" && strCommand != "winners" && strCommand != "genkey" && strCommand != "connect" && strCommand != "outputs")) && strCommand != "debug" && strCommand != "current" && strCommand != "winners" && strCommand != "genkey" && strCommand != "connect" && strCommand != "outputs"))
throw runtime_error( throw runtime_error(
"masternode <start|start-alias|start-many|stop|stop-alias|stop-many|list|list-conf|count|debug|current|winners|genkey|enforce|outputs> [passphrase]\n"); "masternode \"command\"... ( \"passphrase\" )\n"
"Set of commands to execute masternode related actions\n"
"\nArguments:\n"
"1. \"command\" (string or set of strings, required) The command to execute\n"
"2. \"passphrase\" (string, optional) The wallet passphrase\n"
"\nAvailable commands:\n"
" count - Print number of all known masternodes (optional: 'enabled', 'both')\n"
" current - Print info on current masternode winner\n"
" debug - Print masternode status\n"
" genkey - Generate new masternodeprivkey\n"
" enforce - Enforce masternode payments\n"
" outputs - Print masternode compatible outputs\n"
" start - Start masternode configured in darkcoin.conf\n"
" start-alias - Start single masternode by assigned alias configured in masternode.conf\n"
" start-many - Start all masternodes configured in masternode.conf\n"
" stop - Stop masternode configured in darkcoin.conf\n"
" stop-alias - Stop single masternode by assigned alias configured in masternode.conf\n"
" stop-many - Stop all masternodes configured in masternode.conf\n"
" list - Print list of all known masternodes (see masternodelist for more info)\n"
" list-conf - Print masternode.conf in JSON format\n"
" winners - Print list of masternode winners\n"
);
if (strCommand == "stop") if (strCommand == "stop")
{ {
@ -250,7 +271,11 @@ Value masternode(const Array& params, bool fHelp)
throw runtime_error( throw runtime_error(
"too many parameters\n"); "too many parameters\n");
} }
if (params.size() == 2) return mnodeman.CountEnabled(); if (params.size() == 2)
{
if(params[1] == "enabled") return mnodeman.CountEnabled();
if(params[1] == "both") return boost::lexical_cast<std::string>(mnodeman.CountEnabled()) + " / " + boost::lexical_cast<std::string>(mnodeman.size());
}
return mnodeman.size(); return mnodeman.size();
} }
@ -431,7 +456,20 @@ Value masternode(const Array& params, bool fHelp)
{ {
CMasternode* winner = mnodeman.GetCurrentMasterNode(1); CMasternode* winner = mnodeman.GetCurrentMasterNode(1);
if(winner) { if(winner) {
return winner->addr.ToString().c_str(); Object obj;
CScript pubkey;
pubkey.SetDestination(winner->pubkey.GetID());
CTxDestination address1;
ExtractDestination(pubkey, address1);
CBitcoinAddress address2(address1);
obj.push_back(Pair("IP:port", winner->addr.ToString().c_str()));
obj.push_back(Pair("protocol", (int64_t)winner->protocolVersion));
obj.push_back(Pair("vin", winner->vin.prevout.hash.ToString().c_str()));
obj.push_back(Pair("pubkey", address2.ToString().c_str()));
obj.push_back(Pair("lastseen", (int64_t)winner->lastTimeSeen));
obj.push_back(Pair("activeseconds", (int64_t)(winner->lastTimeSeen - winner->now)));
return obj;
} }
return "unknown"; return "unknown";
@ -543,7 +581,7 @@ Value masternodelist(const Array& params, bool fHelp)
"\nArguments:\n" "\nArguments:\n"
"1. \"mode\" (string, optional, defauls = active) The mode to run list in\n" "1. \"mode\" (string, optional, defauls = active) The mode to run list in\n"
"2. \"filter\" (string, optional) Filter results, can be applied in few modes only\n" "2. \"filter\" (string, optional) Filter results, can be applied in few modes only\n"
"Available modes:\n" "\nAvailable modes:\n"
" active - Print '1' if active and '0' otherwise (can be filtered, exact match)\n" " active - Print '1' if active and '0' otherwise (can be filtered, exact match)\n"
" activeseconds - Print number of seconds masternode recognized by the network as enabled\n" " activeseconds - Print number of seconds masternode recognized by the network as enabled\n"
" full - Print info in format 'active | protocol | pubkey | vin | lastseen | activeseconds' (can be filtered, partial match)\n" " full - Print info in format 'active | protocol | pubkey | vin | lastseen | activeseconds' (can be filtered, partial match)\n"
@ -561,10 +599,12 @@ Value masternodelist(const Array& params, bool fHelp)
std::string strAddr = mn.addr.ToString().c_str(); std::string strAddr = mn.addr.ToString().c_str();
if(strMode == "active"){ if(strMode == "active"){
if(strFilter !="" && stoi(strFilter) != mn.IsEnabled()) continue; if(strFilter !="" && strFilter != boost::lexical_cast<std::string>(mn.IsEnabled()) &&
mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, (int)mn.IsEnabled())); obj.push_back(Pair(strAddr, (int)mn.IsEnabled()));
} else if (strMode == "vin") { } else if (strMode == "vin") {
if(strFilter !="" && mn.vin.prevout.hash.ToString().find(strFilter) == string::npos) continue; if(strFilter !="" && mn.vin.prevout.hash.ToString().find(strFilter) == string::npos &&
mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, mn.vin.prevout.hash.ToString().c_str())); obj.push_back(Pair(strAddr, mn.vin.prevout.hash.ToString().c_str()));
} else if (strMode == "pubkey") { } else if (strMode == "pubkey") {
CScript pubkey; CScript pubkey;
@ -573,16 +613,23 @@ Value masternodelist(const Array& params, bool fHelp)
ExtractDestination(pubkey, address1); ExtractDestination(pubkey, address1);
CBitcoinAddress address2(address1); CBitcoinAddress address2(address1);
if(strFilter !="" && address2.ToString().find(strFilter) == string::npos) continue; if(strFilter !="" && address2.ToString().find(strFilter) == string::npos &&
mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, address2.ToString().c_str())); obj.push_back(Pair(strAddr, address2.ToString().c_str()));
} else if (strMode == "protocol") { } else if (strMode == "protocol") {
if(strFilter !="" && stoi(strFilter) != mn.protocolVersion) continue; if(strFilter !="" && strFilter != boost::lexical_cast<std::string>(mn.protocolVersion) &&
mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, (int64_t)mn.protocolVersion)); obj.push_back(Pair(strAddr, (int64_t)mn.protocolVersion));
} else if (strMode == "lastseen") { } else if (strMode == "lastseen") {
if(strFilter !="" && mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, (int64_t)mn.lastTimeSeen)); obj.push_back(Pair(strAddr, (int64_t)mn.lastTimeSeen));
} else if (strMode == "activeseconds") { } else if (strMode == "activeseconds") {
if(strFilter !="" && mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, (int64_t)(mn.lastTimeSeen - mn.now))); obj.push_back(Pair(strAddr, (int64_t)(mn.lastTimeSeen - mn.now)));
} else if (strMode == "rank") { } else if (strMode == "rank") {
if(strFilter !="" && mn.addr.ToString().find(strFilter) == string::npos) continue;
obj.push_back(Pair(strAddr, (int)(mnodeman.GetMasternodeRank(mn.vin, chainActive.Tip()->nHeight)))); obj.push_back(Pair(strAddr, (int)(mnodeman.GetMasternodeRank(mn.vin, chainActive.Tip()->nHeight))));
} else if (strMode == "full") { } else if (strMode == "full") {
CScript pubkey; CScript pubkey;

View File

@ -457,9 +457,14 @@ Value getblocktemplate(const Array& params, bool fHelp)
" \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n" " \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
" \"bits\" : \"xxx\", (string) compressed target of next block\n" " \"bits\" : \"xxx\", (string) compressed target of next block\n"
" \"height\" : n (numeric) The height of the next block\n" " \"height\" : n (numeric) The height of the next block\n"
" \"payee\" : required payee\n" " \"payee\" : \"xxx\", (string) required payee for the next block\n"
" \"payee_amount\" : required amount to pay\n" " \"payee_amount\" : n, (numeric) required amount to pay\n"
" \"votes\" : show vote candidates for this block\n" " \"votes\" : [\n (array) show vote candidates\n"
" { ... } (json object) vote candidate\n"
" ,...\n"
" ],\n"
" \"masternode_payments\" : true|false, (boolean) true, if masternode payments are enabled"
" \"enforce_masternode_payments\" : true|false (boolean) true, if masternode payments are enforced"
"}\n" "}\n"
"\nExamples:\n" "\nExamples:\n"

View File

@ -270,12 +270,12 @@ static const CRPCCommand vRPCCommands[] =
{ "verifymessage", &verifymessage, false, false, false }, { "verifymessage", &verifymessage, false, false, false },
/* Darkcoin features */ /* Darkcoin features */
{ "darksend", &darksend, false, false, true },
{ "spork", &spork, true, false, false }, { "spork", &spork, true, false, false },
{ "masternode", &masternode, true, false, true }, { "masternode", &masternode, true, false, true },
{ "masternodelist", &masternodelist, true, false, false }, { "masternodelist", &masternodelist, true, false, false },
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET
{ "darksend", &darksend, false, false, true },
/* Wallet */ /* Wallet */
{ "addmultisigaddress", &addmultisigaddress, false, false, true }, { "addmultisigaddress", &addmultisigaddress, false, false, true },
{ "backupwallet", &backupwallet, true, false, true }, { "backupwallet", &backupwallet, true, false, true },

View File

@ -19,9 +19,11 @@ using namespace boost;
class CSporkMessage; class CSporkMessage;
class CSporkManager; class CSporkManager;
CSporkManager sporkManager;
std::map<uint256, CSporkMessage> mapSporks; std::map<uint256, CSporkMessage> mapSporks;
std::map<int, CSporkMessage> mapSporksActive; std::map<int, CSporkMessage> mapSporksActive;
CSporkManager sporkManager;
void ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStream& vRecv) void ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStream& vRecv)
{ {

View File

@ -27,7 +27,7 @@ extern const std::string CLIENT_DATE;
// network protocol versioning // network protocol versioning
// //
static const int PROTOCOL_VERSION = 70066; static const int PROTOCOL_VERSION = 70067;
// intial proto version, to be increased after version/verack negotiation // intial proto version, to be increased after version/verack negotiation
static const int INIT_PROTO_VERSION = 209; static const int INIT_PROTO_VERSION = 209;