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.
1251btck_Block* btck_block_read(const btck_ChainstateManager* chainman, const btck_BlockTreeEntry* entry)1252{1253auto block{std::make_shared<CBlock>()};1254if (!btck_ChainstateManager::get(chainman).m_chainman->m_blockman.ReadBlock(*block, btck_BlockTreeEntry::get(entry))) {1255LogError("Failed to read block.");1256return nullptr;1257}1258return btck_Block::create(block);1259}1261btck_BlockHeader* btck_block_tree_entry_get_block_header(const btck_BlockTreeEntry* entry)1262{1263return btck_BlockHeader::create(btck_BlockTreeEntry::get(entry).GetBlockHeader());1264}1266int32_t btck_block_tree_entry_get_height(const btck_BlockTreeEntry* entry)1267{1268return btck_BlockTreeEntry::get(entry).nHeight;1269}1271const btck_BlockHash* btck_block_tree_entry_get_block_hash(const btck_BlockTreeEntry* entry)1272{1273return btck_BlockHash::ref(btck_BlockTreeEntry::get(entry).phashBlock);1274}1276int btck_block_tree_entry_equals(const btck_BlockTreeEntry* entry1, const btck_BlockTreeEntry* entry2)1277{1278return &btck_BlockTreeEntry::get(entry1) == &btck_BlockTreeEntry::get(entry2);1279}1281btck_BlockHash* btck_block_hash_create(const unsigned char block_hash[32])1282{1283return btck_BlockHash::create(std::span<const unsigned char>{block_hash, 32});1284}1286btck_BlockHash* btck_block_hash_copy(const btck_BlockHash* block_hash)1287{1288return btck_BlockHash::copy(block_hash);1289}1291void btck_block_hash_to_bytes(const btck_BlockHash* block_hash, unsigned char output[32])1292{1293std::memcpy(output, btck_BlockHash::get(block_hash).begin(), 32);1294}1296int btck_block_hash_equals(const btck_BlockHash* hash1, const btck_BlockHash* hash2)1297{1298return btck_BlockHash::get(hash1) == btck_BlockHash::get(hash2);1299}1301void btck_block_hash_destroy(btck_BlockHash* hash)1302{1303delete hash;1304}1306btck_BlockSpentOutputs* btck_block_spent_outputs_read(const btck_ChainstateManager* chainman, const btck_BlockTreeEntry* entry)1307{1308auto block_undo{std::make_shared<CBlockUndo>()};1309if (btck_BlockTreeEntry::get(entry).nHeight < 1) {1310LogDebug(BCLog::KERNEL, "The genesis block does not have any spent outputs.");1311return btck_BlockSpentOutputs::create(block_undo);1312}1313if (!btck_ChainstateManager::get(chainman).m_chainman->m_blockman.ReadBlockUndo(*block_undo, btck_BlockTreeEntry::get(entry))) {1314LogError("Failed to read block spent outputs data.");1315return nullptr;1316}1317return btck_BlockSpentOutputs::create(block_undo);1318}1320btck_BlockSpentOutputs* btck_block_spent_outputs_copy(const btck_BlockSpentOutputs* block_spent_outputs)1321{1322return btck_BlockSpentOutputs::copy(block_spent_outputs);1323}1325size_t btck_block_spent_outputs_count(const btck_BlockSpentOutputs* block_spent_outputs)1326{1327return btck_BlockSpentOutputs::get(block_spent_outputs)->vtxundo.size();1328}1330const btck_TransactionSpentOutputs* btck_block_spent_outputs_get_transaction_spent_outputs_at(const btck_BlockSpentOutputs* block_spent_outputs, size_t transaction_index)1331{1332assert(transaction_index < btck_BlockSpentOutputs::get(block_spent_outputs)->vtxundo.size());1333const auto* tx_undo{&btck_BlockSpentOutputs::get(block_spent_outputs)->vtxundo.at(transaction_index)};1334return btck_TransactionSpentOutputs::ref(tx_undo);1335}1337void btck_block_spent_outputs_destroy(btck_BlockSpentOutputs* block_spent_outputs)1338{1339delete block_spent_outputs;1340}1342btck_TransactionSpentOutputs* btck_transaction_spent_outputs_copy(const btck_TransactionSpentOutputs* transaction_spent_outputs)1343{1344return btck_TransactionSpentOutputs::copy(transaction_spent_outputs);1345}1347size_t btck_transaction_spent_outputs_count(const btck_TransactionSpentOutputs* transaction_spent_outputs)1348{1349return btck_TransactionSpentOutputs::get(transaction_spent_outputs).vprevout.size();1350}1352void btck_transaction_spent_outputs_destroy(btck_TransactionSpentOutputs* transaction_spent_outputs)1353{1354delete transaction_spent_outputs;1355}1357const btck_Coin* btck_transaction_spent_outputs_get_coin_at(const btck_TransactionSpentOutputs* transaction_spent_outputs, size_t coin_index)1358{1359assert(coin_index < btck_TransactionSpentOutputs::get(transaction_spent_outputs).vprevout.size());1360const Coin* coin{&btck_TransactionSpentOutputs::get(transaction_spent_outputs).vprevout.at(coin_index)};1361return btck_Coin::ref(coin);1362}1364btck_Coin* btck_coin_copy(const btck_Coin* coin)1365{1366return btck_Coin::copy(coin);1367}1369uint32_t btck_coin_confirmation_height(const btck_Coin* coin)1370{1371return btck_Coin::get(coin).nHeight;1372}1374int btck_coin_is_coinbase(const btck_Coin* coin)1375{1376return btck_Coin::get(coin).IsCoinBase() ? 1 : 0;1377}1379const btck_TransactionOutput* btck_coin_get_output(const btck_Coin* coin)1380{1381return btck_TransactionOutput::ref(&btck_Coin::get(coin).out);1382}1384void btck_coin_destroy(btck_Coin* coin)1385{1386delete coin;1387}1389int btck_chainstate_manager_process_block(1390btck_ChainstateManager* chainman,1391const btck_Block* block,1392int* _new_block)1393{1394bool new_block;1395auto result = btck_ChainstateManager::get(chainman).m_chainman->ProcessNewBlock(btck_Block::get(block), /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/&new_block);1396if (_new_block) {1397*_new_block = new_block ? 1 : 0;1398}1399return result ? 0 : -1;1400}1402btck_BlockValidationState* btck_chainstate_manager_process_block_header(1403btck_ChainstateManager* chainstate_manager,1404const btck_BlockHeader* header)1405{1406try {1407auto& chainman = btck_ChainstateManager::get(chainstate_manager).m_chainman;1409auto state = btck_BlockValidationState::create();1410bool result{chainman->ProcessNewBlockHeaders({&btck_BlockHeader::get(header), 1}, /*min_pow_checked=*/true, btck_BlockValidationState::get(state))};1411assert(result == btck_BlockValidationState::get(state).IsValid());1412return state;1413} catch (const std::exception& e) {1414LogError("Failed to process block header: %s", e.what());1415return nullptr;1416}1417}1419const btck_Chain* btck_chainstate_manager_get_active_chain(const btck_ChainstateManager* chainman)1420{1421return btck_Chain::ref(&WITH_LOCK(btck_ChainstateManager::get(chainman).m_chainman->GetMutex(), return btck_ChainstateManager::get(chainman).m_chainman->ActiveChain()));1422}1424int32_t btck_chain_get_height(const btck_Chain* chain)1425{1426LOCK(::cs_main);1427return btck_Chain::get(chain).Height();1428}1430const btck_BlockTreeEntry* btck_chain_get_by_height(const btck_Chain* chain, int32_t height)1431{1432LOCK(::cs_main);1433return btck_BlockTreeEntry::ref(btck_Chain::get(chain)[height]);1434}1436int btck_chain_contains(const btck_Chain* chain, const btck_BlockTreeEntry* entry)1437{1438LOCK(::cs_main);1439return btck_Chain::get(chain).Contains(btck_BlockTreeEntry::get(entry)) ? 1 : 0;1440}1442btck_BlockHeader* btck_block_header_create(const void* raw_block_header, size_t raw_block_header_len)1443{1444assert(raw_block_header != nullptr && raw_block_header_len == 80);1445auto header{std::make_unique<CBlockHeader>()};1446SpanReader stream{std::span{reinterpret_cast<const std::byte*>(raw_block_header), raw_block_header_len}};1448try {1449stream >> *header;1450} catch (...) {1451LogError("Block header decode failed.");1452return nullptr;1453}1455return btck_BlockHeader::ref(header.release());1456}1458btck_BlockHeader* btck_block_header_copy(const btck_BlockHeader* header)1459{1460return btck_BlockHeader::copy(header);1461}1463btck_BlockHash* btck_block_header_get_hash(const btck_BlockHeader* header)1464{1465return btck_BlockHash::create(btck_BlockHeader::get(header).GetHash());1466}1468const btck_BlockHash* btck_block_header_get_prev_hash(const btck_BlockHeader* header)1469{1470return btck_BlockHash::ref(&btck_BlockHeader::get(header).hashPrevBlock);1471}1473uint32_t btck_block_header_get_timestamp(const btck_BlockHeader* header)1474{1475return btck_BlockHeader::get(header).nTime;1476}1478uint32_t btck_block_header_get_bits(const btck_BlockHeader* header)1479{1480return btck_BlockHeader::get(header).nBits;1481}1483int32_t btck_block_header_get_version(const btck_BlockHeader* header)1484{1485return btck_BlockHeader::get(header).nVersion;1486}1488uint32_t btck_block_header_get_nonce(const btck_BlockHeader* header)1489{1490return btck_BlockHeader::get(header).nNonce;1491}1493int btck_block_header_to_bytes(const btck_BlockHeader* header, unsigned char output[80])1494{1495try {1496SpanWriter{std::as_writable_bytes(std::span{output, 80})} << btck_BlockHeader::get(header);1497return 0;1498} catch (...) {1499return -1;1500}