Skip to content

Commit e71a6b0

Browse files
committed
Merge #301: Address all TODO in v23
828454a Run the formatter (Jamil Lambert, PhD) 9e6f836 Add getdeploymentinfo struct, model and test (Jamil Lambert, PhD) 869f0c4 Add newkeypool macro and test (Jamil Lambert, PhD) 5429040 Add restorewallet struct, macro and test (Jamil Lambert, PhD) 6ffbf1d Add getblockfrompeer macro and test (Jamil Lambert, PhD) Pull request description: Go through all the TODO in the v23 types table. Add all the missing RPCs. - Add getblockfrompeer macro and test - Add restorewallet struct, macro and test - Add newkeypool macro and test - Add getdeploymentinfo struct, model and test - Run the formatter ACKs for top commit: tcharding: ACK 828454a Tree-SHA512: 6298568c5646287f7d5eb1ba6ed745cc978cabe76e7202770cf42f07ae07007bbb97d31a244c5635b1b2a06802b2078c290796ac7bf3a03947c6ed950a5252a1
2 parents b41f35f + 828454a commit e71a6b0

File tree

24 files changed

+486
-45
lines changed

24 files changed

+486
-45
lines changed

client/src/client_sync/v23/blockchain.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,34 @@
99
//!
1010
//! See or use the `define_jsonrpc_minreq_client!` macro to define a `Client`.
1111
12+
/// Implements Bitcoin Core JSON-RPC API method `getblockfrompeer`
13+
#[macro_export]
14+
macro_rules! impl_client_v23__get_block_from_peer {
15+
() => {
16+
impl Client {
17+
pub fn get_block_from_peer(&self, blockhash: BlockHash, peer_id: u32) -> Result<()> {
18+
match self.call("getblockfrompeer", &[into_json(blockhash)?, into_json(peer_id)?]) {
19+
Ok(serde_json::Value::Object(ref map)) if map.is_empty() => Ok(()),
20+
Ok(res) => Err(Error::Returned(res.to_string())),
21+
Err(err) => Err(err.into()),
22+
}
23+
}
24+
}
25+
};
26+
}
27+
28+
/// Implements Bitcoin Core JSON-RPC API method `getdeploymentinfo`.
29+
#[macro_export]
30+
macro_rules! impl_client_v23__get_deployment_info {
31+
() => {
32+
impl Client {
33+
pub fn get_deployment_info(&self, blockhash: &BlockHash) -> Result<GetDeploymentInfo> {
34+
self.call("getdeploymentinfo", &[into_json(blockhash)?])
35+
}
36+
}
37+
};
38+
}
39+
1240
/// Implements Bitcoin Core JSON-RPC API method `savemempool`
1341
#[macro_export]
1442
macro_rules! impl_client_v23__save_mempool {

client/src/client_sync/v23/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,13 @@ crate::impl_client_v17__get_block!();
3535
crate::impl_client_v17__get_blockchain_info!();
3636
crate::impl_client_v17__get_block_count!();
3737
crate::impl_client_v19__get_block_filter!();
38+
crate::impl_client_v23__get_block_from_peer!();
3839
crate::impl_client_v17__get_block_hash!();
3940
crate::impl_client_v17__get_block_header!();
4041
crate::impl_client_v17__get_block_stats!();
4142
crate::impl_client_v17__get_chain_tips!();
4243
crate::impl_client_v17__get_chain_tx_stats!();
44+
crate::impl_client_v23__get_deployment_info!();
4345
crate::impl_client_v17__get_difficulty!();
4446
crate::impl_client_v17__get_mempool_ancestors!();
4547
crate::impl_client_v17__get_mempool_descendants!();
@@ -168,9 +170,11 @@ crate::impl_client_v18__list_wallet_dir!();
168170
crate::impl_client_v17__list_wallets!();
169171
crate::impl_client_v22__load_wallet!();
170172
crate::impl_client_v17__lock_unspent!();
173+
crate::impl_client_v23__new_keypool!();
171174
crate::impl_client_v21__psbt_bump_fee!();
172175
crate::impl_client_v17__remove_pruned_funds!();
173176
crate::impl_client_v17__rescan_blockchain!();
177+
crate::impl_client_v23__restore_wallet!();
174178
crate::impl_client_v21__send!();
175179
crate::impl_client_v17__send_many!();
176180
crate::impl_client_v17__send_to_address!();

client/src/client_sync/v23/wallet.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,44 @@ macro_rules! impl_client_v23__create_wallet {
5656
}
5757
};
5858
}
59+
60+
/// Implements Bitcoin Core JSON-RPC API method `newkeypool`.
61+
#[macro_export]
62+
macro_rules! impl_client_v23__new_keypool {
63+
() => {
64+
impl Client {
65+
/// Calls `newkeypool` for the loaded wallet.
66+
///
67+
/// > newkeypool
68+
/// >
69+
/// > Entirely clears and refills the keypool.
70+
/// > Requires wallet passphrase to be set if wallet is encrypted.
71+
pub fn new_keypool(&self) -> Result<()> {
72+
match self.call("newkeypool", &[]) {
73+
Ok(serde_json::Value::Null) => Ok(()),
74+
Ok(res) => Err(Error::Returned(res.to_string())),
75+
Err(err) => Err(err.into()),
76+
}
77+
}
78+
}
79+
};
80+
}
81+
82+
/// Implements Bitcoin Core JSON-RPC API method `restorewallet`.
83+
#[macro_export]
84+
macro_rules! impl_client_v23__restore_wallet {
85+
() => {
86+
impl Client {
87+
/// Calls `restorewallet` with required and optional arguments.
88+
///
89+
/// > restorewallet "wallet_name" "backup_file" ( load_on_startup )
90+
pub fn restore_wallet(
91+
&self,
92+
wallet_name: &str,
93+
backup_file: &Path,
94+
) -> Result<RestoreWallet> {
95+
self.call("restorewallet", &[wallet_name.into(), into_json(backup_file)?])
96+
}
97+
}
98+
};
99+
}

client/src/client_sync/v24/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ crate::impl_client_v17__get_block!();
3232
crate::impl_client_v17__get_blockchain_info!();
3333
crate::impl_client_v17__get_block_count!();
3434
crate::impl_client_v19__get_block_filter!();
35+
crate::impl_client_v23__get_block_from_peer!();
3536
crate::impl_client_v17__get_block_hash!();
3637
crate::impl_client_v17__get_block_header!();
3738
crate::impl_client_v17__get_block_stats!();
3839
crate::impl_client_v17__get_chain_tips!();
3940
crate::impl_client_v17__get_chain_tx_stats!();
41+
crate::impl_client_v23__get_deployment_info!();
4042
crate::impl_client_v17__get_difficulty!();
4143
crate::impl_client_v17__get_mempool_ancestors!();
4244
crate::impl_client_v17__get_mempool_descendants!();
@@ -165,9 +167,11 @@ crate::impl_client_v18__list_wallet_dir!();
165167
crate::impl_client_v17__list_wallets!();
166168
crate::impl_client_v22__load_wallet!();
167169
crate::impl_client_v17__lock_unspent!();
170+
crate::impl_client_v23__new_keypool!();
168171
crate::impl_client_v21__psbt_bump_fee!();
169172
crate::impl_client_v17__remove_pruned_funds!();
170173
crate::impl_client_v17__rescan_blockchain!();
174+
crate::impl_client_v23__restore_wallet!();
171175
crate::impl_client_v21__send!();
172176
crate::impl_client_v17__send_many!();
173177
crate::impl_client_v17__send_to_address!();

client/src/client_sync/v25/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ crate::impl_client_v17__get_block!();
3434
crate::impl_client_v17__get_blockchain_info!();
3535
crate::impl_client_v17__get_block_count!();
3636
crate::impl_client_v19__get_block_filter!();
37+
crate::impl_client_v23__get_block_from_peer!();
3738
crate::impl_client_v17__get_block_hash!();
3839
crate::impl_client_v17__get_block_header!();
3940
crate::impl_client_v17__get_block_stats!();
4041
crate::impl_client_v17__get_chain_tips!();
4142
crate::impl_client_v17__get_chain_tx_stats!();
43+
crate::impl_client_v23__get_deployment_info!();
4244
crate::impl_client_v17__get_difficulty!();
4345
crate::impl_client_v17__get_mempool_ancestors!();
4446
crate::impl_client_v17__get_mempool_descendants!();
@@ -167,9 +169,11 @@ crate::impl_client_v18__list_wallet_dir!();
167169
crate::impl_client_v17__list_wallets!();
168170
crate::impl_client_v22__load_wallet!();
169171
crate::impl_client_v17__lock_unspent!();
172+
crate::impl_client_v23__new_keypool!();
170173
crate::impl_client_v21__psbt_bump_fee!();
171174
crate::impl_client_v17__remove_pruned_funds!();
172175
crate::impl_client_v17__rescan_blockchain!();
176+
crate::impl_client_v23__restore_wallet!();
173177
crate::impl_client_v21__send!();
174178
crate::impl_client_v17__send_many!();
175179
crate::impl_client_v17__send_to_address!();

client/src/client_sync/v26/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@ crate::impl_client_v17__get_block!();
3636
crate::impl_client_v17__get_blockchain_info!();
3737
crate::impl_client_v17__get_block_count!();
3838
crate::impl_client_v19__get_block_filter!();
39+
crate::impl_client_v23__get_block_from_peer!();
3940
crate::impl_client_v17__get_block_hash!();
4041
crate::impl_client_v17__get_block_header!();
4142
crate::impl_client_v17__get_block_stats!();
4243
crate::impl_client_v17__get_chain_tips!();
4344
crate::impl_client_v17__get_chain_tx_stats!();
45+
crate::impl_client_v23__get_deployment_info!();
4446
crate::impl_client_v17__get_difficulty!();
4547
crate::impl_client_v17__get_mempool_ancestors!();
4648
crate::impl_client_v17__get_mempool_descendants!();
@@ -171,9 +173,11 @@ crate::impl_client_v18__list_wallet_dir!();
171173
crate::impl_client_v17__list_wallets!();
172174
crate::impl_client_v22__load_wallet!();
173175
crate::impl_client_v17__lock_unspent!();
176+
crate::impl_client_v23__new_keypool!();
174177
crate::impl_client_v21__psbt_bump_fee!();
175178
crate::impl_client_v17__remove_pruned_funds!();
176179
crate::impl_client_v17__rescan_blockchain!();
180+
crate::impl_client_v23__restore_wallet!();
177181
crate::impl_client_v21__send!();
178182
crate::impl_client_v17__send_many!();
179183
crate::impl_client_v17__send_to_address!();

client/src/client_sync/v27/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ crate::impl_client_v17__get_block!();
3232
crate::impl_client_v17__get_blockchain_info!();
3333
crate::impl_client_v17__get_block_count!();
3434
crate::impl_client_v19__get_block_filter!();
35+
crate::impl_client_v23__get_block_from_peer!();
3536
crate::impl_client_v17__get_block_hash!();
3637
crate::impl_client_v17__get_block_header!();
3738
crate::impl_client_v17__get_block_stats!();
3839
crate::impl_client_v17__get_chain_tips!();
3940
crate::impl_client_v17__get_chain_tx_stats!();
41+
crate::impl_client_v23__get_deployment_info!();
4042
crate::impl_client_v17__get_difficulty!();
4143
crate::impl_client_v17__get_mempool_ancestors!();
4244
crate::impl_client_v17__get_mempool_descendants!();
@@ -167,9 +169,11 @@ crate::impl_client_v18__list_wallet_dir!();
167169
crate::impl_client_v17__list_wallets!();
168170
crate::impl_client_v22__load_wallet!();
169171
crate::impl_client_v17__lock_unspent!();
172+
crate::impl_client_v23__new_keypool!();
170173
crate::impl_client_v21__psbt_bump_fee!();
171174
crate::impl_client_v17__remove_pruned_funds!();
172175
crate::impl_client_v17__rescan_blockchain!();
176+
crate::impl_client_v23__restore_wallet!();
173177
crate::impl_client_v21__send!();
174178
crate::impl_client_v17__send_many!();
175179
crate::impl_client_v17__send_to_address!();

client/src/client_sync/v28/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ crate::impl_client_v17__get_block!();
3434
crate::impl_client_v17__get_blockchain_info!();
3535
crate::impl_client_v17__get_block_count!();
3636
crate::impl_client_v19__get_block_filter!();
37+
crate::impl_client_v23__get_block_from_peer!();
3738
crate::impl_client_v17__get_block_hash!();
3839
crate::impl_client_v17__get_block_header!();
3940
crate::impl_client_v17__get_block_stats!();
4041
crate::impl_client_v17__get_chain_tips!();
4142
crate::impl_client_v17__get_chain_tx_stats!();
43+
crate::impl_client_v23__get_deployment_info!();
4244
crate::impl_client_v17__get_difficulty!();
4345
crate::impl_client_v17__get_mempool_ancestors!();
4446
crate::impl_client_v17__get_mempool_descendants!();
@@ -169,9 +171,11 @@ crate::impl_client_v18__list_wallet_dir!();
169171
crate::impl_client_v17__list_wallets!();
170172
crate::impl_client_v22__load_wallet!();
171173
crate::impl_client_v17__lock_unspent!();
174+
crate::impl_client_v23__new_keypool!();
172175
crate::impl_client_v21__psbt_bump_fee!();
173176
crate::impl_client_v17__remove_pruned_funds!();
174177
crate::impl_client_v17__rescan_blockchain!();
178+
crate::impl_client_v23__restore_wallet!();
175179
crate::impl_client_v21__send!();
176180
crate::impl_client_v17__send_many!();
177181
crate::impl_client_v17__send_to_address!();

client/src/client_sync/v29/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ crate::impl_client_v17__get_block!();
3333
crate::impl_client_v17__get_blockchain_info!();
3434
crate::impl_client_v17__get_block_count!();
3535
crate::impl_client_v19__get_block_filter!();
36+
crate::impl_client_v23__get_block_from_peer!();
3637
crate::impl_client_v17__get_block_hash!();
3738
crate::impl_client_v17__get_block_header!();
3839
crate::impl_client_v17__get_block_stats!();
3940
crate::impl_client_v17__get_chain_tips!();
4041
crate::impl_client_v17__get_chain_tx_stats!();
42+
crate::impl_client_v23__get_deployment_info!();
4143
crate::impl_client_v29__get_descriptor_activity!();
4244
crate::impl_client_v17__get_difficulty!();
4345
crate::impl_client_v17__get_mempool_ancestors!();
@@ -169,9 +171,11 @@ crate::impl_client_v18__list_wallet_dir!();
169171
crate::impl_client_v17__list_wallets!();
170172
crate::impl_client_v22__load_wallet!();
171173
crate::impl_client_v17__lock_unspent!();
174+
crate::impl_client_v23__new_keypool!();
172175
crate::impl_client_v21__psbt_bump_fee!();
173176
crate::impl_client_v17__remove_pruned_funds!();
174177
crate::impl_client_v17__rescan_blockchain!();
178+
crate::impl_client_v23__restore_wallet!();
175179
crate::impl_client_v21__send!();
176180
crate::impl_client_v17__send_many!();
177181
crate::impl_client_v17__send_to_address!();

integration_test/tests/blockchain.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,37 @@ fn blockchain__get_block_filter__modelled() {
6565
model.unwrap();
6666
}
6767

68+
#[test]
69+
#[cfg(not(feature = "v22_and_below"))]
70+
fn blockchain__get_block_from_peer() {
71+
use bitcoin::hashes::Hash;
72+
let (node1, _node2, _node3) = integration_test::three_node_network();
73+
74+
let now = std::time::SystemTime::now()
75+
.duration_since(std::time::UNIX_EPOCH)
76+
.expect("Time went backwards")
77+
.as_secs() as u32;
78+
79+
// Create a dummy header and submit it
80+
let mut header = bitcoin::block::Header {
81+
version: bitcoin::block::Version::from_consensus(0x20000000),
82+
prev_blockhash: node1.client.best_block_hash().expect("best_block_hash failed"),
83+
merkle_root: bitcoin::TxMerkleNode::all_zeros(),
84+
time: now,
85+
bits: bitcoin::CompactTarget::from_consensus(0x207fffff),
86+
nonce: 0,
87+
};
88+
let target = header.target();
89+
while header.validate_pow(target).is_err() {
90+
header.nonce += 1;
91+
}
92+
node1.client.submit_header(&header).expect("submit_header failed");
93+
94+
let hash = header.block_hash();
95+
let peer_id = node1.client.get_peer_info().expect("getpeerinfo").0[0].id;
96+
let _: () = node1.client.get_block_from_peer(hash, peer_id).expect("getblockfrompeer");
97+
}
98+
6899
#[test]
69100
fn blockchain__get_block_hash__modelled() {
70101
let node = Node::with_wallet(Wallet::None, &[]);
@@ -147,6 +178,17 @@ fn blockchain__get_chain_tx_stats__modelled() {
147178
model.unwrap();
148179
}
149180

181+
#[test]
182+
#[cfg(not(feature = "v22_and_below"))]
183+
fn blockchain__get_deployment_info__modelled() {
184+
let node = Node::with_wallet(Wallet::None, &[]);
185+
let block_hash = node.client.best_block_hash().expect("best_block_hash failed");
186+
187+
let json: GetDeploymentInfo = node.client.get_deployment_info(&block_hash).expect("getdeploymentinfo");
188+
let model: Result<mtype::GetDeploymentInfo, GetDeploymentInfoError> = json.into_model();
189+
model.unwrap();
190+
}
191+
150192
#[test]
151193
#[cfg(not(feature = "v28_and_below"))]
152194
fn blockchain__get_descriptor_activity__modelled() {

0 commit comments

Comments
 (0)