|
|
|
@ -313,6 +313,7 @@ struct CNodeState {
@@ -313,6 +313,7 @@ struct CNodeState {
|
|
|
|
|
fPreferHeaders = false; |
|
|
|
|
fPreferHeaderAndIDs = false; |
|
|
|
|
fProvidesHeaderAndIDs = false; |
|
|
|
|
fHaveWitness = false; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -4812,6 +4813,14 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
@@ -4812,6 +4813,14 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint32_t GetFetchFlags(CNode* pfrom, CBlockIndex* pprev, const Consensus::Params& chainparams) { |
|
|
|
|
uint32_t nFetchFlags = 0; |
|
|
|
|
if (IsWitnessEnabled(pprev, chainparams) && State(pfrom->GetId())->fHaveWitness) { |
|
|
|
|
nFetchFlags |= MSG_WITNESS_FLAG; |
|
|
|
|
} |
|
|
|
|
return nFetchFlags; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams) |
|
|
|
|
{ |
|
|
|
|
LogPrint("net", "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->id); |
|
|
|
@ -4918,6 +4927,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4918,6 +4927,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
|
|
|
|
|
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK); |
|
|
|
|
|
|
|
|
|
if((pfrom->nServices & NODE_WITNESS)) |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
State(pfrom->GetId())->fHaveWitness = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Potentially mark this peer as a preferred download peer.
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
@ -5119,17 +5134,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5119,17 +5134,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
|
|
|
|
|
LOCK(cs_main); |
|
|
|
|
|
|
|
|
|
uint32_t nFetchFlags = GetFetchFlags(pfrom, chainActive.Tip(), chainparams.GetConsensus()); |
|
|
|
|
|
|
|
|
|
std::vector<CInv> vToFetch; |
|
|
|
|
|
|
|
|
|
for (unsigned int nInv = 0; nInv < vInv.size(); nInv++) |
|
|
|
|
{ |
|
|
|
|
const CInv &inv = vInv[nInv]; |
|
|
|
|
CInv &inv = vInv[nInv]; |
|
|
|
|
|
|
|
|
|
boost::this_thread::interruption_point(); |
|
|
|
|
|
|
|
|
|
bool fAlreadyHave = AlreadyHave(inv); |
|
|
|
|
LogPrint("net", "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom->id); |
|
|
|
|
|
|
|
|
|
if (inv.type == MSG_TX) { |
|
|
|
|
inv.type |= nFetchFlags; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (inv.type == MSG_BLOCK) { |
|
|
|
|
UpdateBlockAvailability(pfrom->GetId(), inv.hash); |
|
|
|
|
if (!fAlreadyHave && !fImporting && !fReindex && !mapBlocksInFlight.count(inv.hash)) { |
|
|
|
@ -5144,7 +5165,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5144,7 +5165,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), inv.hash); |
|
|
|
|
CNodeState *nodestate = State(pfrom->GetId()); |
|
|
|
|
if (CanDirectFetch(chainparams.GetConsensus()) && |
|
|
|
|
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) { |
|
|
|
|
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER && |
|
|
|
|
(!IsWitnessEnabled(chainActive.Tip(), chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) { |
|
|
|
|
inv.type |= nFetchFlags; |
|
|
|
|
if (nodestate->fProvidesHeaderAndIDs) |
|
|
|
|
vToFetch.push_back(CInv(MSG_CMPCT_BLOCK, inv.hash)); |
|
|
|
|
else |
|
|
|
@ -5730,7 +5753,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5730,7 +5753,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
// Calculate all the blocks we'd need to switch to pindexLast, up to a limit.
|
|
|
|
|
while (pindexWalk && !chainActive.Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) { |
|
|
|
|
if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) && |
|
|
|
|
!mapBlocksInFlight.count(pindexWalk->GetBlockHash())) { |
|
|
|
|
!mapBlocksInFlight.count(pindexWalk->GetBlockHash()) && |
|
|
|
|
(!IsWitnessEnabled(pindexWalk->pprev, chainparams.GetConsensus()) || State(pfrom->GetId())->fHaveWitness)) { |
|
|
|
|
// We don't have this block, and it's not yet in flight.
|
|
|
|
|
vToFetch.push_back(pindexWalk); |
|
|
|
|
} |
|
|
|
@ -5752,7 +5776,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5752,7 +5776,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
// Can't download any more from this peer
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash())); |
|
|
|
|
uint32_t nFetchFlags = GetFetchFlags(pfrom, pindex->pprev, chainparams.GetConsensus()); |
|
|
|
|
vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash())); |
|
|
|
|
MarkBlockAsInFlight(pfrom->GetId(), pindex->GetBlockHash(), chainparams.GetConsensus(), pindex); |
|
|
|
|
LogPrint("net", "Requesting block %s from peer=%d\n", |
|
|
|
|
pindex->GetBlockHash().ToString(), pfrom->id); |
|
|
|
@ -6598,11 +6623,14 @@ bool SendMessages(CNode* pto)
@@ -6598,11 +6623,14 @@ bool SendMessages(CNode* pto)
|
|
|
|
|
NodeId staller = -1; |
|
|
|
|
FindNextBlocksToDownload(pto->GetId(), MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller); |
|
|
|
|
BOOST_FOREACH(CBlockIndex *pindex, vToDownload) { |
|
|
|
|
vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash())); |
|
|
|
|
if (State(pto->GetId())->fHaveWitness || !IsWitnessEnabled(pindex->pprev, consensusParams)) { |
|
|
|
|
uint32_t nFetchFlags = GetFetchFlags(pto, pindex->pprev, consensusParams); |
|
|
|
|
vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash())); |
|
|
|
|
MarkBlockAsInFlight(pto->GetId(), pindex->GetBlockHash(), consensusParams, pindex); |
|
|
|
|
LogPrint("net", "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(), |
|
|
|
|
pindex->nHeight, pto->id); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (state.nBlocksInFlight == 0 && staller != -1) { |
|
|
|
|
if (State(staller)->nStallingSince == 0) { |
|
|
|
|
State(staller)->nStallingSince = nNow; |
|
|
|
|