78d82d9193
* Update to spec v0.9.0 * Update to v0.9.1 * Bump spec tags for v0.9.1 * Formatting, fix CI failures * Resolve accidental KeyPair merge conflict * Document new BeaconState functions * Add `validator` changes from `validator-to-rest` * Add initial (failing) REST api tests * Fix signature parsing * Add more tests * Refactor http router * Add working tests for publish beacon block * Add validator duties tests * Move account_manager under `lighthouse` binary * Unify logfile handling in `environment` crate. * Fix incorrect cache drops in `advance_caches` * Update fork choice for v0.9.1 * Add `deposit_contract` crate * Add progress on validator onboarding * Add unfinished attesation code * Update account manager CLI * Write eth1 data file as hex string * Integrate ValidatorDirectory with validator_client * Move ValidatorDirectory into validator_client * Clean up some FIXMEs * Add beacon_chain_sim * Fix a few docs/logs * Expand `beacon_chain_sim` * Fix spec for `beacon_chain_sim * More testing for api * Start work on attestation endpoint * Reject empty attestations * Allow attestations to genesis block * Add working tests for `rest_api` validator endpoint * Remove grpc from beacon_node * Start heavy refactor of validator client - Block production is working * Prune old validator client files * Start works on attestation service * Add attestation service to validator client * Use full pubkey for validator directories * Add validator duties post endpoint * Use par_iter for keypair generation * Use bulk duties request in validator client * Add version http endpoint tests * Add interop keys and startup wait * Ensure a prompt exit * Add duties pruning * Fix compile error in beacon node tests * Add github workflow * Modify rust.yaml * Modify gitlab actions * Add to CI file * Add sudo to CI npm install * Move cargo fmt to own job in tests * Fix cargo fmt in CI * Add rustup update before cargo fmt * Change name of CI job * Make other CI jobs require cargo fmt * Add CI badge * Remove gitlab and travis files * Add different http timeout for debug * Update docker file, use makefile in CI * Use make in the dockerfile, skip the test * Use the makefile for debug GI test * Update book * Tidy grpc and misc things * Apply discv5 fixes * Address other minor issues * Fix warnings * Attempt fix for addr parsing * Tidy validator config, CLIs * Tidy comments * Tidy signing, reduce ForkService duplication * Fail if skipping too many slots * Set default recent genesis time to 0 * Add custom http timeout to validator * Fix compile bug in node_test_rig * Remove old bootstrap flag from val CLI * Update docs * Tidy val client * Change val client log levels * Add comments, more validity checks * Fix compile error, add comments * Undo changes to eth2-libp2p/src * Reduce duplication of keypair generation * Add more logging for validator duties * Fix beacon_chain_sim, nitpicks * Fix compile error, minor nits * Address Michael's comments
127 lines
4.1 KiB
Rust
127 lines
4.1 KiB
Rust
use clap::ArgMatches;
|
|
use network::NetworkConfig;
|
|
use serde_derive::{Deserialize, Serialize};
|
|
use std::fs;
|
|
use std::path::PathBuf;
|
|
|
|
/// The number initial validators when starting the `Minimal`.
|
|
const TESTNET_SPEC_CONSTANTS: &str = "minimal";
|
|
|
|
/// Defines how the client should initialize the `BeaconChain` and other components.
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub enum ClientGenesis {
|
|
/// Reads the genesis state and other persisted data from the `Store`.
|
|
Resume,
|
|
/// Creates a genesis state as per the 2019 Canada interop specifications.
|
|
Interop {
|
|
validator_count: usize,
|
|
genesis_time: u64,
|
|
},
|
|
/// Connects to an eth1 node and waits until it can create the genesis state from the deposit
|
|
/// contract.
|
|
DepositContract,
|
|
/// Loads the genesis state from a SSZ-encoded `BeaconState` file.
|
|
SszFile { path: PathBuf },
|
|
/// Connects to another Lighthouse instance and reads the genesis state and other data via the
|
|
/// HTTP API.
|
|
RemoteNode { server: String, port: Option<u16> },
|
|
}
|
|
|
|
impl Default for ClientGenesis {
|
|
fn default() -> Self {
|
|
Self::DepositContract
|
|
}
|
|
}
|
|
|
|
/// The core configuration of a Lighthouse beacon node.
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct Config {
|
|
pub data_dir: PathBuf,
|
|
pub db_type: String,
|
|
db_name: String,
|
|
pub log_file: PathBuf,
|
|
pub spec_constants: String,
|
|
/// If true, the node will use co-ordinated junk for eth1 values.
|
|
///
|
|
/// This is the method used for the 2019 client interop in Canada.
|
|
pub dummy_eth1_backend: bool,
|
|
pub sync_eth1_chain: bool,
|
|
#[serde(skip)]
|
|
/// The `genesis` field is not serialized or deserialized by `serde` to ensure it is defined
|
|
/// via the CLI at runtime, instead of from a configuration file saved to disk.
|
|
pub genesis: ClientGenesis,
|
|
pub network: network::NetworkConfig,
|
|
pub rest_api: rest_api::Config,
|
|
pub websocket_server: websocket_server::Config,
|
|
pub eth1: eth1::Config,
|
|
}
|
|
|
|
impl Default for Config {
|
|
fn default() -> Self {
|
|
Self {
|
|
data_dir: PathBuf::from(".lighthouse"),
|
|
log_file: PathBuf::from(""),
|
|
db_type: "disk".to_string(),
|
|
db_name: "chain_db".to_string(),
|
|
genesis: <_>::default(),
|
|
network: NetworkConfig::new(),
|
|
rest_api: <_>::default(),
|
|
websocket_server: <_>::default(),
|
|
spec_constants: TESTNET_SPEC_CONSTANTS.into(),
|
|
dummy_eth1_backend: false,
|
|
sync_eth1_chain: false,
|
|
eth1: <_>::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Config {
|
|
/// Returns the path to which the client may initialize an on-disk database.
|
|
pub fn db_path(&self) -> Option<PathBuf> {
|
|
self.data_dir()
|
|
.and_then(|path| Some(path.join(&self.db_name)))
|
|
}
|
|
|
|
/// Returns the core path for the client.
|
|
///
|
|
/// Creates the directory if it does not exist.
|
|
pub fn data_dir(&self) -> Option<PathBuf> {
|
|
let path = dirs::home_dir()?.join(&self.data_dir);
|
|
fs::create_dir_all(&path).ok()?;
|
|
Some(path)
|
|
}
|
|
|
|
/// Apply the following arguments to `self`, replacing values if they are specified in `args`.
|
|
///
|
|
/// Returns an error if arguments are obviously invalid. May succeed even if some values are
|
|
/// invalid.
|
|
pub fn apply_cli_args(&mut self, args: &ArgMatches, _log: &slog::Logger) -> Result<(), String> {
|
|
if let Some(dir) = args.value_of("datadir") {
|
|
self.data_dir = PathBuf::from(dir);
|
|
};
|
|
|
|
if let Some(dir) = args.value_of("db") {
|
|
self.db_type = dir.to_string();
|
|
};
|
|
|
|
self.network.apply_cli_args(args)?;
|
|
self.rest_api.apply_cli_args(args)?;
|
|
self.websocket_server.apply_cli_args(args)?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use toml;
|
|
|
|
#[test]
|
|
fn serde() {
|
|
let config = Config::default();
|
|
let serialized = toml::to_string(&config).expect("should serde encode default config");
|
|
toml::from_str::<Config>(&serialized).expect("should serde decode default config");
|
|
}
|
|
}
|