diff --git a/client/src/client_sync/v17/hidden.rs b/client/src/client_sync/v17/hidden.rs index d3b400fd..3bc2afea 100644 --- a/client/src/client_sync/v17/hidden.rs +++ b/client/src/client_sync/v17/hidden.rs @@ -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", &[]) + } + } + }; +} + +/// 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)?]) + } + } + }; +} diff --git a/client/src/client_sync/v17/mod.rs b/client/src/client_sync/v17/mod.rs index 7ad22305..fd599518 100644 --- a/client/src/client_sync/v17/mod.rs +++ b/client/src/client_sync/v17/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v18/mod.rs b/client/src/client_sync/v18/mod.rs index cb3d9e47..5a5a35f4 100644 --- a/client/src/client_sync/v18/mod.rs +++ b/client/src/client_sync/v18/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v19/mod.rs b/client/src/client_sync/v19/mod.rs index dfc00400..0fc52e41 100644 --- a/client/src/client_sync/v19/mod.rs +++ b/client/src/client_sync/v19/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v20/hidden.rs b/client/src/client_sync/v20/hidden.rs new file mode 100644 index 00000000..84702d76 --- /dev/null +++ b/client/src/client_sync/v20/hidden.rs @@ -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)?]) + } + } + }; +} diff --git a/client/src/client_sync/v20/mod.rs b/client/src/client_sync/v20/mod.rs index 40c2eed6..afa1ff2f 100644 --- a/client/src/client_sync/v20/mod.rs +++ b/client/src/client_sync/v20/mod.rs @@ -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; @@ -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!(); diff --git a/client/src/client_sync/v21/mod.rs b/client/src/client_sync/v21/mod.rs index f532abdb..fcad23a7 100644 --- a/client/src/client_sync/v21/mod.rs +++ b/client/src/client_sync/v21/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index 1e0b542b..3353051b 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index aba9cd2b..739bf59c 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v24/mod.rs b/client/src/client_sync/v24/mod.rs index 617dba69..36ef55a8 100644 --- a/client/src/client_sync/v24/mod.rs +++ b/client/src/client_sync/v24/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v25/mod.rs b/client/src/client_sync/v25/mod.rs index b17d955d..b916340b 100644 --- a/client/src/client_sync/v25/mod.rs +++ b/client/src/client_sync/v25/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index b1f021a3..c201c8f3 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v27/mod.rs b/client/src/client_sync/v27/mod.rs index 385a122a..909987ac 100644 --- a/client/src/client_sync/v27/mod.rs +++ b/client/src/client_sync/v27/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index 422ad4e0..e41f05b0 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v29/mod.rs b/client/src/client_sync/v29/mod.rs index 851c2c2a..e39f57f9 100644 --- a/client/src/client_sync/v29/mod.rs +++ b/client/src/client_sync/v29/mod.rs @@ -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!(); diff --git a/client/src/client_sync/v30/mod.rs b/client/src/client_sync/v30/mod.rs index 7acb8cbd..61d6e32b 100644 --- a/client/src/client_sync/v30/mod.rs +++ b/client/src/client_sync/v30/mod.rs @@ -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!(); diff --git a/integration_test/tests/hidden.rs b/integration_test/tests/hidden.rs index 77ce3609..8aa3aa8b 100644 --- a/integration_test/tests/hidden.rs +++ b/integration_test/tests/hidden.rs @@ -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"); +} diff --git a/types/src/v30/mining/mod.rs b/types/src/v30/mining/mod.rs index 9e149471..a16ecc04 100644 --- a/types/src/v30/mining/mod.rs +++ b/types/src/v30/mining/mod.rs @@ -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.