From 11a1505784570b946a18f2f1883e148c8be0fb78 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Mon, 2 Sep 2019 15:07:32 +1000 Subject: [PATCH] Allow starting from SSZ genesis state --- .../beacon_chain/src/beacon_chain_builder.rs | 17 ++++++++++++++++- beacon_node/client/src/config.rs | 2 ++ beacon_node/client/src/lib.rs | 9 +++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/beacon_node/beacon_chain/src/beacon_chain_builder.rs b/beacon_node/beacon_chain/src/beacon_chain_builder.rs index 06d2818e21..514a72a405 100644 --- a/beacon_node/beacon_chain/src/beacon_chain_builder.rs +++ b/beacon_node/beacon_chain/src/beacon_chain_builder.rs @@ -4,9 +4,10 @@ use lighthouse_bootstrap::Bootstrapper; use merkle_proof::MerkleTree; use rayon::prelude::*; use slog::Logger; -use ssz::Encode; +use ssz::{Decode, Encode}; use state_processing::initialize_beacon_state_from_eth1; use std::fs::File; +use std::io::prelude::*; use std::path::PathBuf; use std::sync::Arc; use std::time::SystemTime; @@ -61,6 +62,20 @@ impl BeaconChainBuilder { Ok(Self::from_genesis_state(genesis_state, spec, log)) } + pub fn ssz_state(file: &PathBuf, spec: ChainSpec, log: Logger) -> Result { + let mut file = File::open(file.clone()) + .map_err(|e| format!("Unable to open SSZ genesis state file {:?}: {:?}", file, e))?; + + let mut bytes = vec![]; + file.read_to_end(&mut bytes) + .map_err(|e| format!("Failed to read SSZ file: {:?}", e))?; + + let genesis_state = BeaconState::from_ssz_bytes(&bytes) + .map_err(|e| format!("Unable to parse SSZ genesis state file: {:?}", e))?; + + Ok(Self::from_genesis_state(genesis_state, spec, log)) + } + pub fn http_bootstrap(server: &str, spec: ChainSpec, log: Logger) -> Result { let bootstrapper = Bootstrapper::from_server_string(server.to_string()) .map_err(|e| format!("Failed to initialize bootstrap client: {}", e))?; diff --git a/beacon_node/client/src/config.rs b/beacon_node/client/src/config.rs index 2f5389ce54..2fb62c3f9b 100644 --- a/beacon_node/client/src/config.rs +++ b/beacon_node/client/src/config.rs @@ -54,6 +54,8 @@ pub enum BeaconChainStartMethod { }, /// Create a new beacon chain by loading a YAML-encoded genesis state from a file. Yaml { file: PathBuf }, + /// Create a new beacon chain by loading a SSZ-encoded genesis state from a file. + Ssz { file: PathBuf }, /// Create a new beacon chain by using a HTTP server (running our REST-API) to load genesis and /// finalized states and blocks. HttpBootstrap { server: String, port: Option }, diff --git a/beacon_node/client/src/lib.rs b/beacon_node/client/src/lib.rs index 766d12c561..1396ed45ff 100644 --- a/beacon_node/client/src/lib.rs +++ b/beacon_node/client/src/lib.rs @@ -138,6 +138,15 @@ where ); BeaconChainBuilder::yaml_state(file, spec.clone(), log.clone())? } + BeaconChainStartMethod::Ssz { file } => { + info!( + log, + "Starting beacon chain"; + "file" => format!("{:?}", file), + "method" => "ssz" + ); + BeaconChainBuilder::ssz_state(file, spec.clone(), log.clone())? + } BeaconChainStartMethod::HttpBootstrap { server, port } => { info!( log,