Inside Bitcoin
Opening the selected file…
Inside Bitcoin
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.
752btck_TransactionOutPoint* btck_transaction_out_point_copy(const btck_TransactionOutPoint* out_point)753{754return btck_TransactionOutPoint::copy(out_point);755}757uint32_t btck_transaction_out_point_get_index(const btck_TransactionOutPoint* out_point)758{759return btck_TransactionOutPoint::get(out_point).n;760}762const btck_Txid* btck_transaction_out_point_get_txid(const btck_TransactionOutPoint* out_point)763{764return btck_Txid::ref(&btck_TransactionOutPoint::get(out_point).hash);765}767void btck_transaction_out_point_destroy(btck_TransactionOutPoint* out_point)768{769delete out_point;770}772btck_Txid* btck_txid_copy(const btck_Txid* txid)773{774return btck_Txid::copy(txid);775}777void btck_txid_to_bytes(const btck_Txid* txid, unsigned char output[32])778{779std::memcpy(output, btck_Txid::get(txid).begin(), 32);780}782int btck_txid_equals(const btck_Txid* txid1, const btck_Txid* txid2)783{784return btck_Txid::get(txid1) == btck_Txid::get(txid2);785}787void btck_txid_destroy(btck_Txid* txid)788{789delete txid;790}792void btck_logging_set_options(const btck_LoggingOptions options)793{794LOCK(cs_main);795LogInstance().m_log_timestamps = options.log_timestamps;796LogInstance().m_log_time_micros = options.log_time_micros;797LogInstance().m_log_threadnames = options.log_threadnames;798LogInstance().m_log_sourcelocations = options.log_sourcelocations;799LogInstance().m_always_print_category_level = options.always_print_category_levels;800}802void btck_logging_set_level_category(btck_LogCategory category, btck_LogLevel level)803{804LOCK(cs_main);805if (category == btck_LogCategory_ALL) {806LogInstance().SetLogLevel(get_bclog_level(level));807}809LogInstance().AddCategoryLogLevel(get_bclog_flag(category), get_bclog_level(level));810}812void btck_logging_enable_category(btck_LogCategory category)813{814LogInstance().EnableCategory(get_bclog_flag(category));815}817void btck_logging_disable_category(btck_LogCategory category)818{819LogInstance().DisableCategory(get_bclog_flag(category));820}822void btck_logging_disable()823{824LogInstance().DisableLogging();825}827btck_LoggingConnection* btck_logging_connection_create(btck_LogCallback callback, void* user_data, btck_DestroyCallback user_data_destroy_callback)828{829try {830return btck_LoggingConnection::create(callback, user_data, user_data_destroy_callback);831} catch (const std::exception&) {832return nullptr;833}834}836void btck_logging_connection_destroy(btck_LoggingConnection* connection)837{838delete connection;839}841btck_ChainParameters* btck_chain_parameters_create(const btck_ChainType chain_type)842{843switch (chain_type) {844case btck_ChainType_MAINNET: {845return btck_ChainParameters::ref(const_cast<CChainParams*>(CChainParams::Main().release()));846}847case btck_ChainType_TESTNET: {848return btck_ChainParameters::ref(const_cast<CChainParams*>(CChainParams::TestNet().release()));849}850case btck_ChainType_TESTNET_4: {851return btck_ChainParameters::ref(const_cast<CChainParams*>(CChainParams::TestNet4().release()));852}853case btck_ChainType_SIGNET: {854return btck_ChainParameters::ref(const_cast<CChainParams*>(CChainParams::SigNet().release()));855}856case btck_ChainType_REGTEST: {857return btck_ChainParameters::ref(const_cast<CChainParams*>(CChainParams::RegTest().release()));858}859}860assert(false);861}863btck_ChainParameters* btck_chain_parameters_create_signet(const void* challenge, size_t challenge_len)864{865assert(challenge != nullptr || challenge_len == 0);866const uint8_t* p = static_cast<const uint8_t*>(challenge);867CChainParams::SigNetOptions options{868.challenge = std::vector<uint8_t>{p, p + challenge_len},869};870return btck_ChainParameters::ref(const_cast<CChainParams*>(CChainParams::SigNet(options).release()));871}873btck_ChainParameters* btck_chain_parameters_copy(const btck_ChainParameters* chain_parameters)874{875return btck_ChainParameters::copy(chain_parameters);876}878const btck_ConsensusParams* btck_chain_parameters_get_consensus_params(const btck_ChainParameters* chain_parameters)879{880return btck_ConsensusParams::ref(&btck_ChainParameters::get(chain_parameters).GetConsensus());881}883void btck_chain_parameters_destroy(btck_ChainParameters* chain_parameters)884{885delete chain_parameters;886}888btck_ContextOptions* btck_context_options_create()889{890return btck_ContextOptions::create();891}893void btck_context_options_set_chainparams(btck_ContextOptions* options, const btck_ChainParameters* chain_parameters)894{895// Copy the chainparams, so the caller can free it again896LOCK(btck_ContextOptions::get(options).m_mutex);897btck_ContextOptions::get(options).m_chainparams = std::make_unique<const CChainParams>(btck_ChainParameters::get(chain_parameters));898}900void btck_context_options_set_notifications(btck_ContextOptions* options, btck_NotificationInterfaceCallbacks notifications)901{902// The KernelNotifications are copy-initialized, so the caller can free them again.903LOCK(btck_ContextOptions::get(options).m_mutex);904btck_ContextOptions::get(options).m_notifications = std::make_shared<KernelNotifications>(notifications);905}907void btck_context_options_set_validation_interface(btck_ContextOptions* options, btck_ValidationInterfaceCallbacks vi_cbs)908{909LOCK(btck_ContextOptions::get(options).m_mutex);910btck_ContextOptions::get(options).m_validation_interface = std::make_shared<KernelValidationInterface>(vi_cbs);911}913void btck_context_options_destroy(btck_ContextOptions* options)914{915delete options;916}918btck_Context* btck_context_create(const btck_ContextOptions* options)919{920bool sane{true};921const ContextOptions* opts = options ? &btck_ContextOptions::get(options) : nullptr;922auto context{std::make_shared<const Context>(opts, sane)};923if (!sane) {924LogError("Kernel context sanity check failed.");925return nullptr;926}927return btck_Context::create(context);928}930btck_Context* btck_context_copy(const btck_Context* context)931{932return btck_Context::copy(context);933}935int btck_context_interrupt(btck_Context* context)936{937return (*btck_Context::get(context)->m_interrupt)() ? 0 : -1;938}940void btck_context_destroy(btck_Context* context)941{942delete context;943}945const btck_BlockTreeEntry* btck_block_tree_entry_get_previous(const btck_BlockTreeEntry* entry)946{947if (!btck_BlockTreeEntry::get(entry).pprev) {948LogInfo("Genesis block has no previous.");949return nullptr;950}952return btck_BlockTreeEntry::ref(btck_BlockTreeEntry::get(entry).pprev);953}955const btck_BlockTreeEntry* btck_block_tree_entry_get_ancestor(const btck_BlockTreeEntry* block_tree_entry, int32_t height)956{957const auto* ancestor{btck_BlockTreeEntry::get(block_tree_entry).GetAncestor(height)};958assert(ancestor);959return btck_BlockTreeEntry::ref(ancestor);960}962btck_BlockValidationState* btck_block_validation_state_create()963{964return btck_BlockValidationState::create();965}967btck_BlockValidationState* btck_block_validation_state_copy(const btck_BlockValidationState* state)968{969return btck_BlockValidationState::copy(state);970}972void btck_block_validation_state_destroy(btck_BlockValidationState* state)973{974delete state;975}977btck_ValidationMode btck_block_validation_state_get_validation_mode(const btck_BlockValidationState* block_validation_state_)978{979auto& block_validation_state = btck_BlockValidationState::get(block_validation_state_);980if (block_validation_state.IsValid()) return btck_ValidationMode_VALID;981if (block_validation_state.IsInvalid()) return btck_ValidationMode_INVALID;982return btck_ValidationMode_INTERNAL_ERROR;983}985btck_BlockValidationResult btck_block_validation_state_get_block_validation_result(const btck_BlockValidationState* block_validation_state_)986{987auto& block_validation_state = btck_BlockValidationState::get(block_validation_state_);988switch (block_validation_state.GetResult()) {989case BlockValidationResult::BLOCK_RESULT_UNSET:990return btck_BlockValidationResult_UNSET;991case BlockValidationResult::BLOCK_CONSENSUS:992return btck_BlockValidationResult_CONSENSUS;993case BlockValidationResult::BLOCK_CACHED_INVALID:994return btck_BlockValidationResult_CACHED_INVALID;995case BlockValidationResult::BLOCK_INVALID_HEADER:996return btck_BlockValidationResult_INVALID_HEADER;997case BlockValidationResult::BLOCK_MUTATED:998return btck_BlockValidationResult_MUTATED;999case BlockValidationResult::BLOCK_MISSING_PREV:1000return btck_BlockValidationResult_MISSING_PREV;