Skip to content
This repository has been archived by the owner on Mar 1, 2024. It is now read-only.

Commit

Permalink
Merge pull request #246 from subspace/gemini-3f-release
Browse files Browse the repository at this point in the history
Gemini 3f release
  • Loading branch information
jfrank-summit committed Aug 17, 2023
2 parents a36f703 + 5b4ff76 commit db417c7
Show file tree
Hide file tree
Showing 10 changed files with 2,659 additions and 873 deletions.
3,358 changes: 2,557 additions & 801 deletions Cargo.lock

Large diffs are not rendered by default.

13 changes: 5 additions & 8 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pulsar"
version = "0.5.4"
version = "0.6.0"
edition = "2021"

[dependencies]
Expand All @@ -26,12 +26,13 @@ rand = "0.8.5"
serde = "1"
serde_derive = "1"
single-instance = "0.3.3"
sp-core = { version = "21.0.0", git = "https://github.com/subspace/substrate", rev = "55c157cff49b638a59d81a9f971f0f9a66829c71", features=["full_crypto"] }
sp-core = { version = "21.0.0", git = "https://github.com/subspace/substrate", rev = "55c157cff49b638a59d81a9f971f0f9a66829c71", features = ["full_crypto"] }
strum = "0.24.1"
strum_macros = "0.24.3"
subspace-sdk = { git = "https://github.com/subspace/subspace-sdk", rev = "cfe095af6bd314e346a26acf08c32ecd21b40964" }
thiserror = "1"
toml = "0.7"
tokio = { version = "1.27", features = ["macros", "rt-multi-thread", "tracing"] }
toml = "0.7"
tracing = "0.1.37"
tracing-appender = "0.2"
tracing-bunyan-formatter = "0.3.4"
Expand All @@ -40,9 +41,6 @@ tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
whoami = "1"
zeroize = "1.6.0"

subspace-sdk = { git = "https://github.com/subspace/subspace-sdk", rev = "66d82c1724f280a889821a57d020d8fcd3be5a8c" }


[dev-dependencies]
rand = "0.8.5"

Expand Down Expand Up @@ -103,7 +101,7 @@ hash-db = { opt-level = 3 }
hmac = { opt-level = 3 }
httparse = { opt-level = 3 }
integer-sqrt = { opt-level = 3 }
k256 = { opt-level = 3}
k256 = { opt-level = 3 }
keccak = { opt-level = 3 }
libm = { opt-level = 3 }
libsecp256k1 = { opt-level = 3 }
Expand Down Expand Up @@ -131,7 +129,6 @@ x25519-dalek = { opt-level = 3 }
yamux = { opt-level = 3 }
zeroize = { opt-level = 3 }


# Reason: We need to patch substrate dependency of snowfork and frontier libraries to our fork
# TODO: Remove when we are using upstream substrate instead of fork
[patch."https://github.com/paritytech/substrate.git"]
Expand Down
4 changes: 2 additions & 2 deletions rust-toolchain.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[toolchain]
channel = "nightly-2023-05-16"
channel = "nightly-2023-07-21"
components = ["rust-src"]
targets = ["wasm32-unknown-unknown"]
profile = "default"
profile = "default"
10 changes: 5 additions & 5 deletions src/commands/farm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ type MaybeHandles = Option<(JoinHandle<Result<()>>, JoinHandle<Result<()>>)>;
/// lastly, depending on the verbosity, it subscribes to plotting progress and
/// new solutions
#[instrument]
pub(crate) async fn farm(is_verbose: bool, executor: bool, no_rotation: bool) -> Result<()> {
pub(crate) async fn farm(is_verbose: bool, enable_domains: bool, no_rotation: bool) -> Result<()> {
install_tracing(is_verbose, no_rotation);
color_eyre::install()
.context("color eyre installment failed, it should have been the first one")?;
Expand All @@ -55,16 +55,16 @@ pub(crate) async fn farm(is_verbose: bool, executor: bool, no_rotation: bool) ->
let reward_address = farmer_config.reward_address;

// apply advanced options (flags)
if executor {
println!("Setting the {} flag for the node...", "executor".underline());
node_config.advanced.executor = true;
if enable_domains {
println!("Setting the {} flag for the node...", "enable_domains".underline());
node_config.advanced.enable_domains = true;
}

println!("Starting node ...");
let node = Arc::new(
node_config
.clone()
.build(chain.clone(), is_verbose)
.build(chain.clone(), is_verbose, farmer_config.plot_size)
.await
.context("error building the node")?,
);
Expand Down
2 changes: 1 addition & 1 deletion src/commands/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ fn get_config_from_user_inputs() -> Result<Config> {
)?;

// get chain
let default_chain = ChainConfig::Gemini3e;
let default_chain = ChainConfig::Gemini3f;
let chain = get_user_input(
&format!(
"Specify the chain to farm. Available options are: {:?}. \n Defaults to \
Expand Down
8 changes: 1 addition & 7 deletions src/commands/wipe.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
use color_eyre::eyre::{Context, Result};
use owo_colors::OwoColorize;
use subspace_sdk::farmer::CacheDescription;
use subspace_sdk::{Node, PlotDescription};

use crate::config::{delete_config, parse_config};
use crate::summary::delete_summary;
use crate::utils::{
cache_directory_getter, get_user_input, node_directory_getter, plot_directory_getter,
yes_or_no_parser,
get_user_input, node_directory_getter, plot_directory_getter, yes_or_no_parser,
};

/// wipe configurator
Expand Down Expand Up @@ -78,10 +76,6 @@ async fn wipe(
let _ = PlotDescription::new(config.farmer.plot_directory, config.farmer.plot_size)
.wipe()
.await;
let _ =
CacheDescription::new(cache_directory_getter(), config.farmer.advanced.cache_size)?
.wipe()
.await;
} else {
let _ = tokio::fs::remove_dir_all(plot_directory_getter()).await;
}
Expand Down
95 changes: 77 additions & 18 deletions src/config.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
use std::fs::{create_dir_all, remove_file, File};
use std::num::NonZeroU8;
use std::path::PathBuf;

use color_eyre::eyre::{eyre, Report, Result, WrapErr};
use derivative::Derivative;
use serde::{Deserialize, Serialize};
use sp_core::crypto::{AccountId32, Ss58Codec};
use strum_macros::EnumIter;
use subspace_sdk::farmer::{CacheDescription, Farmer};
use subspace_sdk::node::{DsnBuilder, NetworkBuilder, Node, Role};
use subspace_sdk::farmer::Farmer;
use subspace_sdk::node::{
DomainConfigBuilder, DsnBuilder, NetworkBuilder, Node, PotConfiguration, Role,
};
use subspace_sdk::{chain_spec, ByteSize, PlotDescription, PublicKey};
use tracing::instrument;

use crate::utils::{cache_directory_getter, provider_storage_dir_getter, IntoEyre};
use crate::utils::{provider_storage_dir_getter, IntoEyre};

/// defaults for the user config file
pub(crate) const DEFAULT_PLOT_SIZE: ByteSize = ByteSize::gb(2);
Expand All @@ -28,7 +32,7 @@ pub(crate) struct Config {
#[derive(Deserialize, Serialize, Clone, Debug, Default, PartialEq)]
pub(crate) struct AdvancedNodeSettings {
#[serde(default, skip_serializing_if = "crate::utils::is_default")]
pub(crate) executor: bool,
pub(crate) enable_domains: bool,
#[serde(default, flatten)]
pub(crate) extra: toml::Table,
}
Expand All @@ -43,26 +47,71 @@ pub(crate) struct NodeConfig {
}

impl NodeConfig {
pub async fn build(self, chain: ChainConfig, is_verbose: bool) -> Result<Node> {
let Self { directory, name, advanced: AdvancedNodeSettings { executor: _, extra } } = self;
pub async fn build(
self,
chain: ChainConfig,
is_verbose: bool,
farmer_space_pledged: ByteSize,
) -> Result<Node> {
let Self { directory, name, advanced: AdvancedNodeSettings { enable_domains, extra } } =
self;

let (mut node, chain_spec) = match chain {
ChainConfig::Gemini3e => {
let node = Node::gemini_3e().network(NetworkBuilder::gemini_3e().name(name)).dsn(
DsnBuilder::gemini_3e().provider_storage_path(provider_storage_dir_getter()),
);
let chain_spec = chain_spec::gemini_3e();
ChainConfig::Gemini3f => {
let mut node =
Node::gemini_3f().network(NetworkBuilder::gemini_3f().name(name)).dsn(
DsnBuilder::gemini_3f()
.provider_storage_path(provider_storage_dir_getter()),
);
if enable_domains {
node = node.domain(Some(
DomainConfigBuilder::gemini_3f()
.relayer_id(
AccountId32::from_ss58check(
"5CXTmJEusve5ixyJufqHThmy4qUrrm6FyLCR7QfE4bbyMTNC",
)
.expect("Static address should not fail"),
)
.configuration(),
));
}
let chain_spec = chain_spec::gemini_3f();
(node, chain_spec)
}
ChainConfig::Dev => {
let node = Node::dev();
let mut node = Node::dev();
if enable_domains {
node = node.domain(Some(
DomainConfigBuilder::dev()
.role(Role::Authority)
.relayer_id(
AccountId32::from_ss58check(
"5CXTmJEusve5ixyJufqHThmy4qUrrm6FyLCR7QfE4bbyMTNC",
)
.expect("Static address should not fail"),
)
.configuration(),
));
}
let chain_spec = chain_spec::dev_config();
(node, chain_spec)
}
ChainConfig::DevNet => {
let node = Node::devnet()
let mut node = Node::devnet()
.network(NetworkBuilder::devnet().name(name))
.dsn(DsnBuilder::devnet().provider_storage_path(provider_storage_dir_getter()));
if enable_domains {
node = node.domain(Some(
DomainConfigBuilder::devnet()
.relayer_id(
AccountId32::from_ss58check(
"5CXTmJEusve5ixyJufqHThmy4qUrrm6FyLCR7QfE4bbyMTNC",
)
.expect("Static address should not fail"),
)
.configuration(),
));
}
let chain_spec = chain_spec::devnet_config();
(node, chain_spec)
}
Expand All @@ -79,7 +128,12 @@ impl NodeConfig {

crate::utils::apply_extra_options(&node.configuration(), extra)
.context("Failed to deserialize node config")?
.build(directory, chain_spec)
.build(
directory,
chain_spec,
PotConfiguration { is_pot_enabled: false, is_node_time_keeper: false },
farmer_space_pledged.to_u64() as usize,
)
.await
.into_eyre()
.wrap_err("Failed to build subspace node")
Expand Down Expand Up @@ -111,14 +165,19 @@ pub(crate) struct FarmerConfig {
impl FarmerConfig {
pub async fn build(self, node: &Node) -> Result<Farmer> {
let plot_description = &[PlotDescription::new(self.plot_directory, self.plot_size)];
let cache = CacheDescription::new(cache_directory_getter(), self.advanced.cache_size)?;

// currently we do not have different configuration for the farmer w.r.t
// different chains, but we may in the future
let farmer = Farmer::builder();
crate::utils::apply_extra_options(&farmer.configuration(), self.advanced.extra)
.context("Failed to deserialize node config")?
.build(self.reward_address, node, plot_description, cache)
.build(
self.reward_address,
node,
plot_description,
// TODO: Make this configurable via user input
NonZeroU8::new(1).expect("static value should not fail; qed"),
)
.await
.context("Failed to build a farmer")
}
Expand All @@ -128,7 +187,7 @@ impl FarmerConfig {
#[derive(Deserialize, Serialize, Default, Clone, Debug, EnumIter)]
pub(crate) enum ChainConfig {
#[default]
Gemini3e,
Gemini3f,
Dev,
DevNet,
}
Expand All @@ -138,7 +197,7 @@ impl std::str::FromStr for ChainConfig {

fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"gemini3e" => Ok(ChainConfig::Gemini3e),
"gemini3f" => Ok(ChainConfig::Gemini3f),
"dev" => Ok(ChainConfig::Dev),
"devnet" => Ok(ChainConfig::DevNet),
_ => Err(eyre!("given chain: `{s}` is not recognized!")),
Expand Down
14 changes: 7 additions & 7 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ enum Commands {
#[arg(short, long, action)]
verbose: bool,
#[arg(short, long, action)]
executor: bool,
enable_domains: bool,
#[arg(long, action)]
no_rotation: bool,
},
Expand Down Expand Up @@ -88,8 +88,8 @@ async fn main() -> Result<(), Report> {
Some(Commands::Init) => {
init().suggestion(support_message())?;
}
Some(Commands::Farm { verbose, executor, no_rotation }) => {
farm(verbose, executor, no_rotation).await.suggestion(support_message())?;
Some(Commands::Farm { verbose, enable_domains, no_rotation }) => {
farm(verbose, enable_domains, no_rotation).await.suggestion(support_message())?;
}
Some(Commands::Wipe { farmer, node }) => {
wipe_config(farmer, node).await.suggestion(support_message())?;
Expand Down Expand Up @@ -166,15 +166,15 @@ async fn arrow_key_mode() -> Result<(), Report> {
let verbose =
get_user_input(prompt, None, yes_or_no_parser).context("prompt failed")?;

let prompt = "Do you want to be an executor? [y/n]: ";
let executor =
let prompt = "Do you want to run a domain node? [y/n]: ";
let enable_domains =
get_user_input(prompt, None, yes_or_no_parser).context("prompt failed")?;

let prompt = "Do you want to disable rotation for logs? [y/n]: ";
let no_rotation =
get_user_input(prompt, None, yes_or_no_parser).context("prompt failed")?;

farm(verbose, executor, no_rotation).await.suggestion(support_message())?;
farm(verbose, enable_domains, no_rotation).await.suggestion(support_message())?;
}
2 => {
wipe_config(false, false).await.suggestion(support_message())?;
Expand Down Expand Up @@ -224,7 +224,7 @@ fn print_options(
impl std::fmt::Display for Commands {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match *self {
Commands::Farm { verbose: _, executor: _, no_rotation: _ } => write!(f, "farm"),
Commands::Farm { verbose: _, enable_domains: _, no_rotation: _ } => write!(f, "farm"),
Commands::Wipe { farmer: _, node: _ } => write!(f, "wipe"),
Commands::Info => write!(f, "info"),
Commands::Init => write!(f, "init"),
Expand Down
21 changes: 3 additions & 18 deletions src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ use subspace_sdk::ByteSize;
use crate::config::ChainConfig;
use crate::summary::*;
use crate::utils::{
apply_extra_options, cache_directory_getter, custom_log_dir, directory_parser,
node_directory_getter, node_name_parser, plot_directory_getter, reward_address_parser,
size_parser, yes_or_no_parser,
apply_extra_options, custom_log_dir, directory_parser, node_directory_getter, node_name_parser,
plot_directory_getter, reward_address_parser, size_parser, yes_or_no_parser,
};

async fn update_summary_file_randomly(summary_file: SummaryFile) {
Expand Down Expand Up @@ -135,7 +134,7 @@ fn size_checker() {

#[test]
fn chain_checker() {
assert!(ChainConfig::from_str("gemini3e").is_ok());
assert!(ChainConfig::from_str("gemini3f").is_ok());
assert!(ChainConfig::from_str("devv").is_err());
}

Expand All @@ -153,20 +152,6 @@ fn plot_directory_tester() {
assert!(plot_path.ends_with("AppData/Roaming/pulsar/plots"));
}

#[test]
fn cache_directory_tester() {
let cache_path = cache_directory_getter();

#[cfg(target_os = "macos")]
assert!(cache_path.ends_with("Library/Application Support/pulsar/cache"));

#[cfg(target_os = "linux")]
assert!(cache_path.ends_with(".local/share/pulsar/cache"));

#[cfg(target_os = "windows")]
assert!(cache_path.ends_with("AppData/Roaming/pulsar/cache"));
}

#[test]
fn node_directory_tester() {
let node_path = node_directory_getter();
Expand Down
Loading

0 comments on commit db417c7

Please sign in to comment.