Skip to content

Commit 5f8d334

Browse files
authored
Merge pull request #673 from evoskuil/master
Implement and test handle_blockchain_transaction_get_merkle.
2 parents 5372396 + 2ce7425 commit 5f8d334

39 files changed

Lines changed: 2165 additions & 1061 deletions

Makefile.am

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,18 @@ src_libbitcoin_server_la_SOURCES = \
4848
src/parsers/native_target.cpp \
4949
src/protocols/protocol_bitcoind_rest.cpp \
5050
src/protocols/protocol_bitcoind_rpc.cpp \
51-
src/protocols/protocol_electrum.cpp \
52-
src/protocols/protocol_electrum_version.cpp \
5351
src/protocols/protocol_html.cpp \
5452
src/protocols/protocol_http.cpp \
5553
src/protocols/protocol_native.cpp \
56-
src/protocols/protocol_stratum_v1.cpp
54+
src/protocols/protocol_stratum_v1.cpp \
55+
src/protocols/electrum/protocol_electrum.cpp \
56+
src/protocols/electrum/protocol_electrum_addresses.cpp \
57+
src/protocols/electrum/protocol_electrum_fees.cpp \
58+
src/protocols/electrum/protocol_electrum_headers.cpp \
59+
src/protocols/electrum/protocol_electrum_mempool.cpp \
60+
src/protocols/electrum/protocol_electrum_server.cpp \
61+
src/protocols/electrum/protocol_electrum_transactions.cpp \
62+
src/protocols/electrum/protocol_electrum_version.cpp
5763

5864
# local: test/libbitcoin-server-test
5965
#------------------------------------------------------------------------------
@@ -84,9 +90,10 @@ test_libbitcoin_server_test_SOURCES = \
8490
test/protocols/electrum/electrum_addresses.cpp \
8591
test/protocols/electrum/electrum_fees.cpp \
8692
test/protocols/electrum/electrum_headers.cpp \
93+
test/protocols/electrum/electrum_mempool.cpp \
8794
test/protocols/electrum/electrum_server.cpp \
88-
test/protocols/electrum/electrum_server_version.cpp \
89-
test/protocols/electrum/electrum_transactions.cpp
95+
test/protocols/electrum/electrum_transactions.cpp \
96+
test/protocols/electrum/electrum_version.cpp
9097

9198
endif WITH_TESTS
9299

builds/msvc/vs2022/libbitcoin-server-test/libbitcoin-server-test.vcxproj

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@
124124
<ClCompile Include="..\..\..\..\test\main.cpp" />
125125
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_query.cpp" />
126126
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp" />
127-
<ClCompile Include="..\..\..\..\test\parsers\electrum_version.cpp" />
127+
<ClCompile Include="..\..\..\..\test\parsers\electrum_version.cpp">
128+
<ObjectFileName>$(IntDir)test_parsers_electrum_version.obj</ObjectFileName>
129+
</ClCompile>
128130
<ClCompile Include="..\..\..\..\test\parsers\native_query.cpp" />
129131
<ClCompile Include="..\..\..\..\test\parsers\native_target.cpp" />
130132
<ClCompile Include="..\..\..\..\test\protocols\blocks.cpp">
@@ -136,9 +138,12 @@
136138
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_addresses.cpp" />
137139
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_fees.cpp" />
138140
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_headers.cpp" />
141+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_mempool.cpp" />
139142
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server.cpp" />
140-
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server_version.cpp" />
141143
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_transactions.cpp" />
144+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_version.cpp">
145+
<ObjectFileName>$(IntDir)test_protocols_electrum_electrum_version.obj</ObjectFileName>
146+
</ClCompile>
142147
<ClCompile Include="..\..\..\..\test\settings.cpp" />
143148
<ClCompile Include="..\..\..\..\test\test.cpp">
144149
<ObjectFileName>$(IntDir)test_test.obj</ObjectFileName>

builds/msvc/vs2022/libbitcoin-server-test/libbitcoin-server-test.vcxproj.filters

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,18 @@
6363
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_headers.cpp">
6464
<Filter>src\protocols\electrum</Filter>
6565
</ClCompile>
66-
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server.cpp">
66+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_mempool.cpp">
6767
<Filter>src\protocols\electrum</Filter>
6868
</ClCompile>
69-
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server_version.cpp">
69+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server.cpp">
7070
<Filter>src\protocols\electrum</Filter>
7171
</ClCompile>
7272
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_transactions.cpp">
7373
<Filter>src\protocols\electrum</Filter>
7474
</ClCompile>
75+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_version.cpp">
76+
<Filter>src\protocols\electrum</Filter>
77+
</ClCompile>
7578
<ClCompile Include="..\..\..\..\test\settings.cpp">
7679
<Filter>src</Filter>
7780
</ClCompile>

builds/msvc/vs2022/libbitcoin-server/libbitcoin-server.vcxproj

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,16 @@
130130
<ClCompile Include="..\..\..\..\src\parsers\electrum_version.cpp" />
131131
<ClCompile Include="..\..\..\..\src\parsers\native_query.cpp" />
132132
<ClCompile Include="..\..\..\..\src\parsers\native_target.cpp" />
133+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum.cpp" />
134+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_addresses.cpp" />
135+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_fees.cpp" />
136+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_headers.cpp" />
137+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_mempool.cpp" />
138+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_server.cpp" />
139+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_transactions.cpp" />
140+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_version.cpp" />
133141
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rest.cpp" />
134142
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rpc.cpp" />
135-
<ClCompile Include="..\..\..\..\src\protocols\protocol_electrum.cpp" />
136-
<ClCompile Include="..\..\..\..\src\protocols\protocol_electrum_version.cpp" />
137143
<ClCompile Include="..\..\..\..\src\protocols\protocol_html.cpp" />
138144
<ClCompile Include="..\..\..\..\src\protocols\protocol_http.cpp" />
139145
<ClCompile Include="..\..\..\..\src\protocols\protocol_native.cpp" />

builds/msvc/vs2022/libbitcoin-server/libbitcoin-server.vcxproj.filters

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,37 @@
88
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
99
<ItemGroup>
1010
<Filter Include="include">
11-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000003}</UniqueIdentifier>
11+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000004}</UniqueIdentifier>
1212
</Filter>
1313
<Filter Include="include\bitcoin">
14-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000004}</UniqueIdentifier>
14+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000005}</UniqueIdentifier>
1515
</Filter>
1616
<Filter Include="include\bitcoin\server">
17-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000005}</UniqueIdentifier>
17+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000006}</UniqueIdentifier>
1818
</Filter>
1919
<Filter Include="include\bitcoin\server\channels">
20-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000006}</UniqueIdentifier>
20+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000007}</UniqueIdentifier>
2121
</Filter>
2222
<Filter Include="include\bitcoin\server\impl">
23-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000007}</UniqueIdentifier>
23+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000008}</UniqueIdentifier>
2424
</Filter>
2525
<Filter Include="include\bitcoin\server\impl\protocols">
26-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000C}</UniqueIdentifier>
26+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000D}</UniqueIdentifier>
2727
</Filter>
2828
<Filter Include="include\bitcoin\server\interfaces">
29-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000008}</UniqueIdentifier>
29+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000009}</UniqueIdentifier>
3030
</Filter>
3131
<Filter Include="include\bitcoin\server\parsers">
32-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000009}</UniqueIdentifier>
32+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000A}</UniqueIdentifier>
3333
</Filter>
3434
<Filter Include="include\bitcoin\server\protocols">
35-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000A}</UniqueIdentifier>
35+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000B}</UniqueIdentifier>
3636
</Filter>
3737
<Filter Include="include\bitcoin\server\sessions">
38-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000B}</UniqueIdentifier>
38+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000C}</UniqueIdentifier>
3939
</Filter>
4040
<Filter Include="resource">
41-
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000D}</UniqueIdentifier>
41+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-00000000000E}</UniqueIdentifier>
4242
</Filter>
4343
<Filter Include="src">
4444
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000000}</UniqueIdentifier>
@@ -49,6 +49,9 @@
4949
<Filter Include="src\protocols">
5050
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000002}</UniqueIdentifier>
5151
</Filter>
52+
<Filter Include="src\protocols\electrum">
53+
<UniqueIdentifier>{73CE0AC2-ECB2-4E8D-0000-000000000003}</UniqueIdentifier>
54+
</Filter>
5255
</ItemGroup>
5356
<ItemGroup>
5457
<ClCompile Include="..\..\..\..\src\configuration.cpp">
@@ -78,16 +81,34 @@
7881
<ClCompile Include="..\..\..\..\src\parsers\native_target.cpp">
7982
<Filter>src\parsers</Filter>
8083
</ClCompile>
81-
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rest.cpp">
82-
<Filter>src\protocols</Filter>
84+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum.cpp">
85+
<Filter>src\protocols\electrum</Filter>
8386
</ClCompile>
84-
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rpc.cpp">
85-
<Filter>src\protocols</Filter>
87+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_addresses.cpp">
88+
<Filter>src\protocols\electrum</Filter>
8689
</ClCompile>
87-
<ClCompile Include="..\..\..\..\src\protocols\protocol_electrum.cpp">
90+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_fees.cpp">
91+
<Filter>src\protocols\electrum</Filter>
92+
</ClCompile>
93+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_headers.cpp">
94+
<Filter>src\protocols\electrum</Filter>
95+
</ClCompile>
96+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_mempool.cpp">
97+
<Filter>src\protocols\electrum</Filter>
98+
</ClCompile>
99+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_server.cpp">
100+
<Filter>src\protocols\electrum</Filter>
101+
</ClCompile>
102+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_transactions.cpp">
103+
<Filter>src\protocols\electrum</Filter>
104+
</ClCompile>
105+
<ClCompile Include="..\..\..\..\src\protocols\electrum\protocol_electrum_version.cpp">
106+
<Filter>src\protocols\electrum</Filter>
107+
</ClCompile>
108+
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rest.cpp">
88109
<Filter>src\protocols</Filter>
89110
</ClCompile>
90-
<ClCompile Include="..\..\..\..\src\protocols\protocol_electrum_version.cpp">
111+
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rpc.cpp">
91112
<Filter>src\protocols</Filter>
92113
</ClCompile>
93114
<ClCompile Include="..\..\..\..\src\protocols\protocol_html.cpp">

include/bitcoin/server/error.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ enum error_t : uint8_t
6464
unconfirmable_transaction,
6565
argument_overflow,
6666
target_overflow,
67+
wrong_version,
6768
server_error
6869
};
6970

include/bitcoin/server/interfaces/electrum.hpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct electrum_methods
4444
method<"blockchain.scripthash.subscribe", string_t>{ "scripthash" },
4545
method<"blockchain.scripthash.unsubscribe", string_t>{ "scripthash" },
4646
method<"blockchain.transaction.broadcast", string_t>{ "raw_tx" },
47+
method<"blockchain.transaction.broadcast_package", string_t, optional<true>>{ "raw_txs", "verbose" },
4748
method<"blockchain.transaction.get", string_t, boolean_t>{ "tx_hash", "verbose" },
4849
method<"blockchain.transaction.get_merkle", string_t, number_t>{ "tx_hash", "height" },
4950
method<"blockchain.transaction.id_from_pos", number_t, number_t, optional<false>>{ "height", "tx_pos", "merkle" },
@@ -58,7 +59,8 @@ struct electrum_methods
5859
method<"server.version", string_t, optional<empty::value>>{ "client_name", "protocol_version" },
5960

6061
/// Mempool methods.
61-
method<"mempool.get_fee_histogram">{}
62+
method<"mempool.get_fee_histogram">{},
63+
method<"mempool.get_info">{}
6264
};
6365

6466
template <typename... Args>
@@ -80,17 +82,19 @@ struct electrum_methods
8082
using blockchain_scripthash_subscribe = at<9>;
8183
using blockchain_scripthash_unsubscribe = at<10>;
8284
using blockchain_transaction_broadcast = at<11>;
83-
using blockchain_transaction_get = at<12>;
84-
using blockchain_transaction_get_merkle = at<13>;
85-
using blockchain_transaction_id_from_pos = at<14>;
86-
using server_add_peer = at<15>;
87-
using server_banner = at<16>;
88-
using server_donation_address = at<17>;
89-
using server_features = at<18>;
90-
using server_peers_subscribe = at<19>;
91-
using server_ping = at<20>;
92-
using server_version = at<21>;
93-
using mempool_get_fee_histogram = at<22>;
85+
using blockchain_transaction_broadcast_package = at<12>;
86+
using blockchain_transaction_get = at<13>;
87+
using blockchain_transaction_get_merkle = at<14>;
88+
using blockchain_transaction_id_from_pos = at<15>;
89+
using server_add_peer = at<16>;
90+
using server_banner = at<17>;
91+
using server_donation_address = at<18>;
92+
using server_features = at<19>;
93+
using server_peers_subscribe = at<20>;
94+
using server_ping = at<21>;
95+
using server_version = at<22>;
96+
using mempool_get_fee_histogram = at<23>;
97+
using mempool_get_info = at<24>;
9498
};
9599

96100
} // namespace interface

include/bitcoin/server/parsers/electrum_version.hpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,19 @@ enum class version
3131
/// Invalid version.
3232
v0_0,
3333

34-
/// 2011, initial protocol negotiation.
34+
/// 2011, initial protocol negotiation (usupported).
3535
v0_6,
3636

37-
/// 2012, enhanced protocol negotiation.
37+
/// 2012, enhanced protocol negotiation (usupported).
3838
v0_8,
3939

40-
/// 2012, added pruning limits and transport indicators.
40+
/// 2012, added pruning limits and transport indicators (usupported).
4141
v0_9,
4242

43-
/// 2013, baseline for core methods in the official specification.
43+
/// 2013, baseline for core methods in official specification (usupported).
4444
v0_10,
4545

46-
/// 2014, 1.x series, deprecations of utxo and block number methods.
46+
/// 2014, deprecations of utxo and block number methods (minimum).
4747
v1_0,
4848

4949
/// 2015, updated version response and introduced scripthash methods.
@@ -64,8 +64,14 @@ enum class version
6464
/// 2020, added scripthash unsubscribe functionality.
6565
v1_4_2,
6666

67-
/// 2022, updated response formats and added fee estimation modes.
68-
v1_6
67+
/// There is no v1.5 release (skipped).
68+
//v1_5,
69+
70+
/// 2022, updated response formats, added fee estimation modes (maximum).
71+
v1_6,
72+
73+
/// Not valid, just defined for out of bounds testing.
74+
v1_7
6975
};
7076

7177
std::string_view version_to_string(version value) NOEXCEPT;

include/bitcoin/server/protocols/protocol_electrum.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <bitcoin/server/define.hpp>
2626
#include <bitcoin/server/interfaces/interfaces.hpp>
2727
#include <bitcoin/server/parsers/parsers.hpp>
28+
#include <bitcoin/server/protocols/protocol_electrum_version.hpp>
2829
#include <bitcoin/server/protocols/protocol_rpc.hpp>
2930

3031
namespace libbitcoin {
@@ -91,6 +92,9 @@ class BCS_API protocol_electrum
9192
void handle_blockchain_transaction_broadcast(const code& ec,
9293
rpc_interface::blockchain_transaction_broadcast,
9394
const std::string& raw_tx) NOEXCEPT;
95+
void handle_blockchain_transaction_broadcast_package(const code& ec,
96+
rpc_interface::blockchain_transaction_broadcast_package,
97+
const std::string& raw_txs, bool verbose) NOEXCEPT;
9498
void handle_blockchain_transaction_get(const code& ec,
9599
rpc_interface::blockchain_transaction_get, const std::string& tx_hash,
96100
bool verbose) NOEXCEPT;
@@ -122,6 +126,8 @@ class BCS_API protocol_electrum
122126
/// Handlers (mempool).
123127
void handle_mempool_get_fee_histogram(const code& ec,
124128
rpc_interface::mempool_get_fee_histogram) NOEXCEPT;
129+
void handle_mempool_get_info(const code& ec,
130+
rpc_interface::mempool_get_info) NOEXCEPT;
125131

126132
protected:
127133
/// Common implementation for block_header/s.
@@ -131,7 +137,7 @@ class BCS_API protocol_electrum
131137
/// Notify client of new header.
132138
void do_header(node::header_t link) NOEXCEPT;
133139

134-
inline bool is_version(server::electrum::version version) const NOEXCEPT
140+
inline bool at_least(server::electrum::version version) const NOEXCEPT
135141
{
136142
return channel_->version() >= version;
137143
}
@@ -142,6 +148,13 @@ class BCS_API protocol_electrum
142148
}
143149

144150
private:
151+
using version_t = protocol_electrum_version;
152+
static constexpr electrum::version minimum = version_t::minimum;
153+
static constexpr electrum::version maximum = version_t::maximum;
154+
155+
// Compute server.features.hosts value from config.
156+
network::rpc::object_t advertised_hosts() const NOEXCEPT;
157+
145158
// These are thread safe.
146159
const options_t& options_;
147160
std::atomic_bool subscribed_{};

include/bitcoin/server/protocols/protocol_electrum_version.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ class BCS_API protocol_electrum_version
3737
typedef std::shared_ptr<protocol_electrum_version> ptr;
3838
using rpc_interface = interface::electrum;
3939

40+
static constexpr electrum::version minimum = electrum::version::v1_0;
41+
static constexpr electrum::version maximum = electrum::version::v1_6;
42+
4043
inline protocol_electrum_version(const auto& session,
4144
const network::channel::ptr& channel,
4245
const options_t& options) NOEXCEPT
@@ -51,8 +54,6 @@ class BCS_API protocol_electrum_version
5154
virtual void finished(const code& ec, const code& shake) NOEXCEPT;
5255

5356
protected:
54-
static constexpr electrum::version minimum = electrum::version::v1_4;
55-
static constexpr electrum::version maximum = electrum::version::v1_4_2;
5657
static constexpr size_t max_client_name_length = 1024;
5758

5859
void handle_server_version(const code& ec,

0 commit comments

Comments
 (0)