mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Cache most-recently-connected compact block
This commit is contained in:
parent
9eaec08dd2
commit
5749a853b9
@ -754,10 +754,11 @@ void PeerLogicValidation::SyncTransaction(const CTransaction& tx, const CBlockIn
|
|||||||
|
|
||||||
static CCriticalSection cs_most_recent_block;
|
static CCriticalSection cs_most_recent_block;
|
||||||
static std::shared_ptr<const CBlock> most_recent_block;
|
static std::shared_ptr<const CBlock> most_recent_block;
|
||||||
|
static std::shared_ptr<CBlockHeaderAndShortTxIDs> most_recent_compact_block;
|
||||||
static uint256 most_recent_block_hash;
|
static uint256 most_recent_block_hash;
|
||||||
|
|
||||||
void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) {
|
void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) {
|
||||||
CBlockHeaderAndShortTxIDs cmpctblock(*pblock, true);
|
std::shared_ptr<CBlockHeaderAndShortTxIDs> pcmpctblock = std::make_shared<CBlockHeaderAndShortTxIDs> (*pblock, true);
|
||||||
CNetMsgMaker msgMaker(PROTOCOL_VERSION);
|
CNetMsgMaker msgMaker(PROTOCOL_VERSION);
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
@ -774,9 +775,10 @@ void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std:
|
|||||||
LOCK(cs_most_recent_block);
|
LOCK(cs_most_recent_block);
|
||||||
most_recent_block_hash = hashBlock;
|
most_recent_block_hash = hashBlock;
|
||||||
most_recent_block = pblock;
|
most_recent_block = pblock;
|
||||||
|
most_recent_compact_block = pcmpctblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
connman->ForEachNode([this, &cmpctblock, pindex, &msgMaker, fWitnessEnabled, &hashBlock](CNode* pnode) {
|
connman->ForEachNode([this, &pcmpctblock, pindex, &msgMaker, fWitnessEnabled, &hashBlock](CNode* pnode) {
|
||||||
// TODO: Avoid the repeated-serialization here
|
// TODO: Avoid the repeated-serialization here
|
||||||
if (pnode->nVersion < INVALID_CB_NO_BAN_VERSION || pnode->fDisconnect)
|
if (pnode->nVersion < INVALID_CB_NO_BAN_VERSION || pnode->fDisconnect)
|
||||||
return;
|
return;
|
||||||
@ -789,7 +791,7 @@ void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std:
|
|||||||
|
|
||||||
LogPrint("net", "%s sending header-and-ids %s to peer %d\n", "PeerLogicValidation::NewPoWValidBlock",
|
LogPrint("net", "%s sending header-and-ids %s to peer %d\n", "PeerLogicValidation::NewPoWValidBlock",
|
||||||
hashBlock.ToString(), pnode->id);
|
hashBlock.ToString(), pnode->id);
|
||||||
connman->PushMessage(pnode, msgMaker.Make(NetMsgType::CMPCTBLOCK, cmpctblock));
|
connman->PushMessage(pnode, msgMaker.Make(NetMsgType::CMPCTBLOCK, *pcmpctblock));
|
||||||
state.pindexBestHeaderSent = pindex;
|
state.pindexBestHeaderSent = pindex;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -2859,13 +2861,24 @@ bool SendMessages(CNode* pto, CConnman& connman, std::atomic<bool>& interruptMsg
|
|||||||
// probably means we're doing an initial-ish-sync or they're slow
|
// probably means we're doing an initial-ish-sync or they're slow
|
||||||
LogPrint("net", "%s sending header-and-ids %s to peer %d\n", __func__,
|
LogPrint("net", "%s sending header-and-ids %s to peer %d\n", __func__,
|
||||||
vHeaders.front().GetHash().ToString(), pto->id);
|
vHeaders.front().GetHash().ToString(), pto->id);
|
||||||
//TODO: Shouldn't need to reload block from disk, but requires refactor
|
|
||||||
CBlock block;
|
|
||||||
bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams);
|
|
||||||
assert(ret);
|
|
||||||
CBlockHeaderAndShortTxIDs cmpctblock(block, state.fWantsCmpctWitness);
|
|
||||||
int nSendFlags = state.fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;
|
int nSendFlags = state.fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;
|
||||||
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));
|
|
||||||
|
LOCK(cs_most_recent_block);
|
||||||
|
if (most_recent_block_hash == pBestIndex->GetBlockHash()) {
|
||||||
|
if (state.fWantsCmpctWitness)
|
||||||
|
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *most_recent_compact_block));
|
||||||
|
else {
|
||||||
|
CBlockHeaderAndShortTxIDs cmpctblock(*most_recent_block, state.fWantsCmpctWitness);
|
||||||
|
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
CBlock block;
|
||||||
|
bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams);
|
||||||
|
assert(ret);
|
||||||
|
CBlockHeaderAndShortTxIDs cmpctblock(block, state.fWantsCmpctWitness);
|
||||||
|
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));
|
||||||
|
}
|
||||||
state.pindexBestHeaderSent = pBestIndex;
|
state.pindexBestHeaderSent = pBestIndex;
|
||||||
} else if (state.fPreferHeaders) {
|
} else if (state.fPreferHeaders) {
|
||||||
if (vHeaders.size() > 1) {
|
if (vHeaders.size() > 1) {
|
||||||
|
Loading…
Reference in New Issue
Block a user