mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-03 10:16:14 +00:00
de4242f47476769d0a7f3e79e8297ed2dd60d9a4 refactor: Use reference for chain_start in HeadersSyncState (Daniela Brozzoni) e37555e5401f9fca39ada0bd153e46b2c7ebd095 refactor: Use initializer list in CompressedHeader (Daniela Brozzoni) 0488bdfefe92b2c9a924be9244c91fe472462aab refactor: Remove unused parameter in ReportHeadersPresync (Daniela Brozzoni) 256246a9fa5b05141c93aeeb359394b9c7a80e49 refactor: Remove redundant parameter from CheckHeadersPoW (Daniela Brozzoni) ca0243e3a6d77d2b218749f1ba113b81444e3f4a refactor: Remove useless CBlock::GetBlockHeader (Pieter Wuille) 45686522224598bed9923e60daad109094d7bc29 refactor: Use std::span in HasValidProofOfWork (Daniela Brozzoni) 4066bfe561a45f61a3c9bf24bec7f600ddcc7467 refactor: Compute work from headers without CBlockIndex (Daniela Brozzoni) 0bf6139e194f355d121bb2aea74715d1c4099598 p2p: Avoid an IsAncestorOfBestHeaderOrTip call (Pieter Wuille) Pull request description: This is a partial* revival of #25968 It contains a list of most-unrelated simplifications and optimizations to the code merged in #25717: - Avoid an IsAncestorOfBestHeaderOrTip call: Just don't call this function when it won't have any effect. - Compute work from headers without CBlockIndex: Avoid the need to construct a CBlockIndex object just to compute work for a header, when its nBits value suffices for that. Also use some Spans where possible. - Remove useless CBlock::GetBlockHeader: There is no need for a function to convert a CBlock to a CBlockHeader, as it's a child class of it. It also contains the following code cleanups, which were suggested by reviewers in #25968: - Remove redundant parameter from CheckHeadersPoW: No need to pass consensusParams, as CheckHeadersPow already has access to m_chainparams.GetConsensus() - Remove unused parameter in ReportHeadersPresync - Use initializer list in CompressedHeader, also make GetFullHeader const - Use reference for chain_start in HeadersSyncState: chain_start can never be null, so it's better to pass it as a reference rather than a raw pointer *I decided to leave out three commits that were in #25968 (4e7ac7b94d04e056e9994ed1c8273c52b7b23931, ab52fb4e95aa2732d1a1391331ea01362e035984, 7f1cf440ca1a9c86085716745ca64d3ac26957c0), since they're a bit more involved, and I'm a new contributor. If this PR gets merged, I'll comment under #25968 to note that these three commits are still up for grabs :) ACKs for top commit: l0rinc: ACK de4242f47476769d0a7f3e79e8297ed2dd60d9a4 polespinasa: re-ACK de4242f47476769d0a7f3e79e8297ed2dd60d9a4 sipa: ACK de4242f47476769d0a7f3e79e8297ed2dd60d9a4 achow101: ACK de4242f47476769d0a7f3e79e8297ed2dd60d9a4 hodlinator: re-ACK de4242f47476769d0a7f3e79e8297ed2dd60d9a4 Tree-SHA512: 1de4f3ce0854a196712505f2b52ccb985856f5133769552bf37375225ea8664a3a7a6a9578c4fd461e935cd94a7cbbb08f15751a1da7651f8962c866146d9d4b
147 lines
3.6 KiB
C++
147 lines
3.6 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-present The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_PRIMITIVES_BLOCK_H
|
|
#define BITCOIN_PRIMITIVES_BLOCK_H
|
|
|
|
#include <primitives/transaction.h>
|
|
#include <serialize.h>
|
|
#include <uint256.h>
|
|
#include <util/time.h>
|
|
|
|
/** Nodes collect new transactions into a block, hash them into a hash tree,
|
|
* and scan through nonce values to make the block's hash satisfy proof-of-work
|
|
* requirements. When they solve the proof-of-work, they broadcast the block
|
|
* to everyone and the block is added to the block chain. The first transaction
|
|
* in the block is a special one that creates a new coin owned by the creator
|
|
* of the block.
|
|
*/
|
|
class CBlockHeader
|
|
{
|
|
public:
|
|
// header
|
|
int32_t nVersion;
|
|
uint256 hashPrevBlock;
|
|
uint256 hashMerkleRoot;
|
|
uint32_t nTime;
|
|
uint32_t nBits;
|
|
uint32_t nNonce;
|
|
|
|
CBlockHeader()
|
|
{
|
|
SetNull();
|
|
}
|
|
|
|
SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }
|
|
|
|
void SetNull()
|
|
{
|
|
nVersion = 0;
|
|
hashPrevBlock.SetNull();
|
|
hashMerkleRoot.SetNull();
|
|
nTime = 0;
|
|
nBits = 0;
|
|
nNonce = 0;
|
|
}
|
|
|
|
bool IsNull() const
|
|
{
|
|
return (nBits == 0);
|
|
}
|
|
|
|
uint256 GetHash() const;
|
|
|
|
NodeSeconds Time() const
|
|
{
|
|
return NodeSeconds{std::chrono::seconds{nTime}};
|
|
}
|
|
|
|
int64_t GetBlockTime() const
|
|
{
|
|
return (int64_t)nTime;
|
|
}
|
|
};
|
|
|
|
|
|
class CBlock : public CBlockHeader
|
|
{
|
|
public:
|
|
// network and disk
|
|
std::vector<CTransactionRef> vtx;
|
|
|
|
// Memory-only flags for caching expensive checks
|
|
mutable bool fChecked; // CheckBlock()
|
|
mutable bool m_checked_witness_commitment{false}; // CheckWitnessCommitment()
|
|
mutable bool m_checked_merkle_root{false}; // CheckMerkleRoot()
|
|
|
|
CBlock()
|
|
{
|
|
SetNull();
|
|
}
|
|
|
|
CBlock(const CBlockHeader &header)
|
|
{
|
|
SetNull();
|
|
*(static_cast<CBlockHeader*>(this)) = header;
|
|
}
|
|
|
|
SERIALIZE_METHODS(CBlock, obj)
|
|
{
|
|
READWRITE(AsBase<CBlockHeader>(obj), obj.vtx);
|
|
}
|
|
|
|
void SetNull()
|
|
{
|
|
CBlockHeader::SetNull();
|
|
vtx.clear();
|
|
fChecked = false;
|
|
m_checked_witness_commitment = false;
|
|
m_checked_merkle_root = false;
|
|
}
|
|
|
|
std::string ToString() const;
|
|
};
|
|
|
|
/** Describes a place in the block chain to another node such that if the
|
|
* other node doesn't have the same branch, it can find a recent common trunk.
|
|
* The further back it is, the further before the fork it may be.
|
|
*/
|
|
struct CBlockLocator
|
|
{
|
|
/** Historically CBlockLocator's version field has been written to network
|
|
* streams as the negotiated protocol version and to disk streams as the
|
|
* client version, but the value has never been used.
|
|
*
|
|
* Hard-code to the highest protocol version ever written to a network stream.
|
|
* SerParams can be used if the field requires any meaning in the future,
|
|
**/
|
|
static constexpr int DUMMY_VERSION = 70016;
|
|
|
|
std::vector<uint256> vHave;
|
|
|
|
CBlockLocator() = default;
|
|
|
|
explicit CBlockLocator(std::vector<uint256>&& have) : vHave(std::move(have)) {}
|
|
|
|
SERIALIZE_METHODS(CBlockLocator, obj)
|
|
{
|
|
int nVersion = DUMMY_VERSION;
|
|
READWRITE(nVersion);
|
|
READWRITE(obj.vHave);
|
|
}
|
|
|
|
void SetNull()
|
|
{
|
|
vHave.clear();
|
|
}
|
|
|
|
bool IsNull() const
|
|
{
|
|
return vHave.empty();
|
|
}
|
|
};
|
|
|
|
#endif // BITCOIN_PRIMITIVES_BLOCK_H
|