Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ bool CLASS::populate_bits(chain_state::data& data,
if (!get_bits(data.bits.self, link))
return false;

// Navigate from the subject (data.height) to the map's high block.
for (auto height = data.height; height > map.bits.high; --height)
link = to_parent(link);

data.bits.ordered.resize(map.bits.count);
for (auto& bit: std::views::reverse(data.bits.ordered))
{
Expand All @@ -53,6 +57,10 @@ bool CLASS::populate_versions(chain_state::data& data,
if (!get_version(data.version.self, link))
return false;

// Navigate from the subject (data.height) to the map's high block.
for (auto height = data.height; height > map.version.high; --height)
link = to_parent(link);

data.version.ordered.resize(map.version.count);
for (auto& version: std::views::reverse(data.version.ordered))
{
Expand All @@ -70,6 +78,10 @@ bool CLASS::populate_timestamps(chain_state::data& data,
if (!get_timestamp(data.timestamp.self, link))
return false;

// Navigate from the subject (data.height) to the map's high block.
for (auto height = data.height; height > map.timestamp.high; --height)
link = to_parent(link);

data.timestamp.ordered.resize(map.timestamp.count);
for (auto& timestamp: std::views::reverse(data.timestamp.ordered))
{
Expand Down Expand Up @@ -163,7 +175,7 @@ bool CLASS::populate_all(chain_state::data& data,
}

TEMPLATE
typename CLASS::chain_state_cptr CLASS::get_chain_state(
typename CLASS::chain_state_cptr CLASS::get_confirmed_chain_state(
const system::settings& settings, const hash_digest& hash) const NOEXCEPT
{
const auto link = to_header(hash);
Expand All @@ -174,9 +186,14 @@ typename CLASS::chain_state_cptr CLASS::get_chain_state(
if (!get_height(height, link))
return nullptr;

if (to_candidate(height) == link)
return get_candidate_chain_state(settings, link, height);
return get_confirmed_chain_state(settings, link, height);
}

TEMPLATE
typename CLASS::chain_state_cptr CLASS::get_confirmed_chain_state(
const system::settings& settings, const header_link& link,
size_t height) const NOEXCEPT
{
chain_state::data data{};
if (!populate_all(data, settings, link, height))
return nullptr;
Expand Down
22 changes: 22 additions & 0 deletions include/bitcoin/database/impl/query/navigate/navigate_reverse.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,28 @@ header_link CLASS::to_parent(const header_link& link) const NOEXCEPT
return header.parent_fk;
}

TEMPLATE
header_link CLASS::to_candidate_child(const header_link& link) const NOEXCEPT
{
size_t height{};
if (!get_height(height, link))
return {};

const auto child = to_candidate(add1(height));
return (to_parent(child) == link) ? child : header_link{};
}

TEMPLATE
header_link CLASS::to_confirmed_child(const header_link& link) const NOEXCEPT
{
size_t height{};
if (!get_height(height, link))
return {};

const auto child = to_confirmed(add1(height));
return (to_parent(child) == link) ? child : header_link{};
}

// address->outputs[receivers]
// ----------------------------------------------------------------------------
// There can be multiple spenders of the same output (due to conflicts) and
Expand Down
6 changes: 5 additions & 1 deletion include/bitcoin/database/query.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,8 @@ class query
height_link find_strong_spender_height(const point& point) const NOEXCEPT;

header_link to_parent(const header_link& link) const NOEXCEPT;
header_link to_candidate_child(const header_link& link) const NOEXCEPT;
header_link to_confirmed_child(const header_link& link) const NOEXCEPT;
tx_links to_duplicates(const hash_digest& tx_hash) const NOEXCEPT;

/// find confirmed objects (reverse navigation)
Expand Down Expand Up @@ -542,8 +544,10 @@ class query
/// Context.
/// -----------------------------------------------------------------------

chain_state_cptr get_chain_state(const system::settings& settings,
chain_state_cptr get_confirmed_chain_state(const system::settings& settings,
const hash_digest& hash) const NOEXCEPT;
chain_state_cptr get_confirmed_chain_state(const system::settings& settings,
const header_link& link, size_t height) const NOEXCEPT;
chain_state_cptr get_candidate_chain_state(
const system::settings& settings) const NOEXCEPT;
chain_state_cptr get_candidate_chain_state(const system::settings& settings,
Expand Down
Loading