Ver código fonte

use `RpcSettings` and `RpcSettingsOpt`

darkfi 1 ano atrás
pai
commit
2bbe39e0ee
76 arquivos alterados com 585 adições e 255 exclusões
  1. 48 18
      bin/darkfid/darkfid_config.toml
  2. 6 5
      bin/darkfid/src/lib.rs
  3. 9 8
      bin/darkfid/src/main.rs
  4. 0 1
      bin/darkfid/src/rpc.rs
  5. 9 4
      bin/darkfid/src/tests/mod.rs
  6. 8 3
      bin/darkirc/config/inbound.toml
  7. 8 3
      bin/darkirc/config/outbound.toml
  8. 8 3
      bin/darkirc/config/seed.toml
  9. 8 3
      bin/darkirc/darkirc_config.toml
  10. 7 5
      bin/darkirc/src/main.rs
  11. 0 1
      bin/darkirc/src/rpc.rs
  12. 8 3
      bin/explorer/explorerd/explorerd_config.toml
  13. 5 4
      bin/explorer/explorerd/src/main.rs
  14. 8 3
      bin/fud/fud/fud_config.toml
  15. 8 6
      bin/fud/fud/src/main.rs
  16. 8 3
      bin/genev/genevd/genev_config.toml
  17. 4 5
      bin/genev/genevd/src/main.rs
  18. 8 3
      bin/genev/script/genevd_a.toml
  19. 8 3
      bin/genev/script/genevd_b.toml
  20. 8 3
      bin/genev/script/genevd_c.toml
  21. 8 3
      bin/genev/script/genevd_d.toml
  22. 8 3
      bin/genev/script/genevd_seed.toml
  23. 6 1
      bin/lilith/lilith_config.toml
  24. 6 5
      bin/lilith/src/main.rs
  25. 8 3
      bin/minerd/minerd.toml
  26. 18 9
      bin/minerd/src/lib.rs
  27. 4 6
      bin/minerd/src/main.rs
  28. 0 1
      bin/tau/taud/src/jsonrpc.rs
  29. 1 1
      bin/tau/taud/src/main.rs
  30. 7 6
      bin/tau/taud/src/settings.rs
  31. 8 3
      bin/tau/taud/taud_config.toml
  32. 8 3
      contrib/localnet/darkfid-five-nodes/darkfid0.toml
  33. 8 3
      contrib/localnet/darkfid-five-nodes/darkfid1.toml
  34. 8 3
      contrib/localnet/darkfid-five-nodes/darkfid2.toml
  35. 8 3
      contrib/localnet/darkfid-five-nodes/darkfid3.toml
  36. 8 3
      contrib/localnet/darkfid-five-nodes/darkfid4.toml
  37. 7 2
      contrib/localnet/darkfid-five-nodes/minerd0.toml
  38. 7 2
      contrib/localnet/darkfid-five-nodes/minerd1.toml
  39. 7 2
      contrib/localnet/darkfid-five-nodes/minerd2.toml
  40. 7 2
      contrib/localnet/darkfid-five-nodes/minerd3.toml
  41. 7 2
      contrib/localnet/darkfid-five-nodes/minerd4.toml
  42. 16 6
      contrib/localnet/darkfid-single-node/darkfid.toml
  43. 7 2
      contrib/localnet/darkfid-single-node/minerd.toml
  44. 8 3
      contrib/localnet/darkfid-small/darkfid0.toml
  45. 8 3
      contrib/localnet/darkfid-small/darkfid1.toml
  46. 8 3
      contrib/localnet/darkfid-small/darkfid2.toml
  47. 7 2
      contrib/localnet/darkfid-small/minerd0.toml
  48. 7 2
      contrib/localnet/darkfid-small/minerd1.toml
  49. 8 3
      contrib/localnet/darkirc-four-nodes/darkirc_full_node1.toml
  50. 8 3
      contrib/localnet/darkirc-four-nodes/darkirc_full_node2.toml
  51. 8 3
      contrib/localnet/darkirc-four-nodes/darkirc_full_node3.toml
  52. 8 3
      contrib/localnet/darkirc-four-nodes/darkirc_full_node4.toml
  53. 8 3
      contrib/localnet/darkirc-four-nodes/seed.toml
  54. 7 2
      contrib/localnet/dchatd-four-nodes/dchat1.toml
  55. 7 2
      contrib/localnet/dchatd-four-nodes/dchat2.toml
  56. 7 2
      contrib/localnet/dchatd-four-nodes/dchat3.toml
  57. 7 2
      contrib/localnet/dchatd-four-nodes/dchat4.toml
  58. 7 1
      contrib/localnet/dchatd-four-nodes/seed.toml
  59. 8 3
      contrib/localnet/fud/fud_config0.toml
  60. 8 3
      contrib/localnet/fud/fud_config1.toml
  61. 8 3
      contrib/localnet/fud/lilith_config.toml
  62. 8 3
      contrib/localnet/taud-four-nodes/seed.toml
  63. 8 3
      contrib/localnet/taud-four-nodes/taud_full_node1.toml
  64. 8 3
      contrib/localnet/taud-four-nodes/taud_full_node2.toml
  65. 8 3
      contrib/localnet/taud-four-nodes/taud_full_node3.toml
  66. 8 3
      contrib/localnet/taud-four-nodes/taud_full_node4.toml
  67. 7 2
      doc/src/learn/dchat/creating-dchatd/accept-addr.md
  68. 5 4
      doc/src/learn/dchat/creating-dchatd/stoppable-task.md
  69. 7 2
      example/dchat/dchatd/dchatd_config.toml
  70. 6 6
      example/dchat/dchatd/src/main.rs
  71. 6 5
      script/evgrd/bin/evgrd.rs
  72. 0 1
      script/evgrd/bin/rpc.rs
  73. 3 0
      script/evgrd/evgrd.toml
  74. 8 3
      script/research/dhtd/dhtd_config.toml
  75. 5 4
      script/research/dhtd/src/main.rs
  76. 13 6
      tests/jsonrpc.rs

+ 48 - 18
bin/darkfid/darkfid_config.toml

@@ -11,9 +11,6 @@ network = "testnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8240"
-
 # Path to the blockchain database directory
 database = "~/.local/share/darkfi/darkfid/localnet"
 
@@ -23,9 +20,6 @@ threshold = 3
 # minerd JSON-RPC endpoint
 minerd_endpoint = "tcp://127.0.0.1:28467"
 
-# Optional HTTP JSON-RPC listen URL to serve handlers for p2pool merge mining requests
-#mm_rpc_listen = "http+tcp://127.0.0.1:8241"
-
 # PoW block production target, in seconds
 pow_target = 10
 
@@ -61,6 +55,22 @@ skip_fees = false
 # Garbage collection task transactions batch size
 txs_batch_size = 50
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8240"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
+## Localnet JSON-RPC settings for p2pool merge mining requests (optional)
+#[network_config."localnet".mm_rpc]
+# JSON-RPC listen URL (merge mining)
+#rpc_listen = "http+tcp://127.0.0.1:8241"
+
+# Disabled RPC methods (merge mining)
+#rpc_disabled_methods = []
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections
@@ -120,9 +130,6 @@ localnet = true
 
 # Testnet blockchain network configuration
 [network_config."testnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8340"
-
 # Path to the blockchain database directory
 database = "~/.local/share/darkfi/darkfid/testnet"
 
@@ -132,9 +139,6 @@ threshold = 6
 # minerd JSON-RPC endpoint
 #minerd_endpoint = "tcp://127.0.0.1:28467"
 
-# Optional HTTP JSON-RPC listen URL to serve handlers for p2pool merge mining requests
-#mm_rpc_listen = "http+tcp://127.0.0.1:8241"
-
 # PoW block production target, in seconds
 pow_target = 90
 
@@ -165,6 +169,22 @@ skip_fees = false
 # Garbage collection task transactions batch size
 txs_batch_size = 50
 
+## Testnet JSON-RPC settings
+[network_config."testnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8340"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
+## Testnet JSON-RPC settings for p2pool merge mining requests (optional)
+#[network_config."testnet".mm_rpc]
+# JSON-RPC listen URL (merge mining)
+#rpc_listen = "http+tcp://127.0.0.1:8341"
+
+# Disabled RPC methods (merge mining)
+#rpc_disabled_methods = []
+
 ## Testnet P2P network settings
 [network_config."testnet".net]
 # P2P accept addresses the instance listens on for inbound connections
@@ -228,9 +248,6 @@ localnet = false
 
 # Mainnet blockchain network configuration
 [network_config."mainnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8440"
-
 # Path to the blockchain database directory
 database = "~/.local/share/darkfi/darkfid/mainnet"
 
@@ -240,9 +257,6 @@ threshold = 11
 # minerd JSON-RPC endpoint
 #minerd_endpoint = "tcp://127.0.0.1:28467"
 
-# Optional HTTP JSON-RPC listen URL to serve handlers for p2pool merge mining requests
-#mm_rpc_listen = "http+tcp://127.0.0.1:8241"
-
 # PoW block production target, in seconds
 pow_target = 90
 
@@ -273,6 +287,22 @@ skip_fees = false
 # Garbage collection task transactions batch size
 txs_batch_size = 50
 
+## Mainnet JSON-RPC settings
+[network_config."mainnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8440"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
+## Mainnet JSON-RPC settings for p2pool merge mining requests (optional)
+#[network_config."mainnet".mm_rpc]
+# JSON-RPC listen URL (merge mining)
+#rpc_listen = "http+tcp://127.0.0.1:8441"
+
+# Disabled RPC methods (merge mining)
+#rpc_disabled_methods = []
+
 ## Mainnet P2P network settings
 [network_config."mainnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 6 - 5
bin/darkfid/src/lib.rs

@@ -30,6 +30,7 @@ use darkfi::{
     rpc::{
         jsonrpc::JsonSubscriber,
         server::{listen_and_serve, RequestHandler},
+        settings::RpcSettings,
     },
     system::{ExecutorPtr, StoppableTask, StoppableTaskPtr},
     validator::{Validator, ValidatorConfig, ValidatorPtr},
@@ -186,8 +187,8 @@ impl Darkfid {
     pub async fn start(
         &self,
         executor: &ExecutorPtr,
-        rpc_listen: &Url,
-        mm_rpc_listen: &Option<Url>,
+        rpc_settings: &RpcSettings,
+        mm_rpc_settings: &Option<RpcSettings>,
         config: &ConsensusInitTaskConfig,
     ) -> Result<()> {
         info!(target: "darkfid::Darkfid::start", "Starting Darkfi daemon...");
@@ -227,7 +228,7 @@ impl Darkfid {
         info!(target: "darkfid::Darkfid::start", "Starting JSON-RPC server");
         let node_ = self.node.clone();
         self.rpc_task.clone().start(
-            listen_and_serve::<DefaultRpcHandler>(rpc_listen.clone(), self.node.clone(), None, executor.clone()),
+            listen_and_serve::<DefaultRpcHandler>(rpc_settings.clone(), self.node.clone(), None, executor.clone()),
             |res| async move {
                 match res {
                     Ok(()) | Err(Error::RpcServerStopped) => <DarkfiNode as RequestHandler<DefaultRpcHandler>>::stop_connections(&node_).await,
@@ -239,11 +240,11 @@ impl Darkfid {
         );
 
         // Start the HTTP JSON-RPC task
-        if let Some(url) = mm_rpc_listen {
+        if let Some(mm_rpc) = mm_rpc_settings {
             info!(target: "darkfid::Darkfid::start", "Starting HTTP JSON-RPC server");
             let node_ = self.node.clone();
             self.mm_rpc_task.clone().start(
-                listen_and_serve::<MmRpcHandler>(url.clone(), self.node.clone(), None, executor.clone()),
+                listen_and_serve::<MmRpcHandler>(mm_rpc.clone(), self.node.clone(), None, executor.clone()),
                 |res| async move {
                     match res {
                         Ok(()) | Err(Error::RpcServerStopped) => <DarkfiNode as RequestHandler<MmRpcHandler>>::stop_connections(&node_).await,

+ 9 - 8
bin/darkfid/src/main.rs

@@ -28,6 +28,7 @@ use darkfi::{
     blockchain::BlockInfo,
     cli_desc,
     net::settings::SettingsOpt,
+    rpc::settings::RpcSettingsOpt,
     util::{
         encoding::base64,
         path::{expand_path, get_config_path},
@@ -78,10 +79,6 @@ struct Args {
 #[derive(Clone, Debug, serde::Deserialize, structopt::StructOpt, structopt_toml::StructOptToml)]
 #[structopt()]
 pub struct BlockchainNetwork {
-    #[structopt(short, long, default_value = "tcp://127.0.0.1:8240")]
-    /// JSON-RPC listen URL
-    rpc_listen: Url,
-
     #[structopt(long, default_value = "~/.local/share/darkfi/darkfid/localnet")]
     /// Path to blockchain database
     database: String,
@@ -94,9 +91,9 @@ pub struct BlockchainNetwork {
     /// minerd JSON-RPC endpoint
     minerd_endpoint: Option<Url>,
 
-    #[structopt(long)]
-    /// Optional HTTP JSON-RPC listen URL to serve handlers for p2pool merge mining requests
-    mm_rpc_listen: Option<Url>,
+    #[structopt(skip)]
+    /// Optional JSON-RPC settings for p2pool merge mining requests
+    mm_rpc: Option<RpcSettingsOpt>,
 
     #[structopt(long, default_value = "10")]
     /// PoW block production target, in seconds
@@ -145,6 +142,10 @@ pub struct BlockchainNetwork {
     /// P2P network settings
     #[structopt(flatten)]
     net: SettingsOpt,
+
+    /// JSON-RPC settings
+    #[structopt(flatten)]
+    rpc: RpcSettingsOpt,
 }
 
 async_daemonize!(realmain);
@@ -230,7 +231,7 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'static>>) -> Result<()> {
         bootstrap,
     };
     daemon
-        .start(&ex, &blockchain_config.rpc_listen, &blockchain_config.mm_rpc_listen, &config)
+        .start(&ex, &blockchain_config.rpc.into(), &blockchain_config.mm_rpc.map(|mm_rpc_opts| mm_rpc_opts.into()), &config)
         .await?;
 
     // Signal handling for graceful termination.

+ 0 - 1
bin/darkfid/src/rpc.rs

@@ -82,7 +82,6 @@ impl RequestHandler<DefaultRpcHandler> for DarkfiNode {
             "ping_miner" => self.ping_miner(req.id, req.params).await,
             "dnet.switch" => self.dnet_switch(req.id, req.params).await,
             "dnet.subscribe_events" => self.dnet_subscribe_events(req.id, req.params).await,
-            // TODO: Make this optional
             "p2p.get_info" => self.p2p_get_info(req.id, req.params).await,
 
             // ==================

+ 9 - 4
bin/darkfid/src/tests/mod.rs

@@ -18,7 +18,9 @@
 
 use std::sync::Arc;
 
-use darkfi::{net::Settings, validator::utils::best_fork_index, Result};
+use darkfi::{
+    net::Settings, rpc::settings::RpcSettings, validator::utils::best_fork_index, Result,
+};
 use darkfi_contract_test_harness::init_logger;
 use darkfi_sdk::num_traits::One;
 use num_bigint::BigUint;
@@ -249,7 +251,10 @@ fn darkfid_programmatic_control() -> Result<()> {
     let sled_db = sled_overlay::sled::Config::new().temporary(true).open()?;
     let (_, vks) = darkfi_contract_test_harness::vks::get_cached_pks_and_vks()?;
     darkfi_contract_test_harness::vks::inject(&sled_db, &vks)?;
-    let rpc_listen = Url::parse("tcp://127.0.0.1:8240")?;
+    let rpc_settings = RpcSettings {
+        listen: Url::parse("tcp://127.0.0.1:8240")?,
+        ..RpcSettings::default()
+    };
 
     // Create an executor and communication signals
     let ex = Arc::new(smol::Executor::new());
@@ -271,13 +276,13 @@ fn darkfid_programmatic_control() -> Result<()> {
                 .unwrap();
 
                 // Start it
-                daemon.start(&ex, &rpc_listen, &None, &consensus_config).await.unwrap();
+                daemon.start(&ex, &rpc_settings, &None, &consensus_config).await.unwrap();
 
                 // Stop it
                 daemon.stop().await.unwrap();
 
                 // Start it again
-                daemon.start(&ex, &rpc_listen, &None, &consensus_config).await.unwrap();
+                daemon.start(&ex, &rpc_settings, &None, &consensus_config).await.unwrap();
 
                 // Stop it
                 daemon.stop().await.unwrap();

+ 8 - 3
bin/darkirc/config/inbound.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "127.0.0.1:1234"
-
 ## IRC listen URL
 irc_listen = "127.0.0.1:11067"
 
 ## Sets Datastore Path
 datastore = "~/.config/darkfi/darkirc-inbound"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:1234"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Raft net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/darkirc/config/outbound.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "127.0.0.1:7777"
-
 ## IRC listen URL
 irc_listen = "127.0.0.1:11066"
 
 ## Sets Datastore Path
 datastore = "~/.config/darkfi/darkirc-outbound"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:7777"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Raft net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/darkirc/config/seed.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "127.0.0.1:8000"
-
 ## IRC listen URL
 irc_listen = "127.0.0.1:11065"
 
 ## Sets Datastore Path
 datastore = "~/.config/darkfi/darkirc-seed"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8000"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Raft net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/darkirc/darkirc_config.toml

@@ -1,9 +1,6 @@
 ## This is the darkirc configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-#rpc_listen = "tcp://127.0.0.1:26660"
-
 ## IRC listen URL
 #irc_listen = "tcp://127.0.0.1:6667"
 
@@ -45,6 +42,14 @@ autojoin = [
 # Set log level. 1 is info (default), 2 is debug, 3 is trace
 #verbose = 2
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:26660"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to the P2P datastore

+ 7 - 5
bin/darkirc/src/main.rs

@@ -25,6 +25,7 @@ use darkfi::{
     rpc::{
         jsonrpc::JsonSubscriber,
         server::{listen_and_serve, RequestHandler},
+        settings::{RpcSettingsOpt, RpcSettings},
     },
     system::{sleep, StoppableTask, StoppableTaskPtr, Subscription},
     util::path::{expand_path, get_config_path},
@@ -79,10 +80,6 @@ struct Args {
     /// Set log file output
     log: Option<String>,
 
-    #[structopt(long, default_value = "tcp://127.0.0.1:26660")]
-    /// RPC server listen address
-    rpc_listen: Url,
-
     #[structopt(long, default_value = "tcp://127.0.0.1:6667")]
     /// IRC server listen address
     irc_listen: Url,
@@ -140,6 +137,10 @@ struct Args {
     /// P2P network settings
     #[structopt(flatten)]
     net: SettingsOpt,
+
+    /// JSON-RPC settings
+    #[structopt(flatten)]
+    rpc: RpcSettingsOpt,
 }
 
 pub struct DarkIrc {
@@ -362,6 +363,7 @@ async fn realmain(args: Args, ex: Arc<Executor<'static>>) -> Result<()> {
     );
 
     info!("Starting JSON-RPC server");
+    let rpc_settings: RpcSettings = args.rpc.into();
     let darkirc = Arc::new(DarkIrc::new(
         p2p.clone(),
         sled_db.clone(),
@@ -373,7 +375,7 @@ async fn realmain(args: Args, ex: Arc<Executor<'static>>) -> Result<()> {
     let darkirc_ = Arc::clone(&darkirc);
     let rpc_task = StoppableTask::new();
     rpc_task.clone().start(
-        listen_and_serve(args.rpc_listen, darkirc.clone(), None, ex.clone()),
+        listen_and_serve(rpc_settings, darkirc.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => darkirc_.stop_connections().await,

+ 0 - 1
bin/darkirc/src/rpc.rs

@@ -43,7 +43,6 @@ impl RequestHandler<()> for DarkIrc {
             "ping" => self.pong(req.id, req.params).await,
             "dnet.switch" => self.dnet_switch(req.id, req.params).await,
             "dnet.subscribe_events" => self.dnet_subscribe_events(req.id, req.params).await,
-            // TODO: Make this optional
             "p2p.get_info" => self.p2p_get_info(req.id, req.params).await,
 
             "deg.switch" => self.deg_switch(req.id, req.params).await,

+ 8 - 3
bin/explorer/explorerd/explorerd_config.toml

@@ -6,9 +6,6 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:14567"
-
 # Path to daemon database
 db_path = "~/.local/share/darkfi/explorerd/daemon.db"
 
@@ -17,3 +14,11 @@ db_pass = "changeme"
 
 # darkfid JSON-RPC endpoint
 endpoint = "tcp://127.0.0.1:8340"
+
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:14567"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 5 - 4
bin/explorer/explorerd/src/main.rs

@@ -37,6 +37,7 @@ use darkfi::{
     rpc::{
         client::RpcClient,
         server::{listen_and_serve, RequestHandler},
+        settings::RpcSettingsOpt
     },
     system::{StoppableTask, StoppableTaskPtr},
     util::path::expand_path,
@@ -113,9 +114,9 @@ struct Args {
     /// Configuration file to use
     config: Option<String>,
 
-    #[structopt(short, long, default_value = "tcp://127.0.0.1:14567")]
-    /// JSON-RPC listen URL
-    rpc_listen: Url,
+    /// JSON-RPC settings
+    #[structopt(flatten)]
+    rpc: RpcSettingsOpt,
 
     #[structopt(long, default_value = "~/.local/share/darkfi/explorerd/daemon.db")]
     /// Path to daemon database
@@ -332,7 +333,7 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'static>>) -> Result<()> {
     let rpc_task = StoppableTask::new();
     let explorer_ = explorer.clone();
     rpc_task.clone().start(
-        listen_and_serve(args.rpc_listen, explorer.clone(), None, ex.clone()),
+        listen_and_serve(args.rpc.into(), explorer.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => explorer_.stop_connections().await,

+ 8 - 3
bin/fud/fud/fud_config.toml

@@ -9,9 +9,6 @@
 # Path to the contents directory
 #folder = "~/.config/darkfi/fud"
 
-# JSON-RPC listen URL
-#rpc_listen = "tcp://127.0.0.1:13336"
-
 # P2P accept addresses
 #p2p_accept = ["tls://127.0.0.1:13337"]
 
@@ -35,3 +32,11 @@ seeds = ["tls://lilith0.dark.fi:13337", "tls://lilith1.dark.fi:13337"]
 
 # Enable channel log
 #channel_log = false
+
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:13336"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 8 - 6
bin/fud/fud/src/main.rs

@@ -44,6 +44,7 @@ use darkfi::{
     rpc::{
         jsonrpc::{ErrorCode, JsonError, JsonRequest, JsonResponse, JsonResult},
         server::{listen_and_serve, RequestHandler},
+        settings::{RpcSettings, RpcSettingsOpt},
     },
     system::{StoppableTask, StoppableTaskPtr},
     util::path::expand_path,
@@ -68,10 +69,6 @@ struct Args {
     /// Increase verbosity (-vvv supported)
     verbose: u8,
 
-    #[structopt(long, default_value = "tcp://127.0.0.1:13336")]
-    /// JSON-RPC listen URL
-    rpc_listen: Url,
-
     #[structopt(short, long)]
     /// Configuration file to use
     config: Option<String>,
@@ -87,6 +84,10 @@ struct Args {
     #[structopt(flatten)]
     /// Network settings
     net: SettingsOpt,
+
+    #[structopt(flatten)]
+    /// JSON-RPC settings
+    rpc: RpcSettingsOpt,
 }
 
 pub struct Fud {
@@ -585,11 +586,12 @@ async fn realmain(args: Args, ex: Arc<Executor<'static>>) -> Result<()> {
         ex.clone(),
     );
 
-    info!(target: "fud", "Starting JSON-RPC server on {}", args.rpc_listen);
+    let rpc_settings: RpcSettings = args.rpc.into();
+    info!(target: "fud", "Starting JSON-RPC server on {}", rpc_settings.listen);
     let rpc_task = StoppableTask::new();
     let fud_ = fud.clone();
     rpc_task.clone().start(
-        listen_and_serve(args.rpc_listen, fud.clone(), None, ex.clone()),
+        listen_and_serve(rpc_settings, fud.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => fud_.stop_connections().await,

+ 8 - 3
bin/genev/genevd/genev_config.toml

@@ -1,6 +1,3 @@
-## JSON-RPC listen URL
-#rpc_listen="tcp://127.0.0.1:28880"
-
 ## Current display name
 #nickname="NICKNAME"
 
@@ -14,6 +11,14 @@
 ## (for eventgraph debugging tool)
 #replay_mode = false
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28880"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## net settings
 [net]
 ## P2P accept addresses

+ 4 - 5
bin/genev/genevd/src/main.rs

@@ -25,6 +25,7 @@ use darkfi::{
     rpc::{
         jsonrpc::JsonSubscriber,
         server::{listen_and_serve, RequestHandler},
+        settings::RpcSettingsOpt,
     },
     system::{sleep, StoppableTask},
     util::path::expand_path,
@@ -34,7 +35,6 @@ use log::{debug, error, info};
 use sled_overlay::sled;
 use smol::{fs, lock::RwLock, stream::StreamExt};
 use structopt_toml::{serde::Deserialize, structopt::StructOpt, StructOptToml};
-use url::Url;
 
 mod rpc;
 use rpc::JsonRpcInterface;
@@ -50,9 +50,8 @@ struct Args {
     /// Configuration file to use
     config: Option<String>,
 
-    /// JSON-RPC listen URL
-    #[structopt(long = "rpc", default_value = "tcp://127.0.0.1:28880")]
-    pub rpc_listen: Url,
+    #[structopt(flatten)]
+    pub rpc: RpcSettingsOpt,
 
     #[structopt(flatten)]
     pub net: SettingsOpt,
@@ -252,7 +251,7 @@ async fn realmain(settings: Args, executor: Arc<smol::Executor<'static>>) -> Res
     let rpc_task = StoppableTask::new();
     let rpc_interface_ = rpc_interface.clone();
     rpc_task.clone().start(
-        listen_and_serve(settings.rpc_listen, rpc_interface, None, executor.clone()),
+        listen_and_serve(settings.rpc.into(), rpc_interface, None, executor.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => rpc_interface_.stop_connections().await,

+ 8 - 3
bin/genev/script/genevd_a.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:28870"
-
 ## Sets Datastore Path
 datastore = "/tmp/genev_test/datastore/node1"
 
 ## Current display name
 #nickname="NICKNAME"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28870"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/genev/script/genevd_b.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:28871"
-
 ## Sets Datastore Path
 datastore = "/tmp/genev_test/datastore/node2"
 
 ## Current display name
 #nickname="NICKNAME"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28871"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/genev/script/genevd_c.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:28872"
-
 ## Sets Datastore Path
 datastore = "/tmp/genev_test/datastore/node3"
 
 ## Current display name
 #nickname="NICKNAME"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28872"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/genev/script/genevd_d.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:28873"
-
 ## Sets Datastore Path
 datastore = "/tmp/genev_test/datastore/node4"
 
 ## Current display name
 #nickname="NICKNAME"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28873"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## net settings
 [net]
 ## P2P accept addresses

+ 8 - 3
bin/genev/script/genevd_seed.toml

@@ -1,12 +1,17 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:28880"
-
 ## Sets Datastore Path
 datastore = "/tmp/genev_test/datastore/seed"
 
 ## Current display name
 #nickname="NICKNAME"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28880"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## net settings
 [net]
 ## P2P accept addresses

+ 6 - 1
bin/lilith/lilith_config.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+## JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
-#rpc_listen = "tcp://127.0.0.1:18927"
+rpc_listen = "tcp://127.0.0.1:18927"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []
 
 ## Per-network settings
 #[network."darkfid_sync_v4"]

+ 6 - 5
bin/lilith/src/main.rs

@@ -43,6 +43,7 @@ use darkfi::{
     rpc::{
         jsonrpc::*,
         server::{listen_and_serve, RequestHandler},
+        settings::{RpcSettings, RpcSettingsOpt},
     },
     system::{sleep, StoppableTask, StoppableTaskPtr},
     util::path::get_config_path,
@@ -56,9 +57,8 @@ const CONFIG_FILE_CONTENTS: &str = include_str!("../lilith_config.toml");
 #[serde(default)]
 #[structopt(name = "lilith", about = cli_desc!())]
 struct Args {
-    #[structopt(long, default_value = "tcp://127.0.0.1:18927")]
-    /// JSON-RPC listen URL
-    pub rpc_listen: Url,
+    #[structopt(flatten)]
+    pub rpc: RpcSettingsOpt,
 
     #[structopt(short, long)]
     /// Configuration file to use
@@ -423,11 +423,12 @@ async fn realmain(args: Args, ex: Arc<Executor<'static>>) -> Result<()> {
     }
 
     // JSON-RPC server
-    info!(target: "lilith", "Starting JSON-RPC server on {}", args.rpc_listen);
+    let rpc_settings: RpcSettings = args.rpc.into();
+    info!(target: "lilith", "Starting JSON-RPC server on {}", rpc_settings.listen);
     let lilith_ = lilith.clone();
     let rpc_task = StoppableTask::new();
     rpc_task.clone().start(
-        listen_and_serve(args.rpc_listen, lilith.clone(), None, ex.clone()),
+        listen_and_serve(rpc_settings, lilith.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => lilith_.stop_connections().await,

+ 8 - 3
bin/minerd/minerd.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
-# JSON-RPC listen URL
-#rpc_listen = "tcp://127.0.0.1:28467"
-
 # PoW miner number of threads to use
 #threads = 4
+
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:28467"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 18 - 9
bin/minerd/src/lib.rs

@@ -23,10 +23,12 @@ use smol::{
     channel::{Receiver, Sender},
     lock::Mutex,
 };
-use url::Url;
 
 use darkfi::{
-    rpc::server::{listen_and_serve, RequestHandler},
+    rpc::{
+        server::{listen_and_serve, RequestHandler},
+        settings::RpcSettings,
+    },
     system::{ExecutorPtr, StoppableTask, StoppableTaskPtr},
     Error, Result,
 };
@@ -92,13 +94,13 @@ impl Minerd {
     }
 
     /// Start the DarkFi mining daemon in the given executor, using the provided JSON-RPC listen url.
-    pub fn start(&self, executor: &ExecutorPtr, rpc_listen: &Url) {
+    pub fn start(&self, executor: &ExecutorPtr, rpc_settings: &RpcSettings) {
         info!(target: "minerd::Minerd::start", "Starting mining daemon...");
 
         // Start the JSON-RPC task
         let node_ = self.node.clone();
         self.rpc_task.clone().start(
-            listen_and_serve(rpc_listen.clone(), self.node.clone(), None, executor.clone()),
+            listen_and_serve(rpc_settings.clone(), self.node.clone(), None, executor.clone()),
             |res| async move {
                 match res {
                     Ok(()) | Err(Error::RpcServerStopped) => node_.stop_connections().await,
@@ -134,6 +136,10 @@ impl Minerd {
     }
 }
 
+
+#[cfg(test)]
+use url::Url;
+
 #[test]
 /// Test the programmatic control of `Minerd`.
 ///
@@ -160,7 +166,10 @@ fn minerd_programmatic_control() -> Result<()> {
 
     // Daemon configuration
     let threads = 4;
-    let rpc_listen = Url::parse("tcp://127.0.0.1:28467")?;
+    let rpc_settings = RpcSettings {
+        listen: Url::parse("tcp://127.0.0.1:28467")?,
+        ..RpcSettings::default()
+    };
 
     // Create an executor and communication signals
     let ex = Arc::new(smol::Executor::new());
@@ -186,14 +195,14 @@ fn minerd_programmatic_control() -> Result<()> {
                 let daemon = Minerd::init(threads);
 
                 // Start it
-                daemon.start(&ex, &rpc_listen);
+                daemon.start(&ex, &rpc_settings);
 
                 // Generate a JSON-RPC client to send mining jobs
                 let mut rpc_client =
-                    darkfi::rpc::client::RpcClient::new(rpc_listen.clone(), ex.clone()).await;
+                    darkfi::rpc::client::RpcClient::new(rpc_settings.listen.clone(), ex.clone()).await;
                 while rpc_client.is_err() {
                     rpc_client =
-                        darkfi::rpc::client::RpcClient::new(rpc_listen.clone(), ex.clone()).await;
+                        darkfi::rpc::client::RpcClient::new(rpc_settings.listen.clone(), ex.clone()).await;
                 }
                 let rpc_client = rpc_client.unwrap();
 
@@ -212,7 +221,7 @@ fn minerd_programmatic_control() -> Result<()> {
                 rpc_client.stop().await;
 
                 // Start it again
-                daemon.start(&ex, &rpc_listen);
+                daemon.start(&ex, &rpc_settings);
 
                 // Stop it
                 daemon.stop().await.unwrap();

+ 4 - 6
bin/minerd/src/main.rs

@@ -21,9 +21,8 @@ use std::sync::Arc;
 use log::info;
 use smol::{stream::StreamExt, Executor};
 use structopt_toml::{serde::Deserialize, structopt::StructOpt, StructOptToml};
-use url::Url;
 
-use darkfi::{async_daemonize, cli_desc, Result};
+use darkfi::{async_daemonize, cli_desc, rpc::settings::RpcSettingsOpt, Result};
 
 use minerd::Minerd;
 
@@ -38,9 +37,8 @@ struct Args {
     /// Configuration file to use
     config: Option<String>,
 
-    #[structopt(short, long, default_value = "tcp://127.0.0.1:28467")]
-    /// JSON-RPC listen URL
-    rpc_listen: Url,
+    #[structopt(flatten)]
+    pub rpc: RpcSettingsOpt,
 
     #[structopt(short, long, default_value = "4")]
     /// PoW miner number of threads to use
@@ -59,7 +57,7 @@ async_daemonize!(realmain);
 async fn realmain(args: Args, ex: Arc<Executor<'static>>) -> Result<()> {
     info!(target: "minerd", "Starting DarkFi Mining Daemon...");
     let daemon = Minerd::init(args.threads);
-    daemon.start(&ex, &args.rpc_listen);
+    daemon.start(&ex, &args.rpc.into());
 
     // Signal handling for graceful termination.
     let (signals_handler, signals_task) = SignalHandler::new(ex)?;

+ 0 - 1
bin/tau/taud/src/jsonrpc.rs

@@ -91,7 +91,6 @@ impl RequestHandler<()> for JsonRpcInterface {
             "deg.subscribe_events" => return self.deg_subscribe_events(req.id, req.params).await,
             "eventgraph.get_info" => return self.eg_get_info(req.id, req.params).await,
 
-            // TODO: make this optional
             "p2p.get_info" => return self.p2p_get_info(req.id, req.params).await,
             _ => return JsonError::new(ErrorCode::MethodNotFound, None, req.id).into(),
         };

+ 1 - 1
bin/tau/taud/src/main.rs

@@ -689,7 +689,7 @@ async fn realmain(settings: Args, executor: Arc<smol::Executor<'static>>) -> Res
     ));
     let rpc_task = StoppableTask::new();
     rpc_task.clone().start(
-        listen_and_serve(settings.rpc_listen, rpc_interface.clone(), None, executor.clone()),
+        listen_and_serve(settings.rpc.into(), rpc_interface.clone(), None, executor.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => rpc_interface.stop_connections().await,

+ 7 - 6
bin/tau/taud/src/settings.rs

@@ -18,9 +18,11 @@
 
 use structopt::StructOpt;
 use structopt_toml::{serde::Deserialize, StructOptToml};
-use url::Url;
 
-use darkfi::net::settings::SettingsOpt;
+use darkfi::{
+    net::settings::SettingsOpt,
+    rpc::settings::RpcSettingsOpt,
+};
 
 pub const CONFIG_FILE: &str = "taud_config.toml";
 pub const CONFIG_FILE_CONTENTS: &str = include_str!("../taud_config.toml");
@@ -34,10 +36,6 @@ pub struct Args {
     #[structopt(long)]
     pub config: Option<String>,
 
-    /// JSON-RPC listen URL
-    #[structopt(long = "rpc", default_value = "tcp://127.0.0.1:23330")]
-    pub rpc_listen: Url,
-
     /// Sets Datastore Path
     #[structopt(long, default_value = "~/.local/share/darkfi/taud_db")]
     pub datastore: String,
@@ -50,6 +48,9 @@ pub struct Args {
     #[structopt(long)]
     pub replay_mode: bool,
 
+    #[structopt(flatten)]
+    pub rpc: RpcSettingsOpt,
+
     #[structopt(flatten)]
     pub net: SettingsOpt,
 

+ 8 - 3
bin/tau/taud/taud_config.toml

@@ -1,9 +1,6 @@
 ## This is the tau daemon configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-#rpc_listen="tcp://127.0.0.1:23330"
-
 ## Datastore Path
 #datastore = "~/.local/share/darkfi/taud_db"
 
@@ -46,6 +43,14 @@ read_key = "F63KzWGXgUdEfHcjQ2o4C54qbD4vDik7zjY5pSHQMxv2"
 write_public_key = "7iHFdGxe1DYyBtPLVFb7fXL3Kk495WtwRWaNxhYQTU9x"
 # write_key = ""
 
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:23330"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to the P2P datastore

+ 8 - 3
contrib/localnet/darkfid-five-nodes/darkfid0.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48240"
-
 # Path to the blockchain database directory
 database = "darkfid0"
 
@@ -55,6 +52,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48240"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 8 - 3
contrib/localnet/darkfid-five-nodes/darkfid1.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48340"
-
 # Path to the blockchain database directory
 database = "darkfid1"
 
@@ -52,6 +49,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48340"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 8 - 3
contrib/localnet/darkfid-five-nodes/darkfid2.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48440"
-
 # Path to the blockchain database directory
 database = "darkfid2"
 
@@ -52,6 +49,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48440"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 8 - 3
contrib/localnet/darkfid-five-nodes/darkfid3.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48540"
-
 # Path to the blockchain database directory
 database = "darkfid3"
 
@@ -52,6 +49,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48540"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 8 - 3
contrib/localnet/darkfid-five-nodes/darkfid4.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48640"
-
 # Path to the blockchain database directory
 database = "darkfid4"
 
@@ -52,6 +49,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48640"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 7 - 2
contrib/localnet/darkfid-five-nodes/minerd0.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 1
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48467"
 
-# PoW miner number of threads to use
-threads = 1
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 7 - 2
contrib/localnet/darkfid-five-nodes/minerd1.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 1
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48567"
 
-# PoW miner number of threads to use
-threads = 1
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 7 - 2
contrib/localnet/darkfid-five-nodes/minerd2.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 1
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48667"
 
-# PoW miner number of threads to use
-threads = 1
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 7 - 2
contrib/localnet/darkfid-five-nodes/minerd3.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 1
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48767"
 
-# PoW miner number of threads to use
-threads = 1
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 7 - 2
contrib/localnet/darkfid-five-nodes/minerd4.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 1
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48867"
 
-# PoW miner number of threads to use
-threads = 1
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 16 - 6
contrib/localnet/darkfid-single-node/darkfid.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48240"
-
 # Path to the blockchain database directory
 database = "darkfid"
 
@@ -23,9 +20,6 @@ threshold = 1
 # minerd JSON-RPC endpoint
 minerd_endpoint = "tcp://127.0.0.1:48467"
 
-# Optional HTTP JSON-RPC listen URL to serve handlers for p2pool merge mining requests
-#mm_rpc_listen = "http+tcp://127.0.0.1:8241"
-
 # PoW block production target, in seconds
 pow_target = 10
 
@@ -58,6 +52,22 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1718807405
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48240"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
+## Localnet JSON-RPC settings for p2pool merge mining requests (optional)
+#[network_config."localnet".mm_rpc]
+# JSON-RPC listen URL (merge mining)
+#rpc_listen = "http+tcp://127.0.0.1:8241"
+
+# Disabled RPC methods (merge mining)
+#rpc_disabled_methods = []
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 7 - 2
contrib/localnet/darkfid-single-node/minerd.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+#threads = 4
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48467"
 
-# PoW miner number of threads to use
-#threads = 4
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 8 - 3
contrib/localnet/darkfid-small/darkfid0.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48240"
-
 # Path to the blockchain database directory
 database = "darkfid0"
 
@@ -52,6 +49,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48240"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 8 - 3
contrib/localnet/darkfid-small/darkfid1.toml

@@ -19,9 +19,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48340"
-
 # Path to the blockchain database directory
 database = "darkfid1"
 
@@ -60,6 +57,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+## Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48340"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 8 - 3
contrib/localnet/darkfid-small/darkfid2.toml

@@ -11,9 +11,6 @@ network = "localnet"
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
-# JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:48440"
-
 # Path to the blockchain database directory
 database = "darkfid2"
 
@@ -41,6 +38,14 @@ skip_fees = false
 # Optional bootstrap timestamp
 #bootstrap = 1712581283
 
+# Localnet JSON-RPC settings
+[network_config."localnet".rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:48440"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## Localnet P2P network settings
 [network_config."localnet".net]
 # P2P accept addresses the instance listens on for inbound connections

+ 7 - 2
contrib/localnet/darkfid-small/minerd0.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 2
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48467"
 
-# PoW miner number of threads to use
-threads = 2
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 7 - 2
contrib/localnet/darkfid-small/minerd1.toml

@@ -6,8 +6,13 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
+# PoW miner number of threads to use
+threads = 2
+
+# JSON-RPC settings
+[rpc]
 # JSON-RPC listen URL
 rpc_listen = "tcp://127.0.0.1:48567"
 
-# PoW miner number of threads to use
-threads = 2
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 8 - 3
contrib/localnet/darkirc-four-nodes/darkirc_full_node1.toml

@@ -1,6 +1,3 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8890"
-
 ## IRC listen URL
 irc_listen = "tcp://127.0.0.1:22022"
 
@@ -15,6 +12,14 @@ autojoin = ["#dev", "#test"]
 # Set log level. 1 is info (default), 2 is debug, 3 is trace
 #verbose = 2
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8890"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## P2P net settings
 [net]
 ## Connection slots

+ 8 - 3
contrib/localnet/darkirc-four-nodes/darkirc_full_node2.toml

@@ -1,6 +1,3 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8891"
-
 ## IRC listen URL
 irc_listen = "tcp://127.0.0.1:22023"
 
@@ -15,6 +12,14 @@ autojoin = ["#dev", "#test"]
 # Set log level. 1 is info (default), 2 is debug, 3 is trace
 #verbose = 2
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8891"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## P2P net settings
 [net]
 ## Connection slots

+ 8 - 3
contrib/localnet/darkirc-four-nodes/darkirc_full_node3.toml

@@ -1,6 +1,3 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8892"
-
 ## IRC listen URL
 irc_listen = "tcp://127.0.0.1:22024"
 
@@ -15,6 +12,14 @@ autojoin = ["#dev", "#test"]
 # Set log level. 1 is info (default), 2 is debug, 3 is trace
 #verbose = 2
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8892"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## P2P net settings
 [net]
 ## Connection slots

+ 8 - 3
contrib/localnet/darkirc-four-nodes/darkirc_full_node4.toml

@@ -1,6 +1,3 @@
-## JSON-RPC listen URL
-rpc_listen = "tcp://127.0.0.1:8893"
-
 ## IRC listen URL
 irc_listen = "tcp://127.0.0.1:22025"
 
@@ -15,6 +12,14 @@ autojoin = ["#dev", "#test"]
 # Set log level. 1 is info (default), 2 is debug, 3 is trace
 #verbose = 2
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8893"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## P2P net settings
 [net]
 ## Connection slots

+ 8 - 3
contrib/localnet/darkirc-four-nodes/seed.toml

@@ -1,6 +1,3 @@
-## JSON-RPC listen URL
-rpc_listen="tcp://127.0.0.1:8888"
-
 ## IRC listen URL
 irc_listen="tcp://127.0.0.1:22020"
 
@@ -21,6 +18,14 @@ autojoin = ["#dev"]
 # Set log level. 1 is info (default), 2 is debug, 3 is trace
 #verbose = 2
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:8888"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 ## P2P net settings
 [net]
 ## Outbound connection slots

+ 7 - 2
contrib/localnet/dchatd-four-nodes/dchat1.toml

@@ -1,7 +1,12 @@
 # dchat toml
 
-## RPC listen address. 
-rpc_listen="tcp://127.0.0.1:51345"
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:51345"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 7 - 2
contrib/localnet/dchatd-four-nodes/dchat2.toml

@@ -1,7 +1,12 @@
 # dchat toml
 
-## RPC listen address. 
-rpc_listen="tcp://127.0.0.1:52345"
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:52345"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 7 - 2
contrib/localnet/dchatd-four-nodes/dchat3.toml

@@ -1,7 +1,12 @@
 # dchat toml
 
-## RPC listen address. 
-rpc_listen="tcp://127.0.0.1:53345"
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:53345"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 7 - 2
contrib/localnet/dchatd-four-nodes/dchat4.toml

@@ -1,7 +1,12 @@
 # dchat toml
 
-## RPC listen address. 
-rpc_listen="tcp://127.0.0.1:54325"
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:54325"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 7 - 1
contrib/localnet/dchatd-four-nodes/seed.toml

@@ -1,6 +1,12 @@
 # dchat toml
 
-rpc_listen="tcp://127.0.0.1:54448"
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:54448"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 8 - 3
contrib/localnet/fud/fud_config0.toml

@@ -9,9 +9,6 @@
 # Path to the contents directory
 folder = "fud0"
 
-# JSON-RPC listen URL
-rpc_listen = "tls://127.0.0.1:13338"
-
 # P2P accept address
 p2p_accept = ["tls://127.0.0.1:13339"]
 
@@ -35,3 +32,11 @@ localnet = true
 
 # Enable channel log
 channel_log = true
+
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tls://127.0.0.1:13338"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 8 - 3
contrib/localnet/fud/fud_config1.toml

@@ -9,9 +9,6 @@
 # Path to the contents directory
 folder = "fud1"
 
-# JSON-RPC listen URL
-rpc_listen = "tls://127.0.0.1:13340"
-
 # P2P accept address
 p2p_accept = ["tls://127.0.0.1:13341"]
 
@@ -35,3 +32,11 @@ localnet = true
 
 # Enable channel log
 channel_log = true
+
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tls://127.0.0.1:13340"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 8 - 3
contrib/localnet/fud/lilith_config.toml

@@ -6,15 +6,20 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
-# JSON-RPC listen URL
-#rpc_listen = "tcp://127.0.0.1:18927"
-
 # Daemon published url, common for all enabled networks
 url = ["tls://127.0.0.1"]
 
 # Hosts .tsv file to use
 hosts_file="lilith_hosts.tsv"
 
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:18927"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []
+
 ## Per-network settings
 #[network."darkfid_sync"]
 #port = 33032

+ 8 - 3
contrib/localnet/taud-four-nodes/seed.toml

@@ -1,9 +1,6 @@
 ## This is the tau daemon configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-rpc_listen="tcp://127.0.0.1:23340"
-
 ## Datastore Path
 datastore = "seed"
 
@@ -46,6 +43,14 @@ read_key = "AXApLyi8id3T1MwKkrgdYZtkpUag5qMmambDHGkdFiY2"
 # write_key = "7jvrj4Rxnm1UcAjz5Y1CNFEfZiGMg9F1ekfbbEakkicA"
 write_public_key = "2LW4qXxR5QSybtMeRtX69GdqNWxgAbDVyMT6aWe37MT7"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:23340"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to a configured hostlist for saving known peers

+ 8 - 3
contrib/localnet/taud-four-nodes/taud_full_node1.toml

@@ -1,9 +1,6 @@
 ## This is the tau daemon configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-rpc_listen="tcp://127.0.0.1:23341"
-
 ## Datastore Path
 datastore = "taud1"
 
@@ -46,6 +43,14 @@ read_key = "AXApLyi8id3T1MwKkrgdYZtkpUag5qMmambDHGkdFiY2"
 write_key = "7jvrj4Rxnm1UcAjz5Y1CNFEfZiGMg9F1ekfbbEakkicA"
 write_public_key = "2LW4qXxR5QSybtMeRtX69GdqNWxgAbDVyMT6aWe37MT7"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:23341"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to a configured hostlist for saving known peers

+ 8 - 3
contrib/localnet/taud-four-nodes/taud_full_node2.toml

@@ -1,9 +1,6 @@
 ## This is the tau daemon configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-rpc_listen="tcp://127.0.0.1:23342"
-
 ## Datastore Path
 datastore = "taud2"
 
@@ -46,6 +43,14 @@ read_key = "AXApLyi8id3T1MwKkrgdYZtkpUag5qMmambDHGkdFiY2"
 write_key = "7jvrj4Rxnm1UcAjz5Y1CNFEfZiGMg9F1ekfbbEakkicA"
 write_public_key = "2LW4qXxR5QSybtMeRtX69GdqNWxgAbDVyMT6aWe37MT7"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:23342"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to a configured hostlist for saving known peers

+ 8 - 3
contrib/localnet/taud-four-nodes/taud_full_node3.toml

@@ -1,9 +1,6 @@
 ## This is the tau daemon configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-rpc_listen="tcp://127.0.0.1:23343"
-
 ## Datastore Path
 datastore = "taud3"
 
@@ -46,6 +43,14 @@ read_key = "AXApLyi8id3T1MwKkrgdYZtkpUag5qMmambDHGkdFiY2"
 write_key = "7jvrj4Rxnm1UcAjz5Y1CNFEfZiGMg9F1ekfbbEakkicA"
 write_public_key = "2LW4qXxR5QSybtMeRtX69GdqNWxgAbDVyMT6aWe37MT7"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:23343"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to a configured hostlist for saving known peers

+ 8 - 3
contrib/localnet/taud-four-nodes/taud_full_node4.toml

@@ -1,9 +1,6 @@
 ## This is the tau daemon configuration file.
 ## Review it carefully.
 
-## JSON-RPC listen URL
-rpc_listen="tcp://127.0.0.1:23344"
-
 ## Datastore Path
 datastore = "taud4"
 
@@ -46,6 +43,14 @@ read_key = "AXApLyi8id3T1MwKkrgdYZtkpUag5qMmambDHGkdFiY2"
 # write_key = "7jvrj4Rxnm1UcAjz5Y1CNFEfZiGMg9F1ekfbbEakkicA"
 write_public_key = "2LW4qXxR5QSybtMeRtX69GdqNWxgAbDVyMT6aWe37MT7"
 
+## JSON-RPC settings
+[rpc]
+## JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:23344"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
+
 # P2P network settings
 [net]
 # Path to a configured hostlist for saving known peers

+ 7 - 2
doc/src/learn/dchat/creating-dchatd/accept-addr.md

@@ -3,7 +3,8 @@
 To start receiving `JSON-RPC` requests, we'll need to configure a
 `JSON-RPC` accept address.
 
-We'll add a `rpc_listen` address to our `Args` struct. It will look
+We'll add a `rpc` struct ([RpcSettingsOpt](https://codeberg.org/darkrenaissance/darkfi/src/branch/master/src/rpc/settings.rs))
+containing a `rpc_listen` address to our `Args` struct. It will look
 like this:
 
 ```rust
@@ -17,8 +18,12 @@ config at `../dchatd_config.toml` as follows:
 ```toml
 # dchat toml
 
+[rpc]
 ## RPC listen address. 
-rpc_listen =["tcp://127.0.0.1:51054"]
+rpc_listen = "tcp://127.0.0.1:51054"
+
+## Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 5 - 4
doc/src/learn/dchat/creating-dchatd/stoppable-task.md

@@ -66,7 +66,8 @@ Next, we invoke `JSON-RPC` in the main function of `dchatd`, wielding
 `StoppableTask` to start a `JSON-RPC` server and wait for a stop signal as follows:
 
 ```rust
-    info!("Starting JSON-RPC server on port {}", args.rpc_listen);
+    let rpc_settings: RpcSettings = args.rpc.into();
+    info!("Starting JSON-RPC server on port {}", rpc_settings.listen);
     let msgs: DchatMsgsBuffer = Arc::new(Mutex::new(vec![DchatMsg { msg: String::new() }]));
     let rpc_connections = Mutex::new(HashSet::new());
     let dchat = Arc::new(Dchat::new(p2p.clone(), msgs.clone(), rpc_connections));
@@ -74,7 +75,7 @@ Next, we invoke `JSON-RPC` in the main function of `dchatd`, wielding
 
     let rpc_task = StoppableTask::new();
     rpc_task.clone().start(
-        listen_and_serve(args.rpc_listen, dchat.clone(), None, ex.clone()),
+        listen_and_serve(rpc_settings, dchat.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => dchat.stop_connections().await,
@@ -100,12 +101,12 @@ Notice that when we start the `StoppableTask` using
 `rpc.task.clone().start`, we also pass a method called `listen_and_serve`.
 `listen_and_serve` is a method defined in DarkFi's [rpc
 module](https://codeberg.org/darkrenaissance/darkfi/src/branch/master/src/rpc/server.rs).
-It starts a JSON-RPC server that is bound to the provided accept address
+It starts a JSON-RPC server that is bound to the provided rpc settings
 and uses our previously implemented `RequestHandler` to handle incoming
 requests.
 
 The async block uses the `move` keyword to takes ownership of
-the `accept_addr` and `RequestHandler` values and pass them into
+the `settings` and `RequestHandler` values and pass them into
 `listen_and_serve`.
 
 We have enabled JSON-RPC.

+ 7 - 2
example/dchat/dchatd/dchatd_config.toml

@@ -1,7 +1,12 @@
 # dchat toml
 
-## RPC listen address. 
-rpc_listen="tcp://127.0.0.1:51054"
+# JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:51054"
+
+# Disabled RPC methods
+rpc_disabled_methods = ["p2p.get_info"]
 
 [net]
 ## P2P accept addresses Required for inbound nodes.

+ 6 - 6
example/dchat/dchatd/src/main.rs

@@ -20,7 +20,6 @@
 use log::{debug, error, info};
 use smol::{lock::Mutex, stream::StreamExt};
 use std::{collections::HashSet, sync::Arc};
-use url::Url;
 
 use darkfi::{
     async_daemonize, cli_desc, net,
@@ -28,6 +27,7 @@ use darkfi::{
     rpc::{
         jsonrpc::JsonSubscriber,
         server::{listen_and_serve, RequestHandler},
+        settings::{RpcSettings, RpcSettingsOpt},
     },
     system::{StoppableTask, StoppableTaskPtr},
     Error, Result,
@@ -54,9 +54,8 @@ const CONFIG_FILE_CONTENTS: &str = include_str!("../dchatd_config.toml");
 #[serde(default)]
 #[structopt(name = "dchat", about = cli_desc!())]
 struct Args {
-    #[structopt(long, default_value = "tcp://127.0.0.1:51054")]
-    /// RPC server listen address
-    rpc_listen: Url,
+    #[structopt(flatten)]
+    pub rpc: RpcSettingsOpt,
 
     #[structopt(short, long)]
     /// Configuration file to use
@@ -128,7 +127,8 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'static>>) -> Result<()> {
     // ANCHOR_end: dnet
 
     // ANCHOR: rpc
-    info!("Starting JSON-RPC server on port {}", args.rpc_listen);
+    let rpc_settings: RpcSettings = args.rpc.into();
+    info!("Starting JSON-RPC server on port {}", rpc_settings.listen);
     let msgs: DchatMsgsBuffer = Arc::new(Mutex::new(vec![DchatMsg { msg: String::new() }]));
     let rpc_connections = Mutex::new(HashSet::new());
     let dchat = Arc::new(Dchat::new(p2p.clone(), msgs.clone(), rpc_connections, dnet_sub));
@@ -136,7 +136,7 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'static>>) -> Result<()> {
 
     let rpc_task = StoppableTask::new();
     rpc_task.clone().start(
-        listen_and_serve(args.rpc_listen, dchat.clone(), None, ex.clone()),
+        listen_and_serve(rpc_settings, dchat.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => dchat.stop_connections().await,

+ 6 - 5
script/evgrd/bin/evgrd.rs

@@ -31,6 +31,7 @@ use darkfi::{
     rpc::{
         jsonrpc::JsonSubscriber,
         server::{listen_and_serve, RequestHandler},
+        settings::RpcSettingsOpt,
     },
     system::{sleep, StoppableTask, StoppableTaskPtr},
     util::path::expand_path,
@@ -72,10 +73,6 @@ struct Args {
     /// RPC server listen address
     daemon_listen: Vec<Url>,
 
-    #[structopt(long, default_value = "tcp://127.0.0.1:26690")]
-    /// JSON-RPC server listen address
-    json_rpc_listen: Url,
-
     #[structopt(short, long, default_value = "~/.local/share/darkfi/evgrd_db")]
     /// Datastore (DB) path
     datastore: String,
@@ -103,6 +100,10 @@ struct Args {
     /// P2P network settings
     #[structopt(flatten)]
     net: NetSettingsOpt,
+
+    /// JSON-RPC settings
+    #[structopt(flatten)]
+    rpc: RpcSettingsOpt,
 }
 
 pub struct Daemon {
@@ -368,7 +369,7 @@ async fn realmain(args: Args, ex: Arc<Executor<'static>>) -> Result<()> {
     let daemon_ = daemon.clone();
     let rpc_task = StoppableTask::new();
     rpc_task.clone().start(
-        listen_and_serve(args.json_rpc_listen, daemon.clone(), None, ex.clone()),
+        listen_and_serve(args.rpc.into(), daemon.clone(), None, ex.clone()),
         |res| async move {
             match res {
                 Ok(()) | Err(Error::RpcServerStopped) => daemon_.stop_connections().await,

+ 0 - 1
script/evgrd/bin/rpc.rs

@@ -43,7 +43,6 @@ impl RequestHandler<()> for Daemon {
             "ping" => self.pong(req.id, req.params).await,
             "dnet.switch" => self.dnet_switch(req.id, req.params).await,
             "dnet.subscribe_events" => self.dnet_subscribe_events(req.id, req.params).await,
-            // TODO: Make this optional
             "p2p.get_info" => self.p2p_get_info(req.id, req.params).await,
 
             "deg.switch" => self.deg_switch(req.id, req.params).await,

+ 3 - 0
script/evgrd/evgrd.toml

@@ -2,3 +2,6 @@
 datastore = "~/.local/share/darkfi/evgrd"
 hostlist = "~/.local/share/darkfi/evgrd/p2p_hostlist.tsv"
 
+[rpc]
+rpc_listen = "tcp://127.0.0.1:26690"
+rpc_disabled_methods = ["p2p.get_info"]

+ 8 - 3
script/research/dhtd/dhtd_config.toml

@@ -6,9 +6,6 @@
 ## The default values are left commented. They can be overridden either by
 ## uncommenting, or by using the command-line.
 
-# JSON-RPC listen URL
-#rpc_listen = "tcp://127.0.0.1:9540"
-
 # P2P accept addresses
 #p2p_accept = ["tls://127.0.0.1:9541"]
 
@@ -23,3 +20,11 @@
 
 # Peers to connect to
 #peer = []
+
+## JSON-RPC settings
+[rpc]
+# JSON-RPC listen URL
+rpc_listen = "tcp://127.0.0.1:9540"
+
+# Disabled RPC methods
+#rpc_disabled_methods = []

+ 5 - 4
script/research/dhtd/src/main.rs

@@ -37,6 +37,7 @@ use darkfi::{
             JsonError, JsonRequest, JsonResponse, JsonResult,
         },
         server::{listen_and_serve, RequestHandler},
+        settings::RpcSettingsOpt
     },
     util::{
         cli::{get_log_config, get_log_level, spawn_config},
@@ -60,9 +61,9 @@ struct Args {
     /// Configuration file to use
     config: Option<String>,
 
-    #[structopt(long, default_value = "tcp://127.0.0.1:9540")]
-    /// JSON-RPC listen URL
-    rpc_listen: Url,
+    /// JSON-RPC settings
+    #[structopt(flatten)]
+    rpc: RpcSettingsOpt,
 
     #[structopt(long)]
     /// P2P accept addresses (repeatable flag)
@@ -300,7 +301,7 @@ async fn realmain(args: Args, ex: Arc<Executor<'_>>) -> Result<()> {
     // JSON-RPC server
     info!("Starting JSON-RPC server");
     let _ex = ex.clone();
-    ex.spawn(listen_and_serve(args.rpc_listen, dhtd.clone(), _ex)).detach();
+    ex.spawn(listen_and_serve(args.rpc.into(), dhtd.clone(), _ex)).detach();
 
     info!("Starting sync P2P network");
     p2p.clone().start(ex.clone()).await?;

+ 13 - 6
tests/jsonrpc.rs

@@ -33,6 +33,7 @@ use darkfi::{
         client::RpcClient,
         jsonrpc::*,
         server::{listen_and_serve, RequestHandler},
+        settings::RpcSettings,
     },
     system::{msleep, StoppableTask, StoppableTaskPtr},
     Error, Result,
@@ -100,7 +101,10 @@ fn jsonrpc_reqrep() -> Result<()> {
         // Find an available port
         let listener = TcpListener::bind("127.0.0.1:0").await?;
         let sockaddr = listener.local_addr()?;
-        let endpoint = Url::parse(&format!("tcp://127.0.0.1:{}", sockaddr.port()))?;
+        let rpc_settings = RpcSettings {
+            listen: Url::parse(&format!("tcp://127.0.0.1:{}", sockaddr.port()))?,
+            ..RpcSettings::default()
+        };
         drop(listener);
 
         let rpcsrv = Arc::new(RpcSrv {
@@ -111,7 +115,7 @@ fn jsonrpc_reqrep() -> Result<()> {
 
         let rpc_task = StoppableTask::new();
         rpc_task.clone().start(
-            listen_and_serve(endpoint.clone(), rpcsrv.clone(), None, executor.clone()),
+            listen_and_serve(rpc_settings.clone(), rpcsrv.clone(), None, executor.clone()),
             |res| async move {
                 match res {
                     Ok(()) | Err(Error::RpcServerStopped) => rpcsrv_.stop_connections().await,
@@ -124,7 +128,7 @@ fn jsonrpc_reqrep() -> Result<()> {
 
         msleep(500).await;
 
-        let client = RpcClient::new(endpoint, executor.clone()).await?;
+        let client = RpcClient::new(rpc_settings.listen, executor.clone()).await?;
         let req = JsonRequest::new("ping", vec![].into());
         let rep = client.request(req).await?;
 
@@ -150,7 +154,10 @@ fn http_jsonrpc_reqrep() -> Result<()> {
         // Find an available port
         let listener = TcpListener::bind("127.0.0.1:0").await?;
         let sockaddr = listener.local_addr()?;
-        let endpoint = Url::parse(&format!("http+tcp://127.0.0.1:{}", sockaddr.port()))?;
+        let rpc_settings = RpcSettings {
+            listen: Url::parse(&format!("http+tcp://127.0.0.1:{}", sockaddr.port()))?,
+            ..RpcSettings::default()
+        };
         drop(listener);
 
         let rpcsrv = Arc::new(RpcSrv {
@@ -161,7 +168,7 @@ fn http_jsonrpc_reqrep() -> Result<()> {
 
         let rpc_task = StoppableTask::new();
         rpc_task.clone().start(
-            listen_and_serve(endpoint.clone(), rpcsrv.clone(), None, executor.clone()),
+            listen_and_serve(rpc_settings.clone(), rpcsrv.clone(), None, executor.clone()),
             |res| async move {
                 match res {
                     Ok(()) | Err(Error::RpcServerStopped) => rpcsrv_.stop_connections().await,
@@ -174,7 +181,7 @@ fn http_jsonrpc_reqrep() -> Result<()> {
 
         msleep(500).await;
 
-        let client = RpcClient::new(endpoint, executor.clone()).await?;
+        let client = RpcClient::new(rpc_settings.listen, executor.clone()).await?;
         let req = JsonRequest::new("ping", vec![].into());
         let rep = client.request(req).await?;