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.
1// Copyright (c) 2024-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#ifndef BITCOIN_KERNEL_BITCOINKERNEL_WRAPPER_H6#define BITCOIN_KERNEL_BITCOINKERNEL_WRAPPER_H8#include <kernel/bitcoinkernel.h>10#include <array>11#include <chrono>12#include <exception>13#include <functional>14#include <memory>15#include <optional>16#include <span>17#include <stdexcept>18#include <string>19#include <string_view>20#include <type_traits>21#include <utility>22#include <vector>24namespace btck {26enum class LogCategory : btck_LogCategory {27ALL = btck_LogCategory_ALL,28BENCH = btck_LogCategory_BENCH,29BLOCKSTORAGE = btck_LogCategory_BLOCKSTORAGE,30COINDB = btck_LogCategory_COINDB,31LEVELDB = btck_LogCategory_LEVELDB,32MEMPOOL = btck_LogCategory_MEMPOOL,33PRUNE = btck_LogCategory_PRUNE,34RAND = btck_LogCategory_RAND,35REINDEX = btck_LogCategory_REINDEX,36VALIDATION = btck_LogCategory_VALIDATION,37KERNEL = btck_LogCategory_KERNEL38};40enum class LogLevel : btck_LogLevel {41TRACE_LEVEL = btck_LogLevel_TRACE,42DEBUG_LEVEL = btck_LogLevel_DEBUG,43INFO_LEVEL = btck_LogLevel_INFO44};46enum class ChainType : btck_ChainType {47MAINNET = btck_ChainType_MAINNET,48TESTNET = btck_ChainType_TESTNET,49TESTNET_4 = btck_ChainType_TESTNET_4,50SIGNET = btck_ChainType_SIGNET,51REGTEST = btck_ChainType_REGTEST52};54enum class SynchronizationState : btck_SynchronizationState {55INIT_REINDEX = btck_SynchronizationState_INIT_REINDEX,56INIT_DOWNLOAD = btck_SynchronizationState_INIT_DOWNLOAD,57POST_INIT = btck_SynchronizationState_POST_INIT58};60enum class Warning : btck_Warning {61UNKNOWN_NEW_RULES_ACTIVATED = btck_Warning_UNKNOWN_NEW_RULES_ACTIVATED,62LARGE_WORK_INVALID_CHAIN = btck_Warning_LARGE_WORK_INVALID_CHAIN63};65enum class ValidationMode : btck_ValidationMode {66VALID = btck_ValidationMode_VALID,67INVALID = btck_ValidationMode_INVALID,68INTERNAL_ERROR = btck_ValidationMode_INTERNAL_ERROR69};71enum class BlockValidationResult : btck_BlockValidationResult {72UNSET = btck_BlockValidationResult_UNSET,73CONSENSUS = btck_BlockValidationResult_CONSENSUS,74CACHED_INVALID = btck_BlockValidationResult_CACHED_INVALID,75INVALID_HEADER = btck_BlockValidationResult_INVALID_HEADER,76MUTATED = btck_BlockValidationResult_MUTATED,77MISSING_PREV = btck_BlockValidationResult_MISSING_PREV,78INVALID_PREV = btck_BlockValidationResult_INVALID_PREV,79TIME_FUTURE = btck_BlockValidationResult_TIME_FUTURE,80HEADER_LOW_WORK = btck_BlockValidationResult_HEADER_LOW_WORK81};83enum class TxValidationResult : btck_TxValidationResult {84UNSET = btck_TxValidationResult_UNSET,85CONSENSUS = btck_TxValidationResult_CONSENSUS,86INPUTS_NOT_STANDARD = btck_TxValidationResult_INPUTS_NOT_STANDARD,87NOT_STANDARD = btck_TxValidationResult_NOT_STANDARD,88MISSING_INPUTS = btck_TxValidationResult_MISSING_INPUTS,89PREMATURE_SPEND = btck_TxValidationResult_PREMATURE_SPEND,90WITNESS_MUTATED = btck_TxValidationResult_WITNESS_MUTATED,91WITNESS_STRIPPED = btck_TxValidationResult_WITNESS_STRIPPED,92CONFLICT = btck_TxValidationResult_CONFLICT,93MEMPOOL_POLICY = btck_TxValidationResult_MEMPOOL_POLICY,94NO_MEMPOOL = btck_TxValidationResult_NO_MEMPOOL,95RECONSIDERABLE = btck_TxValidationResult_RECONSIDERABLE,96UNKNOWN = btck_TxValidationResult_UNKNOWN97};99enum class ScriptVerifyStatus : btck_ScriptVerifyStatus {100OK = btck_ScriptVerifyStatus_OK,101ERROR_INVALID_FLAGS_COMBINATION = btck_ScriptVerifyStatus_ERROR_INVALID_FLAGS_COMBINATION,102ERROR_SPENT_OUTPUTS_REQUIRED = btck_ScriptVerifyStatus_ERROR_SPENT_OUTPUTS_REQUIRED,103};105enum class ScriptVerificationFlags : btck_ScriptVerificationFlags {106NONE = btck_ScriptVerificationFlags_NONE,107P2SH = btck_ScriptVerificationFlags_P2SH,108DERSIG = btck_ScriptVerificationFlags_DERSIG,109NULLDUMMY = btck_ScriptVerificationFlags_NULLDUMMY,110CHECKLOCKTIMEVERIFY = btck_ScriptVerificationFlags_CHECKLOCKTIMEVERIFY,111CHECKSEQUENCEVERIFY = btck_ScriptVerificationFlags_CHECKSEQUENCEVERIFY,112WITNESS = btck_ScriptVerificationFlags_WITNESS,113TAPROOT = btck_ScriptVerificationFlags_TAPROOT,114ALL = btck_ScriptVerificationFlags_ALL115};117enum class BlockCheckFlags : btck_BlockCheckFlags {118BASE = btck_BlockCheckFlags_BASE,119POW = btck_BlockCheckFlags_POW,120MERKLE = btck_BlockCheckFlags_MERKLE,121ALL = btck_BlockCheckFlags_ALL122};124template <typename T>125struct is_bitmask_enum : std::false_type {126};128template <>129struct is_bitmask_enum<ScriptVerificationFlags> : std::true_type {130};132template <>133struct is_bitmask_enum<BlockCheckFlags> : std::true_type {134};136template <typename T>137concept BitmaskEnum = is_bitmask_enum<T>::value;139template <BitmaskEnum T>140constexpr T operator|(T lhs, T rhs)141{142return static_cast<T>(143static_cast<std::underlying_type_t<T>>(lhs) | static_cast<std::underlying_type_t<T>>(rhs));144}146template <BitmaskEnum T>147constexpr T operator&(T lhs, T rhs)148{149return static_cast<T>(150static_cast<std::underlying_type_t<T>>(lhs) & static_cast<std::underlying_type_t<T>>(rhs));151}153template <BitmaskEnum T>154constexpr T operator^(T lhs, T rhs)155{156return static_cast<T>(157static_cast<std::underlying_type_t<T>>(lhs) ^ static_cast<std::underlying_type_t<T>>(rhs));158}160template <BitmaskEnum T>161constexpr T operator~(T value)162{163return static_cast<T>(~static_cast<std::underlying_type_t<T>>(value));164}166template <BitmaskEnum T>167constexpr T& operator|=(T& lhs, T rhs)168{169return lhs = lhs | rhs;170}172template <BitmaskEnum T>173constexpr T& operator&=(T& lhs, T rhs)174{175return lhs = lhs & rhs;176}178template <BitmaskEnum T>179constexpr T& operator^=(T& lhs, T rhs)180{181return lhs = lhs ^ rhs;182}184template <typename T>185T check(T ptr)186{187if (ptr == nullptr) {188throw std::runtime_error("failed to instantiate btck object");189}190return ptr;191}193template <typename Collection, typename ValueType, auto GetFunc>194class Iterator195{196public:197using iterator_category = std::random_access_iterator_tag;198using iterator_concept = std::random_access_iterator_tag;199using difference_type = std::ptrdiff_t;200using value_type = ValueType;202private:203const Collection* m_collection;204size_t m_idx;206public:207Iterator() = default;208Iterator(const Collection* ptr) : m_collection{ptr}, m_idx{0} {}209Iterator(const Collection* ptr, size_t idx) : m_collection{ptr}, m_idx{idx} {}211// This is just a view, so return a copy.212auto operator*() const { return std::invoke(GetFunc, *m_collection, m_idx); }214auto& operator++() { m_idx++; return *this; }215auto operator++(int) { Iterator tmp = *this; ++(*this); return tmp; }217auto& operator--() { m_idx--; return *this; }218auto operator--(int) { auto temp = *this; --m_idx; return temp; }220auto& operator+=(difference_type n) { m_idx += n; return *this; }221auto& operator-=(difference_type n) { m_idx -= n; return *this; }223auto operator+(difference_type n) const { return Iterator(m_collection, m_idx + n); }224auto operator-(difference_type n) const { return Iterator(m_collection, m_idx - n); }226auto operator-(const Iterator& other) const { return static_cast<difference_type>(m_idx) - static_cast<difference_type>(other.m_idx); }228ValueType operator[](difference_type n) const { return *(*this + n); }230auto operator<=>(const Iterator& other) const { return m_idx <=> other.m_idx; }232bool operator==(const Iterator& other) const { return m_collection == other.m_collection && m_idx == other.m_idx; }234private:235friend Iterator operator+(difference_type n, const Iterator& it) { return it + n; }236};238template <typename Container, typename SizeFunc, typename GetFunc>239concept IndexedContainer = requires(const Container& c, SizeFunc size_func, GetFunc get_func, std::size_t i) {240{ std::invoke(size_func, c) } -> std::convertible_to<std::size_t>;241{ std::invoke(get_func, c, i) }; // Return type is deduced242};244template <typename Container, auto SizeFunc, auto GetFunc>245requires IndexedContainer<Container, decltype(SizeFunc), decltype(GetFunc)>246class Range247{248public:249using value_type = std::invoke_result_t<decltype(GetFunc), const Container&, size_t>;250using difference_type = std::ptrdiff_t;