aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/kernel/chain.cpp11
-rw-r--r--src/kernel/chain.h20
-rw-r--r--src/validation.cpp10
-rw-r--r--src/validation.h7
4 files changed, 48 insertions, 0 deletions
diff --git a/src/kernel/chain.cpp b/src/kernel/chain.cpp
index 1c877866d0..318c956b38 100644
--- a/src/kernel/chain.cpp
+++ b/src/kernel/chain.cpp
@@ -4,6 +4,7 @@
#include <chain.h>
#include <interfaces/chain.h>
+#include <kernel/chain.h>
#include <sync.h>
#include <uint256.h>
@@ -25,3 +26,13 @@ interfaces::BlockInfo MakeBlockInfo(const CBlockIndex* index, const CBlock* data
return info;
}
} // namespace kernel
+
+std::ostream& operator<<(std::ostream& os, const ChainstateRole& role) {
+ switch(role) {
+ case ChainstateRole::NORMAL: os << "normal"; break;
+ case ChainstateRole::ASSUMEDVALID: os << "assumedvalid"; break;
+ case ChainstateRole::BACKGROUND: os << "background"; break;
+ default: os.setstate(std::ios_base::failbit);
+ }
+ return os;
+}
diff --git a/src/kernel/chain.h b/src/kernel/chain.h
index f0750f8266..feba24a557 100644
--- a/src/kernel/chain.h
+++ b/src/kernel/chain.h
@@ -5,6 +5,8 @@
#ifndef BITCOIN_KERNEL_CHAIN_H
#define BITCOIN_KERNEL_CHAIN_H
+#include<iostream>
+
class CBlock;
class CBlockIndex;
namespace interfaces {
@@ -14,6 +16,24 @@ struct BlockInfo;
namespace kernel {
//! Return data from block index.
interfaces::BlockInfo MakeBlockInfo(const CBlockIndex* block_index, const CBlock* data = nullptr);
+
} // namespace kernel
+//! This enum describes the various roles a specific Chainstate instance can take.
+//! Other parts of the system sometimes need to vary in behavior depending on the
+//! existence of a background validation chainstate, e.g. when building indexes.
+enum class ChainstateRole {
+ // Single chainstate in use, "normal" IBD mode.
+ NORMAL,
+
+ // Doing IBD-style validation in the background. Implies use of an assumed-valid
+ // chainstate.
+ BACKGROUND,
+
+ // Active assumed-valid chainstate. Implies use of a background IBD chainstate.
+ ASSUMEDVALID,
+};
+
+std::ostream& operator<<(std::ostream& os, const ChainstateRole& role);
+
#endif // BITCOIN_KERNEL_CHAIN_H
diff --git a/src/validation.cpp b/src/validation.cpp
index e2091a2c9a..9a543d3a38 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -5813,6 +5813,16 @@ bool ChainstateManager::DeleteSnapshotChainstate()
return true;
}
+ChainstateRole Chainstate::GetRole() const
+{
+ if (m_chainman.GetAll().size() <= 1) {
+ return ChainstateRole::NORMAL;
+ }
+ return (this != &m_chainman.ActiveChainstate()) ?
+ ChainstateRole::BACKGROUND :
+ ChainstateRole::ASSUMEDVALID;
+}
+
const CBlockIndex* ChainstateManager::GetSnapshotBaseBlock() const
{
return m_active_chainstate ? m_active_chainstate->SnapshotBase() : nullptr;
diff --git a/src/validation.h b/src/validation.h
index c2434264d6..38f57ed1b5 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -13,6 +13,7 @@
#include <arith_uint256.h>
#include <attributes.h>
#include <chain.h>
+#include <kernel/chain.h>
#include <consensus/amount.h>
#include <deploymentstatus.h>
#include <kernel/chainparams.h>
@@ -511,6 +512,12 @@ public:
ChainstateManager& chainman,
std::optional<uint256> from_snapshot_blockhash = std::nullopt);
+ //! Return the current role of the chainstate. See `ChainstateManager`
+ //! documentation for a description of the different types of chainstates.
+ //!
+ //! @sa ChainstateRole
+ ChainstateRole GetRole() const EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
+
/**
* Initialize the CoinsViews UTXO set database management data structures. The in-memory
* cache is initialized separately.