Inside Bitcoin
Opening the selected file…
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
251LogError("Logger start failed.");252LogInstance().DeleteCallback(connection);253if (user_data && user_data_destroy_callback) {254user_data_destroy_callback(user_data);255}256throw std::runtime_error("Failed to start logging");257}259m_connection = std::make_unique<std::list<std::function<void(const std::string&)>>::iterator>(connection);260m_user_data = user_data;261m_deleter = user_data_destroy_callback;263LogDebug(BCLog::KERNEL, "Logger connected.");264}266~LoggingConnection()267{268LOCK(cs_main);269LogDebug(BCLog::KERNEL, "Logger disconnecting.");271// Switch back to buffering by calling DisconnectTestLogger if the272// connection that we are about to remove is the last one.273if (LogInstance().NumConnections() == 1) {274LogInstance().DisconnectTestLogger();275} else {276LogInstance().DeleteCallback(*m_connection);277}279m_connection.reset();280if (m_user_data && m_deleter) {281m_deleter(m_user_data);282}283}284};286class KernelNotifications final : public kernel::Notifications287{288private:289btck_NotificationInterfaceCallbacks m_cbs;291public:292KernelNotifications(btck_NotificationInterfaceCallbacks cbs)293: m_cbs{cbs}294{295}297~KernelNotifications()298{299if (m_cbs.user_data && m_cbs.user_data_destroy) {300m_cbs.user_data_destroy(m_cbs.user_data);301}302m_cbs.user_data_destroy = nullptr;303m_cbs.user_data = nullptr;304}306kernel::InterruptResult blockTip(SynchronizationState state, const CBlockIndex& index, double verification_progress) override307{308if (m_cbs.block_tip) m_cbs.block_tip(m_cbs.user_data, cast_state(state), btck_BlockTreeEntry::ref(&index), verification_progress);309return {};310}311void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) override312{313if (m_cbs.header_tip) m_cbs.header_tip(m_cbs.user_data, cast_state(state), height, timestamp, presync ? 1 : 0);314}315void progress(const bilingual_str& title, int progress_percent, bool resume_possible) override316{317if (m_cbs.progress) m_cbs.progress(m_cbs.user_data, title.original.c_str(), title.original.length(), progress_percent, resume_possible ? 1 : 0);318}319void warningSet(kernel::Warning id, const bilingual_str& message) override320{321if (m_cbs.warning_set) m_cbs.warning_set(m_cbs.user_data, cast_btck_warning(id), message.original.c_str(), message.original.length());322}323void warningUnset(kernel::Warning id) override324{325if (m_cbs.warning_unset) m_cbs.warning_unset(m_cbs.user_data, cast_btck_warning(id));326}327void flushError(const bilingual_str& message) override328{329if (m_cbs.flush_error) m_cbs.flush_error(m_cbs.user_data, message.original.c_str(), message.original.length());330}331void fatalError(const bilingual_str& message) override332{333if (m_cbs.fatal_error) m_cbs.fatal_error(m_cbs.user_data, message.original.c_str(), message.original.length());334}335};337class KernelValidationInterface final : public CValidationInterface338{339public:340btck_ValidationInterfaceCallbacks m_cbs;342explicit KernelValidationInterface(const btck_ValidationInterfaceCallbacks vi_cbs) : m_cbs{vi_cbs} {}344~KernelValidationInterface()345{346if (m_cbs.user_data && m_cbs.user_data_destroy) {347m_cbs.user_data_destroy(m_cbs.user_data);348}349m_cbs.user_data = nullptr;350m_cbs.user_data_destroy = nullptr;351}353protected:354void BlockChecked(const std::shared_ptr<const CBlock>& block, const BlockValidationState& stateIn) override355{356if (m_cbs.block_checked) {357m_cbs.block_checked(m_cbs.user_data,358btck_Block::copy(btck_Block::ref(&block)),359btck_BlockValidationState::ref(&stateIn));360}361}363void NewPoWValidBlock(const CBlockIndex* pindex, const std::shared_ptr<const CBlock>& block) override364{365if (m_cbs.pow_valid_block) {366m_cbs.pow_valid_block(m_cbs.user_data,367btck_Block::copy(btck_Block::ref(&block)),368btck_BlockTreeEntry::ref(pindex));369}370}372void BlockConnected(const ChainstateRole& role, const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex) override373{374if (m_cbs.block_connected) {375m_cbs.block_connected(m_cbs.user_data,376btck_Block::copy(btck_Block::ref(&block)),377btck_BlockTreeEntry::ref(pindex));378}379}381void BlockDisconnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex) override382{383if (m_cbs.block_disconnected) {384m_cbs.block_disconnected(m_cbs.user_data,385btck_Block::copy(btck_Block::ref(&block)),386btck_BlockTreeEntry::ref(pindex));387}388}389};391struct ContextOptions {392mutable Mutex m_mutex;393std::unique_ptr<const CChainParams> m_chainparams GUARDED_BY(m_mutex);394std::shared_ptr<KernelNotifications> m_notifications GUARDED_BY(m_mutex);395std::shared_ptr<KernelValidationInterface> m_validation_interface GUARDED_BY(m_mutex);396};398class Context399{400public:401std::unique_ptr<kernel::Context> m_context;403std::shared_ptr<KernelNotifications> m_notifications;405std::unique_ptr<util::SignalInterrupt> m_interrupt;407std::unique_ptr<ValidationSignals> m_signals;409std::unique_ptr<const CChainParams> m_chainparams;411std::shared_ptr<KernelValidationInterface> m_validation_interface;413Context(const ContextOptions* options, bool& sane)414: m_context{std::make_unique<kernel::Context>()},415m_interrupt{std::make_unique<util::SignalInterrupt>()}416{417if (options) {418LOCK(options->m_mutex);419if (options->m_chainparams) {420m_chainparams = std::make_unique<const CChainParams>(*options->m_chainparams);421}422if (options->m_notifications) {423m_notifications = options->m_notifications;424}425if (options->m_validation_interface) {426m_signals = std::make_unique<ValidationSignals>(std::make_unique<ImmediateTaskRunner>());427m_validation_interface = options->m_validation_interface;428m_signals->RegisterSharedValidationInterface(m_validation_interface);429}430}432if (!m_chainparams) {433m_chainparams = CChainParams::Main();434}435if (!m_notifications) {436m_notifications = std::make_shared<KernelNotifications>(btck_NotificationInterfaceCallbacks{437nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr});438}440if (!kernel::SanityChecks(*m_context)) {441sane = false;442}443}445~Context()446{447if (m_signals) {448m_signals->UnregisterSharedValidationInterface(m_validation_interface);449}450}451};453//! Helper struct to wrap the ChainstateManager-related Options454struct ChainstateManagerOptions {455mutable Mutex m_mutex;456ChainstateManager::Options m_chainman_options GUARDED_BY(m_mutex);457node::BlockManager::Options m_blockman_options GUARDED_BY(m_mutex);458std::shared_ptr<const Context> m_context;459node::ChainstateLoadOptions m_chainstate_load_options GUARDED_BY(m_mutex);460uint64_t m_db_cache_bytes GUARDED_BY(m_mutex){DEFAULT_KERNEL_CACHE};462ChainstateManagerOptions(const std::shared_ptr<const Context>& context, const fs::path& data_dir, const fs::path& blocks_dir)463: m_chainman_options{ChainstateManager::Options{464.chainparams = *context->m_chainparams,465.datadir = data_dir,466.notifications = *context->m_notifications,467.signals = context->m_signals.get()}},468m_blockman_options{node::BlockManager::Options{469.chainparams = *context->m_chainparams,470.blocks_dir = blocks_dir,471.notifications = *context->m_notifications,472.block_tree_db_params = DBParams{473.path = data_dir / "blocks" / "index",474.cache_bytes = kernel::CacheSizes{DEFAULT_KERNEL_CACHE}.block_tree_db,475}}},476m_context{context}, m_chainstate_load_options{node::ChainstateLoadOptions{}}477{478}479};481struct ChainMan {482std::unique_ptr<ChainstateManager> m_chainman;483std::shared_ptr<const Context> m_context;485ChainMan(std::unique_ptr<ChainstateManager> chainman, std::shared_ptr<const Context> context)486: m_chainman(std::move(chainman)), m_context(std::move(context)) {}487};489} // namespace491struct btck_Transaction : Handle<btck_Transaction, std::shared_ptr<const CTransaction>> {};492struct btck_TransactionOutput : Handle<btck_TransactionOutput, CTxOut> {};493struct btck_ScriptPubkey : Handle<btck_ScriptPubkey, CScript> {};494struct btck_LoggingConnection : Handle<btck_LoggingConnection, LoggingConnection> {};495struct btck_ContextOptions : Handle<btck_ContextOptions, ContextOptions> {};496struct btck_Context : Handle<btck_Context, std::shared_ptr<const Context>> {};497struct btck_ChainParameters : Handle<btck_ChainParameters, CChainParams> {};498struct btck_ChainstateManagerOptions : Handle<btck_ChainstateManagerOptions, ChainstateManagerOptions> {};499struct btck_ChainstateManager : Handle<btck_ChainstateManager, ChainMan> {};500struct btck_Chain : Handle<btck_Chain, CChain> {};