From c5e1d2e48f3f976cea11b8dfd14d124d4500569f Mon Sep 17 00:00:00 2001 From: sirouk <8901571+sirouk@users.noreply.github.com> Date: Tue, 14 Nov 2023 13:47:02 -0500 Subject: [PATCH] [tools] VFN config builder (#98) Co-authored-by: 0o-de-lally <1364012+0o-de-lally@users.noreply.github.com> --- tools/config/src/config_cli.rs | 21 ++++-- tools/config/src/lib.rs | 6 +- ...config.rs => make_yaml_public_fullnode.rs} | 73 +++++++++++++++++-- .../{node_yaml.rs => make_yaml_validator.rs} | 3 +- .../src/{host.rs => validator_config.rs} | 4 +- tools/genesis/src/testnet_setup.rs | 4 +- tools/genesis/src/wizard.rs | 2 +- 7 files changed, 91 insertions(+), 22 deletions(-) rename tools/config/src/{fullnode_config.rs => make_yaml_public_fullnode.rs} (72%) rename tools/config/src/{node_yaml.rs => make_yaml_validator.rs} (97%) rename tools/config/src/{host.rs => validator_config.rs} (97%) diff --git a/tools/config/src/config_cli.rs b/tools/config/src/config_cli.rs index 4640cc1cf..802cad860 100644 --- a/tools/config/src/config_cli.rs +++ b/tools/config/src/config_cli.rs @@ -1,5 +1,5 @@ -use crate::fullnode_config::{download_genesis, init_fullnode_yaml}; -use crate::host::initialize_validator_configs; +use crate::make_yaml_public_fullnode::{download_genesis, init_fullnode_yaml}; +use crate::validator_config::initialize_validator_configs; use crate::{legacy_config, make_profile}; use anyhow::{Context, Result}; use clap::Parser; @@ -88,7 +88,7 @@ enum ConfigSub { /// Generate validators' config file ValidatorInit { /// check the files generated - #[clap(short, long, default_value = "false")] + #[clap(short, long)] check: bool, }, @@ -97,6 +97,9 @@ enum ConfigSub { /// path to libra config and data files defaults to $HOME/.libra #[clap(long)] home_path: Option, + /// private VFN (only for validators) + #[clap(short, long)] + vfn: bool, }, } @@ -238,11 +241,19 @@ impl ConfigCli { println!("Validators' config initialized."); Ok(()) } - Some(ConfigSub::FullnodeInit { home_path }) => { + Some(ConfigSub::FullnodeInit { home_path, vfn }) => { download_genesis(home_path.to_owned()).await?; println!("downloaded genesis block"); - let p = init_fullnode_yaml(home_path.to_owned()).await?; + let p = if *vfn { + // no need for seed peers, will be identified + // to validator node + init_fullnode_yaml(home_path.to_owned(), true, true).await? + } else { + // we want seed peers, and will not have an identity + init_fullnode_yaml(home_path.to_owned(), true, false).await? + }; + println!("config created at {}", p.display()); ol_progress::OLProgress::complete("fullnode configs initialized"); diff --git a/tools/config/src/lib.rs b/tools/config/src/lib.rs index e76ceafb4..4dfabc76d 100644 --- a/tools/config/src/lib.rs +++ b/tools/config/src/lib.rs @@ -1,6 +1,6 @@ pub mod config_cli; -pub mod fullnode_config; -pub mod host; pub mod legacy_config; pub mod make_profile; -pub mod node_yaml; +pub mod make_yaml_public_fullnode; +pub mod make_yaml_validator; +pub mod validator_config; diff --git a/tools/config/src/fullnode_config.rs b/tools/config/src/make_yaml_public_fullnode.rs similarity index 72% rename from tools/config/src/fullnode_config.rs rename to tools/config/src/make_yaml_public_fullnode.rs index f7ae7bbb0..629ab8a0f 100644 --- a/tools/config/src/fullnode_config.rs +++ b/tools/config/src/make_yaml_public_fullnode.rs @@ -7,18 +7,29 @@ use std::{ }; /// fetch seed peers and make a yaml file from template -pub async fn init_fullnode_yaml(home_dir: Option) -> anyhow::Result { +pub async fn init_fullnode_yaml( + home_dir: Option, + overwrite_peers: bool, + vfn: bool, +) -> anyhow::Result { let waypoint = get_genesis_waypoint(home_dir.clone()).await?; - let yaml = make_fullnode_yaml(home_dir.clone(), waypoint)?; + let yaml = if vfn { + make_private_vfn_yaml(home_dir.clone(), waypoint)? + } else { + make_fullnode_yaml(home_dir.clone(), waypoint)? + }; + + let filename = if vfn { "vfn.yaml" } else { "fullnode.yaml" }; let home = home_dir.unwrap_or_else(global_config_dir); - let p = home.join("fullnode.yaml"); + let p = home.join(filename); std::fs::write(&p, yaml)?; - let peers = fetch_seed_addresses(None).await?; - - add_peers_to_yaml(&p, peers)?; + if overwrite_peers { + let peers = fetch_seed_addresses(None).await?; + add_peers_to_yaml(&p, peers)?; + } Ok(p) } @@ -75,7 +86,7 @@ execution: state_sync: state_sync_driver: bootstrapping_mode: DownloadLatestStates - continuous_syncing_mode: ExecuteTransactionsOrApplyOutputs + continuous_syncing_mode: ApplyTransactionOutputs full_node_networks: - network_id: 'public' @@ -89,6 +100,53 @@ api: Ok(template) } +/// Create a VFN file to for validators to seed the public network +pub fn make_private_vfn_yaml( + home_dir: Option, + waypoint: Waypoint, +) -> anyhow::Result { + let home_dir = home_dir.unwrap_or_else(global_config_dir); + let path = home_dir.display().to_string(); + + let template = format!( + " +base: + role: 'full_node' + data_dir: '{path}/data' + waypoint: + from_config: '{waypoint}' + +execution: + genesis_file_location: '{path}/genesis/genesis.blob' + +state_sync: + state_sync_driver: + bootstrapping_mode: ApplyTransactionOutputsFromGenesis + continuous_syncing_mode: ApplyTransactionOutputs + +full_node_networks: +- network_id: 'public' + listen_address: '/ip4/0.0.0.0/tcp/6182' + identity: + type: 'from_file' + path: {path}/validator-full-node-identity.yaml + +- network_id: + private: 'vfn' + # mutual_authentication: true + listen_address: '/ip4/0.0.0.0/tcp/6181' + identity: + type: 'from_file' + path: {path}/validator-full-node-identity.yaml + +api: + enabled: false + address: '0.0.0.0:8080' +" + ); + Ok(template) +} + /// download genesis blob pub async fn download_genesis(home_dir: Option) -> anyhow::Result<()> { let bytes = reqwest::get( @@ -177,5 +235,4 @@ async fn persist_genesis() { .unwrap() .unwrap(); assert!(l.file_name().to_str().unwrap().contains("genesis.blob")); - // dbg!(&l); } diff --git a/tools/config/src/node_yaml.rs b/tools/config/src/make_yaml_validator.rs similarity index 97% rename from tools/config/src/node_yaml.rs rename to tools/config/src/make_yaml_validator.rs index 5e989b5e8..809bfa2cd 100644 --- a/tools/config/src/node_yaml.rs +++ b/tools/config/src/make_yaml_validator.rs @@ -50,6 +50,7 @@ validator_network: full_node_networks: - network_id: private: 'vfn' + #mutual_authentication: true listen_address: '/ip4/0.0.0.0/tcp/6181' identity: type: 'from_file' @@ -57,7 +58,7 @@ full_node_networks: api: enabled: true - address: '0.0.0.0:8080' + address: '127.0.0.1:8080' " ); diff --git a/tools/config/src/host.rs b/tools/config/src/validator_config.rs similarity index 97% rename from tools/config/src/host.rs rename to tools/config/src/validator_config.rs index 73ff489f3..c25736ea0 100644 --- a/tools/config/src/host.rs +++ b/tools/config/src/validator_config.rs @@ -1,4 +1,4 @@ -use crate::node_yaml; +use crate::make_yaml_validator; use anyhow::{bail, Context}; use dialoguer::{Confirm, Input}; use diem_genesis::config::HostAndPort; @@ -28,7 +28,7 @@ pub fn initialize_validator( .set_config_files()?; OLProgress::complete("saved validator registration files locally"); - node_yaml::save_validator_yaml(home_path.clone())?; + make_yaml_validator::save_validator_yaml(home_path.clone())?; OLProgress::complete("saved validator node yaml file locally"); // TODO: nice to have diff --git a/tools/genesis/src/testnet_setup.rs b/tools/genesis/src/testnet_setup.rs index 98773ea2a..853e2c275 100644 --- a/tools/genesis/src/testnet_setup.rs +++ b/tools/genesis/src/testnet_setup.rs @@ -1,6 +1,6 @@ use crate::{genesis_builder, parse_json, supply::SupplySettings}; use diem_genesis::config::{HostAndPort, ValidatorConfiguration}; -use libra_config::host; +use libra_config::validator_config; use libra_types::{exports::NamedChain, legacy_types::fixtures::TestPersona}; use std::{fs, net::Ipv4Addr, path::PathBuf, thread, time}; @@ -33,7 +33,7 @@ pub fn setup( let my_host: HostAndPort = format_host_str .parse() .expect("could not parse IP address for host"); - host::initialize_validator( + validator_config::initialize_validator( Some(data_path.clone()), Some(&me.to_string()), my_host, diff --git a/tools/genesis/src/wizard.rs b/tools/genesis/src/wizard.rs index aa5d0efaa..0bf839630 100644 --- a/tools/genesis/src/wizard.rs +++ b/tools/genesis/src/wizard.rs @@ -26,7 +26,7 @@ use diem_github_client::Client; use libra_types::legacy_types::app_cfg::AppCfg; use libra_wallet::keys::VALIDATOR_FILE; -use libra_config::host::initialize_validator_configs; +use libra_config::validator_config::initialize_validator_configs; pub const DEFAULT_GIT_BRANCH: &str = "main"; pub const GITHUB_TOKEN_FILENAME: &str = "github_token.txt";