mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-10 20:22:02 +00:00
* Renamed fork_choice::process_attestation_from_block * Processing attestation in fork choice * Retrieving state from store and checking signature * Looser check on beacon state validity. * Cleaned up get_attestation_state * Expanded fork choice api to provide latest validator message. * Checking if the an attestation contains a latest message * Correct process_attestation error handling. * Copy paste error in comment fixed. * Tidy ancestor iterators * Getting attestation slot via helper method * Refactored attestation creation in test utils * Revert "Refactored attestation creation in test utils" This reverts commit 4d277fe4239a7194758b18fb5c00dfe0b8231306. * Integration tests for free attestation processing * Implicit conflicts resolved. * formatting * Do first pass on Grants code * Add another attestation processing test * Tidy attestation processing * Remove old code fragment * Add non-compiling half finished changes * Simplify, fix bugs, add tests for chain iters * Remove attestation processing from op pool * Fix bug with fork choice, tidy * Fix overly restrictive check in fork choice. * Ensure committee cache is build during attn proc * Ignore unknown blocks at fork choice * Various minor fixes * Make fork choice write lock in to read lock * Remove unused method * Tidy comments * Fix attestation prod. target roots change * Fix compile error in store iters * Reject any attestation prior to finalization * Begin metrics refactor * Move beacon_chain to new metrics structure. * Make metrics not panic if already defined * Use global prometheus gather at rest api * Unify common metric fns into a crate * Add heavy metering to block processing * Remove hypen from prometheus metric name * Add more beacon chain metrics * Add beacon chain persistence metric * Prune op pool on finalization * Add extra prom beacon chain metrics * Prefix BeaconChain metrics with "beacon_" * Add more store metrics * Add basic metrics to libp2p * Add metrics to HTTP server * Remove old `http_server` crate * Update metrics names to be more like standard * Fix broken beacon chain metrics, add slot clock metrics * Add lighthouse_metrics gather fn * Remove http args * Fix wrong state given to op pool prune * Make prom metric names more consistent * Add more metrics, tidy existing metrics * Fix store block read metrics * Tidy attestation metrics * Fix minor PR comments * Fix minor PR comments * Remove duplicated attestation finalization check * Remove awkward `let` statement * Add first attempts at HTTP bootstrap * Add beacon_block methods to rest api * Fix serde for block.body.grafitti * Allow travis failures on beta (see desc) There's a non-backward compatible change in `cargo fmt`. Stable and beta do not agree. * Add network routes to API * Fix rustc warnings * Add best_slot method * Add --bootstrap arg to beacon node * Get bootstrapper working for ENR address * Store intermediate states during block processing * Allow bootstrapper to scrape libp2p address * Update bootstrapper libp2p address finding * Add comments * Tidy API to be more consistent with recent decisions * Address some review comments * Make BeaconChainTypes Send + Sync + 'static * Add `/network/listen_port` API endpoint * Abandon starting the node if libp2p doesn't start * Update bootstrapper for API changes * Remove unnecessary trait bounds
174 lines
5.2 KiB
Rust
174 lines
5.2 KiB
Rust
use client::{
|
|
error, notifier, BeaconChainTypes, Client, ClientConfig, ClientType, Eth2Config,
|
|
InitialiseBeaconChain,
|
|
};
|
|
use futures::sync::oneshot;
|
|
use futures::Future;
|
|
use slog::{error, info};
|
|
use std::cell::RefCell;
|
|
use std::path::Path;
|
|
use std::path::PathBuf;
|
|
use store::{DiskStore, MemoryStore};
|
|
use tokio::runtime::Builder;
|
|
use tokio::runtime::Runtime;
|
|
use tokio::runtime::TaskExecutor;
|
|
use tokio_timer::clock::Clock;
|
|
use types::{InteropEthSpec, MainnetEthSpec, MinimalEthSpec};
|
|
|
|
/// Reads the configuration and initializes a `BeaconChain` with the required types and parameters.
|
|
///
|
|
/// Spawns an executor which performs syncing, networking, block production, etc.
|
|
///
|
|
/// Blocks the current thread, returning after the `BeaconChain` has exited or a `Ctrl+C`
|
|
/// signal.
|
|
pub fn run_beacon_node(
|
|
client_config: ClientConfig,
|
|
eth2_config: Eth2Config,
|
|
log: &slog::Logger,
|
|
) -> error::Result<()> {
|
|
let runtime = Builder::new()
|
|
.name_prefix("main-")
|
|
.clock(Clock::system())
|
|
.build()
|
|
.map_err(|e| format!("{:?}", e))?;
|
|
|
|
let executor = runtime.executor();
|
|
|
|
let db_path: PathBuf = client_config
|
|
.db_path()
|
|
.ok_or_else::<error::Error, _>(|| "Unable to access database path".into())?;
|
|
let db_type = &client_config.db_type;
|
|
let spec_constants = eth2_config.spec_constants.clone();
|
|
|
|
let other_client_config = client_config.clone();
|
|
|
|
info!(
|
|
log,
|
|
"BeaconNode init";
|
|
"p2p_listen_address" => format!("{:?}", &other_client_config.network.listen_address),
|
|
"data_dir" => format!("{:?}", other_client_config.data_dir()),
|
|
"network_dir" => format!("{:?}", other_client_config.network.network_dir),
|
|
"spec_constants" => &spec_constants,
|
|
"db_type" => &other_client_config.db_type,
|
|
);
|
|
|
|
match (db_type.as_str(), spec_constants.as_str()) {
|
|
("disk", "minimal") => run::<ClientType<DiskStore, MinimalEthSpec>>(
|
|
&db_path,
|
|
client_config,
|
|
eth2_config,
|
|
executor,
|
|
runtime,
|
|
log,
|
|
),
|
|
("memory", "minimal") => run::<ClientType<MemoryStore, MinimalEthSpec>>(
|
|
&db_path,
|
|
client_config,
|
|
eth2_config,
|
|
executor,
|
|
runtime,
|
|
log,
|
|
),
|
|
("disk", "mainnet") => run::<ClientType<DiskStore, MainnetEthSpec>>(
|
|
&db_path,
|
|
client_config,
|
|
eth2_config,
|
|
executor,
|
|
runtime,
|
|
log,
|
|
),
|
|
("memory", "mainnet") => run::<ClientType<MemoryStore, MainnetEthSpec>>(
|
|
&db_path,
|
|
client_config,
|
|
eth2_config,
|
|
executor,
|
|
runtime,
|
|
log,
|
|
),
|
|
("disk", "interop") => run::<ClientType<DiskStore, InteropEthSpec>>(
|
|
&db_path,
|
|
client_config,
|
|
eth2_config,
|
|
executor,
|
|
runtime,
|
|
log,
|
|
),
|
|
("memory", "interop") => run::<ClientType<MemoryStore, InteropEthSpec>>(
|
|
&db_path,
|
|
client_config,
|
|
eth2_config,
|
|
executor,
|
|
runtime,
|
|
log,
|
|
),
|
|
(db_type, spec) => {
|
|
error!(log, "Unknown runtime configuration"; "spec_constants" => spec, "db_type" => db_type);
|
|
Err("Unknown specification and/or db_type.".into())
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Performs the type-generic parts of launching a `BeaconChain`.
|
|
fn run<T>(
|
|
db_path: &Path,
|
|
client_config: ClientConfig,
|
|
eth2_config: Eth2Config,
|
|
executor: TaskExecutor,
|
|
mut runtime: Runtime,
|
|
log: &slog::Logger,
|
|
) -> error::Result<()>
|
|
where
|
|
T: BeaconChainTypes + InitialiseBeaconChain<T> + Clone,
|
|
T::Store: OpenDatabase,
|
|
{
|
|
let store = T::Store::open_database(&db_path)?;
|
|
|
|
let client: Client<T> = Client::new(client_config, eth2_config, store, log.clone(), &executor)?;
|
|
|
|
// run service until ctrl-c
|
|
let (ctrlc_send, ctrlc_oneshot) = oneshot::channel();
|
|
let ctrlc_send_c = RefCell::new(Some(ctrlc_send));
|
|
ctrlc::set_handler(move || {
|
|
if let Some(ctrlc_send) = ctrlc_send_c.try_borrow_mut().unwrap().take() {
|
|
ctrlc_send.send(()).expect("Error sending ctrl-c message");
|
|
}
|
|
})
|
|
.map_err(|e| format!("Could not set ctrlc handler: {:?}", e))?;
|
|
|
|
let (exit_signal, exit) = exit_future::signal();
|
|
|
|
notifier::run(&client, executor, exit);
|
|
|
|
runtime
|
|
.block_on(ctrlc_oneshot)
|
|
.map_err(|e| format!("Ctrlc oneshot failed: {:?}", e))?;
|
|
|
|
// perform global shutdown operations.
|
|
info!(log, "Shutting down..");
|
|
exit_signal.fire();
|
|
// shutdown the client
|
|
// client.exit_signal.fire();
|
|
drop(client);
|
|
runtime.shutdown_on_idle().wait().unwrap();
|
|
Ok(())
|
|
}
|
|
|
|
/// A convenience trait, providing a method to open a database.
|
|
///
|
|
/// Panics if unable to open the database.
|
|
pub trait OpenDatabase: Sized {
|
|
fn open_database(path: &Path) -> error::Result<Self>;
|
|
}
|
|
|
|
impl OpenDatabase for MemoryStore {
|
|
fn open_database(_path: &Path) -> error::Result<Self> {
|
|
Ok(MemoryStore::open())
|
|
}
|
|
}
|
|
|
|
impl OpenDatabase for DiskStore {
|
|
fn open_database(path: &Path) -> error::Result<Self> {
|
|
DiskStore::open(path).map_err(|e| format!("Unable to open database: {:?}", e).into())
|
|
}
|
|
}
|