mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-15 02:42:38 +00:00
## Issue Addressed Closes #1504 Closes #1505 Replaces #1703 Closes #1707 ## Proposed Changes * Update BLST and Milagro to versions compatible with BLSv4 spec * Update Lighthouse to spec v1.0.0-rc.0, and update EF test vectors * Use the v1.0.0 constants for `MainnetEthSpec`. * Rename `InteropEthSpec` -> `V012LegacyEthSpec` * Change all constants to suit the mainnet `v0.12.3` specification (i.e., Medalla). * Deprecate the `--spec` flag for the `lighthouse` binary * This value is now obtained from the `config_name` field of the `YamlConfig`. * Built in testnet YAML files have been updated. * Ignore the `--spec` value, if supplied, log a warning that it will be deprecated * `lcli` still has the spec flag, that's fine because it's dev tooling. * Remove the `E: EthSpec` from `YamlConfig` * This means we need to deser the genesis `BeaconState` on-demand, but this is fine. * Swap the old "minimal", "mainnet" strings over to the new `EthSpecId` enum. * Always require a `CONFIG_NAME` field in `YamlConfig` (it used to have a default). ## Additional Info Lots of breaking changes, do not merge! ~~We will likely need a Lighthouse v0.4.0 branch, and possibly a long-term v0.3.0 branch to keep Medalla alive~~. Co-authored-by: Kirk Baird <baird.k@outlook.com> Co-authored-by: Paul Hauner <paul@paulhauner.com>
116 lines
4.1 KiB
Rust
116 lines
4.1 KiB
Rust
//! A helper library for parsing values from `clap::ArgMatches`.
|
|
|
|
use clap::ArgMatches;
|
|
use eth2_testnet_config::Eth2TestnetConfig;
|
|
use ssz::Decode;
|
|
use std::path::PathBuf;
|
|
use std::str::FromStr;
|
|
|
|
pub const BAD_TESTNET_DIR_MESSAGE: &str = "The hard-coded testnet directory was invalid. \
|
|
This happens when Lighthouse is migrating between spec versions \
|
|
or when there is no default public network to connect to. \
|
|
During these times you must specify a --testnet-dir.";
|
|
|
|
/// Attempts to load the testnet dir at the path if `name` is in `matches`, returning an error if
|
|
/// the path cannot be found or the testnet dir is invalid.
|
|
pub fn parse_testnet_dir(
|
|
matches: &ArgMatches,
|
|
name: &'static str,
|
|
) -> Result<Option<Eth2TestnetConfig>, String> {
|
|
let path = parse_required::<PathBuf>(matches, name)?;
|
|
Eth2TestnetConfig::load(path.clone())
|
|
.map_err(|e| format!("Unable to open testnet dir at {:?}: {}", path, e))
|
|
.map(Some)
|
|
}
|
|
|
|
/// Attempts to load a hardcoded network config if `name` is in `matches`, returning an error if
|
|
/// the name is not a valid network name.
|
|
pub fn parse_hardcoded_network(
|
|
matches: &ArgMatches,
|
|
name: &str,
|
|
) -> Result<Option<Eth2TestnetConfig>, String> {
|
|
let network_name = parse_required::<String>(matches, name)?;
|
|
Eth2TestnetConfig::constant(network_name.as_str())
|
|
}
|
|
|
|
/// If `name` is in `matches`, parses the value as a path. Otherwise, attempts to find the user's
|
|
/// home directory and appends `default` to it.
|
|
pub fn parse_path_with_default_in_home_dir(
|
|
matches: &ArgMatches,
|
|
name: &'static str,
|
|
default: PathBuf,
|
|
) -> Result<PathBuf, String> {
|
|
matches
|
|
.value_of(name)
|
|
.map(|dir| {
|
|
dir.parse::<PathBuf>()
|
|
.map_err(|e| format!("Unable to parse {}: {}", name, e))
|
|
})
|
|
.unwrap_or_else(|| {
|
|
dirs::home_dir()
|
|
.map(|home| home.join(default))
|
|
.ok_or_else(|| format!("Unable to locate home directory. Try specifying {}", name))
|
|
})
|
|
}
|
|
|
|
/// Returns the value of `name` or an error if it is not in `matches` or does not parse
|
|
/// successfully using `std::string::FromStr`.
|
|
pub fn parse_required<T>(matches: &ArgMatches, name: &str) -> Result<T, String>
|
|
where
|
|
T: FromStr,
|
|
<T as FromStr>::Err: std::fmt::Display,
|
|
{
|
|
parse_optional(matches, name)?.ok_or_else(|| format!("{} not specified", name))
|
|
}
|
|
|
|
/// Returns the value of `name` (if present) or an error if it does not parse successfully using
|
|
/// `std::string::FromStr`.
|
|
pub fn parse_optional<T>(matches: &ArgMatches, name: &str) -> Result<Option<T>, String>
|
|
where
|
|
T: FromStr,
|
|
<T as FromStr>::Err: std::fmt::Display,
|
|
{
|
|
matches
|
|
.value_of(name)
|
|
.map(|val| {
|
|
val.parse()
|
|
.map_err(|e| format!("Unable to parse {}: {}", name, e))
|
|
})
|
|
.transpose()
|
|
}
|
|
|
|
/// Returns the value of `name` or an error if it is not in `matches` or does not parse
|
|
/// successfully using `ssz::Decode`.
|
|
///
|
|
/// Expects the value of `name` to be 0x-prefixed ASCII-hex.
|
|
pub fn parse_ssz_required<T: Decode>(
|
|
matches: &ArgMatches,
|
|
name: &'static str,
|
|
) -> Result<T, String> {
|
|
parse_ssz_optional(matches, name)?.ok_or_else(|| format!("{} not specified", name))
|
|
}
|
|
|
|
/// Returns the value of `name` (if present) or an error if it does not parse successfully using
|
|
/// `ssz::Decode`.
|
|
///
|
|
/// Expects the value of `name` (if any) to be 0x-prefixed ASCII-hex.
|
|
pub fn parse_ssz_optional<T: Decode>(
|
|
matches: &ArgMatches,
|
|
name: &'static str,
|
|
) -> Result<Option<T>, String> {
|
|
matches
|
|
.value_of(name)
|
|
.map(|val| {
|
|
if val.starts_with("0x") {
|
|
let vec = hex::decode(&val[2..])
|
|
.map_err(|e| format!("Unable to parse {} as hex: {:?}", name, e))?;
|
|
|
|
T::from_ssz_bytes(&vec)
|
|
.map_err(|e| format!("Unable to parse {} as SSZ: {:?}", name, e))
|
|
} else {
|
|
Err(format!("Unable to parse {}, must have 0x prefix", name))
|
|
}
|
|
})
|
|
.transpose()
|
|
}
|