From 2b81d845ea1569f9c694685768fac63fc0924eaa Mon Sep 17 00:00:00 2001 From: Arya Date: Tue, 29 Aug 2023 03:44:59 -0400 Subject: [PATCH] fix(panic): Log a warning instead of panicking for unused mining configs (#7290) * Logs warning for unused mining config * add conditional serialization of the mining section * rustfmt * Simplify mining::Config argument passing * Simplify mining config argument passing in start.rs --------- Co-authored-by: Alfredo Garcia Co-authored-by: teor --- zebra-rpc/src/config.rs | 2 ++ .../config.rs => config/mining.rs} | 13 +++++++++++ .../src/methods/get_block_template_rpcs.rs | 3 +-- .../tests/snapshot/get_block_template_rpcs.rs | 23 ++++++++----------- zebra-rpc/src/methods/tests/vectors.rs | 7 ++---- zebra-rpc/src/server.rs | 8 ++----- zebrad/src/commands/start.rs | 11 ++++++--- zebrad/src/config.rs | 4 ++-- 8 files changed, 40 insertions(+), 31 deletions(-) rename zebra-rpc/src/{methods/get_block_template_rpcs/config.rs => config/mining.rs} (72%) diff --git a/zebra-rpc/src/config.rs b/zebra-rpc/src/config.rs index a9be9488..10a0ff4d 100644 --- a/zebra-rpc/src/config.rs +++ b/zebra-rpc/src/config.rs @@ -4,6 +4,8 @@ use std::net::SocketAddr; use serde::{Deserialize, Serialize}; +pub mod mining; + /// RPC configuration section. #[derive(Clone, Debug, Deserialize, Serialize)] #[serde(deny_unknown_fields, default)] diff --git a/zebra-rpc/src/methods/get_block_template_rpcs/config.rs b/zebra-rpc/src/config/mining.rs similarity index 72% rename from zebra-rpc/src/methods/get_block_template_rpcs/config.rs rename to zebra-rpc/src/config/mining.rs index 3747990b..f8224859 100644 --- a/zebra-rpc/src/methods/get_block_template_rpcs/config.rs +++ b/zebra-rpc/src/config/mining.rs @@ -39,3 +39,16 @@ impl Default for Config { } } } + +impl Config { + /// Return true if `getblocktemplate-rpcs` rust feature is not turned on, false otherwise. + /// + /// This is used to ignore the mining section of the configuration if the feature is not + /// enabled, allowing us to log a warning when the config found is different from the default. + pub fn skip_getblocktemplate(&self) -> bool { + #[cfg(feature = "getblocktemplate-rpcs")] + return false; + #[cfg(not(feature = "getblocktemplate-rpcs"))] + return true; + } +} diff --git a/zebra-rpc/src/methods/get_block_template_rpcs.rs b/zebra-rpc/src/methods/get_block_template_rpcs.rs index ca861e54..cf515cea 100644 --- a/zebra-rpc/src/methods/get_block_template_rpcs.rs +++ b/zebra-rpc/src/methods/get_block_template_rpcs.rs @@ -55,7 +55,6 @@ use crate::methods::{ height_from_signed_int, GetBlockHash, MISSING_BLOCK_ERROR_CODE, }; -pub mod config; pub mod constants; pub mod get_block_template; pub mod types; @@ -315,7 +314,7 @@ where #[allow(clippy::too_many_arguments)] pub fn new( network: Network, - mining_config: config::Config, + mining_config: crate::config::mining::Config, mempool: Buffer, state: State, latest_chain_tip: Tip, diff --git a/zebra-rpc/src/methods/tests/snapshot/get_block_template_rpcs.rs b/zebra-rpc/src/methods/tests/snapshot/get_block_template_rpcs.rs index ab57b7b1..258159cb 100644 --- a/zebra-rpc/src/methods/tests/snapshot/get_block_template_rpcs.rs +++ b/zebra-rpc/src/methods/tests/snapshot/get_block_template_rpcs.rs @@ -36,18 +36,15 @@ use zebra_test::{ }; use crate::methods::{ - get_block_template_rpcs::{ - self, - types::{ - get_block_template::{self, GetBlockTemplateRequestMode}, - get_mining_info, - hex_data::HexData, - long_poll::{LongPollId, LONG_POLL_ID_LENGTH}, - peer_info::PeerInfo, - submit_block, - subsidy::BlockSubsidy, - unified_address, validate_address, z_validate_address, - }, + get_block_template_rpcs::types::{ + get_block_template::{self, GetBlockTemplateRequestMode}, + get_mining_info, + hex_data::HexData, + long_poll::{LongPollId, LONG_POLL_ID_LENGTH}, + peer_info::PeerInfo, + submit_block, + subsidy::BlockSubsidy, + unified_address, validate_address, z_validate_address, }, tests::{snapshot::EXCESSIVE_BLOCK_HEIGHT, utils::fake_history_tree}, GetBlockHash, GetBlockTemplateRpc, GetBlockTemplateRpcImpl, @@ -100,7 +97,7 @@ pub async fn test_responses( let mut mock_sync_status = MockSyncStatus::default(); mock_sync_status.set_is_close_to_tip(true); - let mining_config = get_block_template_rpcs::config::Config { + let mining_config = crate::config::mining::Config { miner_address: Some(transparent::Address::from_script_hash(network, [0xad; 20])), extra_coinbase_data: None, debug_like_zcashd: true, diff --git a/zebra-rpc/src/methods/tests/vectors.rs b/zebra-rpc/src/methods/tests/vectors.rs index 6490b8c8..20ef6d8c 100644 --- a/zebra-rpc/src/methods/tests/vectors.rs +++ b/zebra-rpc/src/methods/tests/vectors.rs @@ -1203,7 +1203,6 @@ async fn rpc_getblocktemplate_mining_address(use_p2pkh: bool) { use crate::methods::{ get_block_template_rpcs::{ - config::Config, constants::{ GET_BLOCK_TEMPLATE_CAPABILITIES_FIELD, GET_BLOCK_TEMPLATE_MUTABLE_FIELD, GET_BLOCK_TEMPLATE_NONCE_RANGE_FIELD, @@ -1229,7 +1228,7 @@ async fn rpc_getblocktemplate_mining_address(use_p2pkh: bool) { true => Some(transparent::Address::from_pub_key_hash(Mainnet, [0x7e; 20])), }; - let mining_config = Config { + let mining_config = crate::config::mining::Config { miner_address, extra_coinbase_data: None, debug_like_zcashd: true, @@ -1668,9 +1667,7 @@ async fn rpc_getdifficulty() { use zebra_state::{GetBlockTemplateChainInfo, ReadRequest, ReadResponse}; - use crate::methods::{ - get_block_template_rpcs::config::Config, tests::utils::fake_history_tree, - }; + use crate::{config::mining::Config, methods::tests::utils::fake_history_tree}; let _init_guard = zebra_test::init(); diff --git a/zebra-rpc/src/server.rs b/zebra-rpc/src/server.rs index d1bdd7ed..b4281c15 100644 --- a/zebra-rpc/src/server.rs +++ b/zebra-rpc/src/server.rs @@ -32,7 +32,7 @@ use crate::{ }; #[cfg(feature = "getblocktemplate-rpcs")] -use crate::methods::{get_block_template_rpcs, GetBlockTemplateRpc, GetBlockTemplateRpcImpl}; +use crate::methods::{GetBlockTemplateRpc, GetBlockTemplateRpcImpl}; pub mod http_request_compatibility; pub mod rpc_call_compatibility; @@ -95,11 +95,7 @@ impl RpcServer { AddressBook, >( config: Config, - #[cfg(feature = "getblocktemplate-rpcs")] - mining_config: get_block_template_rpcs::config::Config, - #[cfg(not(feature = "getblocktemplate-rpcs"))] - #[allow(unused_variables)] - mining_config: (), + mining_config: crate::config::mining::Config, build_version: VersionString, user_agent: UserAgentString, mempool: Buffer, diff --git a/zebrad/src/commands/start.rs b/zebrad/src/commands/start.rs index 3e8e1823..f5b19ff4 100644 --- a/zebrad/src/commands/start.rs +++ b/zebrad/src/commands/start.rs @@ -208,13 +208,18 @@ impl StartCmd { // And give it time to clear its queue tokio::task::yield_now().await; + #[cfg(not(feature = "getblocktemplate-rpcs"))] + if config.mining != zebra_rpc::config::mining::Config::default() { + warn!( + "Unused mining section in config,\ + compile with 'getblocktemplate-rpcs' feature to use mining RPCs" + ); + } + // Launch RPC server let (rpc_task_handle, rpc_tx_queue_task_handle, rpc_server) = RpcServer::spawn( config.rpc.clone(), - #[cfg(feature = "getblocktemplate-rpcs")] config.mining.clone(), - #[cfg(not(feature = "getblocktemplate-rpcs"))] - (), build_version(), user_agent(), mempool.clone(), diff --git a/zebrad/src/config.rs b/zebrad/src/config.rs index ed1f19d1..9a8f9ce1 100644 --- a/zebrad/src/config.rs +++ b/zebrad/src/config.rs @@ -38,7 +38,7 @@ pub struct ZebradConfig { /// RPC configuration pub rpc: zebra_rpc::config::Config, - #[cfg(feature = "getblocktemplate-rpcs")] + #[serde(skip_serializing_if = "zebra_rpc::config::mining::Config::skip_getblocktemplate")] /// Mining configuration - pub mining: zebra_rpc::methods::get_block_template_rpcs::config::Config, + pub mining: zebra_rpc::config::mining::Config, }