43int main(
int argc,
char* argv[])
54 <<
"Usage: " << argv[0] <<
" DATADIR" << std::endl
55 <<
"Display DATADIR information, and process hex-encoded blocks on standard input." << std::endl
57 <<
"IMPORTANT: THIS EXECUTABLE IS EXPERIMENTAL, FOR TESTING ONLY, AND EXPECTED TO" << std::endl
58 <<
" BREAK IN FUTURE VERSIONS. DO NOT USE ON YOUR ACTUAL DATADIR." << std::endl;
72 ValidationSignals validation_signals{std::make_unique<util::ImmediateTaskRunner>()};
79 std::cout <<
"Block tip changed" << std::endl;
84 std::cout <<
"Header tip changed: " << height <<
", " << timestamp <<
", " << presync << std::endl;
88 std::cout <<
"Progress: " << title.
original <<
", " << progress_percent <<
", " << resume_possible << std::endl;
92 std::cout <<
"Warning " <<
static_cast<int>(id) <<
" set: " << message.
original << std::endl;
96 std::cout <<
"Warning " <<
static_cast<int>(id) <<
" unset" << std::endl;
100 std::cerr <<
"Error flushing block data to disk: " << message.
original << std::endl;
104 std::cerr <<
"Error: " << message.
original << std::endl;
107 auto notifications = std::make_unique<KernelNotifications>();
114 .datadir = abs_datadir,
115 .notifications = *notifications,
116 .signals = &validation_signals,
120 .blocks_dir = abs_datadir /
"blocks",
121 .notifications = chainman_opts.notifications,
130 std::cerr <<
"Failed to load Chain state from your datadir." << std::endl;
135 std::cerr <<
"Failed to verify loaded Chain state from your datadir." << std::endl;
142 if (!chainstate->ActivateBestChain(state,
nullptr)) {
143 std::cerr <<
"Failed to connect best block (" << state.
ToString() <<
")" << std::endl;
150 <<
"Hello! I'm going to print out some information about your datadir." << std::endl
152 <<
"Path: " << abs_datadir << std::endl;
154 LOCK(chainman.GetMutex());
156 <<
"\t" <<
"Blockfiles Indexed: " << std::boolalpha << chainman.m_blockman.m_blockfiles_indexed.load() << std::noboolalpha << std::endl
157 <<
"\t" <<
"Snapshot Active: " << std::boolalpha << chainman.IsSnapshotActive() << std::noboolalpha << std::endl
158 <<
"\t" <<
"Active Height: " << chainman.ActiveHeight() << std::endl
159 <<
"\t" <<
"Active IBD: " << std::boolalpha << chainman.IsInitialBlockDownload() << std::noboolalpha << std::endl;
162 std::cout <<
"\t" << tip->
ToString() << std::endl;
166 for (std::string line; std::getline(std::cin, line);) {
168 std::cerr <<
"Empty line found" << std::endl;
172 std::shared_ptr<CBlock> blockptr = std::make_shared<CBlock>();
173 CBlock& block = *blockptr;
176 std::cerr <<
"Block decode failed" << std::endl;
184 chainman.UpdateUncommittedBlockStructures(block, pindex);
209 auto sc = std::make_shared<submitblock_StateCatcher>(block.
GetHash());
210 validation_signals.RegisterSharedValidationInterface(sc);
211 bool accepted = chainman.ProcessNewBlock(blockptr,
true,
true, &new_block);
212 validation_signals.UnregisterSharedValidationInterface(sc);
213 if (!new_block && accepted) {
214 std::cerr <<
"duplicate" << std::endl;
218 std::cerr <<
"inconclusive" << std::endl;
221 std::cout << sc->state.ToString() << std::endl;
222 switch (sc->state.GetResult()) {
224 std::cerr <<
"initial value. Block has not yet been rejected" << std::endl;
227 std::cerr <<
"the block header may be on a too-little-work chain" << std::endl;
230 std::cerr <<
"invalid by consensus rules (excluding any below reasons)" << std::endl;
233 std::cerr <<
"this block was cached as being invalid and we didn't store the reason why" << std::endl;
236 std::cerr <<
"invalid proof of work or time too old" << std::endl;
239 std::cerr <<
"the block's data didn't match the data committed to by the PoW" << std::endl;
242 std::cerr <<
"We don't have the previous block the checked one is built on" << std::endl;
245 std::cerr <<
"A block this one builds on is invalid" << std::endl;
248 std::cerr <<
"block timestamp was > 2 hours in the future (or our clock is bad)" << std::endl;
251 std::cerr <<
"the block failed to meet one of our checkpoints" << std::endl;
259 validation_signals.FlushBackgroundCallbacks();
262 for (
Chainstate* chainstate : chainman.GetAll()) {
263 if (chainstate->CanFlushToDisk()) {
264 chainstate->ForceFlushStateToDisk();
265 chainstate->ResetCoinsViews();
int main(int argc, char *argv[])
void DisableLogging() EXCLUSIVE_LOCKS_REQUIRED(!m_cs)
Disable logging This offers a slight speedup and slightly smaller memory usage compared to leaving th...
The block chain is a tree shaped structure starting with the genesis block at the root,...
std::string ToString() const
static std::unique_ptr< const CChainParams > Main()
Implement this to subscribe to events generated in validation and mempool.
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
std::string ToString() const
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
A base class defining functions for notifying about certain kernel events.
virtual void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync)
virtual void fatalError(const bilingual_str &message)
The fatal error notification is sent to notify the user when an error occurs in kernel code that can'...
virtual void warningSet(Warning id, const bilingual_str &message)
virtual void progress(const bilingual_str &title, int progress_percent, bool resume_possible)
virtual void flushError(const bilingual_str &message)
The flush error notification is sent to notify the user that an error occurred while flushing block d...
virtual InterruptResult blockTip(SynchronizationState state, CBlockIndex &index)
virtual void warningUnset(Warning id)
void BlockChecked(const CBlock &block, const BlockValidationState &stateIn) override
Notifies listeners of a block validation result.
submitblock_StateCatcher(const uint256 &hashIn)
BlockValidationState state
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
@ BLOCK_CHECKPOINT
the block failed to meet one of our checkpoints
@ BLOCK_HEADER_LOW_WORK
the block header may be on a too-little-work chain
@ BLOCK_INVALID_HEADER
invalid proof of work or time too old
@ BLOCK_CACHED_INVALID
this block was cached as being invalid and we didn't store the reason why
@ BLOCK_CONSENSUS
invalid by consensus rules (excluding any below reasons)
@ BLOCK_MISSING_PREV
We don't have the previous block the checked one is built on.
@ BLOCK_INVALID_PREV
A block this one builds on is invalid.
@ BLOCK_MUTATED
the block's data didn't match the data committed to by the PoW
@ BLOCK_TIME_FUTURE
block timestamp was > 2 hours in the future (or our clock is bad)
@ BLOCK_RESULT_UNSET
initial value. Block has not yet been rejected
bool DecodeHexBlk(CBlock &, const std::string &strHexBlk)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
static constexpr size_t DEFAULT_KERNEL_CACHE
Suggested default amount of cache reserved for the kernel (bytes)
BCLog::Logger & LogInstance()
static path absolute(const path &p)
static bool create_directories(const std::filesystem::path &p)
Create directory (and if necessary its parents), unless the leaf directory already exists or is a sym...
std::variant< std::monostate, Interrupted > InterruptResult
Simple result type for functions that need to propagate an interrupt status and don't have other retu...
util::Result< void > SanityChecks(const Context &)
Ensure a usable environment with all necessary library support.
ChainstateLoadResult LoadChainstate(ChainstateManager &chainman, const CacheSizes &cache_sizes, const ChainstateLoadOptions &options)
ChainstateLoadResult VerifyLoadedChainstate(ChainstateManager &chainman, const ChainstateLoadOptions &options)
An options struct for BlockManager, more ergonomically referred to as BlockManager::Options due to th...
const CChainParams & chainparams
An options struct for ChainstateManager, more ergonomically referred to as ChainstateManager::Options...
const CChainParams & chainparams
Context struct holding the kernel library's logically global state, and passed to external libbitcoin...
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
This header provides an interface and simple implementation for a task runner.
SynchronizationState
Current sync state passed to tip changed callbacks.