better local address discovery for active mn (#1203)
* Make local address discovery more robust in CActiveMasternode * parameter interaction: -masternode=1 -> setting -listen=1 * slightly postpone first run to give net thread a chance to connect to some peers * make sure local address detected in CActiveMasternode::ManageStateInitial is valid * Simplified address detection logic
This commit is contained in:
parent
84c242fc8c
commit
88ee7a372e
@ -127,10 +127,43 @@ bool CActiveMasternode::SendMasternodePing()
|
|||||||
void CActiveMasternode::ManageStateInitial()
|
void CActiveMasternode::ManageStateInitial()
|
||||||
{
|
{
|
||||||
LogPrint("masternode", "CActiveMasternode::ManageStateInitial -- status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled);
|
LogPrint("masternode", "CActiveMasternode::ManageStateInitial -- status = %s, type = %s, pinger enabled = %d\n", GetStatus(), GetTypeString(), fPingerEnabled);
|
||||||
|
|
||||||
// Check that our local network configuration is correct
|
// Check that our local network configuration is correct
|
||||||
if(!GetLocal(service)) {
|
if (!fListen) {
|
||||||
|
// listen option is probably overwritten by smth else, no good
|
||||||
nState = ACTIVE_MASTERNODE_NOT_CAPABLE;
|
nState = ACTIVE_MASTERNODE_NOT_CAPABLE;
|
||||||
strNotCapableReason = "Can't detect external address. Please consider using the externalip configuration option if problem persists.";
|
strNotCapableReason = "Masternode must accept connections from outside. Make sure listen configuration option is not overwritten by some another parameter.";
|
||||||
|
LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fFoundLocal = false;
|
||||||
|
{
|
||||||
|
LOCK(cs_vNodes);
|
||||||
|
|
||||||
|
// First try to find whatever local address is specified by externalip option
|
||||||
|
fFoundLocal = GetLocal(service) && CMasternode::IsValidNetAddr(service);
|
||||||
|
if(!fFoundLocal) {
|
||||||
|
// nothing and no live connections, can't do anything for now
|
||||||
|
if (vNodes.empty()) {
|
||||||
|
nState = ACTIVE_MASTERNODE_NOT_CAPABLE;
|
||||||
|
strNotCapableReason = "Can't detect valid external address. Will retry when there are some connections available.";
|
||||||
|
LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// We have some peers, let's try to find our local address from one of them
|
||||||
|
BOOST_FOREACH(CNode* pnode, vNodes) {
|
||||||
|
if (pnode->fSuccessfullyConnected && pnode->addr.IsIPv4()) {
|
||||||
|
fFoundLocal = GetLocal(service, &pnode->addr) && CMasternode::IsValidNetAddr(service);
|
||||||
|
if(fFoundLocal) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!fFoundLocal) {
|
||||||
|
nState = ACTIVE_MASTERNODE_NOT_CAPABLE;
|
||||||
|
strNotCapableReason = "Can't detect valid external address. Please consider using the externalip configuration option if problem persists. Make sure to use IPv4 address only.";
|
||||||
LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason);
|
LogPrintf("CActiveMasternode::ManageStateInitial -- %s: %s\n", GetStateString(), strNotCapableReason);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -150,7 +183,7 @@ void CActiveMasternode::ManageStateInitial()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogPrintf("CActiveMasternode::ManageState -- Checking inbound connection to '%s'\n", service.ToString());
|
LogPrintf("CActiveMasternode::ManageStateInitial -- Checking inbound connection to '%s'\n", service.ToString());
|
||||||
|
|
||||||
if(!ConnectNode((CAddress)service, NULL, true)) {
|
if(!ConnectNode((CAddress)service, NULL, true)) {
|
||||||
nState = ACTIVE_MASTERNODE_NOT_CAPABLE;
|
nState = ACTIVE_MASTERNODE_NOT_CAPABLE;
|
||||||
|
@ -2479,8 +2479,8 @@ void ThreadCheckDarkSendPool()
|
|||||||
nTick++;
|
nTick++;
|
||||||
|
|
||||||
// check if we should activate or ping every few minutes,
|
// check if we should activate or ping every few minutes,
|
||||||
// start right after sync is considered to be done
|
// slightly postpone first run to give net thread a chance to connect to some peers
|
||||||
if(nTick % MASTERNODE_MIN_MNP_SECONDS == 1)
|
if(nTick % MASTERNODE_MIN_MNP_SECONDS == 15)
|
||||||
activeMasternode.ManageState();
|
activeMasternode.ManageState();
|
||||||
|
|
||||||
mnodeman.Check();
|
mnodeman.Check();
|
||||||
|
@ -797,6 +797,12 @@ void InitParameterInteraction()
|
|||||||
LogPrintf("%s: parameter interaction: -whitebind set -> setting -listen=1\n", __func__);
|
LogPrintf("%s: parameter interaction: -whitebind set -> setting -listen=1\n", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GetBoolArg("-masternode", false)) {
|
||||||
|
// masternodes must accept connections from outside
|
||||||
|
if (SoftSetBoolArg("-listen", true))
|
||||||
|
LogPrintf("%s: parameter interaction: -masternode=1 -> setting -listen=1\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
if (mapArgs.count("-connect") && mapMultiArgs["-connect"].size() > 0) {
|
if (mapArgs.count("-connect") && mapMultiArgs["-connect"].size() > 0) {
|
||||||
// when only connecting to trusted nodes, do not seed via DNS, or listen by default
|
// when only connecting to trusted nodes, do not seed via DNS, or listen by default
|
||||||
if (SoftSetBoolArg("-dnsseed", false))
|
if (SoftSetBoolArg("-dnsseed", false))
|
||||||
|
@ -273,11 +273,16 @@ void CMasternode::Check(bool fForce)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CMasternode::IsValidNetAddr()
|
bool CMasternode::IsValidNetAddr()
|
||||||
|
{
|
||||||
|
return IsValidNetAddr(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CMasternode::IsValidNetAddr(CService addrIn)
|
||||||
{
|
{
|
||||||
// TODO: regtest is fine with any addresses for now,
|
// TODO: regtest is fine with any addresses for now,
|
||||||
// should probably be a bit smarter if one day we start to implement tests for this
|
// should probably be a bit smarter if one day we start to implement tests for this
|
||||||
return Params().NetworkIDString() == CBaseChainParams::REGTEST ||
|
return Params().NetworkIDString() == CBaseChainParams::REGTEST ||
|
||||||
(addr.IsIPv4() && IsReachable(addr) && addr.IsRoutable());
|
(addrIn.IsIPv4() && IsReachable(addrIn) && addrIn.IsRoutable());
|
||||||
}
|
}
|
||||||
|
|
||||||
masternode_info_t CMasternode::GetInfo()
|
masternode_info_t CMasternode::GetInfo()
|
||||||
|
@ -274,6 +274,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool IsValidNetAddr();
|
bool IsValidNetAddr();
|
||||||
|
static bool IsValidNetAddr(CService addrIn);
|
||||||
|
|
||||||
void IncreasePoSeBanScore() { if(nPoSeBanScore < MASTERNODE_POSE_BAN_MAX_SCORE) nPoSeBanScore++; }
|
void IncreasePoSeBanScore() { if(nPoSeBanScore < MASTERNODE_POSE_BAN_MAX_SCORE) nPoSeBanScore++; }
|
||||||
void DecreasePoSeBanScore() { if(nPoSeBanScore > -MASTERNODE_POSE_BAN_MAX_SCORE) nPoSeBanScore--; }
|
void DecreasePoSeBanScore() { if(nPoSeBanScore > -MASTERNODE_POSE_BAN_MAX_SCORE) nPoSeBanScore--; }
|
||||||
|
Loading…
Reference in New Issue
Block a user