mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 23:29:12 +01:00
kernel: Add functions to read block from disk to C header
This adds functions for reading a block from disk with a retrieved block tree entry. External services that wish to build their own index, or analyze blocks can use this to retrieve block data. The block tree can now be traversed from the tip backwards. This is guaranteed to work, since the chainstate maintains an internal block tree index in memory and every block (besides the genesis) has an ancestor. The user can use this function to iterate through all blocks in the chain (starting from the tip). The tip is retrieved from a separate `Chain` object, which allows distinguishing whether entries are currently in the best chain. Once the block tree entry for the genesis block is reached a nullptr is returned if the user attempts to get the previous entry.
This commit is contained in:
@@ -484,6 +484,7 @@ struct btck_Context : Handle<btck_Context, std::shared_ptr<const Context>> {};
|
||||
struct btck_ChainParameters : Handle<btck_ChainParameters, CChainParams> {};
|
||||
struct btck_ChainstateManagerOptions : Handle<btck_ChainstateManagerOptions, ChainstateManagerOptions> {};
|
||||
struct btck_ChainstateManager : Handle<btck_ChainstateManager, ChainMan> {};
|
||||
struct btck_Chain : Handle<btck_Chain, CChain> {};
|
||||
|
||||
btck_Transaction* btck_transaction_create(const void* raw_transaction, size_t raw_transaction_len)
|
||||
{
|
||||
@@ -769,6 +770,16 @@ void btck_context_destroy(btck_Context* context)
|
||||
delete context;
|
||||
}
|
||||
|
||||
const btck_BlockTreeEntry* btck_block_tree_entry_get_previous(const btck_BlockTreeEntry* entry)
|
||||
{
|
||||
if (!btck_BlockTreeEntry::get(entry).pprev) {
|
||||
LogInfo("Genesis block has no previous.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return btck_BlockTreeEntry::ref(btck_BlockTreeEntry::get(entry).pprev);
|
||||
}
|
||||
|
||||
btck_ValidationMode btck_block_validation_state_get_validation_mode(const btck_BlockValidationState* block_validation_state_)
|
||||
{
|
||||
auto& block_validation_state = btck_BlockValidationState::get(block_validation_state_);
|
||||
@@ -983,6 +994,16 @@ void btck_block_destroy(btck_Block* block)
|
||||
delete block;
|
||||
}
|
||||
|
||||
btck_Block* btck_block_read(const btck_ChainstateManager* chainman, const btck_BlockTreeEntry* entry)
|
||||
{
|
||||
auto block{std::make_shared<CBlock>()};
|
||||
if (!btck_ChainstateManager::get(chainman).m_chainman->m_blockman.ReadBlock(*block, btck_BlockTreeEntry::get(entry))) {
|
||||
LogError("Failed to read block.");
|
||||
return nullptr;
|
||||
}
|
||||
return btck_Block::create(block);
|
||||
}
|
||||
|
||||
int btck_chainstate_manager_process_block(
|
||||
btck_ChainstateManager* chainman,
|
||||
const btck_Block* block,
|
||||
@@ -995,3 +1016,20 @@ int btck_chainstate_manager_process_block(
|
||||
}
|
||||
return result ? 0 : -1;
|
||||
}
|
||||
|
||||
const btck_Chain* btck_chainstate_manager_get_active_chain(const btck_ChainstateManager* chainman)
|
||||
{
|
||||
return btck_Chain::ref(&WITH_LOCK(btck_ChainstateManager::get(chainman).m_chainman->GetMutex(), return btck_ChainstateManager::get(chainman).m_chainman->ActiveChain()));
|
||||
}
|
||||
|
||||
const btck_BlockTreeEntry* btck_chain_get_tip(const btck_Chain* chain)
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
return btck_BlockTreeEntry::ref(btck_Chain::get(chain).Tip());
|
||||
}
|
||||
|
||||
int btck_chain_get_height(const btck_Chain* chain)
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
return btck_Chain::get(chain).Height();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user