mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
fix: add MaybePlatformPath (#2231)
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
//! clap [Args](clap::Args) for network related arguments.
|
//! clap [Args](clap::Args) for network related arguments.
|
||||||
|
|
||||||
use crate::dirs::{KnownPeersPath, PlatformPath};
|
use crate::dirs::{KnownPeersPath, MaybePlatformPath};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
use reth_net_nat::NatResolver;
|
use reth_net_nat::NatResolver;
|
||||||
use reth_network::NetworkConfigBuilder;
|
use reth_network::NetworkConfigBuilder;
|
||||||
@ -36,7 +36,7 @@ pub struct NetworkArgs {
|
|||||||
/// dumped to this file on node shutdown, and read on startup.
|
/// dumped to this file on node shutdown, and read on startup.
|
||||||
/// Cannot be used with --no-persist-peers
|
/// Cannot be used with --no-persist-peers
|
||||||
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
||||||
pub peers_file: PlatformPath<KnownPeersPath>,
|
pub peers_file: MaybePlatformPath<KnownPeersPath>,
|
||||||
|
|
||||||
/// Do not persist peers. Cannot be used with --peers-file
|
/// Do not persist peers. Cannot be used with --peers-file
|
||||||
#[arg(long, verbatim_doc_comment, conflicts_with = "peers_file")]
|
#[arg(long, verbatim_doc_comment, conflicts_with = "peers_file")]
|
||||||
@ -82,7 +82,7 @@ impl NetworkArgs {
|
|||||||
return None
|
return None
|
||||||
}
|
}
|
||||||
|
|
||||||
let peers_file = self.peers_file.clone().with_chain(chain);
|
let peers_file = self.peers_file.clone().unwrap_or_chain_default(chain);
|
||||||
Some(peers_file.into())
|
Some(peers_file.into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@ use crate::dirs::{PlatformPath, SecretKeyPath};
|
|||||||
use hex::encode as hex_encode;
|
use hex::encode as hex_encode;
|
||||||
use reth_network::config::rng_secret_key;
|
use reth_network::config::rng_secret_key;
|
||||||
use secp256k1::{Error as SecretKeyBaseError, SecretKey};
|
use secp256k1::{Error as SecretKeyBaseError, SecretKey};
|
||||||
use std::fs::read_to_string;
|
use std::{fs::read_to_string, path::Path};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
/// Errors returned by loading a [`SecretKey`][secp256k1::SecretKey], including IO errors.
|
/// Errors returned by loading a [`SecretKey`][secp256k1::SecretKey], including IO errors.
|
||||||
@ -19,9 +19,7 @@ pub enum SecretKeyError {
|
|||||||
/// there, then it generates a secret key and stores it in the default path. I/O
|
/// there, then it generates a secret key and stores it in the default path. I/O
|
||||||
/// errors might occur during write operations in the form of a
|
/// errors might occur during write operations in the form of a
|
||||||
/// [`SecretKeyError`]
|
/// [`SecretKeyError`]
|
||||||
pub fn get_secret_key(
|
pub fn get_secret_key(secret_key_path: impl AsRef<Path>) -> Result<SecretKey, SecretKeyError> {
|
||||||
secret_key_path: &PlatformPath<SecretKeyPath>,
|
|
||||||
) -> Result<SecretKey, SecretKeyError> {
|
|
||||||
let fpath = secret_key_path.as_ref();
|
let fpath = secret_key_path.as_ref();
|
||||||
let exists = fpath.try_exists();
|
let exists = fpath.try_exists();
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
dirs::{ConfigPath, DbPath, PlatformPath},
|
dirs::{ConfigPath, DbPath, MaybePlatformPath, PlatformPath},
|
||||||
node::events::{handle_events, NodeEvent},
|
node::events::{handle_events, NodeEvent},
|
||||||
};
|
};
|
||||||
use clap::{crate_version, Parser};
|
use clap::{crate_version, Parser};
|
||||||
@ -35,7 +35,7 @@ use tracing::{debug, info};
|
|||||||
pub struct ImportCommand {
|
pub struct ImportCommand {
|
||||||
/// The path to the configuration file to use.
|
/// The path to the configuration file to use.
|
||||||
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
||||||
config: PlatformPath<ConfigPath>,
|
config: MaybePlatformPath<ConfigPath>,
|
||||||
|
|
||||||
/// The path to the database folder.
|
/// The path to the database folder.
|
||||||
///
|
///
|
||||||
@ -45,7 +45,7 @@ pub struct ImportCommand {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -78,10 +78,10 @@ impl ImportCommand {
|
|||||||
info!(target: "reth::cli", "reth {} starting", crate_version!());
|
info!(target: "reth::cli", "reth {} starting", crate_version!());
|
||||||
|
|
||||||
let config: Config = self.load_config_with_chain(self.chain.chain)?;
|
let config: Config = self.load_config_with_chain(self.chain.chain)?;
|
||||||
info!(target: "reth::cli", path = %self.config.with_chain(self.chain.chain), "Configuration loaded");
|
info!(target: "reth::cli", path = %self.config.unwrap_or_chain_default(self.chain.chain), "Configuration loaded");
|
||||||
|
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
info!(target: "reth::cli", path = ?db_path, "Opening database");
|
info!(target: "reth::cli", path = ?db_path, "Opening database");
|
||||||
let db = Arc::new(init_db(db_path)?);
|
let db = Arc::new(init_db(db_path)?);
|
||||||
@ -175,7 +175,7 @@ impl ImportCommand {
|
|||||||
/// Loads the reth config based on the intended chain
|
/// Loads the reth config based on the intended chain
|
||||||
fn load_config_with_chain(&self, chain: Chain) -> eyre::Result<Config> {
|
fn load_config_with_chain(&self, chain: Chain) -> eyre::Result<Config> {
|
||||||
// add network name to config directory
|
// add network name to config directory
|
||||||
let config_path = self.config.with_chain(chain);
|
let config_path = self.config.unwrap_or_chain_default(chain);
|
||||||
confy::load_path::<Config>(config_path.clone())
|
confy::load_path::<Config>(config_path.clone())
|
||||||
.wrap_err_with(|| format!("Could not load config file {}", config_path))
|
.wrap_err_with(|| format!("Could not load config file {}", config_path))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use crate::dirs::{DbPath, PlatformPath};
|
use crate::dirs::{DbPath, MaybePlatformPath};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use reth_primitives::ChainSpec;
|
use reth_primitives::ChainSpec;
|
||||||
use reth_staged_sync::utils::{
|
use reth_staged_sync::utils::{
|
||||||
@ -19,7 +19,7 @@ pub struct InitCommand {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -45,7 +45,7 @@ impl InitCommand {
|
|||||||
info!(target: "reth::cli", "reth init starting");
|
info!(target: "reth::cli", "reth init starting");
|
||||||
|
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
info!(target: "reth::cli", path = %db_path, "Opening database");
|
info!(target: "reth::cli", path = %db_path, "Opening database");
|
||||||
let db = Arc::new(init_db(&db_path)?);
|
let db = Arc::new(init_db(&db_path)?);
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
dirs::{DbPath, PlatformPath},
|
dirs::{DbPath, MaybePlatformPath},
|
||||||
utils::DbTool,
|
utils::DbTool,
|
||||||
};
|
};
|
||||||
use clap::{Parser, Subcommand};
|
use clap::{Parser, Subcommand};
|
||||||
@ -28,7 +28,7 @@ pub struct Command {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(global = true, long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(global = true, long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -87,7 +87,7 @@ impl Command {
|
|||||||
/// Execute `db` command
|
/// Execute `db` command
|
||||||
pub async fn execute(&self) -> eyre::Result<()> {
|
pub async fn execute(&self) -> eyre::Result<()> {
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
std::fs::create_dir_all(&db_path)?;
|
std::fs::create_dir_all(&db_path)?;
|
||||||
|
|
||||||
@ -212,7 +212,7 @@ impl Command {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
Subcommands::Drop => {
|
Subcommands::Drop => {
|
||||||
tool.drop(&self.db)?;
|
tool.drop(self.db.unwrap_or_chain_default(self.chain.chain))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -181,7 +181,7 @@ pub trait XdgPath {
|
|||||||
///
|
///
|
||||||
/// assert_ne!(default.as_ref(), custom.as_ref());
|
/// assert_ne!(default.as_ref(), custom.as_ref());
|
||||||
/// ```
|
/// ```
|
||||||
#[derive(Clone, Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct PlatformPath<D>(PathBuf, std::marker::PhantomData<D>);
|
pub struct PlatformPath<D>(PathBuf, std::marker::PhantomData<D>);
|
||||||
|
|
||||||
impl<D> Display for PlatformPath<D> {
|
impl<D> Display for PlatformPath<D> {
|
||||||
@ -190,6 +190,12 @@ impl<D> Display for PlatformPath<D> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<D> Clone for PlatformPath<D> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Self(self.0.clone(), std::marker::PhantomData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<D: XdgPath> Default for PlatformPath<D> {
|
impl<D: XdgPath> Default for PlatformPath<D> {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self(
|
Self(
|
||||||
@ -246,6 +252,55 @@ impl<D> PlatformPath<D> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An Optional wrapper type around [PlatformPath].
|
||||||
|
///
|
||||||
|
/// This is useful for when a path is optional, such as the `--db-path` flag.
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
pub struct MaybePlatformPath<D>(Option<PlatformPath<D>>);
|
||||||
|
|
||||||
|
// === impl MaybePlatformPath ===
|
||||||
|
|
||||||
|
impl<D: XdgPath> MaybePlatformPath<D> {
|
||||||
|
/// Returns the path if it is set, otherwise returns the default path for the given chain.
|
||||||
|
pub fn unwrap_or_chain_default(&self, chain: Chain) -> PlatformPath<D> {
|
||||||
|
self.0.clone().unwrap_or_else(|| PlatformPath::default().with_chain(chain).0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D: XdgPath> Display for MaybePlatformPath<D> {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
if let Some(path) = &self.0 {
|
||||||
|
path.fmt(f)
|
||||||
|
} else {
|
||||||
|
// NOTE: this is a workaround for making it work with clap's `default_value_t` which
|
||||||
|
// computes the default value via `Default -> Display -> FromStr`
|
||||||
|
write!(f, "default")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D> Default for MaybePlatformPath<D> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D> FromStr for MaybePlatformPath<D> {
|
||||||
|
type Err = shellexpand::LookupError<VarError>;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let p = match s {
|
||||||
|
"default" => {
|
||||||
|
// NOTE: this is a workaround for making it work with clap's `default_value_t` which
|
||||||
|
// computes the default value via `Default -> Display -> FromStr`
|
||||||
|
None
|
||||||
|
}
|
||||||
|
_ => Some(PlatformPath::from_str(s)?),
|
||||||
|
};
|
||||||
|
Ok(Self(p))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Wrapper type around PlatformPath that includes a `Chain`, used for separating reth data for
|
/// Wrapper type around PlatformPath that includes a `Chain`, used for separating reth data for
|
||||||
/// different networks.
|
/// different networks.
|
||||||
///
|
///
|
||||||
@ -282,3 +337,30 @@ impl<D> From<ChainPath<D>> for PathBuf {
|
|||||||
value.0.into()
|
value.0.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_maybe_db_platform_path() {
|
||||||
|
let path = MaybePlatformPath::<DbPath>::default();
|
||||||
|
let path = path.unwrap_or_chain_default(Chain::mainnet());
|
||||||
|
assert!(path.as_ref().ends_with("reth/mainnet/db"), "{:?}", path);
|
||||||
|
|
||||||
|
let path = MaybePlatformPath::<DbPath>::from_str("my/path/to/db").unwrap();
|
||||||
|
let path = path.unwrap_or_chain_default(Chain::mainnet());
|
||||||
|
assert!(path.as_ref().ends_with("my/path/to/db"), "{:?}", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_maybe_config_platform_path() {
|
||||||
|
let path = MaybePlatformPath::<ConfigPath>::default();
|
||||||
|
let path = path.unwrap_or_chain_default(Chain::mainnet());
|
||||||
|
assert!(path.as_ref().ends_with("reth/mainnet/reth.toml"), "{:?}", path);
|
||||||
|
|
||||||
|
let path = MaybePlatformPath::<DbPath>::from_str("my/path/to/reth.toml").unwrap();
|
||||||
|
let path = path.unwrap_or_chain_default(Chain::mainnet());
|
||||||
|
assert!(path.as_ref().ends_with("my/path/to/reth.toml"), "{:?}", path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
//! Database debugging tool
|
//! Database debugging tool
|
||||||
use crate::{
|
use crate::{
|
||||||
dirs::{DbPath, PlatformPath},
|
dirs::{DbPath, MaybePlatformPath},
|
||||||
utils::DbTool,
|
utils::DbTool,
|
||||||
StageEnum,
|
StageEnum,
|
||||||
};
|
};
|
||||||
@ -28,7 +28,7 @@ pub struct Command {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(global = true, long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(global = true, long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -54,7 +54,7 @@ impl Command {
|
|||||||
/// Execute `db` command
|
/// Execute `db` command
|
||||||
pub async fn execute(&self) -> eyre::Result<()> {
|
pub async fn execute(&self) -> eyre::Result<()> {
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
std::fs::create_dir_all(&db_path)?;
|
std::fs::create_dir_all(&db_path)?;
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ use merkle::dump_merkle_stage;
|
|||||||
use reth_primitives::ChainSpec;
|
use reth_primitives::ChainSpec;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
dirs::{DbPath, PlatformPath},
|
dirs::{DbPath, MaybePlatformPath, PlatformPath},
|
||||||
utils::DbTool,
|
utils::DbTool,
|
||||||
};
|
};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
@ -36,7 +36,7 @@ pub struct Command {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -100,7 +100,7 @@ impl Command {
|
|||||||
/// Execute `dump-stage` command
|
/// Execute `dump-stage` command
|
||||||
pub async fn execute(&self) -> eyre::Result<()> {
|
pub async fn execute(&self) -> eyre::Result<()> {
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
std::fs::create_dir_all(&db_path)?;
|
std::fs::create_dir_all(&db_path)?;
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
//! Starts the client
|
//! Starts the client
|
||||||
use crate::{
|
use crate::{
|
||||||
args::{get_secret_key, DebugArgs, NetworkArgs, RpcServerArgs},
|
args::{get_secret_key, DebugArgs, NetworkArgs, RpcServerArgs},
|
||||||
dirs::{ConfigPath, DbPath, PlatformPath, SecretKeyPath},
|
dirs::{ConfigPath, DbPath, SecretKeyPath},
|
||||||
prometheus_exporter,
|
prometheus_exporter,
|
||||||
runner::CliContext,
|
runner::CliContext,
|
||||||
utils::get_single_header,
|
utils::get_single_header,
|
||||||
@ -70,6 +70,7 @@ use tokio::sync::{
|
|||||||
};
|
};
|
||||||
use tracing::*;
|
use tracing::*;
|
||||||
|
|
||||||
|
use crate::dirs::MaybePlatformPath;
|
||||||
use reth_interfaces::p2p::headers::client::HeadersClient;
|
use reth_interfaces::p2p::headers::client::HeadersClient;
|
||||||
use reth_stages::stages::{MERKLE_EXECUTION, MERKLE_UNWIND};
|
use reth_stages::stages::{MERKLE_EXECUTION, MERKLE_UNWIND};
|
||||||
|
|
||||||
@ -80,7 +81,7 @@ pub mod events;
|
|||||||
pub struct Command {
|
pub struct Command {
|
||||||
/// The path to the configuration file to use.
|
/// The path to the configuration file to use.
|
||||||
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
||||||
config: PlatformPath<ConfigPath>,
|
config: MaybePlatformPath<ConfigPath>,
|
||||||
|
|
||||||
/// The path to the database folder.
|
/// The path to the database folder.
|
||||||
///
|
///
|
||||||
@ -90,7 +91,7 @@ pub struct Command {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -113,7 +114,7 @@ pub struct Command {
|
|||||||
///
|
///
|
||||||
/// This also will deterministically set the peer ID.
|
/// This also will deterministically set the peer ID.
|
||||||
#[arg(long, value_name = "PATH", global = true, required = false, default_value_t)]
|
#[arg(long, value_name = "PATH", global = true, required = false, default_value_t)]
|
||||||
p2p_secret_key: PlatformPath<SecretKeyPath>,
|
p2p_secret_key: MaybePlatformPath<SecretKeyPath>,
|
||||||
|
|
||||||
/// Enable Prometheus metrics.
|
/// Enable Prometheus metrics.
|
||||||
///
|
///
|
||||||
@ -145,10 +146,10 @@ impl Command {
|
|||||||
raise_fd_limit();
|
raise_fd_limit();
|
||||||
|
|
||||||
let mut config: Config = self.load_config_with_chain(self.chain.chain)?;
|
let mut config: Config = self.load_config_with_chain(self.chain.chain)?;
|
||||||
info!(target: "reth::cli", path = %self.config.with_chain(self.chain.chain), "Configuration loaded");
|
info!(target: "reth::cli", path = %self.config.unwrap_or_chain_default(self.chain.chain), "Configuration loaded");
|
||||||
|
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
info!(target: "reth::cli", path = %db_path, "Opening database");
|
info!(target: "reth::cli", path = %db_path, "Opening database");
|
||||||
let db = Arc::new(init_db(&db_path)?);
|
let db = Arc::new(init_db(&db_path)?);
|
||||||
@ -177,7 +178,8 @@ impl Command {
|
|||||||
info!(target: "reth::cli", "Test transaction pool initialized");
|
info!(target: "reth::cli", "Test transaction pool initialized");
|
||||||
|
|
||||||
info!(target: "reth::cli", "Connecting to P2P network");
|
info!(target: "reth::cli", "Connecting to P2P network");
|
||||||
let secret_key = get_secret_key(&self.p2p_secret_key)?;
|
let secret_key =
|
||||||
|
get_secret_key(self.p2p_secret_key.unwrap_or_chain_default(self.chain.chain))?;
|
||||||
let network_config = self.load_network_config(
|
let network_config = self.load_network_config(
|
||||||
&config,
|
&config,
|
||||||
Arc::clone(&db),
|
Arc::clone(&db),
|
||||||
@ -407,7 +409,7 @@ impl Command {
|
|||||||
/// Loads the reth config based on the intended chain
|
/// Loads the reth config based on the intended chain
|
||||||
fn load_config_with_chain(&self, chain: Chain) -> eyre::Result<Config> {
|
fn load_config_with_chain(&self, chain: Chain) -> eyre::Result<Config> {
|
||||||
// add network name to config directory
|
// add network name to config directory
|
||||||
let config_path = self.config.with_chain(chain);
|
let config_path = self.config.unwrap_or_chain_default(chain);
|
||||||
confy::load_path::<Config>(config_path.clone())
|
confy::load_path::<Config>(config_path.clone())
|
||||||
.wrap_err_with(|| format!("Could not load config file {}", config_path))
|
.wrap_err_with(|| format!("Could not load config file {}", config_path))
|
||||||
}
|
}
|
||||||
@ -694,7 +696,7 @@ async fn run_network_until_shutdown<C>(
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use std::net::IpAddr;
|
use std::{net::IpAddr, path::Path};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parse_help_node_command() {
|
fn parse_help_node_command() {
|
||||||
@ -735,4 +737,39 @@ mod tests {
|
|||||||
let cmd = Command::try_parse_from(["reth", "--metrics", "localhost:9000"]).unwrap();
|
let cmd = Command::try_parse_from(["reth", "--metrics", "localhost:9000"]).unwrap();
|
||||||
assert_eq!(cmd.metrics, Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 9000)));
|
assert_eq!(cmd.metrics, Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 9000)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_config_path() {
|
||||||
|
let cmd = Command::try_parse_from(["reth", "--config", "my/path/to/reth.toml"]).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
cmd.config.unwrap_or_chain_default(cmd.chain.chain).as_ref(),
|
||||||
|
Path::new("my/path/to/reth.toml")
|
||||||
|
);
|
||||||
|
|
||||||
|
let cmd = Command::try_parse_from(["reth"]).unwrap();
|
||||||
|
assert!(
|
||||||
|
cmd.config
|
||||||
|
.unwrap_or_chain_default(cmd.chain.chain)
|
||||||
|
.as_ref()
|
||||||
|
.ends_with("reth/mainnet/reth.toml"),
|
||||||
|
"{:?}",
|
||||||
|
cmd.config
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parse_db_path() {
|
||||||
|
let cmd = Command::try_parse_from(["reth", "--db", "my/path/to/db"]).unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
cmd.db.unwrap_or_chain_default(cmd.chain.chain).as_ref(),
|
||||||
|
Path::new("my/path/to/db")
|
||||||
|
);
|
||||||
|
|
||||||
|
let cmd = Command::try_parse_from(["reth"]).unwrap();
|
||||||
|
assert!(
|
||||||
|
cmd.db.unwrap_or_chain_default(cmd.chain.chain).as_ref().ends_with("reth/mainnet/db"),
|
||||||
|
"{:?}",
|
||||||
|
cmd.config
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
//! Stage debugging tool
|
//! Stage debugging tool
|
||||||
use crate::{
|
use crate::{
|
||||||
args::{get_secret_key, NetworkArgs},
|
args::{get_secret_key, NetworkArgs},
|
||||||
dirs::{ConfigPath, DbPath, PlatformPath, SecretKeyPath},
|
dirs::{ConfigPath, DbPath, MaybePlatformPath, PlatformPath, SecretKeyPath},
|
||||||
prometheus_exporter, StageEnum,
|
prometheus_exporter, StageEnum,
|
||||||
};
|
};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
@ -33,11 +33,11 @@ pub struct Command {
|
|||||||
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
/// - Windows: `{FOLDERID_RoamingAppData}/reth/db`
|
||||||
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
/// - macOS: `$HOME/Library/Application Support/reth/db`
|
||||||
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "PATH", verbatim_doc_comment, default_value_t)]
|
||||||
db: PlatformPath<DbPath>,
|
db: MaybePlatformPath<DbPath>,
|
||||||
|
|
||||||
/// The path to the configuration file to use.
|
/// The path to the configuration file to use.
|
||||||
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
#[arg(long, value_name = "FILE", verbatim_doc_comment, default_value_t)]
|
||||||
config: PlatformPath<ConfigPath>,
|
config: MaybePlatformPath<ConfigPath>,
|
||||||
|
|
||||||
/// The chain this node is running.
|
/// The chain this node is running.
|
||||||
///
|
///
|
||||||
@ -99,7 +99,9 @@ impl Command {
|
|||||||
// Does not do anything on windows.
|
// Does not do anything on windows.
|
||||||
fdlimit::raise_fd_limit();
|
fdlimit::raise_fd_limit();
|
||||||
|
|
||||||
let config: Config = confy::load_path(&self.config).unwrap_or_default();
|
let config: Config =
|
||||||
|
confy::load_path(self.config.unwrap_or_chain_default(self.chain.chain))
|
||||||
|
.unwrap_or_default();
|
||||||
info!(target: "reth::cli", "reth {} starting stage {:?}", clap::crate_version!(), self.stage);
|
info!(target: "reth::cli", "reth {} starting stage {:?}", clap::crate_version!(), self.stage);
|
||||||
|
|
||||||
let input = ExecInput {
|
let input = ExecInput {
|
||||||
@ -110,7 +112,7 @@ impl Command {
|
|||||||
let unwind = UnwindInput { stage_progress: self.to, unwind_to: self.from, bad_block: None };
|
let unwind = UnwindInput { stage_progress: self.to, unwind_to: self.from, bad_block: None };
|
||||||
|
|
||||||
// add network name to db directory
|
// add network name to db directory
|
||||||
let db_path = self.db.with_chain(self.chain.chain);
|
let db_path = self.db.unwrap_or_chain_default(self.chain.chain);
|
||||||
|
|
||||||
let db = Arc::new(init_db(db_path)?);
|
let db = Arc::new(init_db(db_path)?);
|
||||||
let mut tx = Transaction::new(db.as_ref())?;
|
let mut tx = Transaction::new(db.as_ref())?;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
//! Common CLI utility functions.
|
//! Common CLI utility functions.
|
||||||
use crate::dirs::{DbPath, PlatformPath};
|
|
||||||
use eyre::{Result, WrapErr};
|
use eyre::{Result, WrapErr};
|
||||||
use reth_db::{
|
use reth_db::{
|
||||||
cursor::{DbCursorRO, Walker},
|
cursor::{DbCursorRO, Walker},
|
||||||
@ -16,7 +16,7 @@ use reth_interfaces::{
|
|||||||
};
|
};
|
||||||
use reth_primitives::{BlockHashOrNumber, HeadersDirection, SealedHeader};
|
use reth_primitives::{BlockHashOrNumber, HeadersDirection, SealedHeader};
|
||||||
use reth_provider::insert_canonical_block;
|
use reth_provider::insert_canonical_block;
|
||||||
use std::collections::BTreeMap;
|
use std::{collections::BTreeMap, path::Path};
|
||||||
use tracing::info;
|
use tracing::info;
|
||||||
|
|
||||||
/// Get a single header from network
|
/// Get a single header from network
|
||||||
@ -106,8 +106,9 @@ impl<'a, DB: Database> DbTool<'a, DB> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Drops the database at the given path.
|
/// Drops the database at the given path.
|
||||||
pub fn drop(&mut self, path: &PlatformPath<DbPath>) -> Result<()> {
|
pub fn drop(&mut self, path: impl AsRef<Path>) -> Result<()> {
|
||||||
info!(target: "reth::cli", "Dropping db at {}", path);
|
let path = path.as_ref();
|
||||||
|
info!(target: "reth::cli", "Dropping db at {:?}", path);
|
||||||
std::fs::remove_dir_all(path).wrap_err("Dropping the database failed")?;
|
std::fs::remove_dir_all(path).wrap_err("Dropping the database failed")?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user