mirror of
https://github.com/dashpay/dash.git
synced 2024-12-28 05:23:01 +01:00
Merge remote-tracking branch 'upstream/v0.11.2.x' into v0.11.2.x
This commit is contained in:
commit
8001c48c71
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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")
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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())
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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"
|
||||||
|
@ -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 },
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user