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
11 changes: 3 additions & 8 deletions include/bitcoin/node/protocols/protocol_explore.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,12 @@
#include <atomic>
#include <memory>
#include <optional>
#include <set>
#include <bitcoin/node/define.hpp>
#include <bitcoin/node/protocols/protocol_html.hpp>

namespace libbitcoin {
namespace node {

// TODO: establish a place for endpoint types.
using point_set = std::set<system::chain::point>;
using outpoint_set = std::set<system::chain::outpoint>;

class BCN_API protocol_explore
: public node::protocol_html,
protected network::tracker<protocol_explore>
Expand Down Expand Up @@ -152,7 +147,8 @@ class BCN_API protocol_explore

private:
using balance_handler = std::function<void(code, uint8_t, uint64_t)>;
using address_handler = std::function<void(code, uint8_t, outpoint_set&&)>;
using address_handler = std::function<void(code, uint8_t,
database::outpoints&&)>;

void do_get_address(uint8_t media, const system::hash_cptr& hash,
const address_handler& handler) NOEXCEPT;
Expand All @@ -161,9 +157,8 @@ class BCN_API protocol_explore
void do_get_address_unconfirmed(uint8_t media,
const system::hash_cptr& hash,
const address_handler& handler) NOEXCEPT;

void complete_get_address(const code& ec, uint8_t media,
const outpoint_set& set) NOEXCEPT;
const database::outpoints& set) NOEXCEPT;

void do_get_address_balance(uint8_t media, const system::hash_cptr& hash,
const balance_handler& handler) NOEXCEPT;
Expand Down
76 changes: 34 additions & 42 deletions src/protocols/protocol_explore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,25 @@ using namespace network::messages::peer;
using namespace std::placeholders;
using namespace boost::json;

DEFINE_JSON_TO_TAG(point_set)
using inpoint = database::inpoint;
using outpoint = database::outpoint;
using inpoints = database::inpoints;
using outpoints = database::outpoints;

DEFINE_JSON_TO_TAG(inpoints)
{
point_set out{};
for (const auto& point : value.as_array())
out.insert(value_to<chain::point>(point));
inpoints out{};
for (const auto& point: value.as_array())
out.insert(value_to<inpoint>(point));

return out;
}

DEFINE_JSON_TO_TAG(outpoint_set)
DEFINE_JSON_TO_TAG(outpoints)
{
outpoint_set out{};
for (const auto& outpoint : value.as_array())
out.insert(value_to<chain::outpoint>(outpoint));
outpoints out{};
for (const auto& point: value.as_array())
out.insert(value_to<outpoint>(point));

return out;
}
Expand Down Expand Up @@ -869,17 +874,10 @@ bool protocol_explore::handle_get_output_spender(const code& ec,

const auto& query = archive();
const chain::point spent{ *hash, index };
const auto link = query.to_confirmed_spender(spent);
if (link.is_terminal())
{
send_not_found();
return true;
}

const auto spender = query.get_spender(link);
const auto spender = query.get_spender(query.to_confirmed_spender(spent));
if (spender.index() == chain::point::null_index)
{
send_internal_server_error(database::error::integrity);
send_not_found();
return true;
}

Expand Down Expand Up @@ -908,29 +906,24 @@ bool protocol_explore::handle_get_output_spenders(const code& ec,
if (stopped(ec))
return false;

const auto& query = archive();
const auto points = query.to_spenders(*hash, index);
if (points.empty())
const auto ins = archive().get_spenders({ *hash, index });
if (ins.empty())
{
send_not_found();
return true;
}

point_set out{};
for (const auto& point: points)
out.insert(query.get_spender(point));

const auto size = out.size() * chain::point::serialized_size();
const auto size = ins.size() * inpoint::serialized_size();
switch (media)
{
case data:
send_chunk(to_bin_array(out, size));
send_chunk(to_bin_array(ins, size));
return true;
case text:
send_text(to_hex_array(out, size));
send_text(to_hex_array(ins, size));
return true;
case json:
send_json(value_from(out), two * size);
send_json(value_from(ins), two * size);
return true;
}

Expand Down Expand Up @@ -962,29 +955,28 @@ bool protocol_explore::handle_get_address(const code& ec, interface::address,
void protocol_explore::do_get_address(uint8_t media, const hash_cptr& hash,
const address_handler& handler) NOEXCEPT
{
// Not stranded, query is threadsafe.
const auto& query = archive();

// TODO: push into database as single call, generalize outpoint_set.
// TODO: push into database as single call.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// TODO: change query to return code to differentiate cancel vs. integrity.
database::output_links outputs{};
if (!query.to_address_outputs(stopping_, outputs, *hash))
database::output_links links{};
if (!query.to_address_outputs(stopping_, links, *hash))
{
handler(network::error::operation_canceled, {}, {});
return;
}

outpoint_set set{};
for (const auto& output: outputs)
outpoints set{};
for (const auto& link: links)
{
if (stopping_)
{
handler(network::error::operation_canceled, {}, {});
return;
}

set.insert(query.get_spent(output));
set.insert(query.get_spent(link));
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand All @@ -993,7 +985,7 @@ void protocol_explore::do_get_address(uint8_t media, const hash_cptr& hash,

// This is shared by the tree get_address.. methods.
void protocol_explore::complete_get_address(const code& ec, uint8_t media,
const outpoint_set& set) NOEXCEPT
const outpoints& set) NOEXCEPT
{
BC_ASSERT(stranded());

Expand Down Expand Up @@ -1056,26 +1048,26 @@ void protocol_explore::do_get_address_confirmed(uint8_t media,
{
const auto& query = archive();

// TODO: push into database as single call, generalize outpoint_set.
// TODO: push into database as single call.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// TODO: change query to return code to differentiate cancel vs. integrity.
database::output_links outputs{};
if (!query.to_confirmed_unspent_outputs(stopping_, outputs, *hash))
database::output_links links{};
if (!query.to_confirmed_unspent_outputs(stopping_, links, *hash))
{
handler(network::error::operation_canceled, {}, {});
return;
}

outpoint_set set{};
for (const auto& output : outputs)
outpoints set{};
for (const auto& link: links)
{
if (stopping_)
{
handler(network::error::operation_canceled, {}, {});
return;
}

set.insert(query.get_spent(output));
set.insert(query.get_spent(link));
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand Down
Loading