From 224200d08f51123b5b212927b97edd2f1ac71049 Mon Sep 17 00:00:00 2001 From: "Jamil Lambert, PhD" Date: Tue, 16 Dec 2025 10:02:47 +0000 Subject: [PATCH] Implement addconnection in hidden Implement the RPC in v22 hidden module, add the client macro, model and test. Redefine the client macro in v27 where there is an added required argument. Add all the reexports up to v30. --- client/src/client_sync/v22/hidden.rs | 26 ++++++++++++++++++++++ client/src/client_sync/v22/mod.rs | 2 ++ client/src/client_sync/v23/mod.rs | 1 + client/src/client_sync/v24/mod.rs | 1 + client/src/client_sync/v25/mod.rs | 1 + client/src/client_sync/v26/mod.rs | 1 + client/src/client_sync/v27/hidden.rs | 30 ++++++++++++++++++++++++++ client/src/client_sync/v27/mod.rs | 3 +++ client/src/client_sync/v28/mod.rs | 1 + client/src/client_sync/v29/mod.rs | 1 + client/src/client_sync/v30/mod.rs | 1 + integration_test/tests/hidden.rs | 32 ++++++++++++++++++++++++++++ types/src/v22/hidden/mod.rs | 22 +++++++++++++++++++ types/src/v22/mod.rs | 2 ++ types/src/v23/mod.rs | 8 +++---- types/src/v24/mod.rs | 8 +++---- types/src/v25/mod.rs | 4 ++-- types/src/v26/mod.rs | 4 ++-- types/src/v27/mod.rs | 4 ++-- types/src/v28/mod.rs | 4 ++-- types/src/v29/mod.rs | 4 ++-- types/src/v30/mod.rs | 4 ++-- 22 files changed, 144 insertions(+), 20 deletions(-) create mode 100644 client/src/client_sync/v22/hidden.rs create mode 100644 client/src/client_sync/v27/hidden.rs create mode 100644 types/src/v22/hidden/mod.rs diff --git a/client/src/client_sync/v22/hidden.rs b/client/src/client_sync/v22/hidden.rs new file mode 100644 index 00000000..d6f23df5 --- /dev/null +++ b/client/src/client_sync/v22/hidden.rs @@ -0,0 +1,26 @@ +// 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 `v22`. +//! +//! 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 `addconnection`. +#[macro_export] +macro_rules! impl_client_v22__add_connection { + () => { + impl Client { + pub fn add_connection( + &self, + address: &str, + connection_type: &str, + ) -> Result { + self.call("addconnection", &[into_json(address)?, into_json(connection_type)?]) + } + } + }; +} diff --git a/client/src/client_sync/v22/mod.rs b/client/src/client_sync/v22/mod.rs index c6c0ceb5..1e0b542b 100644 --- a/client/src/client_sync/v22/mod.rs +++ b/client/src/client_sync/v22/mod.rs @@ -4,6 +4,7 @@ //! //! We ignore option arguments unless they effect the shape of the returned JSON data. +mod hidden; mod signer; mod wallet; @@ -69,6 +70,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v22__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v23/mod.rs b/client/src/client_sync/v23/mod.rs index 012c6dad..aba9cd2b 100644 --- a/client/src/client_sync/v23/mod.rs +++ b/client/src/client_sync/v23/mod.rs @@ -72,6 +72,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v22__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v24/mod.rs b/client/src/client_sync/v24/mod.rs index 28861f26..617dba69 100644 --- a/client/src/client_sync/v24/mod.rs +++ b/client/src/client_sync/v24/mod.rs @@ -73,6 +73,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v22__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v25/mod.rs b/client/src/client_sync/v25/mod.rs index 931f6607..b17d955d 100644 --- a/client/src/client_sync/v25/mod.rs +++ b/client/src/client_sync/v25/mod.rs @@ -74,6 +74,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v22__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v26/mod.rs b/client/src/client_sync/v26/mod.rs index dd004165..b1f021a3 100644 --- a/client/src/client_sync/v26/mod.rs +++ b/client/src/client_sync/v26/mod.rs @@ -80,6 +80,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v22__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v27/hidden.rs b/client/src/client_sync/v27/hidden.rs new file mode 100644 index 00000000..810b0e34 --- /dev/null +++ b/client/src/client_sync/v27/hidden.rs @@ -0,0 +1,30 @@ +// 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 `v27`. +//! +//! 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 `addconnection`. +#[macro_export] +macro_rules! impl_client_v27__add_connection { + () => { + impl Client { + pub fn add_connection( + &self, + address: &str, + connection_type: &str, + v2transport: bool, + ) -> Result { + self.call( + "addconnection", + &[into_json(address)?, into_json(connection_type)?, into_json(v2transport)?], + ) + } + } + }; +} diff --git a/client/src/client_sync/v27/mod.rs b/client/src/client_sync/v27/mod.rs index 54c15700..385a122a 100644 --- a/client/src/client_sync/v27/mod.rs +++ b/client/src/client_sync/v27/mod.rs @@ -4,6 +4,8 @@ //! //! We ignore option arguments unless they effect the shape of the returned JSON data. +pub mod hidden; + use std::collections::BTreeMap; use std::path::Path; @@ -74,6 +76,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v27__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v28/mod.rs b/client/src/client_sync/v28/mod.rs index cb296ba3..422ad4e0 100644 --- a/client/src/client_sync/v28/mod.rs +++ b/client/src/client_sync/v28/mod.rs @@ -77,6 +77,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v27__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v29/mod.rs b/client/src/client_sync/v29/mod.rs index 1b52b58c..9fe5d04e 100644 --- a/client/src/client_sync/v29/mod.rs +++ b/client/src/client_sync/v29/mod.rs @@ -77,6 +77,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v27__add_connection!(); crate::impl_client_v21__add_peer_address!(); crate::impl_client_v17__estimate_raw_fee!(); crate::impl_client_v17__wait_for_block!(); diff --git a/client/src/client_sync/v30/mod.rs b/client/src/client_sync/v30/mod.rs index 59c8352d..d22722ac 100644 --- a/client/src/client_sync/v30/mod.rs +++ b/client/src/client_sync/v30/mod.rs @@ -78,6 +78,7 @@ crate::impl_client_v20__generate_to_descriptor!(); crate::impl_client_v17__invalidate_block!(); // == Hidden == +crate::impl_client_v27__add_connection!(); crate::impl_client_v21__add_peer_address!(); // == Mining == diff --git a/integration_test/tests/hidden.rs b/integration_test/tests/hidden.rs index bf14931e..5a7cfcb6 100644 --- a/integration_test/tests/hidden.rs +++ b/integration_test/tests/hidden.rs @@ -7,6 +7,38 @@ use integration_test::{Node, NodeExt as _, Wallet}; use node::mtype; use node::vtype::*; // All the version specific types. +#[cfg(not(feature = "v21_and_below"))] +use node::P2P; + +#[test] +#[cfg(not(feature = "v21_and_below"))] +fn hidden__add_connection() { + let (listener, dialer, _node3) = integration_test::three_node_network(); + + let p2p = listener.p2p_connect(false).expect("p2p address"); + let address = match p2p { + P2P::Connect(socket, _) => socket.to_string(), + _ => unreachable!("p2p_connect should return P2P::Connect"), + }; + + let json: AddConnection = { + #[cfg(feature = "v26_and_below")] + { + dialer.client.add_connection(&address, "outbound-full-relay").expect("addconnection") + } + #[cfg(not(feature = "v26_and_below"))] + { + dialer + .client + .add_connection(&address, "outbound-full-relay", false) + .expect("addconnection") + } + }; + + assert_eq!(json.address, address); + assert_eq!(json.connection_type, "outbound-full-relay"); + assert!(dialer.peers_connected() >= 1); +} #[test] fn hidden__estimate_raw_fee__modelled() { diff --git a/types/src/v22/hidden/mod.rs b/types/src/v22/hidden/mod.rs new file mode 100644 index 00000000..37a68b08 --- /dev/null +++ b/types/src/v22/hidden/mod.rs @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: CC0-1.0 + +//! The JSON-RPC API for Bitcoin Core `v22` - hidden. +//! +//! Types for methods that are excluded from the API docs by default. + +use serde::{Deserialize, Serialize}; + +/// Result of JSON-RPC method `addconnection`. +/// +/// > addconnection "address" "connection_type" +/// > +/// > Open an outbound connection to a specified node. +/// > This RPC is for testing only. +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] +#[cfg_attr(feature = "serde-deny-unknown-fields", serde(deny_unknown_fields))] +pub struct AddConnection { + /// The address of the newly added connection. + pub address: String, + /// Type of connection. + pub connection_type: String, +} diff --git a/types/src/v22/mod.rs b/types/src/v22/mod.rs index ed4ef2fe..625eb65e 100644 --- a/types/src/v22/mod.rs +++ b/types/src/v22/mod.rs @@ -245,6 +245,7 @@ // JSON-RPC types by API section. mod blockchain; mod control; +mod hidden; mod network; mod raw_transactions; mod signer; @@ -254,6 +255,7 @@ mod wallet; pub use self::{ blockchain::GetMempoolInfo, control::Logging, + hidden::AddConnection, network::{Banned, GetNodeAddresses, GetPeerInfo, ListBanned, NodeAddress, PeerInfo}, raw_transactions::{ DecodeScript, DecodeScriptError, DecodeScriptSegwit, MempoolAcceptance, diff --git a/types/src/v23/mod.rs b/types/src/v23/mod.rs index 38a9aa5c..8751859c 100644 --- a/types/src/v23/mod.rs +++ b/types/src/v23/mod.rs @@ -321,9 +321,9 @@ pub use crate::{ SendMany, SendManyVerbose, UnloadWallet, UpgradeWallet, }, v22::{ - Banned, DescriptorInfo, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, - GetMempoolInfo, GetNodeAddresses, ListBanned, ListDescriptors, MempoolAcceptance, - MempoolAcceptanceError, MempoolAcceptanceFees, NodeAddress, ScriptPubkey, Signers, - TestMempoolAccept, TestMempoolAcceptError, WalletDisplayAddress, + AddConnection, Banned, DescriptorInfo, EnumerateSigners, GetAddressInfo, + GetAddressInfoEmbedded, GetMempoolInfo, GetNodeAddresses, ListBanned, ListDescriptors, + MempoolAcceptance, MempoolAcceptanceError, MempoolAcceptanceFees, NodeAddress, + ScriptPubkey, Signers, TestMempoolAccept, TestMempoolAcceptError, WalletDisplayAddress, }, }; diff --git a/types/src/v24/mod.rs b/types/src/v24/mod.rs index 9faa1212..4e232980 100644 --- a/types/src/v24/mod.rs +++ b/types/src/v24/mod.rs @@ -321,10 +321,10 @@ pub use crate::{ SendMany, SendManyVerbose, UnloadWallet, UpgradeWallet, }, v22::{ - Banned, DescriptorInfo, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, - GetNodeAddresses, ListBanned, ListDescriptors, MempoolAcceptance, MempoolAcceptanceError, - MempoolAcceptanceFees, NodeAddress, ScriptPubkey, Signers, TestMempoolAccept, - TestMempoolAcceptError, WalletDisplayAddress, + AddConnection, Banned, DescriptorInfo, EnumerateSigners, GetAddressInfo, + GetAddressInfoEmbedded, GetNodeAddresses, ListBanned, ListDescriptors, MempoolAcceptance, + MempoolAcceptanceError, MempoolAcceptanceFees, NodeAddress, ScriptPubkey, Signers, + TestMempoolAccept, TestMempoolAcceptError, WalletDisplayAddress, }, v23::{ AddMultisigAddress, Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, diff --git a/types/src/v25/mod.rs b/types/src/v25/mod.rs index afd270eb..899c3947 100644 --- a/types/src/v25/mod.rs +++ b/types/src/v25/mod.rs @@ -314,8 +314,8 @@ pub use crate::{ SendManyVerbose, UpgradeWallet, }, v22::{ - Banned, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, GetNodeAddresses, - ListBanned, NodeAddress, ScriptPubkey, Signers, WalletDisplayAddress, + AddConnection, Banned, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, + GetNodeAddresses, ListBanned, NodeAddress, ScriptPubkey, Signers, WalletDisplayAddress, }, v23::{ AddMultisigAddress, Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, diff --git a/types/src/v26/mod.rs b/types/src/v26/mod.rs index 4a2ab341..9886bc97 100644 --- a/types/src/v26/mod.rs +++ b/types/src/v26/mod.rs @@ -329,8 +329,8 @@ pub use crate::{ SendManyVerbose, UpgradeWallet, }, v22::{ - Banned, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, GetNodeAddresses, - ListBanned, NodeAddress, ScriptPubkey, Signers, WalletDisplayAddress, + AddConnection, Banned, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, + GetNodeAddresses, ListBanned, NodeAddress, ScriptPubkey, Signers, WalletDisplayAddress, }, v23::{ AddMultisigAddress, Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, diff --git a/types/src/v27/mod.rs b/types/src/v27/mod.rs index 6f032eaa..a79980fe 100644 --- a/types/src/v27/mod.rs +++ b/types/src/v27/mod.rs @@ -305,8 +305,8 @@ pub use crate::{ SendManyVerbose, UpgradeWallet, }, v22::{ - Banned, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, GetNodeAddresses, - ListBanned, NodeAddress, ScriptPubkey, Signers, WalletDisplayAddress, + AddConnection, Banned, EnumerateSigners, GetAddressInfo, GetAddressInfoEmbedded, + GetNodeAddresses, ListBanned, NodeAddress, ScriptPubkey, Signers, WalletDisplayAddress, }, v23::{ AddMultisigAddress, Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, diff --git a/types/src/v28/mod.rs b/types/src/v28/mod.rs index 22a6e0e3..c904851a 100644 --- a/types/src/v28/mod.rs +++ b/types/src/v28/mod.rs @@ -325,8 +325,8 @@ pub use crate::{ PsbtBumpFee, PsbtBumpFeeError, Send, SendError, SendMany, SendManyVerbose, UpgradeWallet, }, v22::{ - Banned, EnumerateSigners, GetNodeAddresses, ListBanned, NodeAddress, ScriptPubkey, Signers, - WalletDisplayAddress, + AddConnection, Banned, EnumerateSigners, GetNodeAddresses, ListBanned, NodeAddress, + ScriptPubkey, Signers, WalletDisplayAddress, }, v23::{ AddMultisigAddress, Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, diff --git a/types/src/v29/mod.rs b/types/src/v29/mod.rs index f2661c44..024d01bc 100644 --- a/types/src/v29/mod.rs +++ b/types/src/v29/mod.rs @@ -319,8 +319,8 @@ pub use crate::{ PsbtBumpFee, PsbtBumpFeeError, Send, SendError, SendMany, SendManyVerbose, UpgradeWallet, }, v22::{ - Banned, EnumerateSigners, GetNodeAddresses, ListBanned, NodeAddress, ScriptPubkey, Signers, - WalletDisplayAddress, + AddConnection, Banned, EnumerateSigners, GetNodeAddresses, ListBanned, NodeAddress, + ScriptPubkey, Signers, WalletDisplayAddress, }, v23::{ AddMultisigAddress, Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, diff --git a/types/src/v30/mod.rs b/types/src/v30/mod.rs index 5f665580..786e5085 100644 --- a/types/src/v30/mod.rs +++ b/types/src/v30/mod.rs @@ -312,8 +312,8 @@ pub use crate::{ PsbtBumpFee, PsbtBumpFeeError, Send, SendError, SendMany, SendManyVerbose, }, v22::{ - Banned, EnumerateSigners, GetNodeAddresses, ListBanned, NodeAddress, ScriptPubkey, Signers, - WalletDisplayAddress, + AddConnection, Banned, EnumerateSigners, GetNodeAddresses, ListBanned, NodeAddress, + ScriptPubkey, Signers, WalletDisplayAddress, }, v23::{ Bip9Info, Bip9Statistics, CreateMultisig, DecodeScript, DecodeScriptError,