mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-06 13:47:56 +02:00
Merge #9375: Relay compact block messages prior to full block connection
02ee4ebMake most_recent_compact_block a pointer to a const (Matt Corallo)73666adAdd comment to describe callers to ActivateBestChain (Matt Corallo)962f7f0Call ActivateBestChain without cs_main/with most_recent_block (Matt Corallo)0df777dUse a temp pindex to avoid a const_cast in ProcessNewBlockHeaders (Matt Corallo)c1ae4fcAvoid holding cs_most_recent_block while calling ReadBlockFromDisk (Matt Corallo)9eb67f5Ensure we meet the BIP 152 old-relay-types response requirements (Matt Corallo)5749a85Cache most-recently-connected compact block (Matt Corallo)9eaec08Cache most-recently-announced block's shared_ptr (Matt Corallo)c802092Relay compact block messages prior to full block connection (Matt Corallo)6987219Add a CValidationInterface::NewPoWValidBlock callback (Matt Corallo)180586fCall AcceptBlock with the block's shared_ptr instead of CBlock& (Matt Corallo)8baaba6[qa] Avoid race in preciousblock test. (Matt Corallo)9a0b2f4[qa] Make compact blocks test construction using fetch methods (Matt Corallo)8017547Make CBlockIndex*es in net_processing const (Matt Corallo)
This commit is contained in:
@@ -2414,6 +2414,11 @@ static void NotifyHeaderTip() {
|
||||
* that is already loaded (to avoid loading it again from disk).
|
||||
*/
|
||||
bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, std::shared_ptr<const CBlock> pblock) {
|
||||
// Note that while we're often called here from ProcessNewBlock, this is
|
||||
// far from a guarantee. Things in the P2P/RPC will often end up calling
|
||||
// us in the middle of ProcessNewBlock - do not assume pblock is set
|
||||
// sanely for performance or correctness!
|
||||
|
||||
CBlockIndex *pindexMostWork = NULL;
|
||||
CBlockIndex *pindexNewTip = NULL;
|
||||
do {
|
||||
@@ -3056,14 +3061,18 @@ static bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state
|
||||
}
|
||||
|
||||
// Exposed wrapper for AcceptBlockHeader
|
||||
bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex)
|
||||
bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, CValidationState& state, const CChainParams& chainparams, const CBlockIndex** ppindex)
|
||||
{
|
||||
{
|
||||
LOCK(cs_main);
|
||||
for (const CBlockHeader& header : headers) {
|
||||
if (!AcceptBlockHeader(header, state, chainparams, ppindex)) {
|
||||
CBlockIndex *pindex = NULL; // Use a temp pindex instead of ppindex to avoid a const_cast
|
||||
if (!AcceptBlockHeader(header, state, chainparams, &pindex)) {
|
||||
return false;
|
||||
}
|
||||
if (ppindex) {
|
||||
*ppindex = pindex;
|
||||
}
|
||||
}
|
||||
}
|
||||
NotifyHeaderTip();
|
||||
@@ -3071,8 +3080,10 @@ bool ProcessNewBlockHeaders(const std::vector<CBlockHeader>& headers, CValidatio
|
||||
}
|
||||
|
||||
/** Store block on disk. If dbp is non-NULL, the file is known to already reside on disk */
|
||||
static bool AcceptBlock(const CBlock& block, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex, bool fRequested, const CDiskBlockPos* dbp, bool* fNewBlock)
|
||||
static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidationState& state, const CChainParams& chainparams, CBlockIndex** ppindex, bool fRequested, const CDiskBlockPos* dbp, bool* fNewBlock)
|
||||
{
|
||||
const CBlock& block = *pblock;
|
||||
|
||||
if (fNewBlock) *fNewBlock = false;
|
||||
AssertLockHeld(cs_main);
|
||||
|
||||
@@ -3118,6 +3129,11 @@ static bool AcceptBlock(const CBlock& block, CValidationState& state, const CCha
|
||||
return error("%s: %s", __func__, FormatStateMessage(state));
|
||||
}
|
||||
|
||||
// Header is valid/has work, merkle tree and segwit merkle tree are good...RELAY NOW
|
||||
// (but if it does not build on our best tip, let the SendMessages loop relay it)
|
||||
if (!IsInitialBlockDownload() && chainActive.Tip() == pindex->pprev)
|
||||
GetMainSignals().NewPoWValidBlock(pindex, pblock);
|
||||
|
||||
int nHeight = pindex->nHeight;
|
||||
|
||||
// Write block to history file
|
||||
@@ -3152,7 +3168,7 @@ bool ProcessNewBlock(const CChainParams& chainparams, const std::shared_ptr<cons
|
||||
CBlockIndex *pindex = NULL;
|
||||
if (fNewBlock) *fNewBlock = false;
|
||||
CValidationState state;
|
||||
bool ret = AcceptBlock(*pblock, state, chainparams, &pindex, fForceProcessing, NULL, fNewBlock);
|
||||
bool ret = AcceptBlock(pblock, state, chainparams, &pindex, fForceProcessing, NULL, fNewBlock);
|
||||
CheckBlockIndex(chainparams.GetConsensus());
|
||||
if (!ret) {
|
||||
GetMainSignals().BlockChecked(*pblock, state);
|
||||
@@ -3808,7 +3824,8 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
|
||||
dbp->nPos = nBlockPos;
|
||||
blkdat.SetLimit(nBlockPos + nSize);
|
||||
blkdat.SetPos(nBlockPos);
|
||||
CBlock block;
|
||||
std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
|
||||
CBlock& block = *pblock;
|
||||
blkdat >> block;
|
||||
nRewind = blkdat.GetPos();
|
||||
|
||||
@@ -3826,7 +3843,7 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
|
||||
if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) {
|
||||
LOCK(cs_main);
|
||||
CValidationState state;
|
||||
if (AcceptBlock(block, state, chainparams, NULL, true, dbp, NULL))
|
||||
if (AcceptBlock(pblock, state, chainparams, NULL, true, dbp, NULL))
|
||||
nLoaded++;
|
||||
if (state.IsError())
|
||||
break;
|
||||
@@ -3853,16 +3870,17 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
|
||||
std::pair<std::multimap<uint256, CDiskBlockPos>::iterator, std::multimap<uint256, CDiskBlockPos>::iterator> range = mapBlocksUnknownParent.equal_range(head);
|
||||
while (range.first != range.second) {
|
||||
std::multimap<uint256, CDiskBlockPos>::iterator it = range.first;
|
||||
if (ReadBlockFromDisk(block, it->second, chainparams.GetConsensus()))
|
||||
std::shared_ptr<CBlock> pblockrecursive = std::make_shared<CBlock>();
|
||||
if (ReadBlockFromDisk(*pblockrecursive, it->second, chainparams.GetConsensus()))
|
||||
{
|
||||
LogPrint("reindex", "%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(),
|
||||
LogPrint("reindex", "%s: Processing out of order child %s of %s\n", __func__, pblockrecursive->GetHash().ToString(),
|
||||
head.ToString());
|
||||
LOCK(cs_main);
|
||||
CValidationState dummy;
|
||||
if (AcceptBlock(block, dummy, chainparams, NULL, true, &it->second, NULL))
|
||||
if (AcceptBlock(pblockrecursive, dummy, chainparams, NULL, true, &it->second, NULL))
|
||||
{
|
||||
nLoaded++;
|
||||
queue.push_back(block.GetHash());
|
||||
queue.push_back(pblockrecursive->GetHash());
|
||||
}
|
||||
}
|
||||
range.first++;
|
||||
|
||||
Reference in New Issue
Block a user