mirror of
https://github.com/dashpay/dash.git
synced 2024-12-28 21:42:47 +01:00
net: handle version push in InitializeNode
This commit is contained in:
parent
7588b85cd2
commit
902768099c
30
src/main.cpp
30
src/main.cpp
@ -18,6 +18,7 @@
|
|||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "merkleblock.h"
|
#include "merkleblock.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
|
#include "netbase.h"
|
||||||
#include "policy/fees.h"
|
#include "policy/fees.h"
|
||||||
#include "policy/policy.h"
|
#include "policy/policy.h"
|
||||||
#include "pow.h"
|
#include "pow.h"
|
||||||
@ -354,12 +355,37 @@ void UpdatePreferredDownload(CNode* node, CNodeState* state)
|
|||||||
nPreferredDownload += state->fPreferredDownload;
|
nPreferredDownload += state->fPreferredDownload;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeNode(NodeId nodeid, const CNode *pnode) {
|
void PushNodeVersion(CNode *pnode, CConnman& connman, int64_t nTime)
|
||||||
|
{
|
||||||
|
ServiceFlags nLocalNodeServices = pnode->GetLocalServices();
|
||||||
|
uint64_t nonce = pnode->GetLocalNonce();
|
||||||
|
int nNodeStartingHeight = pnode->GetMyStartingHeight();
|
||||||
|
NodeId nodeid = pnode->GetId();
|
||||||
|
CAddress addr = pnode->addr;
|
||||||
|
|
||||||
|
CAddress addrYou = (addr.IsRoutable() && !IsProxy(addr) ? addr : CAddress(CService(), addr.nServices));
|
||||||
|
CAddress addrMe = CAddress(CService(), nLocalNodeServices);
|
||||||
|
|
||||||
|
connman.PushMessageWithVersion(pnode, INIT_PROTO_VERSION, NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,
|
||||||
|
nonce, strSubVersion, nNodeStartingHeight, ::fRelayTxes);
|
||||||
|
|
||||||
|
if (fLogIPs)
|
||||||
|
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addrMe.ToString(), addrYou.ToString(), nodeid);
|
||||||
|
else
|
||||||
|
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addrMe.ToString(), nodeid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeNode(CNode *pnode, CConnman& connman) {
|
||||||
CAddress addr = pnode->addr;
|
CAddress addr = pnode->addr;
|
||||||
std::string addrName = pnode->addrName;
|
std::string addrName = pnode->addrName;
|
||||||
|
NodeId nodeid = pnode->GetId();
|
||||||
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
mapNodeState.emplace_hint(mapNodeState.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(addr, std::move(addrName)));
|
mapNodeState.emplace_hint(mapNodeState.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(addr, std::move(addrName)));
|
||||||
}
|
}
|
||||||
|
if(!pnode->fInbound)
|
||||||
|
PushNodeVersion(pnode, connman, GetTime());
|
||||||
|
}
|
||||||
|
|
||||||
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
|
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
|
||||||
fUpdateConnectionTime = false;
|
fUpdateConnectionTime = false;
|
||||||
@ -5118,7 +5144,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||||||
|
|
||||||
// Be shy and don't send version until we hear
|
// Be shy and don't send version until we hear
|
||||||
if (pfrom->fInbound)
|
if (pfrom->fInbound)
|
||||||
connman.PushVersion(pfrom, GetAdjustedTime());
|
PushNodeVersion(pfrom, connman, GetAdjustedTime());
|
||||||
|
|
||||||
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK);
|
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK);
|
||||||
|
|
||||||
|
34
src/net.cpp
34
src/net.cpp
@ -393,21 +393,15 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
|
|||||||
NodeId id = GetNewNodeId();
|
NodeId id = GetNewNodeId();
|
||||||
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
|
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
|
||||||
CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addrConnect, CalculateKeyedNetGroup(addrConnect), nonce, pszDest ? pszDest : "", false);
|
CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addrConnect, CalculateKeyedNetGroup(addrConnect), nonce, pszDest ? pszDest : "", false);
|
||||||
|
pnode->nServicesExpected = ServiceFlags(addrConnect.nServices & nRelevantServices);
|
||||||
|
pnode->nTimeConnected = GetTime();
|
||||||
PushVersion(pnode, GetTime());
|
|
||||||
|
|
||||||
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
|
|
||||||
pnode->AddRef();
|
pnode->AddRef();
|
||||||
|
GetNodeSignals().InitializeNode(pnode, *this);
|
||||||
{
|
{
|
||||||
LOCK(cs_vNodes);
|
LOCK(cs_vNodes);
|
||||||
vNodes.push_back(pnode);
|
vNodes.push_back(pnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
pnode->nServicesExpected = ServiceFlags(addrConnect.nServices & nRelevantServices);
|
|
||||||
pnode->nTimeConnected = GetTime();
|
|
||||||
|
|
||||||
return pnode;
|
return pnode;
|
||||||
} else if (!proxyConnectionFailed) {
|
} else if (!proxyConnectionFailed) {
|
||||||
// If connecting to the node failed, and failure is not caused by a problem connecting to
|
// If connecting to the node failed, and failure is not caused by a problem connecting to
|
||||||
@ -418,24 +412,6 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CConnman::PushVersion(CNode* pnode, int64_t nTime)
|
|
||||||
{
|
|
||||||
ServiceFlags nLocalNodeServices = pnode->GetLocalServices();
|
|
||||||
CAddress addrYou = (pnode->addr.IsRoutable() && !IsProxy(pnode->addr) ? pnode->addr : CAddress(CService(), pnode->addr.nServices));
|
|
||||||
CAddress addrMe = CAddress(CService(), nLocalNodeServices);
|
|
||||||
uint64_t nonce = pnode->GetLocalNonce();
|
|
||||||
int nNodeStartingHeight = pnode->nMyStartingHeight;
|
|
||||||
NodeId id = pnode->GetId();
|
|
||||||
|
|
||||||
PushMessageWithVersion(pnode, INIT_PROTO_VERSION, NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,
|
|
||||||
nonce, strSubVersion, nNodeStartingHeight, ::fRelayTxes);
|
|
||||||
|
|
||||||
if (fLogIPs)
|
|
||||||
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, them=%s, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addrMe.ToString(), addrYou.ToString(), id);
|
|
||||||
else
|
|
||||||
LogPrint("net", "send version message: version %d, blocks=%d, us=%s, peer=%d\n", PROTOCOL_VERSION, nNodeStartingHeight, addrMe.ToString(), id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CConnman::DumpBanlist()
|
void CConnman::DumpBanlist()
|
||||||
{
|
{
|
||||||
SweepBanned(); // clean unused entries (if bantime has expired)
|
SweepBanned(); // clean unused entries (if bantime has expired)
|
||||||
@ -1036,9 +1012,9 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
|
|||||||
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
|
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
|
||||||
|
|
||||||
CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addr, CalculateKeyedNetGroup(addr), nonce, "", true);
|
CNode* pnode = new CNode(id, nLocalServices, GetBestHeight(), hSocket, addr, CalculateKeyedNetGroup(addr), nonce, "", true);
|
||||||
GetNodeSignals().InitializeNode(pnode->GetId(), pnode);
|
|
||||||
pnode->AddRef();
|
pnode->AddRef();
|
||||||
pnode->fWhitelisted = whitelisted;
|
pnode->fWhitelisted = whitelisted;
|
||||||
|
GetNodeSignals().InitializeNode(pnode, *this);
|
||||||
|
|
||||||
LogPrint("net", "connection from %s accepted\n", addr.ToString());
|
LogPrint("net", "connection from %s accepted\n", addr.ToString());
|
||||||
|
|
||||||
@ -2130,7 +2106,7 @@ bool CConnman::Start(boost::thread_group& threadGroup, CScheduler& scheduler, st
|
|||||||
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
|
uint64_t nonce = GetDeterministicRandomizer(RANDOMIZER_ID_LOCALHOSTNONCE).Write(id).Finalize();
|
||||||
|
|
||||||
pnodeLocalHost = new CNode(id, nLocalServices, GetBestHeight(), INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices), 0, nonce);
|
pnodeLocalHost = new CNode(id, nLocalServices, GetBestHeight(), INVALID_SOCKET, CAddress(CService(local, 0), nLocalServices), 0, nonce);
|
||||||
GetNodeSignals().InitializeNode(pnodeLocalHost->GetId(), pnodeLocalHost);
|
GetNodeSignals().InitializeNode(pnodeLocalHost, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -163,9 +163,6 @@ public:
|
|||||||
PushMessageWithVersionAndFlag(pnode, 0, 0, sCommand, std::forward<Args>(args)...);
|
PushMessageWithVersionAndFlag(pnode, 0, 0, sCommand, std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PushVersion(CNode* pnode, int64_t nTime);
|
|
||||||
|
|
||||||
|
|
||||||
template<typename Callable>
|
template<typename Callable>
|
||||||
bool ForEachNodeContinueIf(Callable&& func)
|
bool ForEachNodeContinueIf(Callable&& func)
|
||||||
{
|
{
|
||||||
@ -462,7 +459,7 @@ struct CNodeSignals
|
|||||||
{
|
{
|
||||||
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> ProcessMessages;
|
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> ProcessMessages;
|
||||||
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> SendMessages;
|
boost::signals2::signal<bool (CNode*, CConnman&), CombinerAll> SendMessages;
|
||||||
boost::signals2::signal<void (NodeId, const CNode*)> InitializeNode;
|
boost::signals2::signal<void (CNode*, CConnman&)> InitializeNode;
|
||||||
boost::signals2::signal<void (NodeId, bool&)> FinalizeNode;
|
boost::signals2::signal<void (NodeId, bool&)> FinalizeNode;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -722,6 +719,10 @@ public:
|
|||||||
return nLocalHostNonce;
|
return nLocalHostNonce;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetMyStartingHeight() const {
|
||||||
|
return nMyStartingHeight;
|
||||||
|
}
|
||||||
|
|
||||||
int GetRefCount()
|
int GetRefCount()
|
||||||
{
|
{
|
||||||
assert(nRefCount >= 0);
|
assert(nRefCount >= 0);
|
||||||
|
@ -50,7 +50,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
|
|||||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
||||||
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 0, 0, "", true);
|
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 0, 0, "", true);
|
||||||
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
|
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
|
||||||
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
|
GetNodeSignals().InitializeNode(&dummyNode1, *connman);
|
||||||
dummyNode1.nVersion = 1;
|
dummyNode1.nVersion = 1;
|
||||||
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
|
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
|
||||||
SendMessages(&dummyNode1, *connman);
|
SendMessages(&dummyNode1, *connman);
|
||||||
@ -60,7 +60,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
|
|||||||
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
|
CAddress addr2(ip(0xa0b0c002), NODE_NONE);
|
||||||
CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, "", true);
|
CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, "", true);
|
||||||
dummyNode2.SetSendVersion(PROTOCOL_VERSION);
|
dummyNode2.SetSendVersion(PROTOCOL_VERSION);
|
||||||
GetNodeSignals().InitializeNode(dummyNode2.GetId(), &dummyNode2);
|
GetNodeSignals().InitializeNode(&dummyNode2, *connman);
|
||||||
dummyNode2.nVersion = 1;
|
dummyNode2.nVersion = 1;
|
||||||
Misbehaving(dummyNode2.GetId(), 50);
|
Misbehaving(dummyNode2.GetId(), 50);
|
||||||
SendMessages(&dummyNode2, *connman);
|
SendMessages(&dummyNode2, *connman);
|
||||||
@ -78,7 +78,7 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
|
|||||||
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
|
||||||
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, 1, "", true);
|
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, 1, "", true);
|
||||||
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
|
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
|
||||||
GetNodeSignals().InitializeNode(dummyNode1.GetId(), &dummyNode1);
|
GetNodeSignals().InitializeNode(&dummyNode1, *connman);
|
||||||
dummyNode1.nVersion = 1;
|
dummyNode1.nVersion = 1;
|
||||||
Misbehaving(dummyNode1.GetId(), 100);
|
Misbehaving(dummyNode1.GetId(), 100);
|
||||||
SendMessages(&dummyNode1, *connman);
|
SendMessages(&dummyNode1, *connman);
|
||||||
@ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
|||||||
CAddress addr(ip(0xa0b0c001), NODE_NONE);
|
CAddress addr(ip(0xa0b0c001), NODE_NONE);
|
||||||
CNode dummyNode(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr, 4, 4, "", true);
|
CNode dummyNode(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr, 4, 4, "", true);
|
||||||
dummyNode.SetSendVersion(PROTOCOL_VERSION);
|
dummyNode.SetSendVersion(PROTOCOL_VERSION);
|
||||||
GetNodeSignals().InitializeNode(dummyNode.GetId(), &dummyNode);
|
GetNodeSignals().InitializeNode(&dummyNode, *connman);
|
||||||
dummyNode.nVersion = 1;
|
dummyNode.nVersion = 1;
|
||||||
|
|
||||||
Misbehaving(dummyNode.GetId(), 100);
|
Misbehaving(dummyNode.GetId(), 100);
|
||||||
|
Loading…
Reference in New Issue
Block a user