From 8169cedef7db0cf3992913d7c2bcc89ed9a64b01 Mon Sep 17 00:00:00 2001
From: Xun Li
Date: Tue, 16 May 2023 22:45:37 -0700
Subject: [PATCH] Consolidate IP and node/config management in tests
---
Cargo.lock | 2 +-
crates/mysten-network/src/multiaddr.rs | 49 +-
crates/sui-benchmark/Cargo.toml | 1 +
crates/sui-benchmark/src/benchmark_setup.rs | 24 +-
crates/sui-benchmark/tests/simtest.rs | 46 +-
crates/sui-cluster-test/src/cluster.rs | 2 +-
crates/sui-config/src/lib.rs | 2 +-
crates/sui-config/src/local_ip_utils.rs | 140 +++++
crates/sui-config/src/node.rs | 11 +
crates/sui-config/src/utils.rs | 83 ---
.../src/quorum_driver/reconfig_observer.rs | 4 +-
crates/sui-core/src/test_utils.rs | 9 +-
crates/sui-framework/src/lib.rs | 2 +-
crates/sui-genesis-builder/src/lib.rs | 10 +-
crates/sui-json-rpc/tests/routing_tests.rs | 27 +-
.../sui-json-rpc/tests/subscription_tests.rs | 2 +-
crates/sui-node/src/handle.rs | 6 +
crates/sui-node/src/lib.rs | 5 +
crates/sui-rosetta/tests/rosetta_client.rs | 8 +-
crates/sui-surfer/src/surfer_state.rs | 6 +
crates/sui-swarm-config/Cargo.toml | 1 +
crates/sui-swarm-config/src/genesis_config.rs | 229 +++-----
crates/sui-swarm-config/src/lib.rs | 1 +
.../src/network_config_builder.rs | 497 ++----------------
.../src/node_config_builder.rs | 301 +++++++++++
crates/sui-swarm/src/memory/container-sim.rs | 3 +-
crates/sui-swarm/src/memory/swarm.rs | 161 +++---
crates/sui/src/fire_drill.rs | 14 +-
crates/sui/src/generate_genesis_checkpoint.rs | 10 +-
crates/sui/src/genesis_ceremony.rs | 10 +-
crates/sui/src/sui_commands.rs | 29 +-
crates/sui/src/unit_tests/cli_tests.rs | 2 +-
crates/sui/tests/full_node_tests.rs | 124 ++---
.../tests/onsite_reconfig_observer_tests.rs | 30 +-
crates/sui/tests/protocol_version_tests.rs | 17 +-
crates/sui/tests/reconfiguration_tests.rs | 6 +-
crates/sui/tests/simulator_tests.rs | 4 +-
.../tests/transaction_orchestrator_tests.rs | 87 +--
crates/test-utils/Cargo.toml | 2 -
crates/test-utils/src/authority.rs | 30 +-
crates/test-utils/src/network.rs | 144 ++---
narwhal/node/src/metrics.rs | 6 +-
42 files changed, 1069 insertions(+), 1078 deletions(-)
create mode 100644 crates/sui-config/src/local_ip_utils.rs
delete mode 100644 crates/sui-config/src/utils.rs
create mode 100644 crates/sui-swarm-config/src/node_config_builder.rs
diff --git a/Cargo.lock b/Cargo.lock
index fd6dacade5522..4de48ee9df609 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -9492,6 +9492,7 @@ dependencies = [
"sui-protocol-config",
"sui-sdk",
"sui-simulator",
+ "sui-swarm",
"sui-swarm-config",
"sui-test-transaction-builder",
"sui-types",
@@ -11213,7 +11214,6 @@ dependencies = [
"move-core-types",
"move-package",
"mysten-metrics",
- "mysten-network",
"prometheus",
"rand 0.8.5",
"serde_json",
diff --git a/crates/mysten-network/src/multiaddr.rs b/crates/mysten-network/src/multiaddr.rs
index 632cad3b7bf83..902ef8f549395 100644
--- a/crates/mysten-network/src/multiaddr.rs
+++ b/crates/mysten-network/src/multiaddr.rs
@@ -84,6 +84,22 @@ impl Multiaddr {
}
}
+ // Converts a /ip{4,6}/-/tcp/-[/-] Multiaddr to SocketAddr.
+ // Useful when an external library only accepts SocketAddr, e.g. to start a local server.
+ // See `client::endpoint_from_multiaddr()` for converting to Endpoint for clients.
+ pub fn to_socket_addr(&self) -> Result {
+ let mut iter = self.iter();
+ let ip = match iter.next().ok_or_else(|| {
+ eyre!("failed to convert to SocketAddr: Multiaddr does not contain IP")
+ })? {
+ Protocol::Ip4(ip4_addr) => IpAddr::V4(ip4_addr),
+ Protocol::Ip6(ip6_addr) => IpAddr::V6(ip6_addr),
+ unsupported => return Err(eyre!("unsupported protocol {unsupported}")),
+ };
+ let tcp_port = parse_tcp(&mut iter)?;
+ Ok(SocketAddr::new(ip, tcp_port))
+ }
+
/// Set the ip address to `0.0.0.0`. For instance, it converts the following address
/// `/ip4/155.138.174.208/tcp/1500/http` into `/ip4/0.0.0.0/tcp/1500/http`.
pub fn zero_ip_multi_address(&self) -> Self {
@@ -151,23 +167,6 @@ impl<'de> serde::Deserialize<'de> for Multiaddr {
}
}
-// Converts a /ip{4,6}/-/tcp/-[/-] Multiaddr to SocketAddr.
-// Useful when an external library only accepts SocketAddr, e.g. to start a local server.
-// See `client::endpoint_from_multiaddr()` for converting to Endpoint for clients.
-pub fn to_socket_addr(addr: &Multiaddr) -> Result {
- let mut iter = addr.iter();
- let ip = match iter
- .next()
- .ok_or_else(|| eyre!("failed to convert to SocketAddr: Multiaddr does not contain IP"))?
- {
- Protocol::Ip4(ip4_addr) => IpAddr::V4(ip4_addr),
- Protocol::Ip6(ip6_addr) => IpAddr::V6(ip6_addr),
- unsupported => return Err(eyre!("unsupported protocol {unsupported}")),
- };
- let tcp_port = parse_tcp(&mut iter)?;
- Ok(SocketAddr::new(ip, tcp_port))
-}
-
pub(crate) fn parse_tcp<'a, T: Iterator- >>(protocols: &mut T) -> Result {
if let Protocol::Tcp(port) = protocols
.next()
@@ -275,25 +274,29 @@ pub(crate) fn parse_unix(address: &Multiaddr) -> Result<(Cow<'_, str>, &'static
#[cfg(test)]
mod test {
- use super::{to_socket_addr, Multiaddr};
+ use super::Multiaddr;
use multiaddr::multiaddr;
#[test]
fn test_to_socket_addr_basic() {
let multi_addr_ipv4 = Multiaddr(multiaddr!(Ip4([127, 0, 0, 1]), Tcp(10500u16)));
- let socket_addr_ipv4 =
- to_socket_addr(&multi_addr_ipv4).expect("Couldn't convert to socket addr");
+ let socket_addr_ipv4 = multi_addr_ipv4
+ .to_socket_addr()
+ .expect("Couldn't convert to socket addr");
assert_eq!(socket_addr_ipv4.to_string(), "127.0.0.1:10500");
let multi_addr_ipv6 = Multiaddr(multiaddr!(Ip6([172, 0, 0, 1, 1, 1, 1, 1]), Tcp(10500u16)));
- let socket_addr_ipv6 =
- to_socket_addr(&multi_addr_ipv6).expect("Couldn't convert to socket addr");
+ let socket_addr_ipv6 = multi_addr_ipv6
+ .to_socket_addr()
+ .expect("Couldn't convert to socket addr");
assert_eq!(socket_addr_ipv6.to_string(), "[ac::1:1:1:1:1]:10500");
}
#[test]
fn test_to_socket_addr_unsupported_protocol() {
let multi_addr_dns = Multiaddr(multiaddr!(Dnsaddr("mysten.sui"), Tcp(10500u16)));
- let _ = to_socket_addr(&multi_addr_dns).expect_err("DNS is unsupported");
+ let _ = multi_addr_dns
+ .to_socket_addr()
+ .expect_err("DNS is unsupported");
}
}
diff --git a/crates/sui-benchmark/Cargo.toml b/crates/sui-benchmark/Cargo.toml
index 2bf5d056e8fcf..552335aaaaff1 100644
--- a/crates/sui-benchmark/Cargo.toml
+++ b/crates/sui-benchmark/Cargo.toml
@@ -38,6 +38,7 @@ sui-json-rpc-types = { path = "../sui-json-rpc-types" }
sui-protocol-config = { path = "../sui-protocol-config" }
sui-test-transaction-builder = { path = "../sui-test-transaction-builder" }
sui-swarm-config = { path = "../sui-swarm-config" }
+sui-swarm = { path = "../sui-swarm" }
telemetry-subscribers.workspace = true
roaring = "0.10.1"
regex = "1.7.1"
diff --git a/crates/sui-benchmark/src/benchmark_setup.rs b/crates/sui-benchmark/src/benchmark_setup.rs
index fb75a1766c6d1..d819568b820df 100644
--- a/crates/sui-benchmark/src/benchmark_setup.rs
+++ b/crates/sui-benchmark/src/benchmark_setup.rs
@@ -1,24 +1,28 @@
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
+
use crate::bank::BenchmarkBank;
use crate::options::Opts;
use crate::util::get_ed25519_keypair_from_keystore;
use crate::{FullNodeProxy, LocalValidatorAggregatorProxy, ValidatorProxy};
use anyhow::{anyhow, bail, Context, Result};
use prometheus::Registry;
+use rand::rngs::OsRng;
use rand::seq::SliceRandom;
use std::path::PathBuf;
use std::sync::Arc;
use std::thread::JoinHandle;
use std::time::Duration;
-use sui_config::utils;
+use sui_config::local_ip_utils;
+use sui_config::node::ExpensiveSafetyCheckConfig;
+use sui_swarm_config::node_config_builder::FullnodeConfigBuilder;
use sui_types::base_types::ObjectID;
use sui_types::base_types::SuiAddress;
use sui_types::crypto::{deterministic_random_account_key, AccountKeyPair};
use sui_types::object::generate_max_test_gas_objects_with_owner;
use sui_types::object::Owner;
+use test_utils::authority::spawn_test_authorities;
use test_utils::authority::test_and_configure_authority_configs_with_objects;
-use test_utils::authority::{spawn_fullnode, spawn_test_authorities};
use tokio::runtime::Builder;
use tokio::sync::{oneshot, Barrier};
use tokio::time::sleep;
@@ -112,8 +116,8 @@ impl Env {
.clone();
// Make the client runtime wait until we are done creating genesis objects
let cloned_config = config.clone();
- let fullnode_ip = format!("{}", utils::get_local_ip_for_tests());
- let fullnode_rpc_port = utils::get_available_port(&fullnode_ip);
+ let fullnode_ip = local_ip_utils::localhost_for_testing();
+ let fullnode_rpc_port = local_ip_utils::get_available_port(&fullnode_ip);
let fullnode_barrier = Arc::new(Barrier::new(2));
let fullnode_barrier_clone = fullnode_barrier.clone();
// spawn a thread to spin up sui nodes on the multi-threaded server runtime.
@@ -130,7 +134,17 @@ impl Env {
server_runtime.block_on(async move {
// Setup the network
let _validators: Vec<_> = spawn_test_authorities(&cloned_config).await;
- let _fullnode = spawn_fullnode(&cloned_config, Some(fullnode_rpc_port)).await;
+
+ let node_config = FullnodeConfigBuilder::new()
+ .with_rpc_port(fullnode_rpc_port)
+ .with_expensive_safety_check_config(
+ ExpensiveSafetyCheckConfig::new_disable_all(),
+ )
+ .build(&mut OsRng, &cloned_config);
+ let node = sui_swarm::memory::Node::new(node_config);
+ node.start().await.unwrap();
+ let _fullnode = node.get_node_handle().unwrap();
+
fullnode_barrier_clone.wait().await;
barrier.wait().await;
recv.await.expect("Unable to wait for terminate signal");
diff --git a/crates/sui-benchmark/tests/simtest.rs b/crates/sui-benchmark/tests/simtest.rs
index 16975529f4a15..64be04304a175 100644
--- a/crates/sui-benchmark/tests/simtest.rs
+++ b/crates/sui-benchmark/tests/simtest.rs
@@ -4,6 +4,7 @@
#[cfg(msim)]
mod test {
use rand::{distributions::uniform::SampleRange, thread_rng, Rng};
+ use std::collections::HashSet;
use std::path::PathBuf;
use std::str::FromStr;
use std::sync::atomic::{AtomicBool, Ordering};
@@ -102,16 +103,35 @@ mod test {
test_simulated_load(TestInitData::new(&test_cluster).await, 120).await;
}
+ /// Get a list of nodes that we don't want to kill in the crash recovery tests.
+ /// This includes the client node which is the node that is running the test, as well as
+ /// rpc fullnode which are needed to run the benchmark.
+ fn get_keep_alive_nodes(cluster: &TestCluster) -> HashSet {
+ let mut keep_alive_nodes = HashSet::new();
+ // The first fullnode in the swarm ins the rpc fullnode.
+ keep_alive_nodes.insert(
+ cluster
+ .swarm
+ .fullnodes()
+ .next()
+ .unwrap()
+ .get_node_handle()
+ .unwrap()
+ .with(|n| n.get_sim_node_id()),
+ );
+ keep_alive_nodes.insert(sui_simulator::current_simnode_id());
+ keep_alive_nodes
+ }
+
fn handle_failpoint(
dead_validator: Arc>>,
- client_node: sui_simulator::task::NodeId,
+ keep_alive_nodes: HashSet,
probability: f64,
) {
let mut dead_validator = dead_validator.lock().unwrap();
let cur_node = sui_simulator::current_simnode_id();
- // never kill the client node (which is running the test)
- if cur_node == client_node {
+ if keep_alive_nodes.contains(&cur_node) {
return;
}
@@ -167,7 +187,8 @@ mod test {
let dead_validator_orig: Arc>> = Default::default();
let dead_validator = dead_validator_orig.clone();
- let client_node = sui_simulator::current_simnode_id();
+ let keep_alive_nodes = get_keep_alive_nodes(&test_cluster);
+ let keep_alive_nodes_clone = keep_alive_nodes.clone();
register_fail_points(
&[
"batch-write-before",
@@ -180,20 +201,23 @@ mod test {
"highest-executed-checkpoint",
],
move || {
- handle_failpoint(dead_validator.clone(), client_node, 0.02);
+ handle_failpoint(dead_validator.clone(), keep_alive_nodes_clone.clone(), 0.02);
},
);
let dead_validator = dead_validator_orig.clone();
+ let keep_alive_nodes_clone = keep_alive_nodes.clone();
register_fail_point_async("crash", move || {
let dead_validator = dead_validator.clone();
+ let keep_alive_nodes_clone = keep_alive_nodes_clone.clone();
async move {
- handle_failpoint(dead_validator.clone(), client_node, 0.01);
+ handle_failpoint(dead_validator.clone(), keep_alive_nodes_clone.clone(), 0.01);
}
});
// Narwhal fail points.
let dead_validator = dead_validator_orig.clone();
+ let keep_alive_nodes_clone = keep_alive_nodes.clone();
register_fail_points(
&[
"narwhal-rpc-response",
@@ -201,7 +225,11 @@ mod test {
"narwhal-store-after-write",
],
move || {
- handle_failpoint(dead_validator.clone(), client_node, 0.001);
+ handle_failpoint(
+ dead_validator.clone(),
+ keep_alive_nodes_clone.clone(),
+ 0.001,
+ );
},
);
register_fail_point_async("narwhal-delay", || delay_failpoint(10..20, 0.001));
@@ -215,9 +243,9 @@ mod test {
let test_cluster = build_test_cluster(4, 10000).await;
let dead_validator: Arc>> = Default::default();
- let client_node = sui_simulator::current_simnode_id();
+ let keep_alive_nodes = get_keep_alive_nodes(&test_cluster);
register_fail_points(&["before-open-new-epoch-store"], move || {
- handle_failpoint(dead_validator.clone(), client_node, 1.0);
+ handle_failpoint(dead_validator.clone(), keep_alive_nodes.clone(), 1.0);
});
test_simulated_load(TestInitData::new(&test_cluster).await, 120).await;
}
diff --git a/crates/sui-cluster-test/src/cluster.rs b/crates/sui-cluster-test/src/cluster.rs
index 62ad61ebe7f20..087f05b5b535a 100644
--- a/crates/sui-cluster-test/src/cluster.rs
+++ b/crates/sui-cluster-test/src/cluster.rs
@@ -186,7 +186,7 @@ impl Cluster for LocalNewCluster {
cluster_builder = cluster_builder.with_epoch_duration_ms(epoch_duration_ms);
}
if let Some(rpc_port) = fullnode_port {
- cluster_builder = cluster_builder.set_fullnode_rpc_port(rpc_port);
+ cluster_builder = cluster_builder.with_fullnode_rpc_port(rpc_port);
}
let mut test_cluster = cluster_builder.build().await?;
diff --git a/crates/sui-config/src/lib.rs b/crates/sui-config/src/lib.rs
index cfe94f2d3b02e..5d0f8481099c6 100644
--- a/crates/sui-config/src/lib.rs
+++ b/crates/sui-config/src/lib.rs
@@ -11,11 +11,11 @@ use tracing::trace;
pub mod certificate_deny_config;
pub mod genesis;
+pub mod local_ip_utils;
pub mod node;
pub mod node_config_metrics;
pub mod p2p;
pub mod transaction_deny_config;
-pub mod utils;
pub use node::{ConsensusConfig, NodeConfig};
diff --git a/crates/sui-config/src/local_ip_utils.rs b/crates/sui-config/src/local_ip_utils.rs
new file mode 100644
index 0000000000000..a730891274c03
--- /dev/null
+++ b/crates/sui-config/src/local_ip_utils.rs
@@ -0,0 +1,140 @@
+// Copyright (c) Mysten Labs, Inc.
+// SPDX-License-Identifier: Apache-2.0
+
+use std::net::SocketAddr;
+#[cfg(msim)]
+use std::sync::{atomic::AtomicI16, Arc};
+use sui_types::multiaddr::Multiaddr;
+
+/// A singleton struct to manage IP addresses and ports for simtest.
+/// This allows us to generate unique IP addresses and ports for each node in simtest.
+#[cfg(msim)]
+pub struct SimAddressManager {
+ next_ip_offset: AtomicI16,
+ next_port: AtomicI16,
+}
+
+#[cfg(msim)]
+impl SimAddressManager {
+ pub fn new() -> Self {
+ Self {
+ next_ip_offset: AtomicI16::new(1),
+ next_port: AtomicI16::new(9000),
+ }
+ }
+
+ pub fn get_next_ip(&self) -> String {
+ let offset = self
+ .next_ip_offset
+ .fetch_add(1, std::sync::atomic::Ordering::SeqCst);
+ // If offset ever goes beyond 255, we could use more bytes in the IP.
+ assert!(offset <= 255);
+ format!("10.10.0.{}", offset)
+ }
+
+ pub fn get_next_available_port(&self) -> u16 {
+ self.next_port
+ .fetch_add(1, std::sync::atomic::Ordering::SeqCst) as u16
+ }
+}
+
+#[cfg(msim)]
+fn get_sim_address_manager() -> Arc {
+ thread_local! {
+ // Uses Arc so that we could return a clone of the thread local singleton.
+ static SIM_ADDRESS_MANAGER: Arc = Arc::new(SimAddressManager::new());
+ }
+ SIM_ADDRESS_MANAGER.with(|s| s.clone())
+}
+
+/// In simtest, we generate a new unique IP each time this function is called.
+#[cfg(msim)]
+pub fn get_new_ip() -> String {
+ get_sim_address_manager().get_next_ip()
+}
+
+/// In non-simtest, we always only have one IP address which is localhost.
+#[cfg(not(msim))]
+pub fn get_new_ip() -> String {
+ localhost_for_testing()
+}
+
+/// Returns localhost, which is always 127.0.0.1.
+pub fn localhost_for_testing() -> String {
+ "127.0.0.1".to_string()
+}
+
+/// Returns an available port for the given host in simtest.
+/// We don't care about host because it's all managed by simulator. Just obtain a unique port.
+#[cfg(msim)]
+pub fn get_available_port(_host: &str) -> u16 {
+ get_sim_address_manager().get_next_available_port()
+}
+
+/// Return an ephemeral, available port. On unix systems, the port returned will be in the
+/// TIME_WAIT state ensuring that the OS won't hand out this port for some grace period.
+/// Callers should be able to bind to this port given they use SO_REUSEADDR.
+#[cfg(not(msim))]
+pub fn get_available_port(host: &str) -> u16 {
+ const MAX_PORT_RETRIES: u32 = 1000;
+
+ for _ in 0..MAX_PORT_RETRIES {
+ if let Ok(port) = get_ephemeral_port(host) {
+ return port;
+ }
+ }
+
+ panic!("Error: could not find an available port");
+}
+
+#[cfg(not(msim))]
+fn get_ephemeral_port(host: &str) -> std::io::Result {
+ use std::net::{TcpListener, TcpStream};
+
+ // Request a random available port from the OS
+ let listener = TcpListener::bind((host, 0))?;
+ let addr = listener.local_addr()?;
+
+ // Create and accept a connection (which we'll promptly drop) in order to force the port
+ // into the TIME_WAIT state, ensuring that the port will be reserved from some limited
+ // amount of time (roughly 60s on some Linux systems)
+ let _sender = TcpStream::connect(addr)?;
+ let _incoming = listener.accept()?;
+
+ Ok(addr.port())
+}
+
+/// Returns a new unique TCP address for the given host, by finding a new available port.
+pub fn new_tcp_address_for_testing(host: &str) -> Multiaddr {
+ format!("/ip4/{}/tcp/{}/http", host, get_available_port(host))
+ .parse()
+ .unwrap()
+}
+
+/// Returns a new unique UDP address for the given host, by finding a new available port.
+pub fn new_udp_address_for_testing(host: &str) -> Multiaddr {
+ format!("/ip4/{}/udp/{}", host, get_available_port(host))
+ .parse()
+ .unwrap()
+}
+
+/// Returns a new unique TCP address (SocketAddr) for localhost, by finding a new available port on localhost.
+pub fn new_local_tcp_socket_for_testing() -> SocketAddr {
+ format!(
+ "{}:{}",
+ localhost_for_testing(),
+ get_available_port(&localhost_for_testing())
+ )
+ .parse()
+ .unwrap()
+}
+
+/// Returns a new unique TCP address (Multiaddr) for localhost, by finding a new available port on localhost.
+pub fn new_local_tcp_address_for_testing() -> Multiaddr {
+ new_tcp_address_for_testing(&localhost_for_testing())
+}
+
+/// Returns a new unique UDP address for localhost, by finding a new available port.
+pub fn new_local_udp_address_for_testing() -> Multiaddr {
+ new_udp_address_for_testing(&localhost_for_testing())
+}
diff --git a/crates/sui-config/src/node.rs b/crates/sui-config/src/node.rs
index ce19a65cd2ed5..da0593e203288 100644
--- a/crates/sui-config/src/node.rs
+++ b/crates/sui-config/src/node.rs
@@ -354,6 +354,17 @@ impl ExpensiveSafetyCheckConfig {
}
}
+ pub fn new_disable_all() -> Self {
+ Self {
+ enable_epoch_sui_conservation_check: false,
+ enable_deep_per_tx_sui_conservation_check: false,
+ force_disable_epoch_sui_conservation_check: true,
+ enable_state_consistency_check: false,
+ force_disable_state_consistency_check: true,
+ enable_move_vm_paranoid_checks: false,
+ }
+ }
+
pub fn enable_paranoid_checks(&mut self) {
self.enable_move_vm_paranoid_checks = true
}
diff --git a/crates/sui-config/src/utils.rs b/crates/sui-config/src/utils.rs
deleted file mode 100644
index 4bb7eeeb7a365..0000000000000
--- a/crates/sui-config/src/utils.rs
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) Mysten Labs, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-use std::net::{IpAddr, TcpListener, TcpStream};
-
-/// Return an ephemeral, available port. On unix systems, the port returned will be in the
-/// TIME_WAIT state ensuring that the OS won't hand out this port for some grace period.
-/// Callers should be able to bind to this port given they use SO_REUSEADDR.
-pub fn get_available_port(host: &str) -> u16 {
- const MAX_PORT_RETRIES: u32 = 1000;
-
- for _ in 0..MAX_PORT_RETRIES {
- if let Ok(port) = get_ephemeral_port(host) {
- return port;
- }
- }
-
- panic!("Error: could not find an available port");
-}
-
-fn get_ephemeral_port(host: &str) -> std::io::Result {
- // Request a random available port from the OS
- let listener = TcpListener::bind((host, 0))?;
- let addr = listener.local_addr()?;
-
- // Create and accept a connection (which we'll promptly drop) in order to force the port
- // into the TIME_WAIT state, ensuring that the port will be reserved from some limited
- // amount of time (roughly 60s on some Linux systems)
- let _sender = TcpStream::connect(addr)?;
- let _incoming = listener.accept()?;
-
- Ok(addr.port())
-}
-
-pub fn new_tcp_network_address() -> sui_types::multiaddr::Multiaddr {
- let host = format!("{}", get_local_ip_for_tests());
- format!("/ip4/{}/tcp/{}/http", host, get_available_port(&host))
- .parse()
- .unwrap()
-}
-
-pub fn new_udp_network_address() -> sui_types::multiaddr::Multiaddr {
- let host = format!("{}", get_local_ip_for_tests());
- format!("/ip4/{}/udp/{}", host, get_available_port(&host))
- .parse()
- .unwrap()
-}
-
-pub fn available_local_socket_address() -> std::net::SocketAddr {
- let host = "127.0.0.1";
- format!("{}:{}", host, get_available_port(host))
- .parse()
- .unwrap()
-}
-
-pub fn available_network_socket_address() -> std::net::SocketAddr {
- let host = "127.0.0.1";
- format!("{}:{}", host, get_available_port(host))
- .parse()
- .unwrap()
-}
-
-pub fn socket_address_to_udp_multiaddr(
- address: std::net::SocketAddr,
-) -> sui_types::multiaddr::Multiaddr {
- match address {
- std::net::SocketAddr::V4(v4) => format!("/ip4/{}/udp/{}", v4.ip(), v4.port()),
- std::net::SocketAddr::V6(v6) => format!("/ip6/{}/udp/{}", v6.ip(), v6.port()),
- }
- .parse()
- .unwrap()
-}
-
-#[cfg(msim)]
-pub fn get_local_ip_for_tests() -> IpAddr {
- let node = sui_simulator::runtime::NodeHandle::current();
- node.ip().expect("Current node should have an IP")
-}
-
-#[cfg(not(msim))]
-pub fn get_local_ip_for_tests() -> IpAddr {
- "127.0.0.1".parse().unwrap()
-}
diff --git a/crates/sui-core/src/quorum_driver/reconfig_observer.rs b/crates/sui-core/src/quorum_driver/reconfig_observer.rs
index db7407d65cc90..a5b814d919b91 100644
--- a/crates/sui-core/src/quorum_driver/reconfig_observer.rs
+++ b/crates/sui-core/src/quorum_driver/reconfig_observer.rs
@@ -113,7 +113,9 @@ impl ReconfigObserver for OnsiteReconfigObserver {
Err(RecvError::Lagged(_)) => {
continue;
}
- Err(RecvError::Closed) => panic!("Do not expect the channel to be closed"),
+ Err(RecvError::Closed) => {
+ panic!("Do not expect the channel to be closed")
+ }
}
}
}
diff --git a/crates/sui-core/src/test_utils.rs b/crates/sui-core/src/test_utils.rs
index cd333836644ae..494aadbd1bafc 100644
--- a/crates/sui-core/src/test_utils.rs
+++ b/crates/sui-core/src/test_utils.rs
@@ -17,6 +17,7 @@ use std::path::PathBuf;
use std::sync::Arc;
use std::time::Duration;
use sui_config::genesis::Genesis;
+use sui_config::local_ip_utils;
use sui_framework::BuiltInFramework;
use sui_genesis_builder::validator_info::ValidatorInfo;
use sui_move_build::{BuildConfig, CompiledPackage, SuiPackageHooks};
@@ -233,10 +234,10 @@ async fn init_genesis(
network_key: network_key_pair.public().clone(),
gas_price: 1,
commission_rate: 0,
- network_address: sui_config::utils::new_tcp_network_address(),
- p2p_address: sui_config::utils::new_udp_network_address(),
- narwhal_primary_address: sui_config::utils::new_udp_network_address(),
- narwhal_worker_address: sui_config::utils::new_udp_network_address(),
+ network_address: local_ip_utils::new_local_tcp_address_for_testing(),
+ p2p_address: local_ip_utils::new_local_udp_address_for_testing(),
+ narwhal_primary_address: local_ip_utils::new_local_udp_address_for_testing(),
+ narwhal_worker_address: local_ip_utils::new_local_udp_address_for_testing(),
description: String::new(),
image_url: String::new(),
project_url: String::new(),
diff --git a/crates/sui-framework/src/lib.rs b/crates/sui-framework/src/lib.rs
index 19635d39dcd3d..8d5f660ef9d36 100644
--- a/crates/sui-framework/src/lib.rs
+++ b/crates/sui-framework/src/lib.rs
@@ -246,7 +246,7 @@ pub async fn compare_system_package(
};
if let Err(e) = compatibility.check(&cur_module, &new_module) {
- error!("Compatibility check failed, for new version of {id}: {e:?}");
+ error!("Compatibility check failed, for new version of {id}::{name}: {e:?}");
return None;
}
}
diff --git a/crates/sui-genesis-builder/src/lib.rs b/crates/sui-genesis-builder/src/lib.rs
index 9cf8cbe759a07..e5618dfe4fd5c 100644
--- a/crates/sui-genesis-builder/src/lib.rs
+++ b/crates/sui-genesis-builder/src/lib.rs
@@ -1093,9 +1093,9 @@ mod test {
use crate::Builder;
use fastcrypto::traits::KeyPair;
use sui_config::genesis::*;
+ use sui_config::local_ip_utils;
use sui_config::node::DEFAULT_COMMISSION_RATE;
use sui_config::node::DEFAULT_VALIDATOR_GAS_PRICE;
- use sui_config::utils;
use sui_types::base_types::SuiAddress;
use sui_types::crypto::{
generate_proof_of_possession, get_key_pair_from_rng, AccountKeyPair, AuthorityKeyPair,
@@ -1136,10 +1136,10 @@ mod test {
network_key: network_key.public().clone(),
gas_price: DEFAULT_VALIDATOR_GAS_PRICE,
commission_rate: DEFAULT_COMMISSION_RATE,
- network_address: utils::new_tcp_network_address(),
- p2p_address: utils::new_udp_network_address(),
- narwhal_primary_address: utils::new_udp_network_address(),
- narwhal_worker_address: utils::new_udp_network_address(),
+ network_address: local_ip_utils::new_local_tcp_address_for_testing(),
+ p2p_address: local_ip_utils::new_local_udp_address_for_testing(),
+ narwhal_primary_address: local_ip_utils::new_local_udp_address_for_testing(),
+ narwhal_worker_address: local_ip_utils::new_local_udp_address_for_testing(),
description: String::new(),
image_url: String::new(),
project_url: String::new(),
diff --git a/crates/sui-json-rpc/tests/routing_tests.rs b/crates/sui-json-rpc/tests/routing_tests.rs
index 817d3fa6f7cbe..9a861ef957c29 100644
--- a/crates/sui-json-rpc/tests/routing_tests.rs
+++ b/crates/sui-json-rpc/tests/routing_tests.rs
@@ -12,8 +12,7 @@ use jsonrpsee::RpcModule;
use jsonrpsee_proc_macros::rpc;
use prometheus::Registry;
use std::env;
-use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
-use sui_config::utils::get_available_port;
+use sui_config::local_ip_utils;
use sui_json_rpc::{JsonRpcServerBuilder, SuiRpcModule, CLIENT_TARGET_API_VERSION_HEADER};
use sui_open_rpc::Module;
use sui_open_rpc_macros::open_rpc;
@@ -23,15 +22,9 @@ async fn test_rpc_backward_compatibility() {
let mut builder = JsonRpcServerBuilder::new("1.5", &Registry::new());
builder.register_module(TestApiModule).unwrap();
- let port = get_available_port("0.0.0.0");
- let _handle = builder
- .start(
- SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, port)),
- None,
- )
- .await
- .unwrap();
- let url = format!("http://0.0.0.0:{}", port);
+ let address = local_ip_utils::new_local_tcp_socket_for_testing();
+ let _handle = builder.start(address, None).await.unwrap();
+ let url = format!("http://0.0.0.0:{}", address.port());
// Test with un-versioned client
let client = HttpClientBuilder::default().build(&url).unwrap();
@@ -108,15 +101,9 @@ async fn test_disable_routing() {
let mut builder = JsonRpcServerBuilder::new("1.5", &Registry::new());
builder.register_module(TestApiModule).unwrap();
- let port = get_available_port("0.0.0.0");
- let _handle = builder
- .start(
- SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, port)),
- None,
- )
- .await
- .unwrap();
- let url = format!("http://0.0.0.0:{}", port);
+ let address = local_ip_utils::new_local_tcp_socket_for_testing();
+ let _handle = builder.start(address, None).await.unwrap();
+ let url = format!("http://0.0.0.0:{}", address.port());
// try to access old method directly should fail
let client = HttpClientBuilder::default().build(&url).unwrap();
diff --git a/crates/sui-json-rpc/tests/subscription_tests.rs b/crates/sui-json-rpc/tests/subscription_tests.rs
index b29c52b2488a6..a6719e5de6d0f 100644
--- a/crates/sui-json-rpc/tests/subscription_tests.rs
+++ b/crates/sui-json-rpc/tests/subscription_tests.rs
@@ -34,7 +34,7 @@ async fn test_subscribe_transaction() -> Result<(), anyhow::Error> {
.unwrap();
let (_, _, digest) = wallet.create_devnet_nft(package_id).await;
- wait_for_tx(digest, cluster.fullnode_handle.sui_node.state().clone()).await;
+ wait_for_tx(digest, cluster.fullnode_handle.sui_node.state()).await;
// Wait for streaming
let effects = match timeout(Duration::from_secs(5), sub.next()).await {
diff --git a/crates/sui-node/src/handle.rs b/crates/sui-node/src/handle.rs
index 3b02a45622fda..cf13c6006d325 100644
--- a/crates/sui-node/src/handle.rs
+++ b/crates/sui-node/src/handle.rs
@@ -45,8 +45,10 @@
use super::SuiNode;
use std::future::Future;
use std::sync::Arc;
+use sui_core::authority::AuthorityState;
/// Wrap SuiNode to allow correct access to SuiNode in simulator tests.
+#[derive(Clone)]
pub struct SuiNodeHandle(Option>);
impl SuiNodeHandle {
@@ -62,6 +64,10 @@ impl SuiNodeHandle {
let _guard = self.guard();
cb(self.inner())
}
+
+ pub fn state(&self) -> Arc {
+ self.with(|sui_node| sui_node.state())
+ }
}
#[cfg(not(msim))]
diff --git a/crates/sui-node/src/lib.rs b/crates/sui-node/src/lib.rs
index 2acb158a9177b..b7c3a81be182e 100644
--- a/crates/sui-node/src/lib.rs
+++ b/crates/sui-node/src/lib.rs
@@ -1170,6 +1170,11 @@ impl SuiNode {
);
new_epoch_store
}
+
+ #[cfg(msim)]
+ pub fn get_sim_node_id(&self) -> sui_simulator::task::NodeId {
+ self.sim_node.id()
+ }
}
/// Notify state-sync that a new list of trusted peers are now available.
diff --git a/crates/sui-rosetta/tests/rosetta_client.rs b/crates/sui-rosetta/tests/rosetta_client.rs
index f8515457c7adb..855fb4d86dcbe 100644
--- a/crates/sui-rosetta/tests/rosetta_client.rs
+++ b/crates/sui-rosetta/tests/rosetta_client.rs
@@ -12,7 +12,7 @@ use serde::Serialize;
use serde_json::Value;
use tokio::task::JoinHandle;
-use sui_config::utils;
+use sui_config::local_ip_utils;
use sui_keys::keystore::AccountKeystore;
use sui_keys::keystore::Keystore;
use sui_rosetta::operations::Operations;
@@ -33,11 +33,11 @@ pub async fn start_rosetta_test_server(
) -> (RosettaClient, Vec>>) {
let online_server = RosettaOnlineServer::new(SuiEnv::LocalNet, client);
let offline_server = RosettaOfflineServer::new(SuiEnv::LocalNet);
- let local_ip = utils::get_local_ip_for_tests().to_string();
- let port = utils::get_available_port(&local_ip);
+ let local_ip = local_ip_utils::localhost_for_testing();
+ let port = local_ip_utils::get_available_port(&local_ip);
let rosetta_address = format!("{}:{}", local_ip, port);
let online_handle = online_server.serve(SocketAddr::from_str(&rosetta_address).unwrap());
- let offline_port = utils::get_available_port(&local_ip);
+ let offline_port = local_ip_utils::get_available_port(&local_ip);
let offline_address = format!("{}:{}", local_ip, offline_port);
let offline_handle = offline_server.serve(SocketAddr::from_str(&offline_address).unwrap());
diff --git a/crates/sui-surfer/src/surfer_state.rs b/crates/sui-surfer/src/surfer_state.rs
index ad65dd14a2c1d..46da2adb44796 100644
--- a/crates/sui-surfer/src/surfer_state.rs
+++ b/crates/sui-surfer/src/surfer_state.rs
@@ -197,6 +197,12 @@ impl SurferState {
async fn process_tx_effects(&mut self, effects: &SuiTransactionBlockEffects) {
for (owned_ref, write_kind) in effects.all_changed_objects() {
+ if matches!(owned_ref.owner, Owner::ObjectOwner(_)) {
+ // For object owned objects, we don't need to do anything.
+ // We also cannot read them because in the case of shared objects, there can be
+ // races and the child object may no longer exist.
+ continue;
+ }
let obj_ref = owned_ref.reference.to_object_ref();
let object = self
.cluster
diff --git a/crates/sui-swarm-config/Cargo.toml b/crates/sui-swarm-config/Cargo.toml
index a46df147b8737..bf31799d8d4b4 100644
--- a/crates/sui-swarm-config/Cargo.toml
+++ b/crates/sui-swarm-config/Cargo.toml
@@ -36,6 +36,7 @@ sui-storage = { path = "../sui-storage" }
sui-types = { path = "../sui-types" }
sui-genesis-builder = { path = "../sui-genesis-builder" }
workspace-hack = { version = "0.1", path = "../workspace-hack" }
+
[target.'cfg(msim)'.dependencies]
sui-simulator = { path = "../sui-simulator" }
diff --git a/crates/sui-swarm-config/src/genesis_config.rs b/crates/sui-swarm-config/src/genesis_config.rs
index 7dade602159c1..ae8bb049125f3 100644
--- a/crates/sui-swarm-config/src/genesis_config.rs
+++ b/crates/sui-swarm-config/src/genesis_config.rs
@@ -1,7 +1,7 @@
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
-use std::net::{IpAddr, Ipv4Addr, SocketAddr};
+use std::net::SocketAddr;
use anyhow::Result;
use fastcrypto::traits::KeyPair;
@@ -9,10 +9,9 @@ use rand::{rngs::StdRng, SeedableRng};
use serde::{Deserialize, Serialize};
use sui_config::genesis::{GenesisCeremonyParameters, TokenAllocation};
use sui_config::node::{DEFAULT_COMMISSION_RATE, DEFAULT_VALIDATOR_GAS_PRICE};
-use sui_config::utils;
-use sui_config::Config;
+use sui_config::{local_ip_utils, Config};
use sui_genesis_builder::validator_info::ValidatorInfo;
-use sui_types::base_types::{ObjectID, SuiAddress};
+use sui_types::base_types::SuiAddress;
use sui_types::crypto::{
get_key_pair_from_rng, AccountKeyPair, AuthorityKeyPair, AuthorityPublicKeyBytes,
NetworkKeyPair, NetworkPublicKey, PublicKey, SuiKeyPair,
@@ -45,127 +44,6 @@ pub struct ValidatorGenesisConfig {
}
impl ValidatorGenesisConfig {
- pub const DEFAULT_NETWORK_PORT: u16 = 1000;
- pub const DEFAULT_P2P_PORT: u16 = 2000;
- pub const DEFAULT_P2P_LISTEN_PORT: u16 = 3000;
- pub const DEFAULT_METRICS_PORT: u16 = 4000;
- pub const DEFAULT_NARWHAL_METRICS_PORT: u16 = 5000;
- pub const DEFAULT_NARWHAL_PRIMARY_PORT: u16 = 6000;
- pub const DEFAULT_NARWHAL_WORKER_PORT: u16 = 7000;
-
- pub fn from_localhost_for_testing(
- key_pair: AuthorityKeyPair,
- worker_key_pair: NetworkKeyPair,
- account_key_pair: SuiKeyPair,
- network_key_pair: NetworkKeyPair,
- gas_price: u64,
- ) -> Self {
- Self {
- key_pair,
- worker_key_pair,
- account_key_pair,
- network_key_pair,
- network_address: utils::new_tcp_network_address(),
- p2p_address: utils::new_udp_network_address(),
- p2p_listen_address: None,
- metrics_address: utils::available_local_socket_address(),
- narwhal_metrics_address: utils::new_tcp_network_address(),
- gas_price,
- commission_rate: DEFAULT_COMMISSION_RATE,
- narwhal_primary_address: utils::new_udp_network_address(),
- narwhal_worker_address: utils::new_udp_network_address(),
- consensus_address: utils::new_tcp_network_address(),
- consensus_internal_worker_address: None,
- stake: sui_types::governance::VALIDATOR_LOW_STAKE_THRESHOLD_MIST,
- }
- }
-
- pub fn from_base_ip(
- key_pair: AuthorityKeyPair,
- worker_key_pair: NetworkKeyPair,
- account_key_pair: SuiKeyPair,
- network_key_pair: NetworkKeyPair,
- p2p_listen_address: Option,
- ip: String,
- // Port offset allows running many SuiNodes inside the same simulator node, which is
- // helpful for tests that don't use Swarm.
- port_offset: usize,
- gas_price: u64,
- ) -> Self {
- assert!(port_offset < 1000);
- let port_offset: u16 = port_offset.try_into().unwrap();
- let make_tcp_addr =
- |port: u16| -> Multiaddr { format!("/ip4/{ip}/tcp/{port}/http").parse().unwrap() };
- let make_udp_addr =
- |port: u16| -> Multiaddr { format!("/ip4/{ip}/udp/{port}").parse().unwrap() };
- let make_tcp_zero_addr =
- |port: u16| -> Multiaddr { format!("/ip4/0.0.0.0/tcp/{port}/http").parse().unwrap() };
-
- Self {
- key_pair,
- worker_key_pair,
- account_key_pair,
- network_key_pair,
- network_address: make_tcp_addr(Self::DEFAULT_NETWORK_PORT + port_offset),
- p2p_address: make_udp_addr(Self::DEFAULT_P2P_PORT + port_offset),
- p2p_listen_address: p2p_listen_address
- .map(|x| SocketAddr::new(x, Self::DEFAULT_P2P_LISTEN_PORT + port_offset)),
- metrics_address: format!("0.0.0.0:{}", Self::DEFAULT_METRICS_PORT + port_offset)
- .parse()
- .unwrap(),
- narwhal_metrics_address: make_tcp_zero_addr(
- Self::DEFAULT_NARWHAL_METRICS_PORT + port_offset,
- ),
- gas_price,
- commission_rate: DEFAULT_COMMISSION_RATE,
- narwhal_primary_address: make_udp_addr(
- Self::DEFAULT_NARWHAL_PRIMARY_PORT + port_offset,
- ),
- narwhal_worker_address: make_udp_addr(Self::DEFAULT_NARWHAL_WORKER_PORT + port_offset),
- consensus_address: make_tcp_addr(4000 + port_offset),
- consensus_internal_worker_address: None,
- stake: sui_types::governance::VALIDATOR_LOW_STAKE_THRESHOLD_MIST,
- }
- }
-
- pub fn new(
- index: usize,
- key_pair: AuthorityKeyPair,
- worker_key_pair: NetworkKeyPair,
- account_key_pair: SuiKeyPair,
- network_key_pair: NetworkKeyPair,
- gas_price: u64,
- ) -> Self {
- if cfg!(msim) {
- // we will probably never run this many validators in a sim
- let low_octet = index + 1;
- if low_octet > 255 {
- todo!("smarter IP formatting required");
- }
-
- let ip = format!("10.10.0.{}", low_octet);
-
- Self::from_base_ip(
- key_pair,
- worker_key_pair,
- account_key_pair,
- network_key_pair,
- None,
- ip,
- index,
- gas_price,
- )
- } else {
- Self::from_localhost_for_testing(
- key_pair,
- worker_key_pair,
- account_key_pair,
- network_key_pair,
- gas_price,
- )
- }
- }
-
pub fn to_validator_info(&self, name: String) -> ValidatorInfo {
let protocol_key: AuthorityPublicKeyBytes = self.key_pair.public().into();
let account_key: PublicKey = self.account_key_pair.public();
@@ -192,6 +70,77 @@ impl ValidatorGenesisConfig {
}
}
+#[derive(Default)]
+pub struct ValidatorGenesisConfigBuilder {
+ protocol_key_pair: Option,
+ account_key_pair: Option,
+ ip: Option,
+ gas_price: Option,
+}
+
+impl ValidatorGenesisConfigBuilder {
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ pub fn with_protocol_key_pair(mut self, key_pair: AuthorityKeyPair) -> Self {
+ self.protocol_key_pair = Some(key_pair);
+ self
+ }
+
+ pub fn with_account_key_pair(mut self, key_pair: AccountKeyPair) -> Self {
+ self.account_key_pair = Some(key_pair);
+ self
+ }
+
+ pub fn with_ip(mut self, ip: String) -> Self {
+ self.ip = Some(ip);
+ self
+ }
+
+ pub fn with_gas_price(mut self, gas_price: u64) -> Self {
+ self.gas_price = Some(gas_price);
+ self
+ }
+
+ pub fn build(self, rng: &mut R) -> ValidatorGenesisConfig {
+ let ip = self.ip.unwrap_or_else(local_ip_utils::get_new_ip);
+ let localhost = local_ip_utils::localhost_for_testing();
+
+ let protocol_key_pair = self
+ .protocol_key_pair
+ .unwrap_or_else(|| get_key_pair_from_rng(rng).1);
+ let account_key_pair = self
+ .account_key_pair
+ .unwrap_or_else(|| get_key_pair_from_rng(rng).1);
+ let gas_price = self.gas_price.unwrap_or(DEFAULT_VALIDATOR_GAS_PRICE);
+
+ let (worker_key_pair, network_key_pair): (NetworkKeyPair, NetworkKeyPair) =
+ (get_key_pair_from_rng(rng).1, get_key_pair_from_rng(rng).1);
+
+ ValidatorGenesisConfig {
+ key_pair: protocol_key_pair,
+ worker_key_pair,
+ account_key_pair: account_key_pair.into(),
+ network_key_pair,
+ network_address: local_ip_utils::new_tcp_address_for_testing(&ip),
+ p2p_address: local_ip_utils::new_udp_address_for_testing(&ip),
+ p2p_listen_address: None,
+ metrics_address: local_ip_utils::new_tcp_address_for_testing(&localhost)
+ .to_socket_addr()
+ .unwrap(),
+ narwhal_metrics_address: local_ip_utils::new_tcp_address_for_testing(&localhost),
+ gas_price,
+ commission_rate: DEFAULT_COMMISSION_RATE,
+ narwhal_primary_address: local_ip_utils::new_udp_address_for_testing(&ip),
+ narwhal_worker_address: local_ip_utils::new_udp_address_for_testing(&ip),
+ consensus_address: local_ip_utils::new_tcp_address_for_testing(&ip),
+ consensus_internal_worker_address: None,
+ stake: sui_types::governance::VALIDATOR_LOW_STAKE_THRESHOLD_MIST,
+ }
+ }
+}
+
#[derive(Serialize, Deserialize, Default)]
pub struct GenesisConfig {
pub validator_config_info: Option>,
@@ -238,14 +187,11 @@ impl GenesisConfig {
}
fn default_socket_address() -> SocketAddr {
- utils::available_local_socket_address()
+ local_ip_utils::new_local_tcp_socket_for_testing()
}
fn default_multiaddr_address() -> Multiaddr {
- let addr = utils::available_local_socket_address();
- format!("/ip4/{:?}/tcp/{}/http", addr.ip(), addr.port())
- .parse()
- .unwrap()
+ local_ip_utils::new_local_tcp_address_for_testing()
}
fn default_stake() -> u64 {
@@ -325,16 +271,9 @@ impl GenesisConfig {
let validator_config_info: Vec<_> = ips
.iter()
.map(|ip| {
- ValidatorGenesisConfig::from_base_ip(
- AuthorityKeyPair::generate(&mut rng), // key_pair
- NetworkKeyPair::generate(&mut rng), // worker_key_pair
- SuiKeyPair::Ed25519(NetworkKeyPair::generate(&mut rng)), // account_key_pair
- NetworkKeyPair::generate(&mut rng), // network_key_pair
- Some(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))), // p2p_listen_address
- ip.to_string(),
- Self::BENCHMARKS_PORT_OFFSET,
- DEFAULT_VALIDATOR_GAS_PRICE,
- )
+ ValidatorGenesisConfigBuilder::new()
+ .with_ip(ip.to_string())
+ .build(&mut rng)
})
.collect();
@@ -372,14 +311,4 @@ impl GenesisConfig {
let mut rng = StdRng::seed_from_u64(Self::BENCHMARKS_RNG_SEED);
SuiKeyPair::Ed25519(NetworkKeyPair::generate(&mut rng))
}
-
- /// Generate several predictable and fixed gas object id offsets for benchmarks. Load generators
- /// and other benchmark facilities may also need to retrieve these id offsets (hence the importance
- /// of the seedable rng).
- pub fn benchmark_gas_object_id_offsets(quantity: usize) -> Vec {
- let mut rng = StdRng::seed_from_u64(Self::BENCHMARKS_RNG_SEED);
- (0..quantity)
- .map(|_| ObjectID::random_from_rng(&mut rng))
- .collect()
- }
}
diff --git a/crates/sui-swarm-config/src/lib.rs b/crates/sui-swarm-config/src/lib.rs
index 1d3205326c7ae..596ff86d49a7c 100644
--- a/crates/sui-swarm-config/src/lib.rs
+++ b/crates/sui-swarm-config/src/lib.rs
@@ -4,3 +4,4 @@
pub mod genesis_config;
pub mod network_config;
pub mod network_config_builder;
+pub mod node_config_builder;
diff --git a/crates/sui-swarm-config/src/network_config_builder.rs b/crates/sui-swarm-config/src/network_config_builder.rs
index 43d9b6bde8373..dbcd2bf60315e 100644
--- a/crates/sui-swarm-config/src/network_config_builder.rs
+++ b/crates/sui-swarm-config/src/network_config_builder.rs
@@ -1,40 +1,18 @@
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
-use crate::genesis_config::{AccountConfig, DEFAULT_GAS_AMOUNT};
+use crate::genesis_config::{AccountConfig, ValidatorGenesisConfigBuilder, DEFAULT_GAS_AMOUNT};
use crate::genesis_config::{GenesisConfig, ValidatorGenesisConfig};
use crate::network_config::NetworkConfig;
-use fastcrypto::encoding::{Encoding, Hex};
-use narwhal_config::{
- NetworkAdminServerParameters, Parameters as ConsensusParameters, PrometheusMetricsParameters,
-};
+use crate::node_config_builder::ValidatorConfigBuilder;
use rand::rngs::OsRng;
-use rand::RngCore;
-use std::net::{IpAddr, SocketAddr};
-use std::{
- num::NonZeroUsize,
- path::{Path, PathBuf},
- sync::Arc,
-};
+use std::path::PathBuf;
+use std::{num::NonZeroUsize, path::Path, sync::Arc};
use sui_config::genesis::{TokenAllocation, TokenDistributionScheduleBuilder};
-use sui_config::node::{
- default_enable_index_processing, default_end_of_epoch_broadcast_channel_capacity,
- AuthorityKeyPairWithPath, AuthorityStorePruningConfig, DBCheckpointConfig,
- ExpensiveSafetyCheckConfig, KeyPairWithPath, StateDebugDumpConfig,
- DEFAULT_GRPC_CONCURRENCY_LIMIT, DEFAULT_VALIDATOR_GAS_PRICE,
-};
-use sui_config::utils;
-use sui_config::{
- p2p::{P2pConfig, SeedPeer},
- ConsensusConfig, NodeConfig, AUTHORITIES_DB_NAME, CONSENSUS_DB_NAME,
-};
use sui_protocol_config::SupportedProtocolVersions;
use sui_types::base_types::{AuthorityName, SuiAddress};
use sui_types::committee::{Committee, ProtocolVersion};
-use sui_types::crypto::{
- generate_proof_of_possession, get_key_pair_from_rng, AccountKeyPair, AuthorityKeyPair,
- AuthorityPublicKeyBytes, KeypairTraits, NetworkKeyPair, PublicKey, SuiKeyPair,
-};
+use sui_types::crypto::{generate_proof_of_possession, AccountKeyPair, KeypairTraits, PublicKey};
use sui_types::object::Object;
pub enum CommitteeConfig {
@@ -43,11 +21,6 @@ pub enum CommitteeConfig {
AccountKeys(Vec),
}
-enum ValidatorIpSelection {
- Localhost,
- Simulator,
-}
-
pub type SupportedProtocolVersionsCallback = Arc<
dyn Fn(
usize, /* validator idx */
@@ -65,24 +38,18 @@ pub enum ProtocolVersionsConfig {
// Use one range for all validators.
Global(SupportedProtocolVersions),
// A closure that returns the versions for each validator.
+ // TODO: This doesn't apply to fullnodes.
PerValidator(SupportedProtocolVersionsCallback),
}
pub struct ConfigBuilder {
rng: Option,
config_directory: PathBuf,
- randomize_ports: bool,
- committee: Option,
+ supported_protocol_versions_config: Option,
+ committee: CommitteeConfig,
genesis_config: Option,
reference_gas_price: Option,
additional_objects: Vec