Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable Running Validator As Process & Container #1437

Merged
merged 3 commits into from
Apr 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions sui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,7 @@ path = "src/sui-move.rs"
[[bin]]
name = "rest_server"
path = "src/rest_server.rs"

[[bin]]
name = "validator"
path = "src/validator.rs"
14 changes: 13 additions & 1 deletion sui/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use serde::{Deserialize, Serialize};
use serde_json::Value;
use serde_with::hex::Hex;
use serde_with::serde_as;
use sui_types::committee::Committee;
use tracing::log::trace;

use sui_framework::DEFAULT_FRAMEWORK_PATH;
Expand All @@ -42,7 +43,7 @@ pub struct AuthorityInfo {
pub base_port: u16,
}

#[derive(Serialize)]
#[derive(Serialize, Debug)]
pub struct AuthorityPrivateInfo {
pub key_pair: KeyPair,
pub host: String,
Expand Down Expand Up @@ -153,6 +154,17 @@ impl NetworkConfig {
}
}

impl From<&NetworkConfig> for Committee {
fn from(network_config: &NetworkConfig) -> Committee {
let voting_rights = network_config
.authorities
.iter()
.map(|authority| (*authority.key_pair.public_key_bytes(), authority.stake))
.collect();
Committee::new(voting_rights)
}
}

#[derive(Serialize, Deserialize)]
#[serde(default)]
pub struct GenesisConfig {
Expand Down
14 changes: 12 additions & 2 deletions sui/src/sui_commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ pub enum SuiCommand {
},
#[clap(name = "genesis")]
Genesis {
#[clap(long, help = "Start genesis with a given config file")]
from_config: Option<PathBuf>,
#[clap(long)]
working_dir: Option<PathBuf>,
#[clap(short, long, help = "Forces overwriting existing configuration")]
Expand Down Expand Up @@ -77,7 +79,11 @@ impl SuiCommand {
.wait_for_completion()
.await
}
SuiCommand::Genesis { working_dir, force } => {
SuiCommand::Genesis {
working_dir,
force,
from_config,
} => {
let sui_config_dir = &match working_dir {
// if a directory is specified, it must exist (it
// will not be created)
Expand Down Expand Up @@ -129,7 +135,11 @@ impl SuiCommand {
let db_folder_path = sui_config_dir.join("client_db");
let gateway_db_folder_path = sui_config_dir.join("gateway_client_db");

let genesis_conf = GenesisConfig::default_genesis(sui_config_dir)?;
let genesis_conf = match from_config {
Some(q) => PersistedConfig::read(q)?,
None => GenesisConfig::default_genesis(sui_config_dir)?,
};

let (network_config, accounts, keystore) = genesis(genesis_conf).await?;
info!("Network genesis completed.");
let network_config = network_config.persisted(&network_path);
Expand Down
2 changes: 2 additions & 0 deletions sui/src/unit_tests/cli_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ async fn test_genesis() -> Result<(), anyhow::Error> {
SuiCommand::Genesis {
working_dir: Some(working_dir.to_path_buf()),
force: false,
from_config: None,
}
.execute()
.await?;
Expand Down Expand Up @@ -107,6 +108,7 @@ async fn test_genesis() -> Result<(), anyhow::Error> {
let result = SuiCommand::Genesis {
working_dir: Some(working_dir.to_path_buf()),
force: false,
from_config: None,
}
.execute()
.await;
Expand Down
81 changes: 81 additions & 0 deletions sui/src/validator.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Copyright (c) 2022, Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

use anyhow::anyhow;
use clap::*;
use std::path::PathBuf;
use sui::{
config::{GenesisConfig, PersistedConfig},
sui_commands::{genesis, make_server},
};
use sui_types::base_types::{decode_bytes_hex, SuiAddress};
use sui_types::committee::Committee;
use tracing::{error, info};

#[derive(Parser)]
#[clap(
name = "Sui Validator",
about = "Validator for Sui Network",
rename_all = "kebab-case"
)]
struct ValidatorOpt {
/// The genesis config file location
#[clap(long)]
pub genesis_config_path: PathBuf,
/// Public key/address of the validator to start
#[clap(long, parse(try_from_str = decode_bytes_hex))]
address: SuiAddress,
}

#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let config = telemetry_subscribers::TelemetryConfig {
service_name: "sui".into(),
enable_tracing: std::env::var("SUI_TRACING_ENABLE").is_ok(),
json_log_output: std::env::var("SUI_JSON_SPAN_LOGS").is_ok(),
..Default::default()
};
#[allow(unused)]
let guard = telemetry_subscribers::init(config);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you can just do let _guard = instead of #[allow(unused)]


let cfg = ValidatorOpt::parse();
let genesis_conf: GenesisConfig = PersistedConfig::read(&cfg.genesis_config_path)?;
let address = cfg.address;

let (network_config, _, _) = genesis(genesis_conf).await?;

// Find the network config for this validator
let net_cfg = network_config
.authorities
.iter()
.find(|x| SuiAddress::from(x.key_pair.public_key_bytes()) == address)
.ok_or_else(|| {
anyhow!(
"Network configs must include config for address {}",
address
)
})?;

info!(
"Started {} authority on {}:{}",
address, net_cfg.host, net_cfg.port
);

if let Err(e) = make_server(
net_cfg,
&Committee::from(&network_config),
network_config.buffer_size,
)
.await
.unwrap()
.spawn()
.await
.unwrap()
.join()
.await
{
error!("Validator server ended with an error: {e}");
}

Ok(())
}