Skip to content
24 changes: 24 additions & 0 deletions client/src/client_sync/v17/hidden.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,27 @@ macro_rules! impl_client_v17__wait_for_new_block {
}
};
}

/// Implements Bitcoin Core JSON-RPC API method `syncwithvalidationinterfacequeue`.
#[macro_export]
macro_rules! impl_client_v17__sync_with_validation_interface_queue {
() => {
impl Client {
pub fn sync_with_validation_interface_queue(&self) -> Result<()> {
self.call("syncwithvalidationinterfacequeue", &[])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For functions that return () we use this pattern

                match self.call("preciousblock", &[into_json(hash)?]) {
                    Ok(serde_json::Value::Null) => Ok(()),
                    Ok(res) => Err(Error::Returned(res.to_string())),
                    Err(err) => Err(err.into()),
                }

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EDIT: See comment below before actioning this

}
}
};
}

/// Implements Bitcoin Core JSON-RPC API method `reconsiderblock`.
#[macro_export]
macro_rules! impl_client_v17__reconsider_block {
() => {
impl Client {
pub fn reconsider_block(&self, blockhash: bitcoin::BlockHash) -> Result<()> {
self.call("reconsiderblock", &[into_json(blockhash)?])
}
}
};
}
2 changes: 2 additions & 0 deletions client/src/client_sync/v17/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
2 changes: 2 additions & 0 deletions client/src/client_sync/v18/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
2 changes: 2 additions & 0 deletions client/src/client_sync/v19/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,8 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
22 changes: 22 additions & 0 deletions client/src/client_sync/v20/hidden.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// SPDX-License-Identifier: CC0-1.0

//! Macros for implementing JSON-RPC methods on a client.
//!
//! Specifically this is `== Hidden ==` methods that are not listed in the
//! API docs of Bitcoin Core `v0.20`.
//!
//! All macros require `Client` to be in scope.
//!
//! See or use the `define_jsonrpc_bitreq_client!` macro to define a `Client`.

/// Implements Bitcoin Core JSON-RPC API method `mockscheduler`.
#[macro_export]
macro_rules! impl_client_v20__mock_scheduler {
() => {
impl Client {
pub fn mock_scheduler(&self, delta_time: u64) -> Result<()> {
self.call("mockscheduler", &[into_json(delta_time)?])
}
}
};
}
4 changes: 4 additions & 0 deletions client/src/client_sync/v20/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
//! We ignore option arguments unless they effect the shape of the returned JSON data.

pub mod generating;
pub mod hidden;

use std::collections::BTreeMap;
use std::path::Path;
Expand Down Expand Up @@ -70,6 +71,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v21/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v22/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v23/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v24/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v25/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v26/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v27/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v28/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v29/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ crate::impl_client_v17__estimate_raw_fee!();
crate::impl_client_v17__wait_for_block!();
crate::impl_client_v17__wait_for_block_height!();
crate::impl_client_v17__wait_for_new_block!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
3 changes: 3 additions & 0 deletions client/src/client_sync/v30/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ crate::impl_client_v29__get_orphan_txs_verbosity_1!();
crate::impl_client_v29__get_orphan_txs!();
crate::impl_client_v27__add_connection!();
crate::impl_client_v21__add_peer_address!();
crate::impl_client_v17__sync_with_validation_interface_queue!();
crate::impl_client_v17__reconsider_block!();
crate::impl_client_v20__mock_scheduler!();

// == Mining ==
crate::impl_client_v17__get_block_template!();
Expand Down
65 changes: 65 additions & 0 deletions integration_test/tests/hidden.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,3 +173,68 @@ fn hidden__get_orphan_txs__modelled() {
}
}
}

#[test]
fn hidden__sync_with_validation_interface_queue() {
let node = Node::with_wallet(Wallet::Default, &[]);
node.fund_wallet();

// Create activity that causes validation callbacks.
let (_address, _txid) = node.create_mempool_transaction();

let _: () = node
.client
.sync_with_validation_interface_queue()
.expect("syncwithvalidationinterfacequeue");
}

#[test]
fn hidden__reconsider_block() {
let node = Node::with_wallet(Wallet::Default, &[]);
node.fund_wallet();

node.mine_a_block();
node.mine_a_block();

let tip_before = node.client.best_block_hash().expect("bestblockhash");
let height_before = node.client.get_block_count().expect("getblockcount").0;

node.client.invalidate_block(tip_before).expect("invalidateblock");

let tip_after_invalidate =
node.client.best_block_hash().expect("bestblockhash after invalidate");
let height_after_invalidate = node.client.get_block_count().expect("getblockcount").0;

assert_ne!(
tip_after_invalidate, tip_before,
"tip should change after invalidating the tip block"
);
assert_eq!(
height_after_invalidate,
height_before - 1,
"height should decrease by 1 after invalidating the tip block"
);

node.client.reconsider_block(tip_before).expect("reconsiderblock");

let tip_after_reconsider =
node.client.best_block_hash().expect("bestblockhash after reconsider");
let height_after_reconsider = node.client.get_block_count().expect("getblockcount").0;

assert_eq!(
tip_after_reconsider, tip_before,
"tip should return to the previously invalidated block after reconsiderblock"
);
assert_eq!(
height_after_reconsider, height_before,
"height should return to the original height after reconsiderblock"
);
}

#[test]
#[cfg(not(feature = "v19_and_below"))]
fn hidden__mock_scheduler() {
let node = Node::with_wallet(Wallet::Default, &[]);

let _: () = node.client.mock_scheduler(1).expect("mockscheduler");
}
2 changes: 1 addition & 1 deletion types/src/v30/mining/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: CC0-1.0

//! The JSON-RPC API for Bitcoin Core `v29` - mining.
//! The JSON-RPC API for Bitcoin Core `v30` - mining.
//!
//! Types for methods found under the `== Mining ==` section of the API docs.

Expand Down