Skip to content

Commit 03cea1e

Browse files
committed
Stub in maximum_history for limiting electrum large address query.
1 parent 191c0e3 commit 03cea1e

6 files changed

Lines changed: 21 additions & 6 deletions

File tree

include/bitcoin/server/protocols/protocol_electrum.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ class BCS_API protocol_electrum
252252
void do_scripthash_subscribe(const hash_digest& hash,
253253
notify_t type) NOEXCEPT;
254254
void complete_scripthash_subscribe(const code& ec,
255-
hash_digest& status, const hash_digest& hash) NOEXCEPT;
255+
const hash_digest& status, const hash_digest& hash) NOEXCEPT;
256256
void scripthash_unsubscribe(const hash_digest& hash) NOEXCEPT;
257257
void do_scripthash_unsubscribe(const hash_digest& hash) NOEXCEPT;
258258
void complete_scripthash_unsubscribe(bool found) NOEXCEPT;
@@ -321,7 +321,7 @@ class BCS_API protocol_electrum
321321

322322
// Status utilities.
323323
code get_scripthash_status(hash_digest& out, subscription& sub,
324-
const hash_digest& hash) NOEXCEPT;
324+
const hash_digest& hash, size_t limit=max_size_t) NOEXCEPT;
325325
bool get_outpoint_statuses(std::vector<interface::object_t>& out,
326326
const system::chain::point& prevout) const NOEXCEPT;
327327
bool get_outpoint_status(interface::object_t& out,

include/bitcoin/server/settings.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ class BCS_API settings
9494
/// Recommended to be a multiple of the difficulty retarget period.
9595
uint32_t maximum_headers{ 10 * 2016 };
9696

97+
/// Maximum number of address history entries upon one subscription.
98+
uint32_t maximum_history{ 1'000'000 };
99+
97100
/// Maximum cumulative number of address subscriptions per channel.
98101
uint32_t maximum_subscriptions{ 1'000'000 };
99102

src/parser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,11 @@ options_metadata parser::load_settings() THROWS
11371137
value<uint32_t>(&configured.server.electrum.maximum_headers),
11381138
"The maximum allowed headers returned per request, defaults to '20160'."
11391139
)
1140+
(
1141+
"electrum.maximum_history",
1142+
value<uint32_t>(&configured.server.electrum.maximum_history),
1143+
"The maximum number of address history entries upon one subscription, defaults to '1000000'."
1144+
)
11401145
(
11411146
"electrum.maximum_subscriptions",
11421147
value<uint32_t>(&configured.server.electrum.maximum_subscriptions),

src/protocols/electrum/protocol_electrum_scripthash_subscribe.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,12 @@ void protocol_electrum::do_scripthash_subscribe(const hash_digest& hash,
9191
hash_digest status{};
9292
if (address_subscriptions_.size() < options_.maximum_subscriptions)
9393
{
94+
using mid = midstate;
95+
const auto limit = options().maximum_history;
96+
9497
// Subscription response is idempotent.
95-
auto at = address_subscriptions_.try_emplace(hash, type, midstate{});
96-
ec = get_scripthash_status(status, at.first->second, at.first->first);
98+
auto& at = *address_subscriptions_.try_emplace(hash, type, mid{}).first;
99+
ec = get_scripthash_status(status, at.second, at.first, limit);
97100
subscribed_address_.store(true, relaxed);
98101
}
99102
else
@@ -105,14 +108,15 @@ void protocol_electrum::do_scripthash_subscribe(const hash_digest& hash,
105108
}
106109

107110
void protocol_electrum::complete_scripthash_subscribe(const code& ec,
108-
hash_digest& status, const hash_digest& hash) NOEXCEPT
111+
const hash_digest& status, const hash_digest& hash) NOEXCEPT
109112
{
110113
BC_ASSERT(stranded());
111114

112115
monitor(false);
113116
if (stopped())
114117
return;
115118

119+
// TODO: map database::error::maximum_depth to server code?
116120
if (ec)
117121
{
118122
send_code(ec);
@@ -281,9 +285,10 @@ hash_digest protocol_electrum::to_status(const histories& histories) NOEXCEPT
281285
}
282286

283287
code protocol_electrum::get_scripthash_status(hash_digest& out,
284-
subscription& /* sub */, const hash_digest& hash) NOEXCEPT
288+
subscription& /* sub */, const hash_digest& hash, size_t /* limit */) NOEXCEPT
285289
{
286290
// TODO: use cursors and midstate to optimize succesive queries.
291+
// TODO: limit first pass query depth.
287292

288293
histories histories{};
289294
const auto& query = archive();

test/protocols/electrum/electrum.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ electrum_setup_fixture::electrum_setup_fixture(const initializer& setup,
5757
electrum.banner_message = "banner_message";
5858
electrum.donation_address = "donation_address";
5959
electrum.maximum_subscriptions = 3;
60+
electrum.maximum_history = 5;
6061
electrum.maximum_headers = 5;
6162
electrum.connections = 1;
6263
database_settings.interval_depth = 2;

test/settings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ BOOST_AUTO_TEST_CASE(server__electrum_server__defaults__expected)
233233

234234
// electrum_server
235235
BOOST_REQUIRE_EQUAL(server.maximum_headers, 10u * 2016u);
236+
BOOST_REQUIRE_EQUAL(server.maximum_history, 1'000'000u);
236237
BOOST_REQUIRE_EQUAL(server.maximum_subscriptions, 1'000'000u);
237238
BOOST_REQUIRE_EQUAL(server.server_name, BC_USER_AGENT);
238239
BOOST_REQUIRE(server.donation_address.empty());

0 commit comments

Comments
 (0)