@ -18,6 +18,7 @@
@@ -18,6 +18,7 @@
# include "init.h"
# include "merkleblock.h"
# include "net.h"
# include "netbase.h"
# include "policy/fees.h"
# include "policy/policy.h"
# include "pow.h"
@ -257,7 +258,7 @@ struct CBlockReject {
@@ -257,7 +258,7 @@ struct CBlockReject {
*/
struct CNodeState {
//! The peer's address
CService address ;
const CService address ;
//! Whether we have a fully established connection.
bool fCurrentlyConnected ;
//! Accumulated misbehaviour score for this peer.
@ -265,7 +266,7 @@ struct CNodeState {
@@ -265,7 +266,7 @@ struct CNodeState {
//! Whether this peer should be disconnected and banned (unless whitelisted).
bool fShouldBan ;
//! String name of this peer (debugging/logging purposes).
std : : string name ;
const std : : string name ;
//! List of asynchronously-determined block rejections to notify this peer about.
std : : vector < CBlockReject > rejects ;
//! The best known block we know this peer has announced.
@ -309,7 +310,7 @@ struct CNodeState {
@@ -309,7 +310,7 @@ struct CNodeState {
*/
bool fSupportsDesiredCmpctVersion ;
CNodeState ( ) {
CNodeState ( CAddress addrIn , std : : string addrNameIn ) : address ( addrIn ) , name ( addrNameIn ) {
fCurrentlyConnected = false ;
nMisbehavior = 0 ;
fShouldBan = false ;
@ -354,11 +355,36 @@ void UpdatePreferredDownload(CNode* node, CNodeState* state)
@@ -354,11 +355,36 @@ void UpdatePreferredDownload(CNode* node, CNodeState* state)
nPreferredDownload + = state - > fPreferredDownload ;
}
void InitializeNode ( NodeId nodeid , const CNode * pnode ) {
LOCK ( cs_main ) ;
CNodeState & state = mapNodeState . insert ( std : : make_pair ( nodeid , CNodeState ( ) ) ) . first - > second ;
state . name = pnode - > addrName ;
state . address = pnode - > addr ;
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 ;
std : : string addrName = pnode - > addrName ;
NodeId nodeid = pnode - > GetId ( ) ;
{
LOCK ( cs_main ) ;
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 ) {
@ -501,15 +527,15 @@ void MaybeSetPeerAsAnnouncingHeaderAndIDs(const CNodeState* nodestate, CNode* pf
@@ -501,15 +527,15 @@ void MaybeSetPeerAsAnnouncingHeaderAndIDs(const CNodeState* nodestate, CNode* pf
if ( lNodesAnnouncingHeaderAndIDs . size ( ) > = 3 ) {
// As per BIP152, we only get 3 of our peers to announce
// blocks using compact encodings.
bool found = connman . ForNode ( lNodesAnnouncingHeaderAndIDs . front ( ) , [ fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ] ( CNode * pnodeStop ) {
pnodeStop - > PushMessage ( NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
bool found = connman . ForNode ( lNodesAnnouncingHeaderAndIDs . front ( ) , [ & connman , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ] ( CNode * pnodeStop ) {
connman . PushMessage ( pnodeStop , NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
return true ;
} ) ;
if ( found )
lNodesAnnouncingHeaderAndIDs . pop_front ( ) ;
}
fAnnounceUsingCMPCTBLOCK = true ;
pfrom - > PushMessage ( NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
connman . PushMessage ( pfrom , NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
lNodesAnnouncingHeaderAndIDs . push_back ( pfrom - > GetId ( ) ) ;
}
}
@ -4900,9 +4926,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4900,9 +4926,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
if ( ! ReadBlockFromDisk ( block , ( * mi ) . second , consensusParams ) )
assert ( ! " cannot load block from disk " ) ;
if ( inv . type = = MSG_BLOCK )
pfrom - > PushMessageWithFlag ( SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : BLOCK , block ) ;
connman . PushMessageWithFlag ( pfrom , SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : BLOCK , block ) ;
else if ( inv . type = = MSG_WITNESS_BLOCK )
pfrom - > PushMessage ( NetMsgType : : BLOCK , block ) ;
connman . PushMessage ( pfrom , NetMsgType : : BLOCK , block ) ;
else if ( inv . type = = MSG_FILTERED_BLOCK )
{
bool sendMerkleBlock = false ;
@ -4915,7 +4941,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4915,7 +4941,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
}
}
if ( sendMerkleBlock ) {
pfrom - > PushMessage ( NetMsgType : : MERKLEBLOCK , merkleBlock ) ;
connman . PushMessage ( pfrom , NetMsgType : : MERKLEBLOCK , merkleBlock ) ;
// CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see
// This avoids hurting performance by pointlessly requiring a round-trip
// Note that there is currently no way for a node to request any single transactions we didn't send here -
@ -4924,7 +4950,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4924,7 +4950,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// however we MUST always provide at least what the remote peer needs
typedef std : : pair < unsigned int , uint256 > PairType ;
BOOST_FOREACH ( PairType & pair , merkleBlock . vMatchedTxn )
pfrom - > PushMessageWithFlag ( SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : TX , block . vtx [ pair . first ] ) ;
connman . PushMessageWithFlag ( pfrom , SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : TX , block . vtx [ pair . first ] ) ;
}
// else
// no response
@ -4938,9 +4964,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4938,9 +4964,9 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
bool fPeerWantsWitness = State ( pfrom - > GetId ( ) ) - > fWantsCmpctWitness ;
if ( CanDirectFetch ( consensusParams ) & & mi - > second - > nHeight > = chainActive . Height ( ) - MAX_CMPCTBLOCK_DEPTH ) {
CBlockHeaderAndShortTxIDs cmpctblock ( block , fPeerWantsWitness ) ;
pfrom - > PushMessageWithFlag ( fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : CMPCTBLOCK , cmpctblock ) ;
connman . PushMessageWithFlag ( pfrom , fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : CMPCTBLOCK , cmpctblock ) ;
} else
pfrom - > PushMessageWithFlag ( fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : BLOCK , block ) ;
connman . PushMessageWithFlag ( pfrom , fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : BLOCK , block ) ;
}
// Trigger the peer node to send a getblocks request for the next batch of inventory
@ -4951,7 +4977,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4951,7 +4977,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// wait for other stuff first.
vector < CInv > vInv ;
vInv . push_back ( CInv ( MSG_BLOCK , chainActive . Tip ( ) - > GetBlockHash ( ) ) ) ;
pfrom - > PushMessage ( NetMsgType : : INV , vInv ) ;
connman . PushMessage ( pfrom , NetMsgType : : INV , vInv ) ;
pfrom - > hashContinue . SetNull ( ) ;
}
}
@ -4962,14 +4988,14 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4962,14 +4988,14 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
bool push = false ;
auto mi = mapRelay . find ( inv . hash ) ;
if ( mi ! = mapRelay . end ( ) ) {
pfrom - > PushMessageWithFlag ( inv . type = = MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0 , NetMsgType : : TX , * mi - > second ) ;
connman . PushMessageWithFlag ( pfrom , inv . type = = MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0 , NetMsgType : : TX , * mi - > second ) ;
push = true ;
} else if ( pfrom - > timeLastMempoolReq ) {
auto txinfo = mempool . info ( inv . hash ) ;
// To protect privacy, do not answer getdata using the mempool when
// that TX couldn't have been INVed in reply to a MEMPOOL request.
if ( txinfo . tx & & txinfo . nTime < = pfrom - > timeLastMempoolReq ) {
pfrom - > PushMessageWithFlag ( inv . type = = MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0 , NetMsgType : : TX , * txinfo . tx ) ;
connman . PushMessageWithFlag ( pfrom , inv . type = = MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0 , NetMsgType : : TX , * txinfo . tx ) ;
push = true ;
}
}
@ -4996,7 +5022,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4996,7 +5022,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// do that because they want to know about (and store and rebroadcast and
// risk analyze) the dependencies of transactions relevant to them, without
// having to download the entire memory pool.
pfrom - > PushMessage ( NetMsgType : : NOTFOUND , vNotFound ) ;
connman . PushMessage ( pfrom , NetMsgType : : NOTFOUND , vNotFound ) ;
}
}
@ -5047,7 +5073,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5047,7 +5073,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Each connection can only send one version message
if ( pfrom - > nVersion ! = 0 )
{
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , REJECT_DUPLICATE , string ( " Duplicate version message " ) ) ;
connman . PushMessageWithVersion ( pfrom , INIT_PROTO_VERSION , NetMsgType : : REJECT , strCommand , REJECT_DUPLICATE , string ( " Duplicate version message " ) ) ;
LOCK ( cs_main ) ;
Misbehaving ( pfrom - > GetId ( ) , 1 ) ;
return false ;
@ -5067,7 +5093,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5067,7 +5093,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
if ( pfrom - > nServicesExpected & ~ pfrom - > nServices )
{
LogPrint ( " net " , " peer=%d does not offer the expected services (%08x offered, %08x expected); disconnecting \n " , pfrom - > id , pfrom - > nServices , pfrom - > nServicesExpected ) ;
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , REJECT_NONSTANDARD ,
connman . PushMessageWithVersion ( pfrom , INIT_PROTO_VERSION , NetMsgType : : REJECT , strCommand , REJECT_NONSTANDARD ,
strprintf ( " Expected to offer services %08x " , pfrom - > nServicesExpected ) ) ;
pfrom - > fDisconnect = true ;
return false ;
@ -5077,7 +5103,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5077,7 +5103,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
{
// disconnect from peers older than this proto version
LogPrintf ( " peer=%d using obsolete version %i; disconnecting \n " , pfrom - > id , pfrom - > nVersion ) ;
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , REJECT_OBSOLETE ,
connman . PushMessageWithVersion ( pfrom , INIT_PROTO_VERSION , NetMsgType : : REJECT , strCommand , REJECT_OBSOLETE ,
strprintf ( " Version must be %d or greater " , MIN_PEER_PROTO_VERSION ) ) ;
pfrom - > fDisconnect = true ;
return false ;
@ -5118,7 +5144,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5118,7 +5144,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Be shy and don't send version until we hear
if ( pfrom - > fInbound )
pfrom - > PushVersion ( ) ;
PushNodeVersion ( pfrom , connman , GetAdjustedTime ( ) ) ;
pfrom - > fClient = ! ( pfrom - > nServices & NODE_NETWORK ) ;
@ -5135,8 +5161,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5135,8 +5161,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
// Change version
pfrom - > PushMessage ( NetMsgType : : VERACK ) ;
pfrom - > ssSend . Set Version( min ( pfrom - > nVersion , PROTOCOL_VERSION ) ) ;
connman . PushMessageWithVersion ( pfrom , INIT_PROTO_VERSION , NetMsgType : : VERACK ) ;
pfrom - > SetSend Version( min ( pfrom - > nVersion , PROTOCOL_VERSION ) ) ;
if ( ! pfrom - > fInbound )
{
@ -5159,7 +5185,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5159,7 +5185,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Get recent addresses
if ( pfrom - > fOneShot | | pfrom - > nVersion > = CADDR_TIME_VERSION | | connman . GetAddressCount ( ) < 1000 )
{
pfrom - > PushMessage ( NetMsgType : : GETADDR ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETADDR ) ;
pfrom - > fGetAddr = true ;
}
connman . MarkAddressGood ( pfrom - > addr ) ;
@ -5206,7 +5232,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5206,7 +5232,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// We send this to non-NODE NETWORK peers as well, because even
// non-NODE NETWORK peers can announce blocks (such as pruning
// nodes)
pfrom - > PushMessage ( NetMsgType : : SENDHEADERS ) ;
connman . PushMessage ( pfrom , NetMsgType : : SENDHEADERS ) ;
}
if ( pfrom - > nVersion > = SHORT_IDS_BLOCKS_VERSION ) {
// Tell our peer we are willing to provide version 1 or 2 cmpctblocks
@ -5217,9 +5243,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5217,9 +5243,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
bool fAnnounceUsingCMPCTBLOCK = false ;
uint64_t nCMPCTBLOCKVersion = 2 ;
if ( pfrom - > GetLocalServices ( ) & NODE_WITNESS )
pfrom - > PushMessage ( NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
connman . PushMessage ( pfrom , NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
nCMPCTBLOCKVersion = 1 ;
pfrom - > PushMessage ( NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
connman . PushMessage ( pfrom , NetMsgType : : SENDCMPCT , fAnnounceUsingCMPCTBLOCK , nCMPCTBLOCKVersion ) ;
}
}
@ -5347,7 +5373,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5347,7 +5373,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// time the block arrives, the header chain leading up to it is already validated. Not
// doing this will result in the received block being rejected as an orphan in case it is
// not a direct successor.
pfrom - > PushMessage ( NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexBestHeader ) , inv . hash ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexBestHeader ) , inv . hash ) ;
CNodeState * nodestate = State ( pfrom - > GetId ( ) ) ;
if ( CanDirectFetch ( chainparams . GetConsensus ( ) ) & &
nodestate - > nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER & &
@ -5383,7 +5409,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5383,7 +5409,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
if ( ! vToFetch . empty ( ) )
pfrom - > PushMessage ( NetMsgType : : GETDATA , vToFetch ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETDATA , vToFetch ) ;
}
@ -5483,7 +5509,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5483,7 +5509,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
resp . txn [ i ] = block . vtx [ req . indexes [ i ] ] ;
}
pfrom - > PushMessageWithFlag ( State ( pfrom - > GetId ( ) ) - > fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : BLOCKTXN , resp ) ;
connman . PushMessageWithFlag ( pfrom , State ( pfrom - > GetId ( ) ) - > fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : BLOCKTXN , resp ) ;
}
@ -5532,7 +5558,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5532,7 +5558,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// headers message). In both cases it's safe to update
// pindexBestHeaderSent to be our tip.
nodestate - > pindexBestHeaderSent = pindex ? pindex : chainActive . Tip ( ) ;
pfrom - > PushMessage ( NetMsgType : : HEADERS , vHeaders ) ;
connman . PushMessage ( pfrom , NetMsgType : : HEADERS , vHeaders ) ;
}
@ -5695,7 +5721,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5695,7 +5721,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
pfrom - > id ,
FormatStateMessage ( state ) ) ;
if ( state . GetRejectCode ( ) < REJECT_INTERNAL ) // Never send AcceptToMemoryPool's internal codes over P2P
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , ( unsigned char ) state . GetRejectCode ( ) ,
connman . PushMessage ( pfrom , NetMsgType : : REJECT , strCommand , ( unsigned char ) state . GetRejectCode ( ) ,
state . GetRejectReason ( ) . substr ( 0 , MAX_REJECT_MESSAGE_LENGTH ) , inv . hash ) ;
if ( nDoS > 0 ) {
Misbehaving ( pfrom - > GetId ( ) , nDoS ) ;
@ -5714,7 +5740,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5714,7 +5740,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
if ( mapBlockIndex . find ( cmpctblock . header . hashPrevBlock ) = = mapBlockIndex . end ( ) ) {
// Doesn't connect (or is genesis), instead of DoSing in AcceptBlockHeader, request deeper headers
if ( ! IsInitialBlockDownload ( ) )
pfrom - > PushMessage ( NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexBestHeader ) , uint256 ( ) ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexBestHeader ) , uint256 ( ) ) ;
return true ;
}
@ -5747,7 +5773,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5747,7 +5773,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// so we just grab the block via normal getdata
std : : vector < CInv > vInv ( 1 ) ;
vInv [ 0 ] = CInv ( MSG_BLOCK | GetFetchFlags ( pfrom , pindex - > pprev , chainparams . GetConsensus ( ) ) , cmpctblock . header . GetHash ( ) ) ;
pfrom - > PushMessage ( NetMsgType : : GETDATA , vInv ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETDATA , vInv ) ;
}
return true ;
}
@ -5791,7 +5817,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5791,7 +5817,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Duplicate txindexes, the block is now in-flight, so just request it
std : : vector < CInv > vInv ( 1 ) ;
vInv [ 0 ] = CInv ( MSG_BLOCK | GetFetchFlags ( pfrom , pindex - > pprev , chainparams . GetConsensus ( ) ) , cmpctblock . header . GetHash ( ) ) ;
pfrom - > PushMessage ( NetMsgType : : GETDATA , vInv ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETDATA , vInv ) ;
return true ;
}
@ -5815,7 +5841,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5815,7 +5841,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
return ProcessMessage ( pfrom , NetMsgType : : BLOCKTXN , blockTxnMsg , nTimeReceived , chainparams , connman ) ;
} else {
req . blockhash = pindex - > GetBlockHash ( ) ;
pfrom - > PushMessage ( NetMsgType : : GETBLOCKTXN , req ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETBLOCKTXN , req ) ;
}
}
} else {
@ -5824,7 +5850,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5824,7 +5850,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// mempool will probably be useless - request the block normally
std : : vector < CInv > vInv ( 1 ) ;
vInv [ 0 ] = CInv ( MSG_BLOCK | GetFetchFlags ( pfrom , pindex - > pprev , chainparams . GetConsensus ( ) ) , cmpctblock . header . GetHash ( ) ) ;
pfrom - > PushMessage ( NetMsgType : : GETDATA , vInv ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETDATA , vInv ) ;
return true ;
} else {
// If this was an announce-cmpctblock, we want the same treatment as a header message
@ -5866,7 +5892,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5866,7 +5892,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Might have collided, fall back to getdata now :(
std : : vector < CInv > invs ;
invs . push_back ( CInv ( MSG_BLOCK | GetFetchFlags ( pfrom , chainActive . Tip ( ) , chainparams . GetConsensus ( ) ) , resp . blockhash ) ) ;
pfrom - > PushMessage ( NetMsgType : : GETDATA , invs ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETDATA , invs ) ;
} else {
MarkBlockAsReceived ( resp . blockhash ) ; // it is now an empty pointer
fBlockRead = true ;
@ -5880,7 +5906,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5880,7 +5906,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
int nDoS ;
if ( state . IsInvalid ( nDoS ) ) {
assert ( state . GetRejectCode ( ) < REJECT_INTERNAL ) ; // Blocks are never rejected with internal reject codes
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , ( unsigned char ) state . GetRejectCode ( ) ,
connman . PushMessage ( pfrom , NetMsgType : : REJECT , strCommand , ( unsigned char ) state . GetRejectCode ( ) ,
state . GetRejectReason ( ) . substr ( 0 , MAX_REJECT_MESSAGE_LENGTH ) , block . GetHash ( ) ) ;
if ( nDoS > 0 ) {
LOCK ( cs_main ) ;
@ -5928,7 +5954,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5928,7 +5954,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// nUnconnectingHeaders gets reset back to 0.
if ( mapBlockIndex . find ( headers [ 0 ] . hashPrevBlock ) = = mapBlockIndex . end ( ) & & nCount < MAX_BLOCKS_TO_ANNOUNCE ) {
nodestate - > nUnconnectingHeaders + + ;
pfrom - > PushMessage ( NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexBestHeader ) , uint256 ( ) ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexBestHeader ) , uint256 ( ) ) ;
LogPrint ( " net " , " received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d) \n " ,
headers [ 0 ] . GetHash ( ) . ToString ( ) ,
headers [ 0 ] . hashPrevBlock . ToString ( ) ,
@ -5975,7 +6001,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5975,7 +6001,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// TODO: optimize: if pindexLast is an ancestor of chainActive.Tip or pindexBestHeader, continue
// from there instead.
LogPrint ( " net " , " more getheaders (%d) to end to peer=%d (startheight:%d) \n " , pindexLast - > nHeight , pfrom - > id , pfrom - > nStartingHeight ) ;
pfrom - > PushMessage ( NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexLast ) , uint256 ( ) ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexLast ) , uint256 ( ) ) ;
}
bool fCanDirectFetch = CanDirectFetch ( chainparams . GetConsensus ( ) ) ;
@ -6028,7 +6054,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -6028,7 +6054,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// In any case, we want to download using a compact block, not a regular one
vGetData [ 0 ] = CInv ( MSG_CMPCT_BLOCK , vGetData [ 0 ] . hash ) ;
}
pfrom - > PushMessage ( NetMsgType : : GETDATA , vGetData ) ;
connman . PushMessage ( pfrom , NetMsgType : : GETDATA , vGetData ) ;
}
}
}
@ -6060,7 +6086,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -6060,7 +6086,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
int nDoS ;
if ( state . IsInvalid ( nDoS ) ) {
assert ( state . GetRejectCode ( ) < REJECT_INTERNAL ) ; // Blocks are never rejected with internal reject codes
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , ( unsigned char ) state . GetRejectCode ( ) ,
connman . PushMessage ( pfrom , NetMsgType : : REJECT , strCommand , ( unsigned char ) state . GetRejectCode ( ) ,
state . GetRejectReason ( ) . substr ( 0 , MAX_REJECT_MESSAGE_LENGTH ) , block . GetHash ( ) ) ;
if ( nDoS > 0 ) {
LOCK ( cs_main ) ;
@ -6137,7 +6163,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -6137,7 +6163,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// it, if the remote node sends a ping once per second and this node takes 5
// seconds to respond to each, the 5th ping the remote sends would appear to
// return very quickly.
pfrom - > PushMessage ( NetMsgType : : PONG , nonce ) ;
connman . PushMessage ( pfrom , NetMsgType : : PONG , nonce ) ;
}
}
@ -6391,7 +6417,7 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman)
@@ -6391,7 +6417,7 @@ bool ProcessMessages(CNode* pfrom, CConnman& connman)
}
catch ( const std : : ios_base : : failure & e )
{
pfrom - > PushMessage ( NetMsgType : : REJECT , strCommand , REJECT_MALFORMED , string ( " error parsing message " ) ) ;
connman . PushMessageWithVersion ( pfrom , INIT_PROTO_VERSION , NetMsgType : : REJECT , strCommand , REJECT_MALFORMED , string ( " error parsing message " ) ) ;
if ( strstr ( e . what ( ) , " end of data " ) )
{
// Allow exceptions from under-length message on vRecv
@ -6480,11 +6506,11 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6480,11 +6506,11 @@ bool SendMessages(CNode* pto, CConnman& connman)
pto - > nPingUsecStart = GetTimeMicros ( ) ;
if ( pto - > nVersion > BIP0031_VERSION ) {
pto - > nPingNonceSent = nonce ;
pto - > PushMessage ( NetMsgType : : PING , nonce ) ;
connman . PushMessage ( pto , NetMsgType : : PING , nonce ) ;
} else {
// Peer is too old to support ping command with nonce, pong will never arrive.
pto - > nPingNonceSent = 0 ;
pto - > PushMessage ( NetMsgType : : PING ) ;
connman . PushMessage ( pto , NetMsgType : : PING ) ;
}
}
@ -6515,14 +6541,14 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6515,14 +6541,14 @@ bool SendMessages(CNode* pto, CConnman& connman)
// receiver rejects addr messages larger than 1000
if ( vAddr . size ( ) > = 1000 )
{
pto - > PushMessage ( NetMsgType : : ADDR , vAddr ) ;
connman . PushMessage ( pto , NetMsgType : : ADDR , vAddr ) ;
vAddr . clear ( ) ;
}
}
}
pto - > vAddrToSend . clear ( ) ;
if ( ! vAddr . empty ( ) )
pto - > PushMessage ( NetMsgType : : ADDR , vAddr ) ;
connman . PushMessage ( pto , NetMsgType : : ADDR , vAddr ) ;
// we only send the big addr message once
if ( pto - > vAddrToSend . capacity ( ) > 40 )
pto - > vAddrToSend . shrink_to_fit ( ) ;
@ -6545,7 +6571,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6545,7 +6571,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
}
BOOST_FOREACH ( const CBlockReject & reject , state . rejects )
pto - > PushMessage ( NetMsgType : : REJECT , ( string ) NetMsgType : : BLOCK , reject . chRejectCode , reject . strRejectReason , reject . hashBlock ) ;
connman . PushMessage ( pto , NetMsgType : : REJECT , ( string ) NetMsgType : : BLOCK , reject . chRejectCode , reject . strRejectReason , reject . hashBlock ) ;
state . rejects . clear ( ) ;
// Start block sync
@ -6568,7 +6594,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6568,7 +6594,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
if ( pindexStart - > pprev )
pindexStart = pindexStart - > pprev ;
LogPrint ( " net " , " initial getheaders (%d) to peer=%d (startheight:%d) \n " , pindexStart - > nHeight , pto - > id , pto - > nStartingHeight ) ;
pto - > PushMessage ( NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexStart ) , uint256 ( ) ) ;
connman . PushMessage ( pto , NetMsgType : : GETHEADERS , chainActive . GetLocator ( pindexStart ) , uint256 ( ) ) ;
}
}
@ -6657,7 +6683,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6657,7 +6683,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
CBlock block ;
assert ( ReadBlockFromDisk ( block , pBestIndex , consensusParams ) ) ;
CBlockHeaderAndShortTxIDs cmpctblock ( block , state . fWantsCmpctWitness ) ;
pto - > PushMessageWithFlag ( state . fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : CMPCTBLOCK , cmpctblock ) ;
connman . PushMessageWithFlag ( pto , state . fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS , NetMsgType : : CMPCTBLOCK , cmpctblock ) ;
state . pindexBestHeaderSent = pBestIndex ;
} else if ( state . fPreferHeaders ) {
if ( vHeaders . size ( ) > 1 ) {
@ -6669,7 +6695,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6669,7 +6695,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
LogPrint ( " net " , " %s: sending header %s to peer=%d \n " , __func__ ,
vHeaders . front ( ) . GetHash ( ) . ToString ( ) , pto - > id ) ;
}
pto - > PushMessage ( NetMsgType : : HEADERS , vHeaders ) ;
connman . PushMessage ( pto , NetMsgType : : HEADERS , vHeaders ) ;
state . pindexBestHeaderSent = pBestIndex ;
} else
fRevertToInv = true ;
@ -6715,7 +6741,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6715,7 +6741,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
BOOST_FOREACH ( const uint256 & hash , pto - > vInventoryBlockToSend ) {
vInv . push_back ( CInv ( MSG_BLOCK , hash ) ) ;
if ( vInv . size ( ) = = MAX_INV_SZ ) {
pto - > PushMessage ( NetMsgType : : INV , vInv ) ;
connman . PushMessage ( pto , NetMsgType : : INV , vInv ) ;
vInv . clear ( ) ;
}
}
@ -6761,7 +6787,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6761,7 +6787,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
pto - > filterInventoryKnown . insert ( hash ) ;
vInv . push_back ( inv ) ;
if ( vInv . size ( ) = = MAX_INV_SZ ) {
pto - > PushMessage ( NetMsgType : : INV , vInv ) ;
connman . PushMessage ( pto , NetMsgType : : INV , vInv ) ;
vInv . clear ( ) ;
}
}
@ -6827,7 +6853,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6827,7 +6853,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
}
}
if ( vInv . size ( ) = = MAX_INV_SZ ) {
pto - > PushMessage ( NetMsgType : : INV , vInv ) ;
connman . PushMessage ( pto , NetMsgType : : INV , vInv ) ;
vInv . clear ( ) ;
}
pto - > filterInventoryKnown . insert ( hash ) ;
@ -6835,7 +6861,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6835,7 +6861,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
}
}
if ( ! vInv . empty ( ) )
pto - > PushMessage ( NetMsgType : : INV , vInv ) ;
connman . PushMessage ( pto , NetMsgType : : INV , vInv ) ;
// Detect whether we're stalling
nNow = GetTimeMicros ( ) ;
@ -6896,7 +6922,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6896,7 +6922,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
vGetData . push_back ( inv ) ;
if ( vGetData . size ( ) > = 1000 )
{
pto - > PushMessage ( NetMsgType : : GETDATA , vGetData ) ;
connman . PushMessage ( pto , NetMsgType : : GETDATA , vGetData ) ;
vGetData . clear ( ) ;
}
} else {
@ -6906,7 +6932,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6906,7 +6932,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
pto - > mapAskFor . erase ( pto - > mapAskFor . begin ( ) ) ;
}
if ( ! vGetData . empty ( ) )
pto - > PushMessage ( NetMsgType : : GETDATA , vGetData ) ;
connman . PushMessage ( pto , NetMsgType : : GETDATA , vGetData ) ;
//
// Message: feefilter
@ -6919,7 +6945,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
@@ -6919,7 +6945,7 @@ bool SendMessages(CNode* pto, CConnman& connman)
if ( timeNow > pto - > nextSendTimeFeeFilter ) {
CAmount filterToSend = filterRounder . round ( currentFilter ) ;
if ( filterToSend ! = pto - > lastSentFeeFilter ) {
pto - > PushMessage ( NetMsgType : : FEEFILTER , filterToSend ) ;
connman . PushMessage ( pto , NetMsgType : : FEEFILTER , filterToSend ) ;
pto - > lastSentFeeFilter = filterToSend ;
}
pto - > nextSendTimeFeeFilter = PoissonNextSend ( timeNow , AVG_FEEFILTER_BROADCAST_INTERVAL ) ;