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

Refactor node configs to remove local-only addresses from genesis #6629

Merged
merged 1 commit into from
Dec 10, 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
117 changes: 70 additions & 47 deletions crates/sui-config/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@

use crate::{
genesis,
genesis_config::{GenesisConfig, ValidatorGenesisInfo},
genesis_config::{GenesisConfig, ValidatorConfigInfo, ValidatorGenesisInfo},
p2p::P2pConfig,
utils, ConsensusConfig, NetworkConfig, NodeConfig, ValidatorInfo, AUTHORITIES_DB_NAME,
CONSENSUS_DB_NAME,
};
use fastcrypto::encoding::{Encoding, Hex};
use multiaddr::Multiaddr;
use rand::rngs::OsRng;
use std::{
num::NonZeroUsize,
Expand All @@ -23,7 +24,7 @@ use sui_types::crypto::{

pub enum CommitteeConfig {
Size(NonZeroUsize),
Validators(Vec<ValidatorGenesisInfo>),
Validators(Vec<ValidatorConfigInfo>),
}

enum ValidatorIpSelection {
Expand Down Expand Up @@ -82,7 +83,7 @@ impl<R> ConfigBuilder<R> {
self
}

pub fn with_validators(mut self, validators: Vec<ValidatorGenesisInfo>) -> Self {
pub fn with_validators(mut self, validators: Vec<ValidatorConfigInfo>) -> Self {
self.committee = Some(CommitteeConfig::Validators(validators));
self
}
Expand Down Expand Up @@ -155,14 +156,19 @@ impl<R: rand::RngCore + rand::CryptoRng> ConfigBuilder<R> {
worker_key_pair: NetworkKeyPair,
account_key_pair: SuiKeyPair,
network_key_pair: NetworkKeyPair,
) -> ValidatorGenesisInfo {
) -> ValidatorConfigInfo {
match self.validator_ip_sel {
ValidatorIpSelection::Localhost => ValidatorGenesisInfo::from_localhost_for_testing(
key_pair,
worker_key_pair,
account_key_pair,
network_key_pair,
),
ValidatorIpSelection::Localhost => ValidatorConfigInfo {
genesis_info: ValidatorGenesisInfo::from_localhost_for_testing(
key_pair,
worker_key_pair,
account_key_pair,
network_key_pair,
),
consensus_address: utils::new_tcp_network_address(),
consensus_internal_worker_address: None,
},

ValidatorIpSelection::Simulator => {
// we will probably never run this many validators in a sim
let low_octet = index + 1;
Expand All @@ -171,38 +177,48 @@ impl<R: rand::RngCore + rand::CryptoRng> ConfigBuilder<R> {
}

let ip = format!("10.10.0.{}", low_octet);
let make_tcp_addr = |port: u16| -> Multiaddr {
format!("/ip4/{}/tcp/{}/http", ip, port).parse().unwrap()
};

ValidatorGenesisInfo::from_base_ip(
key_pair,
worker_key_pair,
account_key_pair,
network_key_pair,
ip,
index,
)
ValidatorConfigInfo {
genesis_info: ValidatorGenesisInfo::from_base_ip(
key_pair,
worker_key_pair,
account_key_pair,
network_key_pair,
ip.clone(),
index,
),
consensus_address: make_tcp_addr(4000 + index as u16),
consensus_internal_worker_address: None,
}
}
}
}

fn build_with_validators(
self,
mut rng: R,
validators: Vec<ValidatorGenesisInfo>,
validators: Vec<ValidatorConfigInfo>,
) -> NetworkConfig {
let validator_set = validators
.iter()
.enumerate()
.map(|(i, validator)| {
let name = format!("validator-{i}");
let protocol_key: AuthorityPublicKeyBytes = validator.key_pair.public().into();
let account_key: PublicKey = validator.account_key_pair.public();
let network_key: NetworkPublicKey = validator.network_key_pair.public().clone();
let worker_key: NetworkPublicKey = validator.worker_key_pair.public().clone();
let stake = validator.stake;
let network_address = validator.network_address.clone();
let protocol_key: AuthorityPublicKeyBytes =
validator.genesis_info.key_pair.public().into();
let account_key: PublicKey = validator.genesis_info.account_key_pair.public();
let network_key: NetworkPublicKey =
validator.genesis_info.network_key_pair.public().clone();
let worker_key: NetworkPublicKey =
validator.genesis_info.worker_key_pair.public().clone();
let stake = validator.genesis_info.stake;
let network_address = validator.genesis_info.network_address.clone();
let pop = generate_proof_of_possession(
&validator.key_pair,
(&validator.account_key_pair.public()).into(),
&validator.genesis_info.key_pair,
(&validator.genesis_info.account_key_pair.public()).into(),
);

(
Expand All @@ -214,16 +230,18 @@ impl<R: rand::RngCore + rand::CryptoRng> ConfigBuilder<R> {
account_key,
stake,
delegation: 0, // no delegation yet at genesis
gas_price: validator.gas_price,
commission_rate: validator.commission_rate,
gas_price: validator.genesis_info.gas_price,
commission_rate: validator.genesis_info.commission_rate,
network_address,
p2p_address: validator.p2p_address.clone(),
narwhal_primary_address: validator.narwhal_primary_address.clone(),
narwhal_worker_address: validator.narwhal_worker_address.clone(),
narwhal_internal_worker_address: validator
.narwhal_internal_worker_address
p2p_address: validator.genesis_info.p2p_address.clone(),
narwhal_primary_address: validator
.genesis_info
.narwhal_primary_address
.clone(),
narwhal_worker_address: validator
.genesis_info
.narwhal_worker_address
.clone(),
narwhal_consensus_address: validator.narwhal_consensus_address.clone(),
},
pop,
)
Expand All @@ -250,36 +268,41 @@ impl<R: rand::RngCore + rand::CryptoRng> ConfigBuilder<R> {
let validator_configs = validators
.into_iter()
.map(|validator| {
let public_key: AuthorityPublicKeyBytes = validator.key_pair.public().into();
let public_key: AuthorityPublicKeyBytes =
validator.genesis_info.key_pair.public().into();
let db_path = self
.config_directory
.join(AUTHORITIES_DB_NAME)
.join(Hex::encode(public_key));
let network_address = validator.network_address;
let consensus_address = validator.narwhal_consensus_address;
let network_address = validator.genesis_info.network_address;
let consensus_address = validator.consensus_address;
let consensus_db_path = self
.config_directory
.join(CONSENSUS_DB_NAME)
.join(Hex::encode(public_key));
let internal_worker_address = validator.consensus_internal_worker_address;
let consensus_config = ConsensusConfig {
consensus_address,
consensus_db_path,
address: consensus_address,
db_path: consensus_db_path,
internal_worker_address,
timeout_secs: Some(60),
narwhal_config: Default::default(),
};

let p2p_config = P2pConfig {
listen_address: utils::udp_multiaddr_to_listen_address(&validator.p2p_address)
.unwrap(),
external_address: Some(validator.p2p_address),
listen_address: utils::udp_multiaddr_to_listen_address(
&validator.genesis_info.p2p_address,
)
.unwrap(),
external_address: Some(validator.genesis_info.p2p_address),
..Default::default()
};

NodeConfig {
protocol_key_pair: Arc::new(validator.key_pair),
worker_key_pair: Arc::new(validator.worker_key_pair),
account_key_pair: Arc::new(validator.account_key_pair),
network_key_pair: Arc::new(validator.network_key_pair),
protocol_key_pair: Arc::new(validator.genesis_info.key_pair),
worker_key_pair: Arc::new(validator.genesis_info.worker_key_pair),
account_key_pair: Arc::new(validator.genesis_info.account_key_pair),
network_key_pair: Arc::new(validator.genesis_info.network_key_pair),
db_path,
network_address,
metrics_address: utils::available_local_socket_address(),
Expand Down
38 changes: 1 addition & 37 deletions crates/sui-config/src/genesis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ use move_binary_format::CompiledModule;
use move_core_types::ident_str;
use move_core_types::language_storage::ModuleId;
use move_vm_runtime::native_functions::NativeFunctionTable;
use narwhal_crypto::NetworkPublicKey;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde_with::serde_as;
use std::collections::BTreeMap;
Expand All @@ -21,8 +20,7 @@ use sui_adapter::{adapter, execution_mode};
use sui_types::base_types::ObjectID;
use sui_types::base_types::TransactionDigest;
use sui_types::chain_id::ChainId;
use sui_types::crypto::{AuthorityPublicKey, ToFromBytes};
use sui_types::crypto::{AuthorityPublicKeyBytes, AuthoritySignature};
use sui_types::crypto::{AuthorityPublicKeyBytes, AuthoritySignature, ToFromBytes};
use sui_types::gas::SuiGasStatus;
use sui_types::in_memory_storage::InMemoryStorage;
use sui_types::messages::CallArg;
Expand Down Expand Up @@ -101,38 +99,6 @@ impl Genesis {
}))
}

#[allow(clippy::mutable_key_type)]
pub fn narwhal_worker_cache(&self) -> narwhal_config::SharedWorkerCache {
let workers = self
.validator_set
.iter()
.map(|validator| {
let name = AuthorityPublicKey::from_bytes(validator.protocol_key().as_ref())
.expect("Can't get protocol key");
let workers = [(
0, // worker_id
narwhal_config::WorkerInfo {
name: NetworkPublicKey::from_bytes(validator.worker_key().as_ref())
.expect("Can't get worker key"),
transactions: validator.narwhal_consensus_address.clone(),
worker_address: validator.narwhal_worker_address.clone(),
internal_worker_address: validator.narwhal_internal_worker_address.clone(),
},
)]
.into_iter()
.collect();
let worker_index = narwhal_config::WorkerIndex(workers);

(name, worker_index)
})
.collect();
narwhal_config::WorkerCache {
workers,
epoch: self.epoch() as narwhal_config::Epoch,
}
.into()
}

pub fn sui_system_object(&self) -> SuiSystemState {
let sui_system_object = self
.objects()
Expand Down Expand Up @@ -689,8 +655,6 @@ mod test {
p2p_address: utils::new_udp_network_address(),
narwhal_primary_address: utils::new_udp_network_address(),
narwhal_worker_address: utils::new_udp_network_address(),
narwhal_internal_worker_address: None,
narwhal_consensus_address: utils::new_tcp_network_address(),
};
let pop = generate_proof_of_possession(&key, account_key.public().into());
let builder = Builder::new()
Expand Down
18 changes: 10 additions & 8 deletions crates/sui-config/src/genesis_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,17 @@ use crate::node::DEFAULT_GRPC_CONCURRENCY_LIMIT;
use crate::Config;
use crate::{utils, DEFAULT_COMMISSION_RATE, DEFAULT_GAS_PRICE, DEFAULT_STAKE};

// All information needed to build a NodeConfig for a validator.
#[derive(Serialize, Deserialize)]
pub struct ValidatorConfigInfo {
pub genesis_info: ValidatorGenesisInfo,
pub consensus_address: Multiaddr,
pub consensus_internal_worker_address: Option<Multiaddr>,
}

#[derive(Serialize, Deserialize)]
pub struct GenesisConfig {
pub validator_genesis_info: Option<Vec<ValidatorGenesisInfo>>,
pub validator_config_info: Option<Vec<ValidatorConfigInfo>>,
pub parameters: GenesisChainParameters,
pub committee_size: usize,
pub grpc_load_shed: Option<bool>,
Expand Down Expand Up @@ -108,8 +116,6 @@ pub struct ValidatorGenesisInfo {
pub commission_rate: u64,
pub narwhal_primary_address: Multiaddr,
pub narwhal_worker_address: Multiaddr,
pub narwhal_internal_worker_address: Option<Multiaddr>,
pub narwhal_consensus_address: Multiaddr,
}

impl ValidatorGenesisInfo {
Expand All @@ -131,8 +137,6 @@ impl ValidatorGenesisInfo {
commission_rate: DEFAULT_COMMISSION_RATE,
narwhal_primary_address: utils::new_udp_network_address(),
narwhal_worker_address: utils::new_udp_network_address(),
narwhal_internal_worker_address: None,
narwhal_consensus_address: utils::new_tcp_network_address(),
}
}

Expand Down Expand Up @@ -165,8 +169,6 @@ impl ValidatorGenesisInfo {
commission_rate: DEFAULT_COMMISSION_RATE,
narwhal_primary_address: make_udp_addr(2000 + port_offset),
narwhal_worker_address: make_udp_addr(3000 + port_offset),
narwhal_internal_worker_address: None,
narwhal_consensus_address: make_tcp_addr(4000 + port_offset),
}
}
}
Expand Down Expand Up @@ -295,7 +297,7 @@ impl GenesisConfig {
impl Default for GenesisConfig {
fn default() -> Self {
Self {
validator_genesis_info: None,
validator_config_info: None,
parameters: Default::default(),
committee_size: DEFAULT_NUMBER_OF_AUTHORITIES,
grpc_load_shed: None,
Expand Down
Loading