mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Merge #19610: p2p: refactor AlreadyHave(), CInv::type, INV/TX processing
fb56d37612dea6666e7da73d671311a697570dae p2p: ensure inv is GenMsgTx before ToGenTxid in inv processing (John Newbery) aa3621385ee66c9dde5c632c0a79fba3a6ea2d62 test: use CInv::MSG_WITNESS_TX flag in p2p_segwit (Jon Atack) 24ee4f01eadb870435712950a1364cf0def06e9f p2p: make gtxid(.hash) and fAlreadyHave localvars const (Jon Atack) b1c855453bf2634e7fd9b53c4a76a8536fc9865d p2p: use CInv block message helpers in net_processing.cpp (Jon Atack) acd66421671e42a58e8e067868e1ab86268e3231 [net processing] Change AlreadyHaveTx() to take a GenTxid (John Newbery) 5fdfb80b861e0de3fcf8a57163b3f52af4b2df3b [net processing] Change AlreadyHaveBlock() to take block_hash argument (John Newbery) 430e183b89d00b4148f0b77a6fcacca2cd948202 [net processing] Remove mempool argument from AlreadyHaveBlock() (John Newbery) 42ca5618cae0fd9ef97d2006b17d896bc58cc17c [net processing] Split AlreadyHave() into separate block and tx functions (John Newbery) 39f1dc944554218911b0945fff7e6d06f3dab284 p2p: remove nFetchFlags from NetMsgType TX and INV processing (Jon Atack) 471714e1f024fb3b4892a7a8b34a76b83a13fa19 p2p: add CInv block message helper methods (Jon Atack) Pull request description: Building on #19590 and the recent `wtxid` and `GenTxid` changes, this is a refactoring and cleanup PR to simplify and improve some of the net processing code. Some of the diffs are best reviewed with `-w` to ignore spacing. Co-authored by John Newbery. ACKs for top commit: laanwj: Code review ACK fb56d37612dea6666e7da73d671311a697570dae jnewbery: utACK fb56d37612dea6666e7da73d671311a697570dae vasild: ACK fb56d3761 Tree-SHA512: ba39b58e6aaf850880a842fe5f6295e9f1870906ef690206acfc17140aae2ac854981e1066dbcd4238062478762fbd040ef772fdc2c50eea6869997c583e6a6d
This commit is contained in:
parent
8e29d1dda6
commit
11d166d609
@ -353,6 +353,7 @@ private:
|
||||
* we fully-validated them at some point.
|
||||
*/
|
||||
bool BlockRequestAllowed(const CBlockIndex* pindex, const Consensus::Params& consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||
bool AlreadyHaveBlock(const uint256& block_hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||
void ProcessGetBlockData(CNode& pfrom, const CChainParams& chainparams, const CInv& inv, CConnman& connman, llmq::CInstantSendManager& isman);
|
||||
|
||||
/**
|
||||
@ -1845,9 +1846,6 @@ bool PeerManagerImpl::AlreadyHave(const CInv& inv)
|
||||
(g_txindex != nullptr && g_txindex->HasTx(inv.hash));
|
||||
}
|
||||
|
||||
case MSG_BLOCK:
|
||||
return m_chainman.m_blockman.LookupBlockIndex(inv.hash) != nullptr;
|
||||
|
||||
/*
|
||||
Dash Related Inventory Messages
|
||||
|
||||
@ -1886,6 +1884,11 @@ bool PeerManagerImpl::AlreadyHave(const CInv& inv)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PeerManagerImpl::AlreadyHaveBlock(const uint256& block_hash)
|
||||
{
|
||||
return m_chainman.m_blockman.LookupBlockIndex(block_hash) != nullptr;
|
||||
}
|
||||
|
||||
void PeerManagerImpl::RelayTransaction(const uint256& txid)
|
||||
{
|
||||
CInv inv(::dstxManager->GetDSTX(txid) ? MSG_DSTX : MSG_TX, txid);
|
||||
@ -1981,7 +1984,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, const CChainParams& chai
|
||||
// disconnect node in case we have reached the outbound limit for serving historical blocks
|
||||
if (send &&
|
||||
connman.OutboundTargetReached(true) &&
|
||||
(((pindexBestHeader != nullptr) && (pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() > HISTORICAL_BLOCK_AGE)) || inv.type == MSG_FILTERED_BLOCK) &&
|
||||
(((pindexBestHeader != nullptr) && (pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() > HISTORICAL_BLOCK_AGE)) || inv.IsMsgFilteredBlk()) &&
|
||||
!pfrom.HasPermission(PF_DOWNLOAD) // nodes with the download permission may exceed target
|
||||
) {
|
||||
LogPrint(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom.GetId());
|
||||
@ -2015,9 +2018,9 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, const CChainParams& chai
|
||||
pblock = pblockRead;
|
||||
}
|
||||
if (pblock) {
|
||||
if (inv.type == MSG_BLOCK)
|
||||
if (inv.IsMsgBlk()) {
|
||||
connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::BLOCK, *pblock));
|
||||
else if (inv.type == MSG_FILTERED_BLOCK) {
|
||||
} else if (inv.IsMsgFilteredBlk()) {
|
||||
bool sendMerkleBlock = false;
|
||||
CMerkleBlock merkleBlock;
|
||||
if (pfrom.RelayAddrsWithConn()) {
|
||||
@ -2047,8 +2050,8 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, const CChainParams& chai
|
||||
}
|
||||
}
|
||||
// else
|
||||
// no response
|
||||
} else if (inv.type == MSG_CMPCT_BLOCK) {
|
||||
// no response
|
||||
} else if (inv.IsMsgCmpctBlk()) {
|
||||
// If a peer is asking for old blocks, we're almost guaranteed
|
||||
// they won't have a useful mempool to match against a compact block,
|
||||
// and we don't feel like constructing the object for them, so
|
||||
@ -2280,7 +2283,7 @@ void PeerManagerImpl::ProcessGetData(CNode& pfrom, Peer& peer, const std::atomic
|
||||
// expensive to process.
|
||||
if (it != peer.m_getdata_requests.end() && !pfrom.fPauseSend) {
|
||||
const CInv &inv = *it++;
|
||||
if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK || inv.type == MSG_CMPCT_BLOCK) {
|
||||
if (inv.IsGenBlkMsg()) {
|
||||
ProcessGetBlockData(pfrom, m_chainparams, inv, m_connman, *m_llmq_ctx->isman);
|
||||
}
|
||||
// else: If the first item on the queue is an unknown type, we erase it
|
||||
@ -3247,21 +3250,19 @@ void PeerManagerImpl::ProcessMessage(
|
||||
const auto current_time = GetTime<std::chrono::microseconds>();
|
||||
uint256* best_block{nullptr};
|
||||
|
||||
for (CInv &inv : vInv)
|
||||
{
|
||||
for (CInv& inv : vInv) {
|
||||
if(!inv.IsKnownType()) {
|
||||
LogPrint(BCLog::NET, "got inv of unknown type %d: %s peer=%d\n", inv.type, inv.hash.ToString(), pfrom.GetId());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (interruptMsgProc)
|
||||
return;
|
||||
if (interruptMsgProc) return;
|
||||
|
||||
bool fAlreadyHave = AlreadyHave(inv);
|
||||
LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
|
||||
statsClient.inc(strprintf("message.received.inv_%s", inv.GetCommand()), 1.0f);
|
||||
if (inv.IsMsgBlk()) {
|
||||
const bool fAlreadyHave = AlreadyHaveBlock(inv.hash);
|
||||
LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
|
||||
statsClient.inc(strprintf("message.received.inv_%s", inv.GetCommand()), 1.0f);
|
||||
|
||||
if (inv.type == MSG_BLOCK) {
|
||||
UpdateBlockAvailability(pfrom.GetId(), inv.hash);
|
||||
|
||||
if (fAlreadyHave || fImporting || fReindex || mapBlocksInFlight.count(inv.hash)) {
|
||||
@ -3289,6 +3290,10 @@ void PeerManagerImpl::ProcessMessage(
|
||||
best_block = &inv.hash;
|
||||
}
|
||||
} else {
|
||||
const bool fAlreadyHave = AlreadyHave(inv);
|
||||
LogPrint(BCLog::NET, "got inv: %s %s peer=%d\n", inv.ToString(), fAlreadyHave ? "have" : "new", pfrom.GetId());
|
||||
statsClient.inc(strprintf("message.received.inv_%s", inv.GetCommand()), 1.0f);
|
||||
|
||||
static std::set<int> allowWhileInIBDObjs = {
|
||||
MSG_SPORK
|
||||
};
|
||||
|
@ -546,10 +546,20 @@ public:
|
||||
|
||||
// Single-message helper methods
|
||||
bool IsMsgTx() const { return type == MSG_TX; }
|
||||
bool IsMsgBlk() const { return type == MSG_BLOCK; }
|
||||
bool IsMsgDstx() const { return type == MSG_DSTX; }
|
||||
bool IsMsgFilteredBlk() const { return type == MSG_FILTERED_BLOCK; }
|
||||
bool IsMsgCmpctBlk() const { return type == MSG_CMPCT_BLOCK; }
|
||||
|
||||
// Combined-message helper methods
|
||||
bool IsGenTxMsg() const { return type == MSG_TX || type == MSG_DSTX; }
|
||||
bool IsGenTxMsg() const
|
||||
{
|
||||
return type == MSG_TX || type == MSG_DSTX;
|
||||
}
|
||||
bool IsGenBlkMsg() const
|
||||
{
|
||||
return type == MSG_BLOCK || type == MSG_FILTERED_BLOCK || type == MSG_CMPCT_BLOCK;
|
||||
}
|
||||
|
||||
private:
|
||||
const char* GetCommandInternal() const;
|
||||
|
Loading…
Reference in New Issue
Block a user