Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
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
3 changes: 3 additions & 0 deletions builds/gnu/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ src_libbitcoin_server_la_SOURCES = \
${srcdir}/../../src/parsers/bitcoind_block_stats.cpp \
${srcdir}/../../src/parsers/bitcoind_descriptor.cpp \
${srcdir}/../../src/parsers/bitcoind_merkle.cpp \
${srcdir}/../../src/parsers/bitcoind_query.cpp \
${srcdir}/../../src/parsers/bitcoind_script.cpp \
${srcdir}/../../src/parsers/bitcoind_target.cpp \
${srcdir}/../../src/parsers/btcd_filter.cpp \
Expand Down Expand Up @@ -182,6 +183,7 @@ include_bitcoin_server_parsers_HEADERS = \
${srcdir}/../../include/bitcoin/server/parsers/bitcoind_block_stats.hpp \
${srcdir}/../../include/bitcoin/server/parsers/bitcoind_descriptor.hpp \
${srcdir}/../../include/bitcoin/server/parsers/bitcoind_merkle.hpp \
${srcdir}/../../include/bitcoin/server/parsers/bitcoind_query.hpp \
${srcdir}/../../include/bitcoin/server/parsers/bitcoind_script.hpp \
${srcdir}/../../include/bitcoin/server/parsers/bitcoind_target.hpp \
${srcdir}/../../include/bitcoin/server/parsers/btcd_filter.hpp \
Expand Down Expand Up @@ -266,6 +268,7 @@ test_libbitcoin_server_test_SOURCES = \
${srcdir}/../../test/parsers/bitcoind_block_stats.cpp \
${srcdir}/../../test/parsers/bitcoind_descriptor.cpp \
${srcdir}/../../test/parsers/bitcoind_merkle.cpp \
${srcdir}/../../test/parsers/bitcoind_query.cpp \
${srcdir}/../../test/parsers/bitcoind_target.cpp \
${srcdir}/../../test/parsers/electrum_version.cpp \
${srcdir}/../../test/parsers/native_query.cpp \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_block_stats.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_descriptor.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_merkle.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_query.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\electrum_version.cpp">
<ObjectFileName>$(IntDir)test_parsers_electrum_version.obj</ObjectFileName>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_merkle.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_query.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_block_stats.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_descriptor.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_merkle.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_query.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_script.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_target.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\btcd_filter.cpp" />
Expand Down Expand Up @@ -220,6 +221,7 @@
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_block_stats.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_descriptor.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_merkle.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_query.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_script.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_target.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\btcd_filter.hpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_merkle.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_query.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_script.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
Expand Down Expand Up @@ -368,6 +371,9 @@
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_merkle.hpp">
<Filter>include\bitcoin\server\parsers</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_query.hpp">
<Filter>include\bitcoin\server\parsers</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_script.hpp">
<Filter>include\bitcoin\server\parsers</Filter>
</ClInclude>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_block_stats.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_descriptor.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_merkle.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_query.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp" />
<ClCompile Include="..\..\..\..\test\parsers\electrum_version.cpp">
<ObjectFileName>$(IntDir)test_parsers_electrum_version.obj</ObjectFileName>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_merkle.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_query.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_block_stats.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_descriptor.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_merkle.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_query.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_script.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_target.cpp" />
<ClCompile Include="..\..\..\..\src\parsers\btcd_filter.cpp" />
Expand Down Expand Up @@ -220,6 +221,7 @@
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_block_stats.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_descriptor.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_merkle.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_query.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_script.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_target.hpp" />
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\btcd_filter.hpp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_merkle.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_query.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_script.cpp">
<Filter>src\parsers</Filter>
</ClCompile>
Expand Down Expand Up @@ -368,6 +371,9 @@
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_merkle.hpp">
<Filter>include\bitcoin\server\parsers</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_query.hpp">
<Filter>include\bitcoin\server\parsers</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\include\bitcoin\server\parsers\bitcoind_script.hpp">
<Filter>include\bitcoin\server\parsers</Filter>
</ClInclude>
Expand Down
1 change: 1 addition & 0 deletions include/bitcoin/server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
#include <bitcoin/server/parsers/bitcoind_block_stats.hpp>
#include <bitcoin/server/parsers/bitcoind_descriptor.hpp>
#include <bitcoin/server/parsers/bitcoind_merkle.hpp>
#include <bitcoin/server/parsers/bitcoind_query.hpp>
#include <bitcoin/server/parsers/bitcoind_script.hpp>
#include <bitcoin/server/parsers/bitcoind_target.hpp>
#include <bitcoin/server/parsers/btcd_filter.hpp>
Expand Down
2 changes: 1 addition & 1 deletion include/bitcoin/server/parsers/bitcoind_block_stats.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace server {

/// All bitcoind getblockstats statistics of a prevout-populated block.
BCS_API network::rpc::object_t block_stats(const system::chain::block& block,
size_t height, uint32_t median_time_past, uint64_t subsidy) NOEXCEPT;
size_t height, uint32_t median_time, uint64_t subsidy) NOEXCEPT;

} // namespace server
} // namespace libbitcoin
Expand Down
33 changes: 33 additions & 0 deletions include/bitcoin/server/parsers/bitcoind_query.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* Copyright (c) 2011-2026 libbitcoin developers
*
* This file is part of libbitcoin.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LIBBITCOIN_SERVER_PARSERS_BITCOIND_QUERY_HPP
#define LIBBITCOIN_SERVER_PARSERS_BITCOIND_QUERY_HPP

#include <bitcoin/server/define.hpp>

namespace libbitcoin {
namespace server {

BCS_API bool bitcoind_query(network::rpc::request_t& out,
const std::string& target) NOEXCEPT;

} // namespace server
} // namespace libbitcoin

#endif
1 change: 1 addition & 0 deletions include/bitcoin/server/parsers/parsers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <bitcoin/server/parsers/bitcoind_block_stats.hpp>
#include <bitcoin/server/parsers/bitcoind_descriptor.hpp>
#include <bitcoin/server/parsers/bitcoind_merkle.hpp>
#include <bitcoin/server/parsers/bitcoind_query.hpp>
#include <bitcoin/server/parsers/bitcoind_script.hpp>
#include <bitcoin/server/parsers/bitcoind_target.hpp>
#include <bitcoin/server/parsers/btcd_filter.hpp>
Expand Down
9 changes: 6 additions & 3 deletions include/bitcoin/server/protocols/protocol_bitcoind.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,15 @@ class BCS_API protocol_bitcoind

/// Model composition.
static double progress(size_t blocks, size_t headers) NOEXCEPT;
static uint32_t median_time_past(const node::query& query,
static uint32_t median_time(const node::query& query,
const system::settings& settings,
const database::header_link& link) NOEXCEPT;
static network::rpc::object_t chain_states_entry(const node::query& query,
const database::header_link& link, double progress,
bool validated) NOEXCEPT;
static void inject_block_context(boost::json::object& out,
const node::query& query, const database::header_link& link,
const node::query& query, const system::settings& settings,
const database::header_link& link,
const system::chain::header& header) NOEXCEPT;
static void inject_tx_context(boost::json::object& out,
const node::query& query, const database::tx_link& link) NOEXCEPT;
Expand All @@ -107,7 +109,8 @@ class BCS_API protocol_bitcoind
/// The getblockchaininfo result, bitcoind field set (btcd augments it).
/// False if the store is inconsistent, the caller sends the error.
static bool chain_info(network::rpc::object_t& out,
const node::query& query, bool pruned, bool current) NOEXCEPT;
const node::query& query, const system::settings& settings,
bool pruned, bool current) NOEXCEPT;

/// The createmultisig result, empty if a key is invalid or the p2sh
/// embedded script exceeds one push element.
Expand Down
4 changes: 2 additions & 2 deletions src/parsers/bitcoind_block_stats.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ static std::array<uint64_t, 5> fee_rate_percentiles(
}

object_t block_stats(const chain::block& block, size_t height,
uint32_t median_time_past, uint64_t subsidy) NOEXCEPT
uint32_t median_time, uint64_t subsidy) NOEXCEPT
{
const auto& txs = *block.transactions_ptr();

Expand Down Expand Up @@ -165,7 +165,7 @@ object_t block_stats(const chain::block& block, size_t height,
{ "maxfeerate", max_fee_rate },
{ "maxtxsize", max_tx_size },
{ "medianfee", truncated_median(fees) },
{ "mediantime", median_time_past },
{ "mediantime", median_time },
{ "mediantxsize", truncated_median(sizes) },
{ "minfee", min_fee == max_uint64 ? zero : min_fee },
{ "minfeerate", min_fee_rate == max_uint64 ? zero : min_fee_rate },
Expand Down
75 changes: 75 additions & 0 deletions src/parsers/bitcoind_query.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/**
* Copyright (c) 2011-2026 libbitcoin developers
*
* This file is part of libbitcoin.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <bitcoin/server/parsers/bitcoind_query.hpp>

#include <charconv>
#include <iterator>
#include <variant>
#include <bitcoin/server/define.hpp>

namespace libbitcoin {
namespace server {

using namespace system;
using namespace network;

BC_PUSH_WARNING(NO_THROW_IN_NOEXCEPT)

template <typename Number>
static bool to_number(Number& out, const std::string_view& token) NOEXCEPT
{
if (token.empty() || (token.size() > one && token.starts_with('0')))
return false;

const auto end = std::next(token.data(), token.size());
const auto result = std::from_chars(token.data(), end, out);
return result.ec == std::errc{} && result.ptr == end;
}

bool bitcoind_query(rpc::request_t& out, const std::string& target) NOEXCEPT
{
wallet::uri uri{};
if (!uri.decode(target))
return false;

// Caller must have provided a request.params object.
if (!out.params.has_value() ||
!std::holds_alternative<rpc::object_t>(out.params.value()))
return false;

auto query = uri.decode_query();
auto& params = std::get<rpc::object_t>(out.params.value());

// Count is optional (defaulted by the target parser where applicable).
if (const auto count = query.find("count"); count != query.end())
{
uint32_t value{};
if (!to_number(value, count->second))
return false;

params["count"] = value;
}

return true;
}

BC_POP_WARNING()

} // namespace server
} // namespace libbitcoin
11 changes: 5 additions & 6 deletions src/parsers/bitcoind_target.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,19 +203,18 @@ code bitcoind_target(request_t& out, const std::string_view& path) NOEXCEPT
return error::success;
}

// /rest/headers/<count>/<hash>.<ext>
// /rest/headers/<hash>.<ext>?count=<count> (count defaults to 5) and the
// legacy /rest/headers/<count>/<hash>.<ext> form.
if (target == "headers")
{
if (segment == segments.size())
return error::missing_target;

uint32_t count{};
if (!to_number(count, segments[segment++]))
uint32_t count{ 5 };
if ((segments.size() - segment > one) &&
!to_number(count, segments[segment++]))
return error::invalid_number;

if (segment == segments.size())
return error::missing_hash;

std::string name{};
uint8_t media{};
if (!split_leaf(name, media, segments[segment++]))
Expand Down
2 changes: 1 addition & 1 deletion src/protocols/bitcoind/protocol_bitcoind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ code protocol_bitcoind::validate_tx(
const auto& settings = system_settings();
const auto link = query.to_confirmed(query.get_top_confirmed());
const auto key = query.get_header_key(link);
const auto state = query.get_chain_state(settings, key);
const auto state = query.get_confirmed_chain_state(settings, key);

// The store always has chain state for the confirmed top.
if (!state)
Expand Down
Loading
Loading