aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShibe <[email protected]>2021-02-08 04:54:51 +0400
committerShibe <[email protected]>2021-02-08 16:52:55 +0400
commitef9242b9ec46a28690e49debe2c2364bb70be702 (patch)
treeb012eaa7e97e3ae70d99027ec5e31f3d08febc20 /src
parentMerge pull request #1705 from rnicoll/block-download-timeout (diff)
downloaddiscoin-ef9242b9ec46a28690e49debe2c2364bb70be702.tar.xz
discoin-ef9242b9ec46a28690e49debe2c2364bb70be702.zip
Don't re-check AuxPoW when sending data to peers
Checking scrypt PoW is expensive and needless in this case. All block headers are already checked when they are accepted, and they will be checked again on the receiving end.
Diffstat (limited to 'src')
-rw-r--r--src/chain.cpp4
-rw-r--r--src/chain.h2
-rw-r--r--src/net_processing.cpp12
-rw-r--r--src/validation.cpp20
-rw-r--r--src/validation.h6
5 files changed, 22 insertions, 22 deletions
diff --git a/src/chain.cpp b/src/chain.cpp
index 2ce98818f..e618f0568 100644
--- a/src/chain.cpp
+++ b/src/chain.cpp
@@ -10,7 +10,7 @@ using namespace std;
/* Moved here from the header, because we need auxpow and the logic
becomes more involved. */
-CBlockHeader CBlockIndex::GetBlockHeader(const Consensus::Params& consensusParams) const
+CBlockHeader CBlockIndex::GetBlockHeader(const Consensus::Params& consensusParams, bool fCheckPOW) const
{
CBlockHeader block;
@@ -21,7 +21,7 @@ CBlockHeader CBlockIndex::GetBlockHeader(const Consensus::Params& consensusParam
have to read the actual *header*, not the full block. */
if (block.IsAuxpow())
{
- ReadBlockHeaderFromDisk(block, this, consensusParams);
+ ReadBlockHeaderFromDisk(block, this, consensusParams, fCheckPOW);
return block;
}
diff --git a/src/chain.h b/src/chain.h
index 7b568eebb..882fdd34d 100644
--- a/src/chain.h
+++ b/src/chain.h
@@ -263,7 +263,7 @@ public:
return ret;
}
- CBlockHeader GetBlockHeader(const Consensus::Params& consensusParams) const;
+ CBlockHeader GetBlockHeader(const Consensus::Params& consensusParams, bool fCheckPOW = true) const;
uint256 GetBlockHash() const
{
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index 1a918f486..1b33d529b 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -1037,7 +1037,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
{
// Send block from disk
CBlock block;
- if (!ReadBlockFromDisk(block, (*mi).second, consensusParams))
+ if (!ReadBlockFromDisk(block, (*mi).second, consensusParams, false))
assert(!"cannot load block from disk");
if (inv.type == MSG_BLOCK)
connman.PushMessage(pfrom, msgMaker.Make(SERIALIZE_TRANSACTION_NO_WITNESS, NetMsgType::BLOCK, block));
@@ -1705,7 +1705,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
}
CBlock block;
- bool ret = ReadBlockFromDisk(block, it->second, chainparams.GetConsensus(it->second->nHeight));
+ bool ret = ReadBlockFromDisk(block, it->second, chainparams.GetConsensus(it->second->nHeight), false);
assert(ret);
SendBlockTransactions(block, req, pfrom, connman);
@@ -1748,7 +1748,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
LogPrint("net", "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom->id);
for (; pindex; pindex = chainActive.Next(pindex))
{
- vHeaders.push_back(pindex->GetBlockHeader(chainparams.GetConsensus(pindex->nHeight)));
+ vHeaders.push_back(pindex->GetBlockHeader(chainparams.GetConsensus(pindex->nHeight), false));
if (--nLimit <= 0 || pindex->GetBlockHash() == hashStop)
break;
}
@@ -2974,14 +2974,14 @@ bool SendMessages(CNode* pto, CConnman& connman, const std::atomic<bool>& interr
pBestIndex = pindex;
if (fFoundStartingHeader) {
// add this to the headers message
- vHeaders.push_back(pindex->GetBlockHeader(consensusParams));
+ vHeaders.push_back(pindex->GetBlockHeader(consensusParams, false));
} else if (PeerHasHeader(&state, pindex)) {
continue; // keep looking for the first new block
} else if (pindex->pprev == NULL || PeerHasHeader(&state, pindex->pprev)) {
// Peer doesn't have this header but they do have the prior one.
// Start sending headers.
fFoundStartingHeader = true;
- vHeaders.push_back(pindex->GetBlockHeader(consensusParams));
+ vHeaders.push_back(pindex->GetBlockHeader(consensusParams, false));
} else {
// Peer doesn't have this header or the prior one -- nothing will
// connect, so bail out.
@@ -3014,7 +3014,7 @@ bool SendMessages(CNode* pto, CConnman& connman, const std::atomic<bool>& interr
}
if (!fGotBlockFromCache) {
CBlock block;
- bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams);
+ bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams, false);
assert(ret);
CBlockHeaderAndShortTxIDs cmpctblock(block, state.fWantsCmpctWitness);
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));
diff --git a/src/validation.cpp b/src/validation.cpp
index 3ddf67717..c5f00fe13 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -1142,7 +1142,7 @@ bool WriteBlockToDisk(const CBlock& block, CDiskBlockPos& pos, const CMessageHea
both a block and its header. */
template<typename T>
-static bool ReadBlockOrHeader(T& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams)
+static bool ReadBlockOrHeader(T& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams, bool fCheckPOW)
{
block.SetNull();
@@ -1160,16 +1160,16 @@ static bool ReadBlockOrHeader(T& block, const CDiskBlockPos& pos, const Consensu
}
// Check the header
- if (!CheckAuxPowProofOfWork(block, consensusParams))
+ if (fCheckPOW && !CheckAuxPowProofOfWork(block, consensusParams))
return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString());
return true;
}
template<typename T>
-static bool ReadBlockOrHeader(T& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
+static bool ReadBlockOrHeader(T& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams, bool fCheckPOW)
{
- if (!ReadBlockOrHeader(block, pindex->GetBlockPos(), consensusParams))
+ if (!ReadBlockOrHeader(block, pindex->GetBlockPos(), consensusParams, fCheckPOW))
return false;
if (block.GetHash() != pindex->GetBlockHash())
return error("ReadBlockOrHeader(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s",
@@ -1177,19 +1177,19 @@ static bool ReadBlockOrHeader(T& block, const CBlockIndex* pindex, const Consens
return true;
}
-bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams)
+bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams, bool fCheckPOW)
{
- return ReadBlockOrHeader(block, pos, consensusParams);
+ return ReadBlockOrHeader(block, pos, consensusParams, fCheckPOW);
}
-bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
+bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams, bool fCheckPOW)
{
- return ReadBlockOrHeader(block, pindex, consensusParams);
+ return ReadBlockOrHeader(block, pindex, consensusParams, fCheckPOW);
}
-bool ReadBlockHeaderFromDisk(CBlockHeader& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
+bool ReadBlockHeaderFromDisk(CBlockHeader& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams, bool fCheckPOW)
{
- return ReadBlockOrHeader(block, pindex, consensusParams);
+ return ReadBlockOrHeader(block, pindex, consensusParams, fCheckPOW);
}
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
diff --git a/src/validation.h b/src/validation.h
index 386979a14..9e7305492 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -476,9 +476,9 @@ public:
/** Functions for disk access for blocks */
bool WriteBlockToDisk(const CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart);
-bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams);
-bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams);
-bool ReadBlockHeaderFromDisk(CBlockHeader& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams);
+bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus::Params& consensusParams, bool fCheckPOW = true);
+bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams, bool fCheckPOW = true);
+bool ReadBlockHeaderFromDisk(CBlockHeader& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams, bool fCheckPOW = true);
/** Functions for validating blocks and updating the block tree */