Skip to content

Commit 4ac08f6

Browse files
committed
Merge #387: Add support for Bitcoin Core 30.0
e2507f4 Update v30 files for changes from Core v29 (Jamil Lambert, PhD) 88ddaf1 Add template for v30 support (Jamil Lambert, PhD) c1ac72c Remove duplicate verify methods (Jamil Lambert, PhD) Pull request description: Add all the necessary files and changes to support Core v30. RPCs that were dropped in v30 have been removed. New and changed RPCs between v29 and v30 have not been implemented in this PR and are TODO in `types`. Patches are: - Remove duplicate methods in verify. - Add all the required files, modules and features to support v30. `verify/src/method/v30.rs` is a copy of v29 with the label changed to v30. `types/src/v30/mod.rs` is a copy of v29 with the exports of the new v29 types moved to a reexport section under v29, no other changes. - Edit the files copied from v29 in a separate patch to make reviewing the changes easier. Feature gate the tests for RPCs that were removed or changed in v30. The new and changed RPCs are left as TODO in the types table for a follow up PR or patch. ACKs for top commit: tcharding: ACK e2507f4 Tree-SHA512: c6e59a27854c50d0b870c583ce484e03ccd72ab556d60113edac08f78d0cafa9a09ab7a509e3af6454379b686a0ee30c67d9d2830de9944c846ef1cc7e6a0139
2 parents 889a2e3 + e2507f4 commit 4ac08f6

File tree

23 files changed

+989
-17
lines changed

23 files changed

+989
-17
lines changed

client/src/client_sync/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pub mod v26;
1616
pub mod v27;
1717
pub mod v28;
1818
pub mod v29;
19+
pub mod v30;
1920

2021
use std::fs::File;
2122
use std::io::{BufRead, BufReader};

client/src/client_sync/v30/mod.rs

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
// SPDX-License-Identifier: CC0-1.0
2+
3+
//! A JSON-RPC client for testing against Bitcoin Core `v30`.
4+
//!
5+
//! We ignore option arguments unless they effect the shape of the returned JSON data.
6+
7+
use std::collections::BTreeMap;
8+
use std::path::Path;
9+
10+
use bitcoin::address::{Address, NetworkChecked};
11+
use bitcoin::{sign_message, Amount, Block, BlockHash, PublicKey, Txid};
12+
use serde_json::json;
13+
14+
use crate::client_sync::into_json;
15+
use crate::types::v30::*;
16+
17+
#[rustfmt::skip] // Keep public re-exports separate.
18+
pub use crate::client_sync::{
19+
v17::{AddNodeCommand, ImportMultiRequest, ImportMultiScriptPubKey, ImportMultiTimestamp, Input, Output, SetBanCommand, WalletCreateFundedPsbtInput,},
20+
v21::ImportDescriptorsRequest,
21+
v23::AddressType,
22+
v29::{TemplateRequest, TemplateRules}
23+
};
24+
25+
crate::define_jsonrpc_minreq_client!("v30");
26+
crate::impl_client_check_expected_server_version!({ [300000] });
27+
28+
// == Blockchain ==
29+
crate::impl_client_v29__dump_tx_out_set!();
30+
crate::impl_client_v17__get_best_block_hash!();
31+
crate::impl_client_v17__get_block!();
32+
crate::impl_client_v17__get_blockchain_info!();
33+
crate::impl_client_v17__get_block_count!();
34+
crate::impl_client_v19__get_block_filter!();
35+
crate::impl_client_v23__get_block_from_peer!();
36+
crate::impl_client_v17__get_block_hash!();
37+
crate::impl_client_v17__get_block_header!();
38+
crate::impl_client_v17__get_block_stats!();
39+
crate::impl_client_v26__get_chain_states!();
40+
crate::impl_client_v17__get_chain_tips!();
41+
crate::impl_client_v17__get_chain_tx_stats!();
42+
crate::impl_client_v23__get_deployment_info!();
43+
crate::impl_client_v29__get_descriptor_activity!();
44+
crate::impl_client_v17__get_difficulty!();
45+
crate::impl_client_v17__get_mempool_ancestors!();
46+
crate::impl_client_v17__get_mempool_descendants!();
47+
crate::impl_client_v17__get_mempool_entry!();
48+
crate::impl_client_v17__get_mempool_info!();
49+
crate::impl_client_v17__get_raw_mempool!();
50+
crate::impl_client_v17__get_tx_out!();
51+
crate::impl_client_v17__get_tx_out_proof!();
52+
crate::impl_client_v26__get_tx_out_set_info!();
53+
crate::impl_client_v24__get_tx_spending_prevout!();
54+
crate::impl_client_v26__import_mempool!();
55+
crate::impl_client_v17__precious_block!();
56+
crate::impl_client_v17__prune_blockchain!();
57+
crate::impl_client_v23__save_mempool!();
58+
crate::impl_client_v25__scan_blocks!();
59+
crate::impl_client_v17__verify_chain!();
60+
crate::impl_client_v17__verify_tx_out_proof!();
61+
62+
// == Control ==
63+
crate::impl_client_v17__get_memory_info!();
64+
crate::impl_client_v18__get_rpc_info!();
65+
crate::impl_client_v17__help!();
66+
crate::impl_client_v17__logging!();
67+
crate::impl_client_v17__stop!();
68+
crate::impl_client_v17__uptime!();
69+
70+
// == Generating ==
71+
crate::impl_client_v25__generate_block!();
72+
crate::impl_client_v17__generate_to_address!();
73+
crate::impl_client_v20__generate_to_descriptor!();
74+
crate::impl_client_v17__invalidate_block!();
75+
76+
// == Hidden ==
77+
crate::impl_client_v21__add_peer_address!();
78+
79+
// == Mining ==
80+
crate::impl_client_v17__get_block_template!();
81+
crate::impl_client_v17__get_mining_info!();
82+
crate::impl_client_v17__get_network_hashes_per_second!();
83+
crate::impl_client_v26__get_prioritised_transactions!();
84+
crate::impl_client_v17__prioritise_transaction!();
85+
crate::impl_client_v17__submit_block!();
86+
crate::impl_client_v18__submit_header!();
87+
88+
// == Network ==
89+
crate::impl_client_v17__add_node!();
90+
crate::impl_client_v17__clear_banned!();
91+
crate::impl_client_v17__disconnect_node!();
92+
crate::impl_client_v17__get_added_node_info!();
93+
crate::impl_client_v26__get_addr_man_info!();
94+
crate::impl_client_v17__get_connection_count!();
95+
crate::impl_client_v17__get_net_totals!();
96+
crate::impl_client_v17__get_network_info!();
97+
crate::impl_client_v18__get_node_addresses!();
98+
crate::impl_client_v17__get_peer_info!();
99+
crate::impl_client_v17__list_banned!();
100+
crate::impl_client_v17__ping!();
101+
crate::impl_client_v17__set_ban!();
102+
crate::impl_client_v17__set_network_active!();
103+
104+
// == Rawtransactions ==
105+
crate::impl_client_v18__analyze_psbt!();
106+
crate::impl_client_v17__combine_psbt!();
107+
crate::impl_client_v17__combine_raw_transaction!();
108+
crate::impl_client_v17__convert_to_psbt!();
109+
crate::impl_client_v17__create_psbt!();
110+
crate::impl_client_v17__create_raw_transaction!();
111+
crate::impl_client_v17__decode_psbt!();
112+
crate::impl_client_v17__decode_raw_transaction!();
113+
crate::impl_client_v17__decode_script!();
114+
crate::impl_client_v17__finalize_psbt!();
115+
crate::impl_client_v17__fund_raw_transaction!();
116+
crate::impl_client_v17__get_raw_transaction!();
117+
crate::impl_client_v18__join_psbts!();
118+
crate::impl_client_v17__send_raw_transaction!();
119+
crate::impl_client_v17__sign_raw_transaction!();
120+
crate::impl_client_v17__sign_raw_transaction_with_key!();
121+
crate::impl_client_v28__submit_package!();
122+
crate::impl_client_v17__test_mempool_accept!();
123+
crate::impl_client_v18__utxo_update_psbt!();
124+
125+
// == Signer ==
126+
crate::impl_client_v22__enumerate_signers!();
127+
128+
// == Util ==
129+
crate::impl_client_v17__create_multisig!();
130+
crate::impl_client_v29__derive_addresses!();
131+
crate::impl_client_v17__estimate_smart_fee!();
132+
crate::impl_client_v18__get_descriptor_info!();
133+
crate::impl_client_v21__get_index_info!();
134+
crate::impl_client_v17__sign_message_with_priv_key!();
135+
crate::impl_client_v17__validate_address!();
136+
crate::impl_client_v17__verify_message!();
137+
138+
// == Wallet ==
139+
crate::impl_client_v17__abandon_transaction!();
140+
crate::impl_client_v17__abort_rescan!();
141+
crate::impl_client_v17__backup_wallet!();
142+
crate::impl_client_v17__bump_fee!();
143+
crate::impl_client_v23__create_wallet!();
144+
crate::impl_client_v28__create_wallet_descriptor!();
145+
crate::impl_client_v17__encrypt_wallet!();
146+
crate::impl_client_v17__get_addresses_by_label!();
147+
crate::impl_client_v17__get_address_info!();
148+
crate::impl_client_v17__get_balance!();
149+
crate::impl_client_v19__get_balances!();
150+
crate::impl_client_v28__get_hd_keys!();
151+
crate::impl_client_v18__get_received_by_label!();
152+
crate::impl_client_v17__get_new_address!();
153+
crate::impl_client_v17__get_raw_change_address!();
154+
crate::impl_client_v17__get_received_by_address!();
155+
crate::impl_client_v17__get_transaction!();
156+
crate::impl_client_v17__get_wallet_info!();
157+
crate::impl_client_v21__import_descriptors!();
158+
crate::impl_client_v17__import_pruned_funds!();
159+
crate::impl_client_v17__key_pool_refill!();
160+
crate::impl_client_v17__list_address_groupings!();
161+
crate::impl_client_v22__list_descriptors!();
162+
crate::impl_client_v18__list_received_by_label!();
163+
crate::impl_client_v17__list_labels!();
164+
crate::impl_client_v17__list_lock_unspent!();
165+
crate::impl_client_v17__list_received_by_address!();
166+
crate::impl_client_v17__list_since_block!();
167+
crate::impl_client_v17__list_transactions!();
168+
crate::impl_client_v17__list_unspent!();
169+
crate::impl_client_v18__list_wallet_dir!();
170+
crate::impl_client_v17__list_wallets!();
171+
crate::impl_client_v22__load_wallet!();
172+
crate::impl_client_v17__lock_unspent!();
173+
crate::impl_client_v24__migrate_wallet!();
174+
crate::impl_client_v21__psbt_bump_fee!();
175+
crate::impl_client_v17__remove_pruned_funds!();
176+
crate::impl_client_v17__rescan_blockchain!();
177+
crate::impl_client_v23__restore_wallet!();
178+
crate::impl_client_v21__send!();
179+
crate::impl_client_v24__send_all!();
180+
crate::impl_client_v17__send_many!();
181+
crate::impl_client_v21__send_many_verbose!();
182+
crate::impl_client_v17__send_to_address!();
183+
crate::impl_client_v17__set_tx_fee!();
184+
crate::impl_client_v19__set_wallet_flag!();
185+
crate::impl_client_v17__sign_message!();
186+
crate::impl_client_v17__sign_raw_transaction_with_wallet!();
187+
crate::impl_client_v24__simulate_raw_transaction!();
188+
crate::impl_client_v21__unload_wallet!();
189+
crate::impl_client_v17__wallet_create_funded_psbt!();
190+
crate::impl_client_v22__wallet_display_address!();
191+
crate::impl_client_v17__wallet_lock!();
192+
crate::impl_client_v17__wallet_passphrase!();
193+
crate::impl_client_v17__wallet_passphrase_change!();
194+
crate::impl_client_v17__wallet_process_psbt!();
195+
196+
// == Zmq ==
197+
crate::impl_client_v17__get_zmq_notifications!();

contrib/templates/bitcoind_aliases

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ alias bt26='/opt/bitcoin-26.2/bin/bitcoin-cli -regtest -rpcuser=user -rpcpasswor
1414
alias bt27='/opt/bitcoin-27.2/bin/bitcoin-cli -regtest -rpcuser=user -rpcpassword=password -rpcport=27249'
1515
alias bt28='/opt/bitcoin-28.1/bin/bitcoin-cli -regtest -rpcuser=user -rpcpassword=password -rpcport=28149'
1616
alias bt29='/opt/bitcoin-29.0/bin/bitcoin-cli -regtest -rpcuser=user -rpcpassword=password -rpcport=29049'
17+
alias bt30='/opt/bitcoin-30.0/bin/bitcoin-cli -regtest -rpcuser=user -rpcpassword=password -rpcport=30049'
1718

1819
# Test aliases for different Bitcoin Core versions
1920

@@ -30,3 +31,4 @@ alias test26='BITCOIND_EXE=/opt/bitcoin-26.2/bin/bitcoind cargo test --features=
3031
alias test27='BITCOIND_EXE=/opt/bitcoin-27.2/bin/bitcoind cargo test --features="27_2"'
3132
alias test28='BITCOIND_EXE=/opt/bitcoin-28.1/bin/bitcoind cargo test --features="28_1"'
3233
alias test29='BITCOIND_EXE=/opt/bitcoin-29.0/bin/bitcoind cargo test --features="29_0"'
34+
alias test30='BITCOIND_EXE=/opt/bitcoin-30.0/bin/bitcoind cargo test --features="30_0"'

contrib/templates/run-bitcoind.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ v26 26.2 262 /opt/bitcoin-26.2/bin/bitcoind
1111
v27 27.2 272 /opt/bitcoin-27.2/bin/bitcoind
1212
v28 28.1 281 /opt/bitcoin-28.1/bin/bitcoind
1313
v29 29.0 290 /opt/bitcoin-29.0/bin/bitcoind
14+
v30 30.0 300 /opt/bitcoin-30.0/bin/bitcoind

integration_test/Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ edition = "2021"
1414
download = ["node/download"]
1515

1616
# Enable the same feature in `node` and the version feature here.
17-
# All minor releases of the latest three versions.
17+
# All minor releases of the latest four versions.
18+
30_0 = ["v30_and_below", "node/30_0"]
1819
29_0 = ["v29_and_below", "node/29_0"]
1920
28_2 = ["v28_and_below", "node/28_2"]
2021
28_1 = ["v28_and_below", "node/28_1"]
@@ -38,7 +39,8 @@ download = ["node/download"]
3839
# Each major version is tested with the same client.
3940
# A specific range of versions can be specified e.g. for 24-26:
4041
# #[cfg(all(feature = "v26_and_below", not(feature = "v23_and_below")))]
41-
v29_and_below = []
42+
v30_and_below = []
43+
v29_and_below = ["v30_and_below"]
4244
v28_and_below = ["v29_and_below"]
4345
v27_and_below = ["v28_and_below"]
4446
v26_and_below = ["v27_and_below"]

integration_test/tests/blockchain.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ fn blockchain__get_mempool_entry__modelled() {
332332
}
333333

334334
#[test]
335+
#[cfg(feature = "v29_and_below")]
335336
fn blockchain__get_mempool_info__modelled() {
336337
let node = Node::with_wallet(Wallet::Default, &[]);
337338
node.fund_wallet();

integration_test/tests/mining.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fn mining__get_block_template__modelled() {
3737
}
3838

3939
#[test]
40+
#[cfg(feature = "v29_and_below")]
4041
fn mining__get_mining_info() {
4142
let node = Node::with_wallet(Wallet::Default, &[]);
4243

integration_test/tests/wallet.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ fn wallet__abort_rescan() {
5959
}
6060

6161
#[test]
62+
#[cfg(feature = "v29_and_below")]
6263
fn wallet__add_multisig_address__modelled() {
6364
let nrequired = 2;
6465

@@ -168,6 +169,7 @@ fn wallet__create_wallet_descriptor() {
168169
}
169170

170171
#[test]
172+
#[cfg(feature = "v29_and_below")]
171173
fn wallet__dump_priv_key__modelled() {
172174
// As of Core v23 the default wallet is an native descriptor wallet which does not
173175
// support dumping private keys. Legacy wallets are supported upto v25 it seems.
@@ -200,6 +202,7 @@ fn wallet__dump_priv_key__modelled() {
200202
}
201203

202204
#[test]
205+
#[cfg(feature = "v29_and_below")]
203206
fn wallet__dump_wallet() {
204207
// As of Core v23 the default wallet is an native descriptor wallet which does not
205208
// support dumping private keys. Legacy wallets are supported upto v25 it seems.
@@ -398,6 +401,7 @@ fn wallet__get_transaction__modelled() {
398401
}
399402

400403
#[test]
404+
#[cfg(feature = "v29_and_below")]
401405
fn wallet__get_unconfirmed_balance__modelled() {
402406
let node = Node::with_wallet(Wallet::Default, &[]);
403407
let json: GetUnconfirmedBalance =
@@ -407,6 +411,7 @@ fn wallet__get_unconfirmed_balance__modelled() {
407411
}
408412

409413
#[test]
414+
#[cfg(feature = "v29_and_below")]
410415
fn wallet__get_wallet_info__modelled() {
411416
let node = Node::with_wallet(Wallet::Default, &[]);
412417
node.mine_a_block();
@@ -433,6 +438,7 @@ fn wallet__get_wallet_info__modelled() {
433438
}
434439

435440
#[test]
441+
#[cfg(feature = "v29_and_below")]
436442
fn wallet__import_address() {
437443
let node = match () {
438444
#[cfg(feature = "v22_and_below")]
@@ -517,6 +523,7 @@ fn wallet__import_pruned_funds() {
517523
}
518524

519525
#[test]
526+
#[cfg(feature = "v29_and_below")]
520527
fn wallet__import_wallet() {
521528
let node = match () {
522529
#[cfg(feature = "v22_and_below")]
@@ -648,6 +655,7 @@ fn wallet__list_transactions__modelled() {
648655
}
649656

650657
#[test]
658+
#[cfg(feature = "v29_and_below")]
651659
fn wallet__import_multi() {
652660
let node = match () {
653661
#[cfg(feature = "v22_and_below")]
@@ -711,6 +719,7 @@ fn wallet__import_multi() {
711719
}
712720

713721
#[test]
722+
#[cfg(feature = "v29_and_below")]
714723
fn wallet__import_privkey() {
715724
let node = match () {
716725
#[cfg(feature = "v22_and_below")]
@@ -730,6 +739,7 @@ fn wallet__import_privkey() {
730739
}
731740

732741
#[test]
742+
#[cfg(feature = "v29_and_below")]
733743
fn wallet__import_pubkey() {
734744
let node = match () {
735745
#[cfg(feature = "v22_and_below")]
@@ -805,7 +815,7 @@ fn wallet__list_unspent__modelled() {
805815
}
806816

807817
#[test]
808-
#[cfg(not(feature = "v17"))]
818+
#[cfg(all(feature = "v29_and_below", not(feature = "v17")))]
809819
fn wallet__list_wallet_dir() {
810820
let wallet_name = "test-wallet";
811821
let node = Node::with_wallet(Wallet::None, &[]);
@@ -853,7 +863,7 @@ fn wallet__lock_unspent() {
853863
}
854864

855865
#[test]
856-
#[cfg(not(feature = "v23_and_below"))]
866+
#[cfg(all(feature = "v29_and_below", not(feature = "v23_and_below")))]
857867
fn wallet__migrate_wallet() {
858868
let node = Node::with_wallet(Wallet::None, &["-deprecatedrpc=create_bdb"]);
859869
let wallet_name = "legacy_wallet";
@@ -865,7 +875,7 @@ fn wallet__migrate_wallet() {
865875
}
866876

867877
#[test]
868-
#[cfg(not(feature = "v22_and_below"))]
878+
#[cfg(all(feature = "v29_and_below", not(feature = "v22_and_below")))]
869879
fn wallet__new_keypool() {
870880
let node = Node::with_wallet(Wallet::None, &["-deprecatedrpc=create_bdb"]);
871881
node.client.create_legacy_wallet("legacy_wallet").expect("createlegacywallet");
@@ -1002,6 +1012,7 @@ fn wallet__send_to_address__modelled() {
10021012
}
10031013

10041014
#[test]
1015+
#[cfg(feature = "v29_and_below")]
10051016
fn wallet__set_tx_fee() {
10061017
let node = Node::with_wallet(Wallet::Default, &[]);
10071018
let fee_rate = FeeRate::from_sat_per_vb(2).expect("2 sat/vb is valid");
@@ -1021,6 +1032,7 @@ fn wallet__set_wallet_flag() {
10211032
}
10221033

10231034
#[test]
1035+
#[cfg(feature = "v29_and_below")]
10241036
fn wallet__set_hd_seed() {
10251037
let node = match () {
10261038
#[cfg(feature = "v22_and_below")]
@@ -1181,7 +1193,7 @@ fn create_load_unload_wallet() {
11811193
}
11821194

11831195
#[test]
1184-
#[cfg(not(feature = "v20_and_below"))]
1196+
#[cfg(all(feature = "v29_and_below", not(feature = "v20_and_below")))]
11851197
fn wallet__upgrade_wallet() {
11861198
let node = Node::with_wallet(Wallet::Default, &[]);
11871199

0 commit comments

Comments
 (0)