From 52248568e8db21442b4e77f44cb2d8f640388e46 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 15:24:10 +0100 Subject: [PATCH 01/44] refactor: wrap server run shell command in function --- zkstack_cli/crates/common/src/server.rs | 72 +++++++++++++++++-------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 40da1cf80325..311855a4d11a 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -1,5 +1,6 @@ use std::{ffi::OsStr, path::PathBuf}; +use anyhow::Context; use xshell::{cmd, Shell}; use crate::cmd::Cmd; @@ -56,28 +57,17 @@ impl Server { let uring = self.uring.then_some("--features=rocksdb/io-uring"); - let mut cmd = Cmd::new( - cmd!( - shell, - "cargo run --release --bin zksync_server {uring...} -- - --genesis-path {genesis_path} - --wallets-path {wallets_path} - --config-path {general_path} - --secrets-path {secrets_path} - --contracts-config-path {contracts_path} - " - ) - .args(additional_args) - .env_remove("RUSTUP_TOOLCHAIN"), - ); - - // If we are running server in normal mode - // we need to get the output to the console - if let ServerMode::Normal = server_mode { - cmd = cmd.with_force_run(); - } - - cmd.run()?; + run_binary_component( + shell, + uring, + genesis_path, + wallets_path, + general_path, + secrets_path, + contracts_path, + additional_args, + server_mode, + )?; Ok(()) } @@ -99,3 +89,41 @@ impl Server { }) } } + +fn run_binary_component

( + shell: &Shell, + uring: Option<&str>, + genesis_path: P, + wallets_path: P, + general_path: P, + secrets_path: P, + contracts_path: P, + additional_args: Vec, + server_mode: ServerMode, +) -> anyhow::Result<()> +where + P: AsRef, +{ + let mut cmd = Cmd::new( + cmd!( + shell, + "cargo run --release --bin zksync_server {uring...} -- + --genesis-path {genesis_path} + --wallets-path {wallets_path} + --config-path {general_path} + --secrets-path {secrets_path} + --contracts-config-path {contracts_path} + " + ) + .args(additional_args) + .env_remove("RUSTUP_TOOLCHAIN"), + ); + + // If we are running server in normal mode + // we need to get the output to the console + if let ServerMode::Normal = server_mode { + cmd = cmd.with_force_run(); + } + + cmd.run().context("Failed to run server") +} From b7e8386cb13fa1b40e4c2fb99736bb29bfcd9a6e Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 15:36:46 +0100 Subject: [PATCH 02/44] refactor: name arg module consistently with command module --- zkstack_cli/crates/zkstack/src/commands/args/mod.rs | 4 ++-- .../zkstack/src/commands/args/{run_server.rs => server.rs} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename zkstack_cli/crates/zkstack/src/commands/args/{run_server.rs => server.rs} (100%) diff --git a/zkstack_cli/crates/zkstack/src/commands/args/mod.rs b/zkstack_cli/crates/zkstack/src/commands/args/mod.rs index 477f3a6ae9af..0f82984ddff3 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/mod.rs @@ -1,7 +1,7 @@ -pub use self::{autocomplete::*, containers::*, run_server::*, update::*, wait::*}; +pub use self::{autocomplete::*, containers::*, server::*, update::*, wait::*}; mod autocomplete; mod containers; -mod run_server; +mod server; mod update; mod wait; diff --git a/zkstack_cli/crates/zkstack/src/commands/args/run_server.rs b/zkstack_cli/crates/zkstack/src/commands/args/server.rs similarity index 100% rename from zkstack_cli/crates/zkstack/src/commands/args/run_server.rs rename to zkstack_cli/crates/zkstack/src/commands/args/server.rs From c6eb6c68a878d195273dd1a3a3fc4828c54c5ed6 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 15:38:19 +0100 Subject: [PATCH 03/44] refactor: use module folder for server command --- .../crates/zkstack/src/commands/args/{server.rs => server/mod.rs} | 0 .../crates/zkstack/src/commands/{server.rs => server/mod.rs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename zkstack_cli/crates/zkstack/src/commands/args/{server.rs => server/mod.rs} (100%) rename zkstack_cli/crates/zkstack/src/commands/{server.rs => server/mod.rs} (100%) diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/mod.rs similarity index 100% rename from zkstack_cli/crates/zkstack/src/commands/args/server.rs rename to zkstack_cli/crates/zkstack/src/commands/args/server/mod.rs diff --git a/zkstack_cli/crates/zkstack/src/commands/server.rs b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs similarity index 100% rename from zkstack_cli/crates/zkstack/src/commands/server.rs rename to zkstack_cli/crates/zkstack/src/commands/server/mod.rs From c3dccee31f6236b9d72a5f8f94ea1a470beb507e Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 15:42:11 +0100 Subject: [PATCH 04/44] refactor: create module for wait subcommand --- .../crates/zkstack/src/commands/server/mod.rs | 28 ++++--------------- .../zkstack/src/commands/server/wait.rs | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 zkstack_cli/crates/zkstack/src/commands/server/wait.rs diff --git a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs index 10f267fb8526..554187cf546f 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs @@ -1,7 +1,6 @@ use anyhow::Context; use common::{ cmd::Cmd, - config::global_config, logger, server::{Server, ServerMode}, }; @@ -9,17 +8,19 @@ use config::{ traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, EcosystemConfig, GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, }; +use wait::wait_for_server; use xshell::{cmd, Shell}; use crate::{ - commands::args::{RunServerArgs, ServerArgs, ServerCommand, WaitArgs}, + commands::args::{RunServerArgs, ServerArgs, ServerCommand}, messages::{ - msg_waiting_for_server_success, MSG_BUILDING_SERVER, MSG_CHAIN_NOT_INITIALIZED, - MSG_FAILED_TO_BUILD_SERVER_ERR, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER, - MSG_WAITING_FOR_SERVER, + MSG_BUILDING_SERVER, MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_BUILD_SERVER_ERR, + MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER, }, }; +mod wait; + pub async fn run(shell: &Shell, args: ServerArgs) -> anyhow::Result<()> { let ecosystem_config = EcosystemConfig::from_file(shell)?; let chain_config = ecosystem_config @@ -73,20 +74,3 @@ fn run_server( ) .context(MSG_FAILED_TO_RUN_SERVER_ERR) } - -async fn wait_for_server(args: WaitArgs, chain_config: &ChainConfig) -> anyhow::Result<()> { - let verbose = global_config().verbose; - - let health_check_port = chain_config - .get_general_config()? - .api_config - .as_ref() - .context("no API config")? - .healthcheck - .port; - - logger::info(MSG_WAITING_FOR_SERVER); - args.poll_health_check(health_check_port, verbose).await?; - logger::info(msg_waiting_for_server_success(health_check_port)); - Ok(()) -} diff --git a/zkstack_cli/crates/zkstack/src/commands/server/wait.rs b/zkstack_cli/crates/zkstack/src/commands/server/wait.rs new file mode 100644 index 000000000000..36d042f0d349 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/commands/server/wait.rs @@ -0,0 +1,28 @@ +use anyhow::Context; +use common::{config::global_config, logger}; +use config::ChainConfig; + +use crate::{ + commands::args::WaitArgs, + messages::{msg_waiting_for_server_success, MSG_WAITING_FOR_SERVER}, +}; + +pub(super) async fn wait_for_server( + args: WaitArgs, + chain_config: &ChainConfig, +) -> anyhow::Result<()> { + let verbose = global_config().verbose; + + let health_check_port = chain_config + .get_general_config()? + .api_config + .as_ref() + .context("no API config")? + .healthcheck + .port; + + logger::info(MSG_WAITING_FOR_SERVER); + args.poll_health_check(health_check_port, verbose).await?; + logger::info(msg_waiting_for_server_success(health_check_port)); + Ok(()) +} From 159ebdf404a82d5a945bbabdc8958bd7912c996d Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 15:44:36 +0100 Subject: [PATCH 05/44] refactor: create module for build subcommand --- .../zkstack/src/commands/server/build.rs | 16 +++++++++++++++ .../crates/zkstack/src/commands/server/mod.rs | 20 ++++--------------- 2 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 zkstack_cli/crates/zkstack/src/commands/server/build.rs diff --git a/zkstack_cli/crates/zkstack/src/commands/server/build.rs b/zkstack_cli/crates/zkstack/src/commands/server/build.rs new file mode 100644 index 000000000000..adffefcb448d --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/commands/server/build.rs @@ -0,0 +1,16 @@ +use anyhow::Context; +use common::{cmd::Cmd, logger}; +use config::ChainConfig; +use xshell::{cmd, Shell}; + +use crate::messages::{MSG_BUILDING_SERVER, MSG_FAILED_TO_BUILD_SERVER_ERR}; + +pub(super) fn build_server(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { + let _dir_guard = shell.push_dir(&chain_config.link_to_code); + + logger::info(MSG_BUILDING_SERVER); + + let mut cmd = Cmd::new(cmd!(shell, "cargo build --release --bin zksync_server")); + cmd = cmd.with_force_run(); + cmd.run().context(MSG_FAILED_TO_BUILD_SERVER_ERR) +} diff --git a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs index 554187cf546f..fdf3321cbdb7 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs @@ -1,6 +1,6 @@ use anyhow::Context; +use build::build_server; use common::{ - cmd::Cmd, logger, server::{Server, ServerMode}, }; @@ -9,16 +9,14 @@ use config::{ GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, }; use wait::wait_for_server; -use xshell::{cmd, Shell}; +use xshell::Shell; use crate::{ commands::args::{RunServerArgs, ServerArgs, ServerCommand}, - messages::{ - MSG_BUILDING_SERVER, MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_BUILD_SERVER_ERR, - MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER, - }, + messages::{MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, }; +mod build; mod wait; pub async fn run(shell: &Shell, args: ServerArgs) -> anyhow::Result<()> { @@ -34,16 +32,6 @@ pub async fn run(shell: &Shell, args: ServerArgs) -> anyhow::Result<()> { } } -fn build_server(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { - let _dir_guard = shell.push_dir(&chain_config.link_to_code); - - logger::info(MSG_BUILDING_SERVER); - - let mut cmd = Cmd::new(cmd!(shell, "cargo build --release --bin zksync_server")); - cmd = cmd.with_force_run(); - cmd.run().context(MSG_FAILED_TO_BUILD_SERVER_ERR) -} - fn run_server( args: RunServerArgs, chain_config: &ChainConfig, From 9d72c07958eb8f209d0fe7920b45a9bf9652bcaf Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 15:46:48 +0100 Subject: [PATCH 06/44] refactor: create module for run subcommand --- .../crates/zkstack/src/commands/server/mod.rs | 46 ++----------------- .../crates/zkstack/src/commands/server/run.rs | 46 +++++++++++++++++++ 2 files changed, 51 insertions(+), 41 deletions(-) create mode 100644 zkstack_cli/crates/zkstack/src/commands/server/run.rs diff --git a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs index fdf3321cbdb7..87d9e69889a1 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs @@ -1,22 +1,17 @@ use anyhow::Context; use build::build_server; -use common::{ - logger, - server::{Server, ServerMode}, -}; -use config::{ - traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, EcosystemConfig, - GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, -}; +use config::EcosystemConfig; +use run::run_server; use wait::wait_for_server; use xshell::Shell; use crate::{ - commands::args::{RunServerArgs, ServerArgs, ServerCommand}, - messages::{MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, + commands::args::{ServerArgs, ServerCommand}, + messages::MSG_CHAIN_NOT_INITIALIZED, }; mod build; +mod run; mod wait; pub async fn run(shell: &Shell, args: ServerArgs) -> anyhow::Result<()> { @@ -31,34 +26,3 @@ pub async fn run(shell: &Shell, args: ServerArgs) -> anyhow::Result<()> { ServerCommand::Wait(args) => wait_for_server(args, &chain_config).await, } } - -fn run_server( - args: RunServerArgs, - chain_config: &ChainConfig, - shell: &Shell, -) -> anyhow::Result<()> { - logger::info(MSG_STARTING_SERVER); - let server = Server::new( - args.components.clone(), - chain_config.link_to_code.clone(), - args.uring, - ); - - let mode = if args.genesis { - ServerMode::Genesis - } else { - ServerMode::Normal - }; - server - .run( - shell, - mode, - GenesisConfig::get_path_with_base_path(&chain_config.configs), - WalletsConfig::get_path_with_base_path(&chain_config.configs), - GeneralConfig::get_path_with_base_path(&chain_config.configs), - SecretsConfig::get_path_with_base_path(&chain_config.configs), - ContractsConfig::get_path_with_base_path(&chain_config.configs), - vec![], - ) - .context(MSG_FAILED_TO_RUN_SERVER_ERR) -} diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs new file mode 100644 index 000000000000..ee402ca9f302 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -0,0 +1,46 @@ +use anyhow::Context; +use common::{ + logger, + server::{Server, ServerMode}, +}; +use config::{ + traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, GeneralConfig, GenesisConfig, + SecretsConfig, WalletsConfig, +}; +use xshell::Shell; + +use crate::{ + commands::args::RunServerArgs, + messages::{MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, +}; + +pub(super) fn run_server( + args: RunServerArgs, + chain_config: &ChainConfig, + shell: &Shell, +) -> anyhow::Result<()> { + logger::info(MSG_STARTING_SERVER); + let server = Server::new( + args.components.clone(), + chain_config.link_to_code.clone(), + args.uring, + ); + + let mode = if args.genesis { + ServerMode::Genesis + } else { + ServerMode::Normal + }; + server + .run( + shell, + mode, + GenesisConfig::get_path_with_base_path(&chain_config.configs), + WalletsConfig::get_path_with_base_path(&chain_config.configs), + GeneralConfig::get_path_with_base_path(&chain_config.configs), + SecretsConfig::get_path_with_base_path(&chain_config.configs), + ContractsConfig::get_path_with_base_path(&chain_config.configs), + vec![], + ) + .context(MSG_FAILED_TO_RUN_SERVER_ERR) +} From c85ba0837bee3a227719414591d707f465e3b8d9 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 16:43:20 +0100 Subject: [PATCH 07/44] refactor: create module for server run args --- .../zkstack/src/commands/args/server/mod.rs | 30 +++---------------- .../zkstack/src/commands/args/server/run.rs | 25 ++++++++++++++++ .../crates/zkstack/src/commands/server/run.rs | 2 +- 3 files changed, 30 insertions(+), 27 deletions(-) create mode 100644 zkstack_cli/crates/zkstack/src/commands/args/server/run.rs diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/mod.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/mod.rs index 40344c90ad05..34e2ad5ec0c3 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/mod.rs @@ -1,13 +1,9 @@ use clap::{Parser, Subcommand}; -use serde::{Deserialize, Serialize}; +use run::RunServerArgs; -use crate::{ - commands::args::WaitArgs, - messages::{ - MSG_SERVER_ADDITIONAL_ARGS_HELP, MSG_SERVER_COMPONENTS_HELP, MSG_SERVER_GENESIS_HELP, - MSG_SERVER_URING_HELP, - }, -}; +use crate::commands::args::WaitArgs; + +pub mod run; #[derive(Debug, Parser)] #[command(args_conflicts_with_subcommands = true, flatten_help = true)] @@ -33,21 +29,3 @@ impl From for ServerCommand { args.command.unwrap_or(ServerCommand::Run(args.run)) } } - -#[derive(Debug, Serialize, Deserialize, Parser)] -pub struct RunServerArgs { - #[arg(long, help = MSG_SERVER_COMPONENTS_HELP)] - pub components: Option>, - #[arg(long, help = MSG_SERVER_GENESIS_HELP)] - pub genesis: bool, - #[arg( - long, short, - trailing_var_arg = true, - allow_hyphen_values = true, - hide = false, - help = MSG_SERVER_ADDITIONAL_ARGS_HELP - )] - additional_args: Vec, - #[clap(help = MSG_SERVER_URING_HELP, long, default_missing_value = "true")] - pub uring: bool, -} diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs new file mode 100644 index 000000000000..f1938c6ae595 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -0,0 +1,25 @@ +use clap::Parser; +use serde::{Deserialize, Serialize}; + +use crate::messages::{ + MSG_SERVER_ADDITIONAL_ARGS_HELP, MSG_SERVER_COMPONENTS_HELP, MSG_SERVER_GENESIS_HELP, + MSG_SERVER_URING_HELP, +}; + +#[derive(Debug, Serialize, Deserialize, Parser)] +pub struct RunServerArgs { + #[arg(long, help = MSG_SERVER_COMPONENTS_HELP)] + pub components: Option>, + #[arg(long, help = MSG_SERVER_GENESIS_HELP)] + pub genesis: bool, + #[arg( + long, short, + trailing_var_arg = true, + allow_hyphen_values = true, + hide = false, + help = MSG_SERVER_ADDITIONAL_ARGS_HELP + )] + additional_args: Vec, + #[clap(help = MSG_SERVER_URING_HELP, long, default_missing_value = "true")] + pub uring: bool, +} diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index ee402ca9f302..fa47a68f57fd 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -10,7 +10,7 @@ use config::{ use xshell::Shell; use crate::{ - commands::args::RunServerArgs, + commands::args::run::RunServerArgs, messages::{MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, }; From 80f15ee0ceaac845ea10e499e7a4172e7e16b91c Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 21 Nov 2024 18:29:50 +0100 Subject: [PATCH 08/44] refactor: clippy --- zkstack_cli/crates/common/src/server.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 311855a4d11a..d0e0d3285ea8 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -90,6 +90,7 @@ impl Server { } } +#[allow(clippy::too_many_arguments)] fn run_binary_component

( shell: &Shell, uring: Option<&str>, From 52bbf7166099ed437076ed0add001468809fe6dc Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 22 Nov 2024 12:03:26 +0100 Subject: [PATCH 09/44] feat: add debug execution mode for server --- zkstack_cli/crates/common/src/server.rs | 63 ++++++++++++++----- .../zkstack/src/commands/args/server/run.rs | 21 ++++++- .../src/commands/chain/genesis/server.rs | 3 +- .../crates/zkstack/src/commands/server/run.rs | 6 +- 4 files changed, 73 insertions(+), 20 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index d0e0d3285ea8..229e75747268 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -20,6 +20,15 @@ pub enum ServerMode { Genesis, } +/// Possible execution modes. +#[derive(Debug, Default)] +pub enum ExecutionMode { + #[default] + Release, + Debug, + Docker, +} + impl Server { /// Creates a new instance of the server. pub fn new(components: Option>, code_path: PathBuf, uring: bool) -> Self { @@ -35,6 +44,7 @@ impl Server { pub fn run

( &self, shell: &Shell, + execution_mode: ExecutionMode, server_mode: ServerMode, genesis_path: P, wallets_path: P, @@ -57,7 +67,7 @@ impl Server { let uring = self.uring.then_some("--features=rocksdb/io-uring"); - run_binary_component( + run_server( shell, uring, genesis_path, @@ -66,6 +76,7 @@ impl Server { secrets_path, contracts_path, additional_args, + execution_mode, server_mode, )?; @@ -91,7 +102,7 @@ impl Server { } #[allow(clippy::too_many_arguments)] -fn run_binary_component

( +fn run_server

( shell: &Shell, uring: Option<&str>, genesis_path: P, @@ -100,25 +111,45 @@ fn run_binary_component

( secrets_path: P, contracts_path: P, additional_args: Vec, + execution_mode: ExecutionMode, server_mode: ServerMode, ) -> anyhow::Result<()> where P: AsRef, { - let mut cmd = Cmd::new( - cmd!( - shell, - "cargo run --release --bin zksync_server {uring...} -- - --genesis-path {genesis_path} - --wallets-path {wallets_path} - --config-path {general_path} - --secrets-path {secrets_path} - --contracts-config-path {contracts_path} - " - ) - .args(additional_args) - .env_remove("RUSTUP_TOOLCHAIN"), - ); + let mut cmd = match execution_mode { + ExecutionMode::Release => Cmd::new( + cmd!( + shell, + "cargo run --release --bin zksync_server {uring...} -- + --genesis-path {genesis_path} + --wallets-path {wallets_path} + --config-path {general_path} + --secrets-path {secrets_path} + --contracts-config-path {contracts_path} + " + ) + .args(additional_args) + .env_remove("RUSTUP_TOOLCHAIN"), + ), + ExecutionMode::Debug => Cmd::new( + cmd!( + shell, + "cargo run --bin zksync_server {uring...} -- + --genesis-path {genesis_path} + --wallets-path {wallets_path} + --config-path {general_path} + --secrets-path {secrets_path} + --contracts-config-path {contracts_path} + " + ) + .args(additional_args) + .env_remove("RUSTUP_TOOLCHAIN"), + ), + ExecutionMode::Docker => { + unimplemented!() + } + }; // If we are running server in normal mode // we need to get the output to the console diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index f1938c6ae595..fcc096f5dbcc 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -1,4 +1,4 @@ -use clap::Parser; +use clap::{Parser, ValueEnum}; use serde::{Deserialize, Serialize}; use crate::messages::{ @@ -6,8 +6,27 @@ use crate::messages::{ MSG_SERVER_URING_HELP, }; +#[derive(Clone, Debug, Serialize, Deserialize, ValueEnum)] +pub enum ExecutionMode { + Release, + Debug, + Docker, +} + +impl From for common::server::ExecutionMode { + fn from(mode: ExecutionMode) -> Self { + match mode { + ExecutionMode::Debug => Self::Debug, + ExecutionMode::Release => Self::Release, + ExecutionMode::Docker => Self::Docker, + } + } +} + #[derive(Debug, Serialize, Deserialize, Parser)] pub struct RunServerArgs { + #[arg(long, default_value = "release")] + pub mode: ExecutionMode, #[arg(long, help = MSG_SERVER_COMPONENTS_HELP)] pub components: Option>, #[arg(long, help = MSG_SERVER_GENESIS_HELP)] diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 50a74b7ea9e4..f9641bf9f4f5 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -1,7 +1,7 @@ use anyhow::Context; use common::{ logger, - server::{Server, ServerMode}, + server::{ExecutionMode, Server, ServerMode}, spinner::Spinner, }; use config::{ @@ -34,6 +34,7 @@ pub fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow:: server .run( shell, + ExecutionMode::default(), ServerMode::Genesis, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index fa47a68f57fd..f21b8938eedb 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -26,15 +26,17 @@ pub(super) fn run_server( args.uring, ); - let mode = if args.genesis { + let server_mode = if args.genesis { ServerMode::Genesis } else { ServerMode::Normal }; + server .run( shell, - mode, + args.mode.into(), + server_mode, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), GeneralConfig::get_path_with_base_path(&chain_config.configs), From a513136b47b12d98d8b570d3fbfb1a14806002ac Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 22 Nov 2024 13:55:44 +0100 Subject: [PATCH 10/44] feat: draft docker execution mode for server --- zkstack_cli/crates/common/src/server.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 229e75747268..54dafb37bef7 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -146,9 +146,21 @@ where .args(additional_args) .env_remove("RUSTUP_TOOLCHAIN"), ), - ExecutionMode::Docker => { - unimplemented!() - } + ExecutionMode::Docker => Cmd::new(cmd!( + shell, + "docker run + --platform linux/amd64 + --net=host + -v ./configs:/configs + -v ./chains:/chains + matterlabs/server-v2:latest2.0 + --genesis-path {genesis_path} + --wallets-path {wallets_path} + --config-path {general_path} + --secrets-path {secrets_path} + --contracts-config-path {contracts_path} + {additional_args...}" + )), }; // If we are running server in normal mode From ba7314ef82a628cd1a257968902dc39a0a9e2fc0 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 22 Nov 2024 15:30:58 +0100 Subject: [PATCH 11/44] feat: remove hardcoded volume folders --- zkstack_cli/crates/common/src/server.rs | 10 ++++++++-- .../zkstack/src/commands/chain/genesis/server.rs | 3 +++ zkstack_cli/crates/zkstack/src/commands/server/run.rs | 8 ++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 54dafb37bef7..42dbe3c16d18 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -46,6 +46,8 @@ impl Server { shell: &Shell, execution_mode: ExecutionMode, server_mode: ServerMode, + configs_folder: P, + chains_folder: P, genesis_path: P, wallets_path: P, general_path: P, @@ -70,6 +72,8 @@ impl Server { run_server( shell, uring, + configs_folder, + chains_folder, genesis_path, wallets_path, general_path, @@ -105,6 +109,8 @@ impl Server { fn run_server

( shell: &Shell, uring: Option<&str>, + configs_folder: P, + chains_folder: P, genesis_path: P, wallets_path: P, general_path: P, @@ -151,8 +157,8 @@ where "docker run --platform linux/amd64 --net=host - -v ./configs:/configs - -v ./chains:/chains + -v {configs_folder}:/configs + -v {chains_folder}:/chains matterlabs/server-v2:latest2.0 --genesis-path {genesis_path} --wallets-path {wallets_path} diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index f9641bf9f4f5..27c22c6f1f99 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -30,12 +30,15 @@ pub async fn run(shell: &Shell) -> anyhow::Result<()> { } pub fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { + let ecosystem_config = EcosystemConfig::from_file(shell)?; let server = Server::new(None, chain_config.link_to_code.clone(), false); server .run( shell, ExecutionMode::default(), ServerMode::Genesis, + ecosystem_config.config, + ecosystem_config.chains, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), GeneralConfig::get_path_with_base_path(&chain_config.configs), diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index f21b8938eedb..6bd8238868ce 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -4,8 +4,8 @@ use common::{ server::{Server, ServerMode}, }; use config::{ - traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, GeneralConfig, GenesisConfig, - SecretsConfig, WalletsConfig, + traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, EcosystemConfig, + GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, }; use xshell::Shell; @@ -19,6 +19,8 @@ pub(super) fn run_server( chain_config: &ChainConfig, shell: &Shell, ) -> anyhow::Result<()> { + let ecosystem_config = EcosystemConfig::from_file(shell)?; + logger::info(MSG_STARTING_SERVER); let server = Server::new( args.components.clone(), @@ -37,6 +39,8 @@ pub(super) fn run_server( shell, args.mode.into(), server_mode, + ecosystem_config.config, + ecosystem_config.chains, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), GeneralConfig::get_path_with_base_path(&chain_config.configs), From 96763351e4500c2224212964fe5e508cfdd84383 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 22 Nov 2024 15:59:20 +0100 Subject: [PATCH 12/44] feat: draft option to specify docker image's tag --- zkstack_cli/crates/common/src/server.rs | 17 ++++++++++++----- .../zkstack/src/commands/args/server/run.rs | 2 ++ .../src/commands/chain/genesis/server.rs | 1 + .../crates/zkstack/src/commands/server/run.rs | 1 + 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 42dbe3c16d18..8afa681a38d7 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -54,6 +54,7 @@ impl Server { secrets_path: P, contracts_path: P, mut additional_args: Vec, + tag: Option<&str>, ) -> anyhow::Result<()> where P: AsRef, @@ -82,6 +83,7 @@ impl Server { additional_args, execution_mode, server_mode, + tag, )?; Ok(()) @@ -119,6 +121,7 @@ fn run_server

( additional_args: Vec, execution_mode: ExecutionMode, server_mode: ServerMode, + tag: Option<&str>, ) -> anyhow::Result<()> where P: AsRef, @@ -152,21 +155,25 @@ where .args(additional_args) .env_remove("RUSTUP_TOOLCHAIN"), ), - ExecutionMode::Docker => Cmd::new(cmd!( - shell, - "docker run + ExecutionMode::Docker => { + let tag = tag.unwrap_or("latest"); + + Cmd::new(cmd!( + shell, + "docker run --platform linux/amd64 --net=host -v {configs_folder}:/configs -v {chains_folder}:/chains - matterlabs/server-v2:latest2.0 + matterlabs/server-v2:{tag} --genesis-path {genesis_path} --wallets-path {wallets_path} --config-path {general_path} --secrets-path {secrets_path} --contracts-config-path {contracts_path} {additional_args...}" - )), + )) + } }; // If we are running server in normal mode diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index fcc096f5dbcc..61282636af94 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -41,4 +41,6 @@ pub struct RunServerArgs { additional_args: Vec, #[clap(help = MSG_SERVER_URING_HELP, long, default_missing_value = "true")] pub uring: bool, + #[arg(long, default_value = "latest")] + pub tag: String, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 27c22c6f1f99..6f67a120cd76 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -45,6 +45,7 @@ pub fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow:: SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], + None, // TODO: add support for docker ) .context(MSG_FAILED_TO_RUN_SERVER_ERR) } diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 6bd8238868ce..8fe4153f6062 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -47,6 +47,7 @@ pub(super) fn run_server( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], + Some(args.tag.as_str()), ) .context(MSG_FAILED_TO_RUN_SERVER_ERR) } From ccb1740129825817b654083bae66dce2a6fc5a55 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Mon, 25 Nov 2024 10:34:09 +0100 Subject: [PATCH 13/44] chore: update autocompletion files --- .../crates/zkstack/completion/_zkstack.zsh | 4 ++++ .../crates/zkstack/completion/zkstack.fish | 4 ++++ .../crates/zkstack/completion/zkstack.sh | 20 +++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh index fc6f29851e66..3e1ef82c0b12 100644 --- a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh +++ b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh @@ -2006,9 +2006,11 @@ esac ;; (server) _arguments "${_arguments_options[@]}" : \ +'--mode=[]:MODE:(release debug docker)' \ '*--components=[Components of server to run]:COMPONENTS:_default' \ '*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ +'--tag=[]:TAG:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ '--genesis[Run server in genesis mode]' \ '--uring[Enables uring support for RocksDB]' \ @@ -2039,9 +2041,11 @@ _arguments "${_arguments_options[@]}" : \ ;; (run) _arguments "${_arguments_options[@]}" : \ +'--mode=[]:MODE:(release debug docker)' \ '*--components=[Components of server to run]:COMPONENTS:_default' \ '*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ +'--tag=[]:TAG:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ '--genesis[Run server in genesis mode]' \ '--uring[Enables uring support for RocksDB]' \ diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.fish b/zkstack_cli/crates/zkstack/completion/zkstack.fish index 8a5b338fcda2..84300d02b466 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.fish +++ b/zkstack_cli/crates/zkstack/completion/zkstack.fish @@ -525,8 +525,10 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "init-bellman-cuda" -d 'Initialize bellman-cuda' complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "compressor-keys" -d 'Download compressor keys' complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l components -d 'Components of server to run' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -s a -l additional-args -d 'Additional arguments that can be passed through the CLI' -r +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l chain -d 'Chain to use' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l genesis -d 'Run server in genesis mode' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l uring -d 'Enables uring support for RocksDB' @@ -541,8 +543,10 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -s v -l verbose -d 'Verbose mode' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -l ignore-prerequisites -d 'Ignores prerequisites checks' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -s h -l help -d 'Print help' +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l components -d 'Components of server to run' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -s a -l additional-args -d 'Additional arguments that can be passed through the CLI' -r +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l chain -d 'Chain to use' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l genesis -d 'Run server in genesis mode' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l uring -d 'Enables uring support for RocksDB' diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.sh b/zkstack_cli/crates/zkstack/completion/zkstack.sh index bb373c3f63eb..8c6e926b5d19 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.sh +++ b/zkstack_cli/crates/zkstack/completion/zkstack.sh @@ -7426,12 +7426,16 @@ _zkstack() { return 0 ;; zkstack__server) - opts="-a -v -h --components --genesis --additional-args --uring --verbose --chain --ignore-prerequisites --help build run wait help" + opts="-a -v -h --mode --components --genesis --additional-args --uring --tag --verbose --chain --ignore-prerequisites --help build run wait help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; --components) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -7444,6 +7448,10 @@ _zkstack() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --chain) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -7544,12 +7552,16 @@ _zkstack() { return 0 ;; zkstack__server__run) - opts="-a -v -h --components --genesis --additional-args --uring --verbose --chain --ignore-prerequisites --help" + opts="-a -v -h --mode --components --genesis --additional-args --uring --tag --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; --components) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -7562,6 +7574,10 @@ _zkstack() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --chain) COMPREPLY=($(compgen -f "${cur}")) return 0 From c4e0bc99e105e114974a6a9f59ab163b3d2cc9ba Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Mon, 25 Nov 2024 14:44:54 +0100 Subject: [PATCH 14/44] feat: add utils to get list of github tags --- zkstack_cli/Cargo.lock | 1 + zkstack_cli/Cargo.toml | 2 + zkstack_cli/crates/zkstack/Cargo.toml | 3 +- .../crates/zkstack/src/utils/github.rs | 138 ++++++++++++++++++ zkstack_cli/crates/zkstack/src/utils/mod.rs | 1 + 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 zkstack_cli/crates/zkstack/src/utils/github.rs diff --git a/zkstack_cli/Cargo.lock b/zkstack_cli/Cargo.lock index 2206a1052f59..0d7ecf6b2a43 100644 --- a/zkstack_cli/Cargo.lock +++ b/zkstack_cli/Cargo.lock @@ -6475,6 +6475,7 @@ dependencies = [ "rand", "reqwest 0.12.8", "secrecy", + "semver", "serde", "serde_json", "serde_yaml", diff --git a/zkstack_cli/Cargo.toml b/zkstack_cli/Cargo.toml index 1f493f9c3e41..103bacaf9e02 100644 --- a/zkstack_cli/Cargo.toml +++ b/zkstack_cli/Cargo.toml @@ -53,6 +53,8 @@ lazy_static = "1.4.0" once_cell = "1.19.0" prost = "0.12.1" rand = "0.8.5" +reqwest = { version = "0.12.8", features = ["json"] } +semver = "1.0.23" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde_yaml = "0.9" diff --git a/zkstack_cli/crates/zkstack/Cargo.toml b/zkstack_cli/crates/zkstack/Cargo.toml index 85ab8081eaa4..ae0970f16f29 100644 --- a/zkstack_cli/crates/zkstack/Cargo.toml +++ b/zkstack_cli/crates/zkstack/Cargo.toml @@ -44,7 +44,8 @@ zksync_consensus_crypto.workspace = true zksync_protobuf.workspace = true zksync_protobuf_config.workspace = true prost.workspace = true -reqwest = "0.12.8" +reqwest.workspace = true +semver.workspace = true [dev-dependencies] rand.workspace = true diff --git a/zkstack_cli/crates/zkstack/src/utils/github.rs b/zkstack_cli/crates/zkstack/src/utils/github.rs new file mode 100644 index 000000000000..86e6b9d0df90 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/utils/github.rs @@ -0,0 +1,138 @@ +use anyhow::{Context, Result}; +use reqwest::{ + header::{HeaderMap, HeaderValue}, + Client, +}; +use semver::Version; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub(crate) struct Tag { + name: String, + commit: Commit, + zipball_url: String, + tarball_url: String, +} + +#[derive(Debug, Serialize, Deserialize)] +struct Commit { + sha: String, + url: String, +} + +/// Fetches and sorts GitHub repository tags by semantic version +pub struct GitHubTagFetcher { + client: Client, + auth_token: Option, +} + +impl GitHubTagFetcher { + pub fn new(auth_token: Option) -> Result { + let client = Client::new(); + Ok(Self { client, auth_token }) + } + + pub async fn get_newest_core_tags(&self, limit: Option) -> Result> { + let mut all_tags = Vec::new(); + let mut page = 1; + + // Set up headers + let mut headers = HeaderMap::new(); + headers.insert( + "Accept", + HeaderValue::from_static("application/vnd.github+json"), + ); + headers.insert("User-Agent", HeaderValue::from_static("zkstack")); + headers.insert( + "X-GitHub-Api-Version", + HeaderValue::from_static("2022-11-28"), + ); + + if let Some(token) = &self.auth_token { + headers.insert( + "Authorization", + HeaderValue::from_str(&format!("Bearer {}", token)) + .context("Invalid authorization header")?, + ); + } + + // Fetch all pages + loop { + let url = format!( + "https://api.github.com/repos/matter-labs/zksync-era/tags?page={}&per_page=100", + page + ); + + let response = self + .client + .get(&url) + .headers(headers.clone()) + .send() + .await?; + + if !response.status().is_success() { + return Err(anyhow::anyhow!( + "GitHub API request failed with status: {}", + response.status() + )); + } + + let page_tags: Vec = response.json().await?; + if page_tags.is_empty() { + break; + } + + all_tags.extend(page_tags); + page += 1; + } + + // filter tag names containing "core" + all_tags.retain(|t| t.name.contains("core")); + + // Sort tags by semantic version + all_tags.sort_by(|a, b| { + let version_a = clean_version(&a.name); + let version_b = clean_version(&b.name); + version_b.cmp(&version_a) // Reverse order (newest first) + }); + + // Apply limit if specified + Ok(if let Some(limit) = limit { + all_tags.into_iter().take(limit).collect() + } else { + all_tags + }) + } +} + +/// Cleans and parses version strings into semver::Version +fn clean_version(tag_name: &str) -> Version { + // Remove "core-v" prefix and parse the version string + let cleaned = tag_name.trim_start_matches("core-v"); + Version::parse(cleaned).unwrap_or_else(|_| Version::new(0, 0, 0)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_get_sorted_tags() -> anyhow::Result<()> { + // Replace with your GitHub token if needed + let auth_token = std::env::var("GITHUB_TOKEN").ok(); + + let fetcher = GitHubTagFetcher::new(auth_token)?; + + // Example usage + let tags = fetcher.get_newest_core_tags(Some(5)).await?; + + println!("\nLatest Repository Tags (sorted by version):"); + for tag in tags { + println!("Tag: {}", tag.name); + println!("Commit SHA: {}", tag.commit.sha); + println!("ZIP URL: {}\n", tag.zipball_url); + } + + Ok(()) + } +} diff --git a/zkstack_cli/crates/zkstack/src/utils/mod.rs b/zkstack_cli/crates/zkstack/src/utils/mod.rs index a8bdc00d73fc..3c87ce4f07ce 100644 --- a/zkstack_cli/crates/zkstack/src/utils/mod.rs +++ b/zkstack_cli/crates/zkstack/src/utils/mod.rs @@ -1,5 +1,6 @@ pub mod consensus; pub mod forge; +pub mod github; pub mod link_to_code; pub mod ports; pub mod rocks_db; From f8b5ea3a0cd3d6b9499ccdac2f2490288ad42f6d Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Mon, 25 Nov 2024 16:33:54 +0100 Subject: [PATCH 15/44] feat: add selector for docker image tag --- zkstack_cli/Cargo.lock | 3 +- zkstack_cli/crates/common/Cargo.toml | 2 ++ .../src/utils => common/src}/github.rs | 16 +++++----- zkstack_cli/crates/common/src/lib.rs | 1 + zkstack_cli/crates/common/src/server.rs | 30 ++++++++++++++----- zkstack_cli/crates/zkstack/Cargo.toml | 1 - .../zkstack/src/commands/args/server/run.rs | 4 +-- .../crates/zkstack/src/commands/args/wait.rs | 2 +- .../zkstack/src/commands/chain/genesis/mod.rs | 2 +- .../src/commands/chain/genesis/server.rs | 5 ++-- .../crates/zkstack/src/commands/server/mod.rs | 2 +- .../crates/zkstack/src/commands/server/run.rs | 5 ++-- zkstack_cli/crates/zkstack/src/utils/mod.rs | 1 - 13 files changed, 47 insertions(+), 27 deletions(-) rename zkstack_cli/crates/{zkstack/src/utils => common/src}/github.rs (95%) diff --git a/zkstack_cli/Cargo.lock b/zkstack_cli/Cargo.lock index 0d7ecf6b2a43..a23b566eaf19 100644 --- a/zkstack_cli/Cargo.lock +++ b/zkstack_cli/Cargo.lock @@ -713,6 +713,8 @@ dependencies = [ "futures", "git_version_macro", "once_cell", + "reqwest 0.12.8", + "semver", "serde", "serde_json", "serde_yaml", @@ -6475,7 +6477,6 @@ dependencies = [ "rand", "reqwest 0.12.8", "secrecy", - "semver", "serde", "serde_json", "serde_yaml", diff --git a/zkstack_cli/crates/common/Cargo.toml b/zkstack_cli/crates/common/Cargo.toml index 5fdf481bea6f..8abcfcc626b1 100644 --- a/zkstack_cli/crates/common/Cargo.toml +++ b/zkstack_cli/crates/common/Cargo.toml @@ -30,3 +30,5 @@ xshell.workspace = true thiserror.workspace = true strum.workspace = true git_version_macro.workspace = true +reqwest.workspace = true +semver.workspace = true diff --git a/zkstack_cli/crates/zkstack/src/utils/github.rs b/zkstack_cli/crates/common/src/github.rs similarity index 95% rename from zkstack_cli/crates/zkstack/src/utils/github.rs rename to zkstack_cli/crates/common/src/github.rs index 86e6b9d0df90..c2f7e5223b8d 100644 --- a/zkstack_cli/crates/zkstack/src/utils/github.rs +++ b/zkstack_cli/crates/common/src/github.rs @@ -7,17 +7,17 @@ use semver::Version; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] -pub(crate) struct Tag { - name: String, - commit: Commit, - zipball_url: String, - tarball_url: String, +pub struct Tag { + pub name: String, + pub commit: Commit, + pub zipball_url: String, + pub tarball_url: String, } #[derive(Debug, Serialize, Deserialize)] -struct Commit { - sha: String, - url: String, +pub struct Commit { + pub sha: String, + pub url: String, } /// Fetches and sorts GitHub repository tags by semantic version diff --git a/zkstack_cli/crates/common/src/lib.rs b/zkstack_cli/crates/common/src/lib.rs index 9680bdd8df39..838d360b7337 100644 --- a/zkstack_cli/crates/common/src/lib.rs +++ b/zkstack_cli/crates/common/src/lib.rs @@ -12,6 +12,7 @@ pub mod external_node; pub mod files; pub mod forge; pub mod git; +pub mod github; pub mod server; pub mod version; pub mod wallets; diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 8afa681a38d7..a6075306b04f 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -3,7 +3,7 @@ use std::{ffi::OsStr, path::PathBuf}; use anyhow::Context; use xshell::{cmd, Shell}; -use crate::cmd::Cmd; +use crate::{cmd::Cmd, github::GitHubTagFetcher, PromptSelect}; /// Allows to perform server operations. #[derive(Debug)] @@ -41,7 +41,7 @@ impl Server { /// Runs the server. #[allow(clippy::too_many_arguments)] - pub fn run

( + pub async fn run

( &self, shell: &Shell, execution_mode: ExecutionMode, @@ -54,7 +54,7 @@ impl Server { secrets_path: P, contracts_path: P, mut additional_args: Vec, - tag: Option<&str>, + tag: Option, ) -> anyhow::Result<()> where P: AsRef, @@ -84,7 +84,8 @@ impl Server { execution_mode, server_mode, tag, - )?; + ) + .await?; Ok(()) } @@ -108,7 +109,7 @@ impl Server { } #[allow(clippy::too_many_arguments)] -fn run_server

( +async fn run_server

( shell: &Shell, uring: Option<&str>, configs_folder: P, @@ -121,7 +122,7 @@ fn run_server

( additional_args: Vec, execution_mode: ExecutionMode, server_mode: ServerMode, - tag: Option<&str>, + tag: Option, ) -> anyhow::Result<()> where P: AsRef, @@ -156,7 +157,7 @@ where .env_remove("RUSTUP_TOOLCHAIN"), ), ExecutionMode::Docker => { - let tag = tag.unwrap_or("latest"); + let tag = tag.unwrap_or(select_tag().await?.to_owned()); Cmd::new(cmd!( shell, @@ -184,3 +185,18 @@ where cmd.run().context("Failed to run server") } + +async fn select_tag() -> anyhow::Result { + let fetcher = GitHubTagFetcher::new(None)?; + let gh_tags = fetcher.get_newest_core_tags(Some(5)).await?; + + let tags: Vec = std::iter::once("latest".to_string()) + .chain( + gh_tags + .iter() + .map(|r| r.name.trim_start_matches("core-").to_string()), + ) + .collect(); + + Ok(PromptSelect::new("Select image", tags).ask().into()) +} diff --git a/zkstack_cli/crates/zkstack/Cargo.toml b/zkstack_cli/crates/zkstack/Cargo.toml index ae0970f16f29..c3dc80c073ae 100644 --- a/zkstack_cli/crates/zkstack/Cargo.toml +++ b/zkstack_cli/crates/zkstack/Cargo.toml @@ -45,7 +45,6 @@ zksync_protobuf.workspace = true zksync_protobuf_config.workspace = true prost.workspace = true reqwest.workspace = true -semver.workspace = true [dev-dependencies] rand.workspace = true diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index 61282636af94..0a4d4e3f9c3f 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -41,6 +41,6 @@ pub struct RunServerArgs { additional_args: Vec, #[clap(help = MSG_SERVER_URING_HELP, long, default_missing_value = "true")] pub uring: bool, - #[arg(long, default_value = "latest")] - pub tag: String, + #[arg(long)] + pub tag: Option, } diff --git a/zkstack_cli/crates/zkstack/src/commands/args/wait.rs b/zkstack_cli/crates/zkstack/src/commands/args/wait.rs index a3a7e32ae8b4..8784d36f5782 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/wait.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/wait.rs @@ -1,6 +1,6 @@ use std::{fmt, future::Future, time::Duration}; -use anyhow::Context as _; +use anyhow::Context; use clap::Parser; use common::logger; use reqwest::StatusCode; diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs index c1cc03174aeb..86b1ac622e46 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs @@ -85,7 +85,7 @@ pub async fn genesis( spinner.finish(); let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(config, shell)?; + run_server_genesis(config, shell).await?; spinner.finish(); Ok(()) diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 6f67a120cd76..457111207830 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -22,14 +22,14 @@ pub async fn run(shell: &Shell) -> anyhow::Result<()> { .context(MSG_CHAIN_NOT_INITIALIZED)?; let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(&chain_config, shell)?; + run_server_genesis(&chain_config, shell).await?; spinner.finish(); logger::outro(MSG_GENESIS_COMPLETED); Ok(()) } -pub fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { +pub async fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { let ecosystem_config = EcosystemConfig::from_file(shell)?; let server = Server::new(None, chain_config.link_to_code.clone(), false); server @@ -47,5 +47,6 @@ pub fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow:: vec![], None, // TODO: add support for docker ) + .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) } diff --git a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs index 87d9e69889a1..6c5c45eb2ae7 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/mod.rs @@ -21,7 +21,7 @@ pub async fn run(shell: &Shell, args: ServerArgs) -> anyhow::Result<()> { .context(MSG_CHAIN_NOT_INITIALIZED)?; match ServerCommand::from(args) { - ServerCommand::Run(args) => run_server(args, &chain_config, shell), + ServerCommand::Run(args) => run_server(args, &chain_config, shell).await, ServerCommand::Build => build_server(&chain_config, shell), ServerCommand::Wait(args) => wait_for_server(args, &chain_config).await, } diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 8fe4153f6062..1baeaa785a2b 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -14,7 +14,7 @@ use crate::{ messages::{MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, }; -pub(super) fn run_server( +pub(super) async fn run_server( args: RunServerArgs, chain_config: &ChainConfig, shell: &Shell, @@ -47,7 +47,8 @@ pub(super) fn run_server( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - Some(args.tag.as_str()), + args.tag, ) + .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) } diff --git a/zkstack_cli/crates/zkstack/src/utils/mod.rs b/zkstack_cli/crates/zkstack/src/utils/mod.rs index 3c87ce4f07ce..a8bdc00d73fc 100644 --- a/zkstack_cli/crates/zkstack/src/utils/mod.rs +++ b/zkstack_cli/crates/zkstack/src/utils/mod.rs @@ -1,6 +1,5 @@ pub mod consensus; pub mod forge; -pub mod github; pub mod link_to_code; pub mod ports; pub mod rocks_db; From 8bc6966943d1754dd4bd5182a22f2c2aa5b7f482 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Mon, 25 Nov 2024 16:36:13 +0100 Subject: [PATCH 16/44] fix: remove temporary test --- zkstack_cli/crates/common/src/github.rs | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/zkstack_cli/crates/common/src/github.rs b/zkstack_cli/crates/common/src/github.rs index c2f7e5223b8d..bb2a785f7599 100644 --- a/zkstack_cli/crates/common/src/github.rs +++ b/zkstack_cli/crates/common/src/github.rs @@ -111,28 +111,3 @@ fn clean_version(tag_name: &str) -> Version { let cleaned = tag_name.trim_start_matches("core-v"); Version::parse(cleaned).unwrap_or_else(|_| Version::new(0, 0, 0)) } - -#[cfg(test)] -mod tests { - use super::*; - - #[tokio::test] - async fn test_get_sorted_tags() -> anyhow::Result<()> { - // Replace with your GitHub token if needed - let auth_token = std::env::var("GITHUB_TOKEN").ok(); - - let fetcher = GitHubTagFetcher::new(auth_token)?; - - // Example usage - let tags = fetcher.get_newest_core_tags(Some(5)).await?; - - println!("\nLatest Repository Tags (sorted by version):"); - for tag in tags { - println!("Tag: {}", tag.name); - println!("Commit SHA: {}", tag.commit.sha); - println!("ZIP URL: {}\n", tag.zipball_url); - } - - Ok(()) - } -} From 477a11ca2d564d2f48a0901bce3e60e4ff9faec7 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Mon, 25 Nov 2024 16:55:21 +0100 Subject: [PATCH 17/44] feat: deduplicate cargo run command --- zkstack_cli/crates/common/src/server.rs | 78 ++++++++++++++++--------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index a6075306b04f..4ff0ea187f55 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -128,33 +128,27 @@ where P: AsRef, { let mut cmd = match execution_mode { - ExecutionMode::Release => Cmd::new( - cmd!( - shell, - "cargo run --release --bin zksync_server {uring...} -- - --genesis-path {genesis_path} - --wallets-path {wallets_path} - --config-path {general_path} - --secrets-path {secrets_path} - --contracts-config-path {contracts_path} - " - ) - .args(additional_args) - .env_remove("RUSTUP_TOOLCHAIN"), + ExecutionMode::Release => cargo_run( + shell, + true, + uring, + genesis_path, + wallets_path, + general_path, + secrets_path, + contracts_path, + additional_args, ), - ExecutionMode::Debug => Cmd::new( - cmd!( - shell, - "cargo run --bin zksync_server {uring...} -- - --genesis-path {genesis_path} - --wallets-path {wallets_path} - --config-path {general_path} - --secrets-path {secrets_path} - --contracts-config-path {contracts_path} - " - ) - .args(additional_args) - .env_remove("RUSTUP_TOOLCHAIN"), + ExecutionMode::Debug => cargo_run( + shell, + false, + uring, + genesis_path, + wallets_path, + general_path, + secrets_path, + contracts_path, + additional_args, ), ExecutionMode::Docker => { let tag = tag.unwrap_or(select_tag().await?.to_owned()); @@ -200,3 +194,35 @@ async fn select_tag() -> anyhow::Result { Ok(PromptSelect::new("Select image", tags).ask().into()) } + +fn cargo_run<'a, P>( + shell: &'a Shell, + release: bool, + uring: Option<&str>, + genesis_path: P, + wallets_path: P, + general_path: P, + secrets_path: P, + contracts_path: P, + additional_args: Vec, +) -> Cmd<'a> +where + P: AsRef, +{ + let mode: &str = release.then(|| "--release").unwrap_or(""); + + Cmd::new( + cmd!( + shell, + "cargo run {mode} --bin zksync_server {uring...} -- + --genesis-path {genesis_path} + --wallets-path {wallets_path} + --config-path {general_path} + --secrets-path {secrets_path} + --contracts-config-path {contracts_path} + " + ) + .args(additional_args) + .env_remove("RUSTUP_TOOLCHAIN"), + ) +} From 27138a2f6cc80e6676c3e318721041cceaeab832 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Mon, 25 Nov 2024 17:04:45 +0100 Subject: [PATCH 18/44] refactor: use const for repo url --- zkstack_cli/crates/common/src/github.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/zkstack_cli/crates/common/src/github.rs b/zkstack_cli/crates/common/src/github.rs index bb2a785f7599..28244dd9c0bb 100644 --- a/zkstack_cli/crates/common/src/github.rs +++ b/zkstack_cli/crates/common/src/github.rs @@ -6,6 +6,8 @@ use reqwest::{ use semver::Version; use serde::{Deserialize, Serialize}; +const GITHUB_API_REPO_URL: &str = "https://api.github.com/repos/matter-labs/zksync-era"; + #[derive(Debug, Serialize, Deserialize)] pub struct Tag { pub name: String, @@ -58,10 +60,7 @@ impl GitHubTagFetcher { // Fetch all pages loop { - let url = format!( - "https://api.github.com/repos/matter-labs/zksync-era/tags?page={}&per_page=100", - page - ); + let url = format!("{}/tags?page={}&per_page=100", GITHUB_API_REPO_URL, page); let response = self .client From a0e3c38693435a6e8661a8e9e03246a487b69f4d Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Tue, 26 Nov 2024 11:25:16 +0100 Subject: [PATCH 19/44] refactor: remove /config volume from dockerized server --- zkstack_cli/crates/common/src/server.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 4ff0ea187f55..e931bec5ecd4 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -73,7 +73,6 @@ impl Server { run_server( shell, uring, - configs_folder, chains_folder, genesis_path, wallets_path, @@ -112,7 +111,6 @@ impl Server { async fn run_server

( shell: &Shell, uring: Option<&str>, - configs_folder: P, chains_folder: P, genesis_path: P, wallets_path: P, @@ -158,7 +156,6 @@ where "docker run --platform linux/amd64 --net=host - -v {configs_folder}:/configs -v {chains_folder}:/chains matterlabs/server-v2:{tag} --genesis-path {genesis_path} @@ -209,12 +206,12 @@ fn cargo_run<'a, P>( where P: AsRef, { - let mode: &str = release.then(|| "--release").unwrap_or(""); + let compilation_mode: &str = release.then_some("--release").unwrap_or(""); Cmd::new( cmd!( shell, - "cargo run {mode} --bin zksync_server {uring...} -- + "cargo run {compilation_mode} --bin zksync_server {uring...} -- --genesis-path {genesis_path} --wallets-path {wallets_path} --config-path {general_path} From 4061cbf8a9b6c09cf4da3e5cf96422b43fe74f4a Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Tue, 26 Nov 2024 12:24:15 +0100 Subject: [PATCH 20/44] feat: add mode/tag to server run subcommands --- zkstack_cli/crates/common/src/server.rs | 24 ++------- .../crates/zkstack/completion/_zkstack.zsh | 10 +++- .../crates/zkstack/completion/zkstack.fish | 6 ++- .../crates/zkstack/completion/zkstack.sh | 50 ++++++++++++++----- .../zkstack/src/commands/args/server/run.rs | 44 ++++++++++++++-- .../src/commands/chain/args/genesis.rs | 25 ++++++++-- .../src/commands/chain/args/init/configs.rs | 4 +- .../src/commands/chain/args/init/mod.rs | 11 ++-- .../src/commands/chain/genesis/database.rs | 2 +- .../zkstack/src/commands/chain/genesis/mod.rs | 2 +- .../src/commands/chain/genesis/server.rs | 1 - .../src/commands/chain/init/configs.rs | 2 +- .../zkstack/src/commands/chain/init/mod.rs | 2 +- .../src/commands/ecosystem/args/init.rs | 4 +- .../zkstack/src/commands/ecosystem/init.rs | 2 +- .../crates/zkstack/src/commands/server/run.rs | 3 +- .../crates/zkstack/src/utils/docker.rs | 16 ++++++ zkstack_cli/crates/zkstack/src/utils/mod.rs | 1 + 18 files changed, 152 insertions(+), 57 deletions(-) create mode 100644 zkstack_cli/crates/zkstack/src/utils/docker.rs diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index e931bec5ecd4..823e61d9fa98 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -3,7 +3,7 @@ use std::{ffi::OsStr, path::PathBuf}; use anyhow::Context; use xshell::{cmd, Shell}; -use crate::{cmd::Cmd, github::GitHubTagFetcher, PromptSelect}; +use crate::cmd::Cmd; /// Allows to perform server operations. #[derive(Debug)] @@ -46,7 +46,6 @@ impl Server { shell: &Shell, execution_mode: ExecutionMode, server_mode: ServerMode, - configs_folder: P, chains_folder: P, genesis_path: P, wallets_path: P, @@ -149,7 +148,8 @@ where additional_args, ), ExecutionMode::Docker => { - let tag = tag.unwrap_or(select_tag().await?.to_owned()); + // safe to unwrap when ExecutionMode is Docker because we invoke fill_values_with_prompt + let tag = tag.unwrap(); Cmd::new(cmd!( shell, @@ -177,21 +177,7 @@ where cmd.run().context("Failed to run server") } -async fn select_tag() -> anyhow::Result { - let fetcher = GitHubTagFetcher::new(None)?; - let gh_tags = fetcher.get_newest_core_tags(Some(5)).await?; - - let tags: Vec = std::iter::once("latest".to_string()) - .chain( - gh_tags - .iter() - .map(|r| r.name.trim_start_matches("core-").to_string()), - ) - .collect(); - - Ok(PromptSelect::new("Select image", tags).ask().into()) -} - +#[allow(clippy::too_many_arguments)] fn cargo_run<'a, P>( shell: &'a Shell, release: bool, @@ -206,7 +192,7 @@ fn cargo_run<'a, P>( where P: AsRef, { - let compilation_mode: &str = release.then_some("--release").unwrap_or(""); + let compilation_mode: &str = if release { "--release" } else { "" }; Cmd::new( cmd!( diff --git a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh index 3e1ef82c0b12..fb2991efbc63 100644 --- a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh +++ b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh @@ -307,6 +307,8 @@ _arguments "${_arguments_options[@]}" : \ case $line[1] in (configs) _arguments "${_arguments_options[@]}" : \ +'--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--l1-rpc-url=[L1 RPC URL]:L1_RPC_URL:_default' \ @@ -353,6 +355,8 @@ esac ;; (genesis) _arguments "${_arguments_options[@]}" : \ +'--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ @@ -377,6 +381,8 @@ _arguments "${_arguments_options[@]}" : \ case $line[1] in (init-database) _arguments "${_arguments_options[@]}" : \ +'--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ @@ -2007,10 +2013,10 @@ esac (server) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '*--components=[Components of server to run]:COMPONENTS:_default' \ '*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ -'--tag=[]:TAG:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ '--genesis[Run server in genesis mode]' \ '--uring[Enables uring support for RocksDB]' \ @@ -2042,10 +2048,10 @@ _arguments "${_arguments_options[@]}" : \ (run) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '*--components=[Components of server to run]:COMPONENTS:_default' \ '*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ -'--tag=[]:TAG:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ '--genesis[Run server in genesis mode]' \ '--uring[Enables uring support for RocksDB]' \ diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.fish b/zkstack_cli/crates/zkstack/completion/zkstack.fish index 84300d02b466..a9708ac94f07 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.fish +++ b/zkstack_cli/crates/zkstack/completion/zkstack.fish @@ -195,6 +195,8 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_s complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -s h -l help -d 'Print help (see more with \'--help\')' complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -f -a "configs" -d 'Initialize chain configs' complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' +complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" +complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l server-db-url -d 'Server database url without database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l server-db-name -d 'Server database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l chain -d 'Chain to use' -r @@ -526,9 +528,9 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "compressor-keys" -d 'Download compressor keys' complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l components -d 'Components of server to run' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -s a -l additional-args -d 'Additional arguments that can be passed through the CLI' -r -complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l chain -d 'Chain to use' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l genesis -d 'Run server in genesis mode' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l uring -d 'Enables uring support for RocksDB' @@ -544,9 +546,9 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -l ignore-prerequisites -d 'Ignores prerequisites checks' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -s h -l help -d 'Print help' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l components -d 'Components of server to run' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -s a -l additional-args -d 'Additional arguments that can be passed through the CLI' -r -complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l chain -d 'Chain to use' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l genesis -d 'Run server in genesis mode' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l uring -d 'Enables uring support for RocksDB' diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.sh b/zkstack_cli/crates/zkstack/completion/zkstack.sh index 8c6e926b5d19..08b5d964fce1 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.sh +++ b/zkstack_cli/crates/zkstack/completion/zkstack.sh @@ -1574,12 +1574,20 @@ _zkstack() { return 0 ;; zkstack__chain__genesis) - opts="-d -d -v -h --server-db-url --server-db-name --dev --dont-drop --verbose --chain --ignore-prerequisites --help init-database server help" + opts="-d -d -v -h --mode --tag --server-db-url --server-db-name --dev --dont-drop --verbose --chain --ignore-prerequisites --help init-database server help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --server-db-url) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -1656,12 +1664,20 @@ _zkstack() { return 0 ;; zkstack__chain__genesis__init__database) - opts="-d -d -v -h --server-db-url --server-db-name --dev --dont-drop --verbose --chain --ignore-prerequisites --help" + opts="-d -d -v -h --mode --tag --server-db-url --server-db-name --dev --dont-drop --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --server-db-url) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -2024,12 +2040,20 @@ _zkstack() { return 0 ;; zkstack__chain__init__configs) - opts="-d -d -v -h --server-db-url --server-db-name --dev --dont-drop --l1-rpc-url --no-port-reallocation --verbose --chain --ignore-prerequisites --help" + opts="-d -d -v -h --mode --tag --server-db-url --server-db-name --dev --dont-drop --l1-rpc-url --no-port-reallocation --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --server-db-url) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -7426,7 +7450,7 @@ _zkstack() { return 0 ;; zkstack__server) - opts="-a -v -h --mode --components --genesis --additional-args --uring --tag --verbose --chain --ignore-prerequisites --help build run wait help" + opts="-a -v -h --mode --tag --components --genesis --additional-args --uring --verbose --chain --ignore-prerequisites --help build run wait help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 2 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -7436,19 +7460,19 @@ _zkstack() { COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) return 0 ;; - --components) + --tag) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --additional-args) + --components) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - -a) + --additional-args) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --tag) + -a) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; @@ -7552,7 +7576,7 @@ _zkstack() { return 0 ;; zkstack__server__run) - opts="-a -v -h --mode --components --genesis --additional-args --uring --tag --verbose --chain --ignore-prerequisites --help" + opts="-a -v -h --mode --tag --components --genesis --additional-args --uring --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -7562,19 +7586,19 @@ _zkstack() { COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) return 0 ;; - --components) + --tag) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --additional-args) + --components) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - -a) + --additional-args) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --tag) + -a) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index 0a4d4e3f9c3f..a56b2badd214 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -1,13 +1,17 @@ use clap::{Parser, ValueEnum}; use serde::{Deserialize, Serialize}; -use crate::messages::{ - MSG_SERVER_ADDITIONAL_ARGS_HELP, MSG_SERVER_COMPONENTS_HELP, MSG_SERVER_GENESIS_HELP, - MSG_SERVER_URING_HELP, +use crate::{ + messages::{ + MSG_SERVER_ADDITIONAL_ARGS_HELP, MSG_SERVER_COMPONENTS_HELP, MSG_SERVER_GENESIS_HELP, + MSG_SERVER_URING_HELP, + }, + utils::docker::select_tag, }; -#[derive(Clone, Debug, Serialize, Deserialize, ValueEnum)] +#[derive(Clone, Debug, Default, Serialize, Deserialize, ValueEnum)] pub enum ExecutionMode { + #[default] Release, Debug, Docker, @@ -27,6 +31,8 @@ impl From for common::server::ExecutionMode { pub struct RunServerArgs { #[arg(long, default_value = "release")] pub mode: ExecutionMode, + #[arg(long)] + pub tag: Option, #[arg(long, help = MSG_SERVER_COMPONENTS_HELP)] pub components: Option>, #[arg(long, help = MSG_SERVER_GENESIS_HELP)] @@ -41,6 +47,34 @@ pub struct RunServerArgs { additional_args: Vec, #[clap(help = MSG_SERVER_URING_HELP, long, default_missing_value = "true")] pub uring: bool, - #[arg(long)] +} + +impl RunServerArgs { + pub async fn fill_values_with_prompt(self) -> RunServerArgsFinal { + let tag = if let ExecutionMode::Docker = self.mode { + self.tag + .or(select_tag().await.ok().or(Some("latest".to_string()))) + } else { + None + }; + + RunServerArgsFinal { + mode: self.mode, + tag, + components: self.components, + genesis: self.genesis, + additional_args: self.additional_args, + uring: self.uring, + } + } +} + +#[derive(Debug, Serialize, Deserialize, Parser)] +pub struct RunServerArgsFinal { + pub mode: ExecutionMode, pub tag: Option, + pub components: Option>, + pub genesis: bool, + pub additional_args: Vec, + pub uring: bool, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs index f990cbfd77da..44ee49c5e5e2 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs @@ -7,15 +7,21 @@ use slugify_rs::slugify; use url::Url; use crate::{ + commands::args::run::ExecutionMode, defaults::{generate_db_names, DBNames, DATABASE_SERVER_URL}, messages::{ msg_server_db_name_prompt, msg_server_db_url_prompt, MSG_SERVER_DB_NAME_HELP, MSG_SERVER_DB_URL_HELP, MSG_USE_DEFAULT_DATABASES_HELP, }, + utils::docker::select_tag, }; #[derive(Debug, Clone, Serialize, Deserialize, Parser, Default)] pub struct GenesisArgs { + #[arg(long, default_value = "release")] + pub mode: ExecutionMode, + #[arg(long)] + pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] pub server_db_url: Option, #[clap(long, help = MSG_SERVER_DB_NAME_HELP)] @@ -27,11 +33,20 @@ pub struct GenesisArgs { } impl GenesisArgs { - pub fn fill_values_with_prompt(self, config: &ChainConfig) -> GenesisArgsFinal { + pub async fn fill_values_with_prompt(self, config: &ChainConfig) -> GenesisArgsFinal { + let tag = if let ExecutionMode::Docker = self.mode { + self.tag + .or(select_tag().await.ok().or(Some("latest".to_string()))) + } else { + None + }; + let DBNames { server_name, .. } = generate_db_names(config); let chain_name = config.name.clone(); if self.dev { GenesisArgsFinal { + mode: self.mode, + tag, server_db: DatabaseConfig::new(DATABASE_SERVER_URL.clone(), server_name), dont_drop: self.dont_drop, } @@ -50,13 +65,15 @@ impl GenesisArgs { separator = "_" ); GenesisArgsFinal { + mode: self.mode, + tag, server_db: DatabaseConfig::new(server_db_url, server_db_name), dont_drop: self.dont_drop, } } } - pub fn fill_values_with_secrets( + pub async fn fill_values_with_secrets( mut self, chain_config: &ChainConfig, ) -> anyhow::Result { @@ -76,7 +93,7 @@ impl GenesisArgs { self.server_db_url = self.server_db_url.or(server_db_url); self.server_db_name = self.server_db_name.or(server_db_name); - Ok(self.fill_values_with_prompt(chain_config)) + Ok(self.fill_values_with_prompt(chain_config).await) } pub fn reset_db_names(&mut self) { @@ -87,6 +104,8 @@ impl GenesisArgs { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GenesisArgsFinal { + pub mode: ExecutionMode, + pub tag: Option, pub server_db: DatabaseConfig, pub dont_drop: bool, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs index b34809643cf5..42ecb68950b0 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs @@ -36,7 +36,7 @@ pub struct InitConfigsArgsFinal { } impl InitConfigsArgs { - pub fn fill_values_with_prompt(self, config: &ChainConfig) -> InitConfigsArgsFinal { + pub async fn fill_values_with_prompt(self, config: &ChainConfig) -> InitConfigsArgsFinal { let l1_rpc_url = self.l1_rpc_url.unwrap_or_else(|| { let mut prompt = Prompt::new(MSG_L1_RPC_URL_PROMPT); if config.l1_network == L1Network::Localhost { @@ -52,7 +52,7 @@ impl InitConfigsArgs { }); InitConfigsArgsFinal { - genesis_args: self.genesis_args.fill_values_with_prompt(config), + genesis_args: self.genesis_args.fill_values_with_prompt(config).await, l1_rpc_url, no_port_reallocation: self.no_port_reallocation, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs index a5c7a6890ca1..ae0607d63a7b 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs @@ -6,7 +6,10 @@ use types::L1Network; use url::Url; use crate::{ - commands::chain::args::genesis::{GenesisArgs, GenesisArgsFinal}, + commands::{ + args::run::ExecutionMode, + chain::args::genesis::{GenesisArgs, GenesisArgsFinal}, + }, defaults::LOCAL_RPC_URL, messages::{ MSG_DEPLOY_PAYMASTER_PROMPT, MSG_DEV_ARG_HELP, MSG_L1_RPC_URL_HELP, @@ -42,6 +45,8 @@ pub struct InitArgs { impl InitArgs { pub fn get_genesis_args(&self) -> GenesisArgs { GenesisArgs { + mode: ExecutionMode::Release, + tag: None, server_db_url: self.server_db_url.clone(), server_db_name: self.server_db_name.clone(), dev: self.dev, @@ -49,7 +54,7 @@ impl InitArgs { } } - pub fn fill_values_with_prompt(self, config: &ChainConfig) -> InitArgsFinal { + pub async fn fill_values_with_prompt(self, config: &ChainConfig) -> InitArgsFinal { let genesis = self.get_genesis_args(); let deploy_paymaster = if self.dev { @@ -82,7 +87,7 @@ impl InitArgs { InitArgsFinal { forge_args: self.forge_args, - genesis_args: genesis.fill_values_with_prompt(config), + genesis_args: genesis.fill_values_with_prompt(config).await, deploy_paymaster, l1_rpc_url, no_port_reallocation: self.no_port_reallocation, diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/database.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/database.rs index edf480946be1..df13ab9c18d5 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/database.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/database.rs @@ -35,7 +35,7 @@ pub async fn run(args: GenesisArgs, shell: &Shell) -> anyhow::Result<()> { .context(MSG_CHAIN_NOT_INITIALIZED)?; let mut secrets = chain_config.get_secrets_config()?; - let args = args.fill_values_with_secrets(&chain_config)?; + let args = args.fill_values_with_secrets(&chain_config).await?; set_server_database(&mut secrets, &args.server_db)?; secrets.save_with_base_path(shell, &chain_config.configs)?; diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs index 86b1ac622e46..825b20351973 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs @@ -50,7 +50,7 @@ pub async fn run_genesis(args: GenesisArgs, shell: &Shell) -> anyhow::Result<()> let chain_config = ecosystem_config .load_current_chain() .context(MSG_CHAIN_NOT_INITIALIZED)?; - let args = args.fill_values_with_prompt(&chain_config); + let args = args.fill_values_with_prompt(&chain_config).await; genesis(args, shell, &chain_config).await?; logger::outro(MSG_GENESIS_COMPLETED); diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 457111207830..99681a3e069f 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -37,7 +37,6 @@ pub async fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> an shell, ExecutionMode::default(), ServerMode::Genesis, - ecosystem_config.config, ecosystem_config.chains, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/init/configs.rs b/zkstack_cli/crates/zkstack/src/commands/chain/init/configs.rs index 31c5c681e7d3..5671b66c5839 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/init/configs.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/init/configs.rs @@ -30,7 +30,7 @@ pub async fn run(args: InitConfigsArgs, shell: &Shell) -> anyhow::Result<()> { let chain_config = ecosystem_config .load_current_chain() .context(MSG_CHAIN_NOT_FOUND_ERR)?; - let args = args.fill_values_with_prompt(&chain_config); + let args = args.fill_values_with_prompt(&chain_config).await; init_configs(&args, shell, &ecosystem_config, &chain_config).await?; logger::outro(MSG_CHAIN_CONFIGS_INITIALIZED); diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/init/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/init/mod.rs index d92c56d2eb10..909ed2a0180c 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/init/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/init/mod.rs @@ -58,7 +58,7 @@ async fn run_init(args: InitArgs, shell: &Shell) -> anyhow::Result<()> { let chain_config = config .load_current_chain() .context(MSG_CHAIN_NOT_FOUND_ERR)?; - let args = args.fill_values_with_prompt(&chain_config); + let args = args.fill_values_with_prompt(&chain_config).await; logger::note(MSG_SELECTED_CONFIG, logger::object_to_string(&chain_config)); logger::info(msg_initializing_chain("")); diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs index 09115fd49ba7..fa41976c15d2 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs @@ -7,7 +7,7 @@ use types::L1Network; use url::Url; use crate::{ - commands::chain::args::genesis::GenesisArgs, + commands::{args::run::ExecutionMode, chain::args::genesis::GenesisArgs}, defaults::LOCAL_RPC_URL, messages::{ MSG_DEPLOY_ECOSYSTEM_PROMPT, MSG_DEPLOY_ERC20_PROMPT, MSG_DEV_ARG_HELP, @@ -106,6 +106,8 @@ pub struct EcosystemInitArgs { impl EcosystemInitArgs { pub fn get_genesis_args(&self) -> GenesisArgs { GenesisArgs { + mode: ExecutionMode::Release, + tag: None, server_db_url: self.server_db_url.clone(), server_db_name: self.server_db_name.clone(), dev: self.dev, diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs index 06b9b9161112..afb5064d7c5d 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs @@ -367,7 +367,7 @@ async fn init_chains( no_port_reallocation: final_init_args.no_port_reallocation, dev: final_init_args.dev, }; - let final_chain_init_args = chain_init_args.fill_values_with_prompt(&chain_config); + let final_chain_init_args = chain_init_args.fill_values_with_prompt(&chain_config).await; chain::init::init( &final_chain_init_args, diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 1baeaa785a2b..57198c3dcb0e 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -19,6 +19,8 @@ pub(super) async fn run_server( chain_config: &ChainConfig, shell: &Shell, ) -> anyhow::Result<()> { + let args = args.fill_values_with_prompt().await; + let ecosystem_config = EcosystemConfig::from_file(shell)?; logger::info(MSG_STARTING_SERVER); @@ -39,7 +41,6 @@ pub(super) async fn run_server( shell, args.mode.into(), server_mode, - ecosystem_config.config, ecosystem_config.chains, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), diff --git a/zkstack_cli/crates/zkstack/src/utils/docker.rs b/zkstack_cli/crates/zkstack/src/utils/docker.rs new file mode 100644 index 000000000000..89952f8e68a3 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/utils/docker.rs @@ -0,0 +1,16 @@ +use common::{github::GitHubTagFetcher, PromptSelect}; + +pub async fn select_tag() -> anyhow::Result { + let fetcher = GitHubTagFetcher::new(None)?; + let gh_tags = fetcher.get_newest_core_tags(Some(5)).await?; + + let tags: Vec = std::iter::once("latest".to_string()) + .chain( + gh_tags + .iter() + .map(|r| r.name.trim_start_matches("core-").to_string()), + ) + .collect(); + + Ok(PromptSelect::new("Select image", tags).ask()) +} diff --git a/zkstack_cli/crates/zkstack/src/utils/mod.rs b/zkstack_cli/crates/zkstack/src/utils/mod.rs index a8bdc00d73fc..87f5fb2d2c57 100644 --- a/zkstack_cli/crates/zkstack/src/utils/mod.rs +++ b/zkstack_cli/crates/zkstack/src/utils/mod.rs @@ -1,4 +1,5 @@ pub mod consensus; +pub mod docker; pub mod forge; pub mod link_to_code; pub mod ports; From debb5070631f6669b5081cd829980f78f1ac062d Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Tue, 26 Nov 2024 15:30:36 +0100 Subject: [PATCH 21/44] fix: fix docker volumes/paths --- zkstack_cli/crates/common/src/server.rs | 19 ++++++++++--------- .../src/commands/chain/genesis/server.rs | 2 -- .../crates/zkstack/src/commands/server/run.rs | 7 ++----- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 823e61d9fa98..b2726bfc1760 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -46,7 +46,6 @@ impl Server { shell: &Shell, execution_mode: ExecutionMode, server_mode: ServerMode, - chains_folder: P, genesis_path: P, wallets_path: P, general_path: P, @@ -72,7 +71,6 @@ impl Server { run_server( shell, uring, - chains_folder, genesis_path, wallets_path, general_path, @@ -110,7 +108,6 @@ impl Server { async fn run_server

( shell: &Shell, uring: Option<&str>, - chains_folder: P, genesis_path: P, wallets_path: P, general_path: P, @@ -156,13 +153,17 @@ where "docker run --platform linux/amd64 --net=host - -v {chains_folder}:/chains + -v {genesis_path}:/genesis.yaml + -v {wallets_path}:/wallets.yaml + -v {general_path}:/general.yaml + -v {secrets_path}:/secrets.yaml + -v {contracts_path}:/contracts.yaml matterlabs/server-v2:{tag} - --genesis-path {genesis_path} - --wallets-path {wallets_path} - --config-path {general_path} - --secrets-path {secrets_path} - --contracts-config-path {contracts_path} + --genesis-path /genesis.yaml + --wallets-path /wallets.yaml + --config-path /general.yaml + --secrets-path /secrets.yaml + --contracts-config-path /contracts.yaml {additional_args...}" )) } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 99681a3e069f..e02d0f8f7525 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -30,14 +30,12 @@ pub async fn run(shell: &Shell) -> anyhow::Result<()> { } pub async fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { - let ecosystem_config = EcosystemConfig::from_file(shell)?; let server = Server::new(None, chain_config.link_to_code.clone(), false); server .run( shell, ExecutionMode::default(), ServerMode::Genesis, - ecosystem_config.chains, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), GeneralConfig::get_path_with_base_path(&chain_config.configs), diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 57198c3dcb0e..55ea6dacd82c 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -4,8 +4,8 @@ use common::{ server::{Server, ServerMode}, }; use config::{ - traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, EcosystemConfig, - GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, + traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, GeneralConfig, GenesisConfig, + SecretsConfig, WalletsConfig, }; use xshell::Shell; @@ -21,8 +21,6 @@ pub(super) async fn run_server( ) -> anyhow::Result<()> { let args = args.fill_values_with_prompt().await; - let ecosystem_config = EcosystemConfig::from_file(shell)?; - logger::info(MSG_STARTING_SERVER); let server = Server::new( args.components.clone(), @@ -41,7 +39,6 @@ pub(super) async fn run_server( shell, args.mode.into(), server_mode, - ecosystem_config.chains, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), GeneralConfig::get_path_with_base_path(&chain_config.configs), From d80eaa5bef7a7fac399c6a4b44d7f6c4e2776eb8 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Tue, 26 Nov 2024 16:17:49 +0100 Subject: [PATCH 22/44] feat: add option to run dockerized server in genesis subcommand --- .../chain/args/{genesis.rs => genesis/mod.rs} | 14 ++--- .../src/commands/chain/args/genesis/server.rs | 52 +++++++++++++++++++ .../zkstack/src/commands/chain/genesis/mod.rs | 7 +-- .../src/commands/chain/genesis/server.rs | 26 +++++++--- 4 files changed, 82 insertions(+), 17 deletions(-) rename zkstack_cli/crates/zkstack/src/commands/chain/args/{genesis.rs => genesis/mod.rs} (99%) create mode 100644 zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs similarity index 99% rename from zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs rename to zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs index 44ee49c5e5e2..67f8fd64e27d 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs @@ -16,6 +16,8 @@ use crate::{ utils::docker::select_tag, }; +pub mod server; + #[derive(Debug, Clone, Serialize, Deserialize, Parser, Default)] pub struct GenesisArgs { #[arg(long, default_value = "release")] @@ -45,10 +47,10 @@ impl GenesisArgs { let chain_name = config.name.clone(); if self.dev { GenesisArgsFinal { - mode: self.mode, - tag, server_db: DatabaseConfig::new(DATABASE_SERVER_URL.clone(), server_name), dont_drop: self.dont_drop, + mode: self.mode, + tag, } } else { let server_db_url = self.server_db_url.unwrap_or_else(|| { @@ -65,10 +67,10 @@ impl GenesisArgs { separator = "_" ); GenesisArgsFinal { - mode: self.mode, - tag, server_db: DatabaseConfig::new(server_db_url, server_db_name), dont_drop: self.dont_drop, + mode: self.mode, + tag, } } } @@ -104,8 +106,8 @@ impl GenesisArgs { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GenesisArgsFinal { - pub mode: ExecutionMode, - pub tag: Option, pub server_db: DatabaseConfig, pub dont_drop: bool, + pub mode: ExecutionMode, + pub tag: Option, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs new file mode 100644 index 000000000000..d384c6f82ff9 --- /dev/null +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs @@ -0,0 +1,52 @@ +use clap::{Parser, ValueEnum}; +use serde::{Deserialize, Serialize}; + +use crate::utils::docker::select_tag; + +#[derive(Clone, Debug, Default, Serialize, Deserialize, ValueEnum)] +pub enum ExecutionMode { + #[default] + Release, + Debug, + Docker, +} + +impl From for common::server::ExecutionMode { + fn from(mode: ExecutionMode) -> Self { + match mode { + ExecutionMode::Debug => Self::Debug, + ExecutionMode::Release => Self::Release, + ExecutionMode::Docker => Self::Docker, + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, Parser)] +pub struct GenesisServerArgs { + #[arg(long, default_value = "release")] + pub mode: ExecutionMode, + #[arg(long)] + pub tag: Option, +} + +impl GenesisServerArgs { + pub async fn fill_values_with_prompt(self) -> GenesisServerArgsFinal { + let tag = if let ExecutionMode::Docker = self.mode { + self.tag + .or(select_tag().await.ok().or(Some("latest".to_string()))) + } else { + None + }; + + GenesisServerArgsFinal { + mode: self.mode, + tag, + } + } +} + +#[derive(Debug, Serialize, Deserialize, Parser)] +pub struct GenesisServerArgsFinal { + pub mode: ExecutionMode, + pub tag: Option, +} diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs index 825b20351973..67802353e76a 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs @@ -4,6 +4,7 @@ use common::{logger, spinner::Spinner}; use config::{ChainConfig, EcosystemConfig}; use xshell::Shell; +use super::args::genesis::server::GenesisServerArgs; use crate::{ commands::chain::{ args::genesis::{GenesisArgs, GenesisArgsFinal}, @@ -25,7 +26,7 @@ pub enum GenesisSubcommands { #[command(alias = "database")] InitDatabase(Box), /// Runs server genesis - Server, + Server(GenesisServerArgs), } #[derive(Parser, Debug)] @@ -40,7 +41,7 @@ pub struct GenesisCommand { pub(crate) async fn run(args: GenesisCommand, shell: &Shell) -> anyhow::Result<()> { match args.command { Some(GenesisSubcommands::InitDatabase(args)) => database::run(*args, shell).await, - Some(GenesisSubcommands::Server) => server::run(shell).await, + Some(GenesisSubcommands::Server(args)) => server::run(args, shell).await, None => run_genesis(args.args, shell).await, } } @@ -85,7 +86,7 @@ pub async fn genesis( spinner.finish(); let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(config, shell).await?; + run_server_genesis(config, shell, args.mode.into(), args.tag).await?; spinner.finish(); Ok(()) diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index e02d0f8f7525..20c4136bd8ae 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -10,31 +10,41 @@ use config::{ }; use xshell::Shell; -use crate::messages::{ - MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_GENESIS_COMPLETED, - MSG_STARTING_GENESIS_SPINNER, +use crate::{ + commands::chain::args::genesis::server::GenesisServerArgs, + messages::{ + MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_GENESIS_COMPLETED, + MSG_STARTING_GENESIS_SPINNER, + }, }; -pub async fn run(shell: &Shell) -> anyhow::Result<()> { +pub async fn run(args: GenesisServerArgs, shell: &Shell) -> anyhow::Result<()> { + let args = args.fill_values_with_prompt().await; + let ecosystem_config = EcosystemConfig::from_file(shell)?; let chain_config = ecosystem_config .load_current_chain() .context(MSG_CHAIN_NOT_INITIALIZED)?; let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(&chain_config, shell).await?; + run_server_genesis(&chain_config, shell, args.mode.into(), args.tag).await?; spinner.finish(); logger::outro(MSG_GENESIS_COMPLETED); Ok(()) } -pub async fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> anyhow::Result<()> { +pub async fn run_server_genesis( + chain_config: &ChainConfig, + shell: &Shell, + execution_mode: ExecutionMode, + tag: Option, +) -> anyhow::Result<()> { let server = Server::new(None, chain_config.link_to_code.clone(), false); server .run( shell, - ExecutionMode::default(), + execution_mode, ServerMode::Genesis, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), @@ -42,7 +52,7 @@ pub async fn run_server_genesis(chain_config: &ChainConfig, shell: &Shell) -> an SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - None, // TODO: add support for docker + tag, ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) From 5b81995d007504ef7b082aefbff52e3f85cffa88 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Tue, 26 Nov 2024 16:34:47 +0100 Subject: [PATCH 23/44] chore: regenerate autocomplete files --- .../crates/zkstack/completion/_zkstack.zsh | 7 ++++++ .../crates/zkstack/completion/zkstack.sh | 22 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh index fb2991efbc63..a7bf3b4f5e6c 100644 --- a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh +++ b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh @@ -399,7 +399,14 @@ _arguments "${_arguments_options[@]}" : \ ;; (server) _arguments "${_arguments_options[@]}" : \ +'--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ +'*--components=[Components of server to run]:COMPONENTS:_default' \ +'*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ +'*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ +'--genesis[Run server in genesis mode]' \ +'--uring[Enables uring support for RocksDB]' \ '-v[Verbose mode]' \ '--verbose[Verbose mode]' \ '--ignore-prerequisites[Ignores prerequisites checks]' \ diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.sh b/zkstack_cli/crates/zkstack/completion/zkstack.sh index 08b5d964fce1..3aa9158ed391 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.sh +++ b/zkstack_cli/crates/zkstack/completion/zkstack.sh @@ -1698,12 +1698,32 @@ _zkstack() { return 0 ;; zkstack__chain__genesis__server) - opts="-v -h --verbose --chain --ignore-prerequisites --help" + opts="-a -v -h --mode --tag --components --genesis --additional-args --uring --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --components) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --additional-args) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -a) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --chain) COMPREPLY=($(compgen -f "${cur}")) return 0 From eef40fd5da1fe09949f5cd3dc19e2b87ab60adf8 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 10:56:15 +0100 Subject: [PATCH 24/44] chore: update autocompletion files --- zkstack_cli/crates/zkstack/completion/_zkstack.zsh | 5 ----- zkstack_cli/crates/zkstack/completion/zkstack.sh | 14 +------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh index a7bf3b4f5e6c..451e32801156 100644 --- a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh +++ b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh @@ -401,12 +401,7 @@ _arguments "${_arguments_options[@]}" : \ _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ '--tag=[]:TAG:_default' \ -'*--components=[Components of server to run]:COMPONENTS:_default' \ -'*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ -'*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ -'--genesis[Run server in genesis mode]' \ -'--uring[Enables uring support for RocksDB]' \ '-v[Verbose mode]' \ '--verbose[Verbose mode]' \ '--ignore-prerequisites[Ignores prerequisites checks]' \ diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.sh b/zkstack_cli/crates/zkstack/completion/zkstack.sh index 3aa9158ed391..35d907858923 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.sh +++ b/zkstack_cli/crates/zkstack/completion/zkstack.sh @@ -1698,7 +1698,7 @@ _zkstack() { return 0 ;; zkstack__chain__genesis__server) - opts="-a -v -h --mode --tag --components --genesis --additional-args --uring --verbose --chain --ignore-prerequisites --help" + opts="-v -h --mode --tag --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 4 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -1712,18 +1712,6 @@ _zkstack() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --components) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --additional-args) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -a) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; --chain) COMPREPLY=($(compgen -f "${cur}")) return 0 From fa853085670a29ae8baa1f0189b49d9044097436 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 11:45:52 +0100 Subject: [PATCH 25/44] refactor: bail instead of unwrapping --- zkstack_cli/crates/common/src/server.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index b2726bfc1760..3c369aedda77 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -1,6 +1,6 @@ use std::{ffi::OsStr, path::PathBuf}; -use anyhow::Context; +use anyhow::{bail, Context}; use xshell::{cmd, Shell}; use crate::cmd::Cmd; @@ -145,8 +145,9 @@ where additional_args, ), ExecutionMode::Docker => { - // safe to unwrap when ExecutionMode is Docker because we invoke fill_values_with_prompt - let tag = tag.unwrap(); + let Some(tag) = tag else { + bail!("Undefined docker image tag"); + }; Cmd::new(cmd!( shell, From f990a0ae25fe8896df91838f1f06bcf4c622c827 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 12:24:57 +0100 Subject: [PATCH 26/44] refactor: improve execution mode enum --- zkstack_cli/crates/common/src/server.rs | 25 +++++--------- .../zkstack/src/commands/args/server/run.rs | 27 +++++++-------- .../src/commands/chain/args/genesis/mod.rs | 18 +++++----- .../src/commands/chain/args/genesis/server.rs | 33 ++++--------------- .../src/commands/chain/args/init/configs.rs | 2 +- .../src/commands/chain/args/init/mod.rs | 8 ++--- .../zkstack/src/commands/chain/genesis/mod.rs | 2 +- .../src/commands/chain/genesis/server.rs | 4 +-- .../src/commands/ecosystem/args/init.rs | 6 ++-- .../crates/zkstack/src/commands/server/run.rs | 3 +- 10 files changed, 49 insertions(+), 79 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 3c369aedda77..cd048db35b00 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -1,6 +1,6 @@ use std::{ffi::OsStr, path::PathBuf}; -use anyhow::{bail, Context}; +use anyhow::Context; use xshell::{cmd, Shell}; use crate::cmd::Cmd; @@ -21,12 +21,14 @@ pub enum ServerMode { } /// Possible execution modes. -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub enum ExecutionMode { #[default] Release, Debug, - Docker, + Docker { + tag: String, + }, } impl Server { @@ -52,7 +54,6 @@ impl Server { secrets_path: P, contracts_path: P, mut additional_args: Vec, - tag: Option, ) -> anyhow::Result<()> where P: AsRef, @@ -79,7 +80,6 @@ impl Server { additional_args, execution_mode, server_mode, - tag, ) .await?; @@ -116,7 +116,6 @@ async fn run_server

( additional_args: Vec, execution_mode: ExecutionMode, server_mode: ServerMode, - tag: Option, ) -> anyhow::Result<()> where P: AsRef, @@ -144,14 +143,9 @@ where contracts_path, additional_args, ), - ExecutionMode::Docker => { - let Some(tag) = tag else { - bail!("Undefined docker image tag"); - }; - - Cmd::new(cmd!( - shell, - "docker run + ExecutionMode::Docker { tag } => Cmd::new(cmd!( + shell, + "docker run --platform linux/amd64 --net=host -v {genesis_path}:/genesis.yaml @@ -166,8 +160,7 @@ where --secrets-path /secrets.yaml --contracts-config-path /contracts.yaml {additional_args...}" - )) - } + )), }; // If we are running server in normal mode diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index a56b2badd214..e74adf9d088a 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -1,4 +1,5 @@ use clap::{Parser, ValueEnum}; +use common::server::ExecutionMode; use serde::{Deserialize, Serialize}; use crate::{ @@ -10,19 +11,21 @@ use crate::{ }; #[derive(Clone, Debug, Default, Serialize, Deserialize, ValueEnum)] -pub enum ExecutionMode { +pub enum Mode { #[default] Release, Debug, Docker, } -impl From for common::server::ExecutionMode { - fn from(mode: ExecutionMode) -> Self { - match mode { - ExecutionMode::Debug => Self::Debug, - ExecutionMode::Release => Self::Release, - ExecutionMode::Docker => Self::Docker, +impl Mode { + pub fn as_execution_mode(self, tag: Option) -> ExecutionMode { + match self { + Mode::Debug => ExecutionMode::Debug, + Mode::Release => ExecutionMode::Release, + Mode::Docker => ExecutionMode::Docker { + tag: tag.unwrap_or("latest".to_string()), + }, } } } @@ -30,7 +33,7 @@ impl From for common::server::ExecutionMode { #[derive(Debug, Serialize, Deserialize, Parser)] pub struct RunServerArgs { #[arg(long, default_value = "release")] - pub mode: ExecutionMode, + pub mode: Mode, #[arg(long)] pub tag: Option, #[arg(long, help = MSG_SERVER_COMPONENTS_HELP)] @@ -51,7 +54,7 @@ pub struct RunServerArgs { impl RunServerArgs { pub async fn fill_values_with_prompt(self) -> RunServerArgsFinal { - let tag = if let ExecutionMode::Docker = self.mode { + let tag = if let Mode::Docker = self.mode { self.tag .or(select_tag().await.ok().or(Some("latest".to_string()))) } else { @@ -59,8 +62,7 @@ impl RunServerArgs { }; RunServerArgsFinal { - mode: self.mode, - tag, + mode: self.mode.as_execution_mode(tag), components: self.components, genesis: self.genesis, additional_args: self.additional_args, @@ -69,10 +71,9 @@ impl RunServerArgs { } } -#[derive(Debug, Serialize, Deserialize, Parser)] +#[derive(Debug)] pub struct RunServerArgsFinal { pub mode: ExecutionMode, - pub tag: Option, pub components: Option>, pub genesis: bool, pub additional_args: Vec, diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs index 67f8fd64e27d..dea9676adeb4 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs @@ -1,13 +1,13 @@ use anyhow::Context; use clap::Parser; -use common::{db::DatabaseConfig, Prompt}; +use common::{db::DatabaseConfig, server::ExecutionMode, Prompt}; use config::ChainConfig; use serde::{Deserialize, Serialize}; use slugify_rs::slugify; use url::Url; use crate::{ - commands::args::run::ExecutionMode, + commands::args::run::Mode, defaults::{generate_db_names, DBNames, DATABASE_SERVER_URL}, messages::{ msg_server_db_name_prompt, msg_server_db_url_prompt, MSG_SERVER_DB_NAME_HELP, @@ -21,7 +21,7 @@ pub mod server; #[derive(Debug, Clone, Serialize, Deserialize, Parser, Default)] pub struct GenesisArgs { #[arg(long, default_value = "release")] - pub mode: ExecutionMode, + pub mode: Mode, #[arg(long)] pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] @@ -36,7 +36,7 @@ pub struct GenesisArgs { impl GenesisArgs { pub async fn fill_values_with_prompt(self, config: &ChainConfig) -> GenesisArgsFinal { - let tag = if let ExecutionMode::Docker = self.mode { + let tag = if let Mode::Docker = self.mode { self.tag .or(select_tag().await.ok().or(Some("latest".to_string()))) } else { @@ -49,8 +49,7 @@ impl GenesisArgs { GenesisArgsFinal { server_db: DatabaseConfig::new(DATABASE_SERVER_URL.clone(), server_name), dont_drop: self.dont_drop, - mode: self.mode, - tag, + mode: self.mode.as_execution_mode(tag), } } else { let server_db_url = self.server_db_url.unwrap_or_else(|| { @@ -66,11 +65,11 @@ impl GenesisArgs { }), separator = "_" ); + GenesisArgsFinal { server_db: DatabaseConfig::new(server_db_url, server_db_name), dont_drop: self.dont_drop, - mode: self.mode, - tag, + mode: self.mode.as_execution_mode(tag), } } } @@ -104,10 +103,9 @@ impl GenesisArgs { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone)] pub struct GenesisArgsFinal { pub server_db: DatabaseConfig, pub dont_drop: bool, pub mode: ExecutionMode, - pub tag: Option, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs index d384c6f82ff9..655c505ec965 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs @@ -1,37 +1,20 @@ -use clap::{Parser, ValueEnum}; +use clap::Parser; +use common::server::ExecutionMode; use serde::{Deserialize, Serialize}; -use crate::utils::docker::select_tag; - -#[derive(Clone, Debug, Default, Serialize, Deserialize, ValueEnum)] -pub enum ExecutionMode { - #[default] - Release, - Debug, - Docker, -} - -impl From for common::server::ExecutionMode { - fn from(mode: ExecutionMode) -> Self { - match mode { - ExecutionMode::Debug => Self::Debug, - ExecutionMode::Release => Self::Release, - ExecutionMode::Docker => Self::Docker, - } - } -} +use crate::{commands::args::run::Mode, utils::docker::select_tag}; #[derive(Clone, Debug, Serialize, Deserialize, Parser)] pub struct GenesisServerArgs { #[arg(long, default_value = "release")] - pub mode: ExecutionMode, + pub mode: Mode, #[arg(long)] pub tag: Option, } impl GenesisServerArgs { pub async fn fill_values_with_prompt(self) -> GenesisServerArgsFinal { - let tag = if let ExecutionMode::Docker = self.mode { + let tag = if let Mode::Docker = self.mode { self.tag .or(select_tag().await.ok().or(Some("latest".to_string()))) } else { @@ -39,14 +22,12 @@ impl GenesisServerArgs { }; GenesisServerArgsFinal { - mode: self.mode, - tag, + mode: self.mode.as_execution_mode(tag), } } } -#[derive(Debug, Serialize, Deserialize, Parser)] +#[derive(Debug)] pub struct GenesisServerArgsFinal { pub mode: ExecutionMode, - pub tag: Option, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs index 42ecb68950b0..566d327b0c18 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/configs.rs @@ -28,7 +28,7 @@ pub struct InitConfigsArgs { pub no_port_reallocation: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Clone)] pub struct InitConfigsArgsFinal { pub genesis_args: GenesisArgsFinal, pub l1_rpc_url: String, diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs index ae0607d63a7b..1ee7d8958eea 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs @@ -7,7 +7,7 @@ use url::Url; use crate::{ commands::{ - args::run::ExecutionMode, + args::run::Mode, chain::args::genesis::{GenesisArgs, GenesisArgsFinal}, }, defaults::LOCAL_RPC_URL, @@ -45,8 +45,8 @@ pub struct InitArgs { impl InitArgs { pub fn get_genesis_args(&self) -> GenesisArgs { GenesisArgs { - mode: ExecutionMode::Release, - tag: None, + mode: Mode::Release, // TODO + tag: None, // TODO server_db_url: self.server_db_url.clone(), server_db_name: self.server_db_name.clone(), dev: self.dev, @@ -96,7 +96,7 @@ impl InitArgs { } } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Clone)] pub struct InitArgsFinal { pub forge_args: ForgeScriptArgs, pub genesis_args: GenesisArgsFinal, diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs index 67802353e76a..65d483467cf9 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs @@ -86,7 +86,7 @@ pub async fn genesis( spinner.finish(); let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(config, shell, args.mode.into(), args.tag).await?; + run_server_genesis(config, shell, args.mode.into()).await?; spinner.finish(); Ok(()) diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 20c4136bd8ae..1bee5b94e107 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -27,7 +27,7 @@ pub async fn run(args: GenesisServerArgs, shell: &Shell) -> anyhow::Result<()> { .context(MSG_CHAIN_NOT_INITIALIZED)?; let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(&chain_config, shell, args.mode.into(), args.tag).await?; + run_server_genesis(&chain_config, shell, args.mode.into()).await?; spinner.finish(); logger::outro(MSG_GENESIS_COMPLETED); @@ -38,7 +38,6 @@ pub async fn run_server_genesis( chain_config: &ChainConfig, shell: &Shell, execution_mode: ExecutionMode, - tag: Option, ) -> anyhow::Result<()> { let server = Server::new(None, chain_config.link_to_code.clone(), false); server @@ -52,7 +51,6 @@ pub async fn run_server_genesis( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - tag, ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs index fa41976c15d2..3329d2964088 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs @@ -7,7 +7,7 @@ use types::L1Network; use url::Url; use crate::{ - commands::{args::run::ExecutionMode, chain::args::genesis::GenesisArgs}, + commands::{args::run::Mode, chain::args::genesis::GenesisArgs}, defaults::LOCAL_RPC_URL, messages::{ MSG_DEPLOY_ECOSYSTEM_PROMPT, MSG_DEPLOY_ERC20_PROMPT, MSG_DEV_ARG_HELP, @@ -106,8 +106,8 @@ pub struct EcosystemInitArgs { impl EcosystemInitArgs { pub fn get_genesis_args(&self) -> GenesisArgs { GenesisArgs { - mode: ExecutionMode::Release, - tag: None, + mode: Mode::Release, // TODO + tag: None, // TODO server_db_url: self.server_db_url.clone(), server_db_name: self.server_db_name.clone(), dev: self.dev, diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 55ea6dacd82c..5f1fdaf5d849 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -37,7 +37,7 @@ pub(super) async fn run_server( server .run( shell, - args.mode.into(), + args.mode, server_mode, GenesisConfig::get_path_with_base_path(&chain_config.configs), WalletsConfig::get_path_with_base_path(&chain_config.configs), @@ -45,7 +45,6 @@ pub(super) async fn run_server( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - args.tag, ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) From 03a615efa16ed90d1e99a4479609075d41aaff62 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 12:28:07 +0100 Subject: [PATCH 27/44] refactor: clippy --- zkstack_cli/crates/zkstack/src/commands/args/server/run.rs | 4 +--- .../crates/zkstack/src/commands/chain/args/init/mod.rs | 2 -- zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs | 2 +- .../crates/zkstack/src/commands/chain/genesis/server.rs | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index e74adf9d088a..8b4e3572943e 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -19,7 +19,7 @@ pub enum Mode { } impl Mode { - pub fn as_execution_mode(self, tag: Option) -> ExecutionMode { + pub fn as_execution_mode(&self, tag: Option) -> ExecutionMode { match self { Mode::Debug => ExecutionMode::Debug, Mode::Release => ExecutionMode::Release, @@ -65,7 +65,6 @@ impl RunServerArgs { mode: self.mode.as_execution_mode(tag), components: self.components, genesis: self.genesis, - additional_args: self.additional_args, uring: self.uring, } } @@ -76,6 +75,5 @@ pub struct RunServerArgsFinal { pub mode: ExecutionMode, pub components: Option>, pub genesis: bool, - pub additional_args: Vec, pub uring: bool, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs index 1ee7d8958eea..ddcd8bc20080 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs @@ -91,7 +91,6 @@ impl InitArgs { deploy_paymaster, l1_rpc_url, no_port_reallocation: self.no_port_reallocation, - dev: self.dev, } } } @@ -103,5 +102,4 @@ pub struct InitArgsFinal { pub deploy_paymaster: bool, pub l1_rpc_url: String, pub no_port_reallocation: bool, - pub dev: bool, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs index 65d483467cf9..991255194aa3 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/mod.rs @@ -86,7 +86,7 @@ pub async fn genesis( spinner.finish(); let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(config, shell, args.mode.into()).await?; + run_server_genesis(config, shell, args.mode).await?; spinner.finish(); Ok(()) diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 1bee5b94e107..99a03d7ba440 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -27,7 +27,7 @@ pub async fn run(args: GenesisServerArgs, shell: &Shell) -> anyhow::Result<()> { .context(MSG_CHAIN_NOT_INITIALIZED)?; let spinner = Spinner::new(MSG_STARTING_GENESIS_SPINNER); - run_server_genesis(&chain_config, shell, args.mode.into()).await?; + run_server_genesis(&chain_config, shell, args.mode).await?; spinner.finish(); logger::outro(MSG_GENESIS_COMPLETED); From 70c17a6193445050786d7029330def516d66fee4 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 13:22:27 +0100 Subject: [PATCH 28/44] feat: add execution mode options to missing subcommands --- .../crates/zkstack/src/commands/chain/args/init/mod.rs | 8 ++++++-- .../crates/zkstack/src/commands/ecosystem/args/init.rs | 8 ++++++-- zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs | 2 ++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs index ddcd8bc20080..25ee51c901ff 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs @@ -26,6 +26,10 @@ pub struct InitArgs { #[clap(flatten)] #[serde(flatten)] pub forge_args: ForgeScriptArgs, + #[arg(long, default_value = "release")] + pub mode: Mode, + #[arg(long)] + pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] pub server_db_url: Option, #[clap(long, help = MSG_SERVER_DB_NAME_HELP)] @@ -45,8 +49,8 @@ pub struct InitArgs { impl InitArgs { pub fn get_genesis_args(&self) -> GenesisArgs { GenesisArgs { - mode: Mode::Release, // TODO - tag: None, // TODO + mode: self.mode.clone(), + tag: self.tag.clone(), server_db_url: self.server_db_url.clone(), server_db_name: self.server_db_name.clone(), dev: self.dev, diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs index 3329d2964088..14f35316112a 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs @@ -86,6 +86,10 @@ pub struct EcosystemInitArgs { /// Deploy Paymaster contract #[clap(long, default_missing_value = "true", num_args = 0..=1)] pub deploy_paymaster: Option, + #[arg(long, default_value = "release")] + pub mode: Mode, + #[arg(long)] + pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] pub server_db_url: Option, #[clap(long, help = MSG_SERVER_DB_NAME_HELP)] @@ -106,8 +110,8 @@ pub struct EcosystemInitArgs { impl EcosystemInitArgs { pub fn get_genesis_args(&self) -> GenesisArgs { GenesisArgs { - mode: Mode::Release, // TODO - tag: None, // TODO + mode: self.mode.clone(), + tag: self.tag.clone(), server_db_url: self.server_db_url.clone(), server_db_name: self.server_db_name.clone(), dev: self.dev, diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs index afb5064d7c5d..6bb098b63254 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/init.rs @@ -359,6 +359,8 @@ async fn init_chains( let chain_init_args = chain::args::init::InitArgs { forge_args: final_init_args.forge_args.clone(), + mode: genesis_args.mode.clone(), + tag: genesis_args.tag.clone(), server_db_url: genesis_args.server_db_url.clone(), server_db_name: genesis_args.server_db_name.clone(), dont_drop: genesis_args.dont_drop, From 221deb70f781bbfab07d29a165fa2f426165a438 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 13:23:02 +0100 Subject: [PATCH 29/44] chore: regenerate autocompletion files --- .../crates/zkstack/completion/_zkstack.zsh | 4 ++++ .../crates/zkstack/completion/zkstack.fish | 4 ++++ .../crates/zkstack/completion/zkstack.sh | 20 +++++++++++++++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh index 451e32801156..2be4338d1e32 100644 --- a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh +++ b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh @@ -126,6 +126,8 @@ _arguments "${_arguments_options[@]}" : \ '*-a+[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '--deploy-paymaster=[Deploy Paymaster contract]' \ +'--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '-o+[Enable Grafana]' \ @@ -280,6 +282,8 @@ _arguments "${_arguments_options[@]}" : \ '--verifier-api-key=[Verifier API key]:VERIFIER_API_KEY:_default' \ '*-a+[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ +'--mode=[]:MODE:(release debug docker)' \ +'--tag=[]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--deploy-paymaster=[]' \ diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.fish b/zkstack_cli/crates/zkstack/completion/zkstack.fish index a9708ac94f07..7eb9eab5a6d3 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.fish +++ b/zkstack_cli/crates/zkstack/completion/zkstack.fish @@ -103,6 +103,8 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_se complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l verifier-api-key -d 'Verifier API key' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -s a -l additional-args -d 'List of additional arguments that can be passed through the CLI' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l deploy-paymaster -d 'Deploy Paymaster contract' -r -f -a "{true\t'',false\t''}" +complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" +complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l server-db-url -d 'Server database url without database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l server-db-name -d 'Server database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -s o -l observability -d 'Enable Grafana' -r -f -a "{true\t'',false\t''}" @@ -181,6 +183,8 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_s complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l verifier-url -d 'Verifier URL, if using a custom provider' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l verifier-api-key -d 'Verifier API key' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -s a -l additional-args -d 'List of additional arguments that can be passed through the CLI' -r +complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" +complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l tag -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l server-db-url -d 'Server database url without database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l server-db-name -d 'Server database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l deploy-paymaster -r -f -a "{true\t'',false\t''}" diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.sh b/zkstack_cli/crates/zkstack/completion/zkstack.sh index 35d907858923..7eb3cdaa2c3d 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.sh +++ b/zkstack_cli/crates/zkstack/completion/zkstack.sh @@ -1990,7 +1990,7 @@ _zkstack() { return 0 ;; zkstack__chain__init) - opts="-a -d -v -h --verify --verifier --verifier-url --verifier-api-key --resume --additional-args --server-db-url --server-db-name --dont-drop --deploy-paymaster --l1-rpc-url --no-port-reallocation --dev --verbose --chain --ignore-prerequisites --help configs help" + opts="-a -d -v -h --verify --verifier --verifier-url --verifier-api-key --resume --additional-args --mode --tag --server-db-url --server-db-name --dont-drop --deploy-paymaster --l1-rpc-url --no-port-reallocation --dev --verbose --chain --ignore-prerequisites --help configs help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -2020,6 +2020,14 @@ _zkstack() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --server-db-url) COMPREPLY=($(compgen -f "${cur}")) return 0 @@ -5128,7 +5136,7 @@ _zkstack() { return 0 ;; zkstack__ecosystem__init) - opts="-a -d -o -v -h --deploy-erc20 --deploy-ecosystem --ecosystem-contracts-path --l1-rpc-url --verify --verifier --verifier-url --verifier-api-key --resume --additional-args --deploy-paymaster --server-db-url --server-db-name --dont-drop --ecosystem-only --dev --observability --no-port-reallocation --verbose --chain --ignore-prerequisites --help" + opts="-a -d -o -v -h --deploy-erc20 --deploy-ecosystem --ecosystem-contracts-path --l1-rpc-url --verify --verifier --verifier-url --verifier-api-key --resume --additional-args --deploy-paymaster --mode --tag --server-db-url --server-db-name --dont-drop --ecosystem-only --dev --observability --no-port-reallocation --verbose --chain --ignore-prerequisites --help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -5178,6 +5186,14 @@ _zkstack() { COMPREPLY=($(compgen -W "true false" -- "${cur}")) return 0 ;; + --mode) + COMPREPLY=($(compgen -W "release debug docker" -- "${cur}")) + return 0 + ;; + --tag) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --server-db-url) COMPREPLY=($(compgen -f "${cur}")) return 0 From 5b1854cf351f41740dcbb2a3db3e555383e69770 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 13:32:58 +0100 Subject: [PATCH 30/44] refactor: add message const for select tag prompt --- zkstack_cli/crates/zkstack/src/messages.rs | 1 + zkstack_cli/crates/zkstack/src/utils/docker.rs | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/zkstack_cli/crates/zkstack/src/messages.rs b/zkstack_cli/crates/zkstack/src/messages.rs index bedcb233b19f..572b767daf05 100644 --- a/zkstack_cli/crates/zkstack/src/messages.rs +++ b/zkstack_cli/crates/zkstack/src/messages.rs @@ -266,6 +266,7 @@ pub(super) const MSG_SERVER_GENESIS_HELP: &str = "Run server in genesis mode"; pub(super) const MSG_SERVER_ADDITIONAL_ARGS_HELP: &str = "Additional arguments that can be passed through the CLI"; pub(super) const MSG_SERVER_URING_HELP: &str = "Enables uring support for RocksDB"; +pub(super) const MSG_SERVER_SELECT_DOCKER_IMAGE_TAG: &str = "Select Docker image tag:"; /// Accept ownership related messages pub(super) const MSG_ACCEPTING_GOVERNANCE_SPINNER: &str = "Accepting governance..."; diff --git a/zkstack_cli/crates/zkstack/src/utils/docker.rs b/zkstack_cli/crates/zkstack/src/utils/docker.rs index 89952f8e68a3..c8a56dfc75bd 100644 --- a/zkstack_cli/crates/zkstack/src/utils/docker.rs +++ b/zkstack_cli/crates/zkstack/src/utils/docker.rs @@ -1,5 +1,7 @@ use common::{github::GitHubTagFetcher, PromptSelect}; +use crate::messages::MSG_SERVER_SELECT_DOCKER_IMAGE_TAG; + pub async fn select_tag() -> anyhow::Result { let fetcher = GitHubTagFetcher::new(None)?; let gh_tags = fetcher.get_newest_core_tags(Some(5)).await?; @@ -12,5 +14,5 @@ pub async fn select_tag() -> anyhow::Result { ) .collect(); - Ok(PromptSelect::new("Select image", tags).ask()) + Ok(PromptSelect::new(MSG_SERVER_SELECT_DOCKER_IMAGE_TAG, tags).ask()) } From 7711a3cc869674af75496928ad68d12249c561da Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 14:55:13 +0100 Subject: [PATCH 31/44] refactor: wrap docker run command in a function --- zkstack_cli/crates/common/src/server.rs | 60 ++++++++++++++++++------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index cd048db35b00..1fc018d7b609 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -143,24 +143,16 @@ where contracts_path, additional_args, ), - ExecutionMode::Docker { tag } => Cmd::new(cmd!( + ExecutionMode::Docker { tag } => docker_run( shell, - "docker run - --platform linux/amd64 - --net=host - -v {genesis_path}:/genesis.yaml - -v {wallets_path}:/wallets.yaml - -v {general_path}:/general.yaml - -v {secrets_path}:/secrets.yaml - -v {contracts_path}:/contracts.yaml - matterlabs/server-v2:{tag} - --genesis-path /genesis.yaml - --wallets-path /wallets.yaml - --config-path /general.yaml - --secrets-path /secrets.yaml - --contracts-config-path /contracts.yaml - {additional_args...}" - )), + genesis_path, + wallets_path, + general_path, + secrets_path, + contracts_path, + additional_args, + tag, + ), }; // If we are running server in normal mode @@ -204,3 +196,37 @@ where .env_remove("RUSTUP_TOOLCHAIN"), ) } + +#[allow(clippy::too_many_arguments)] +fn docker_run<'a, P>( + shell: &'a Shell, + genesis_path: P, + wallets_path: P, + general_path: P, + secrets_path: P, + contracts_path: P, + additional_args: Vec, + tag: String, +) -> Cmd<'a> +where + P: AsRef, +{ + Cmd::new(cmd!( + shell, + "docker run + --platform linux/amd64 + --net=host + -v {genesis_path}:/genesis.yaml + -v {wallets_path}:/wallets.yaml + -v {general_path}:/general.yaml + -v {secrets_path}:/secrets.yaml + -v {contracts_path}:/contracts.yaml + matterlabs/server-v2:{tag} + --genesis-path /genesis.yaml + --wallets-path /wallets.yaml + --config-path /general.yaml + --secrets-path /secrets.yaml + --contracts-config-path /contracts.yaml + {additional_args...}" + )) +} From 9087f0a6beeb9a222bdeee28c2529c875b7cd79b Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 15:35:21 +0100 Subject: [PATCH 32/44] feat: use folder for config files in docker --- zkstack_cli/crates/common/src/server.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 1fc018d7b609..8261fd96e27e 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -216,17 +216,17 @@ where "docker run --platform linux/amd64 --net=host - -v {genesis_path}:/genesis.yaml - -v {wallets_path}:/wallets.yaml - -v {general_path}:/general.yaml - -v {secrets_path}:/secrets.yaml - -v {contracts_path}:/contracts.yaml + -v {genesis_path}:/config/genesis.yaml + -v {wallets_path}:/config/wallets.yaml + -v {general_path}:/config/general.yaml + -v {secrets_path}:/config/secrets.yaml + -v {contracts_path}:/config/contracts.yaml matterlabs/server-v2:{tag} - --genesis-path /genesis.yaml - --wallets-path /wallets.yaml - --config-path /general.yaml - --secrets-path /secrets.yaml - --contracts-config-path /contracts.yaml + --genesis-path /config/genesis.yaml + --wallets-path /config/wallets.yaml + --config-path /config/general.yaml + --secrets-path /config/secrets.yaml + --contracts-config-path /config/contracts.yaml {additional_args...}" )) } From f3ec2ee5c39be0a0e571579b622f49241fae0898 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Wed, 27 Nov 2024 16:08:44 +0100 Subject: [PATCH 33/44] refactor: clippy --- zkstack_cli/crates/common/src/server.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 8261fd96e27e..f8f8708314c1 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -198,8 +198,8 @@ where } #[allow(clippy::too_many_arguments)] -fn docker_run<'a, P>( - shell: &'a Shell, +fn docker_run

( + shell: &Shell, genesis_path: P, wallets_path: P, general_path: P, @@ -207,7 +207,7 @@ fn docker_run<'a, P>( contracts_path: P, additional_args: Vec, tag: String, -) -> Cmd<'a> +) -> Cmd<'_> where P: AsRef, { From 54b81410331ada0a1e9c768e86adf3f43829ca8f Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 28 Nov 2024 14:15:28 +0100 Subject: [PATCH 34/44] docs: improve CLI help --- .../crates/zkstack/src/commands/args/server/run.rs | 6 +++--- .../crates/zkstack/src/commands/chain/args/genesis/mod.rs | 6 +++--- .../zkstack/src/commands/chain/args/genesis/server.rs | 3 ++- .../crates/zkstack/src/commands/chain/args/init/mod.rs | 8 ++++---- .../crates/zkstack/src/commands/ecosystem/args/init.rs | 8 ++++---- .../crates/zkstack/src/commands/prover/args/run.rs | 6 +++--- zkstack_cli/crates/zkstack/src/messages.rs | 1 + 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs index 8b4e3572943e..1c56bf9a73e1 100644 --- a/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/args/server/run.rs @@ -4,8 +4,8 @@ use serde::{Deserialize, Serialize}; use crate::{ messages::{ - MSG_SERVER_ADDITIONAL_ARGS_HELP, MSG_SERVER_COMPONENTS_HELP, MSG_SERVER_GENESIS_HELP, - MSG_SERVER_URING_HELP, + MSG_DOCKER_IMAGE_TAG_OPTION, MSG_SERVER_ADDITIONAL_ARGS_HELP, MSG_SERVER_COMPONENTS_HELP, + MSG_SERVER_GENESIS_HELP, MSG_SERVER_URING_HELP, }, utils::docker::select_tag, }; @@ -34,7 +34,7 @@ impl Mode { pub struct RunServerArgs { #[arg(long, default_value = "release")] pub mode: Mode, - #[arg(long)] + #[arg(long, help = MSG_DOCKER_IMAGE_TAG_OPTION)] pub tag: Option, #[arg(long, help = MSG_SERVER_COMPONENTS_HELP)] pub components: Option>, diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs index dea9676adeb4..98dd2540faee 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/mod.rs @@ -10,8 +10,8 @@ use crate::{ commands::args::run::Mode, defaults::{generate_db_names, DBNames, DATABASE_SERVER_URL}, messages::{ - msg_server_db_name_prompt, msg_server_db_url_prompt, MSG_SERVER_DB_NAME_HELP, - MSG_SERVER_DB_URL_HELP, MSG_USE_DEFAULT_DATABASES_HELP, + msg_server_db_name_prompt, msg_server_db_url_prompt, MSG_DOCKER_IMAGE_TAG_OPTION, + MSG_SERVER_DB_NAME_HELP, MSG_SERVER_DB_URL_HELP, MSG_USE_DEFAULT_DATABASES_HELP, }, utils::docker::select_tag, }; @@ -22,7 +22,7 @@ pub mod server; pub struct GenesisArgs { #[arg(long, default_value = "release")] pub mode: Mode, - #[arg(long)] + #[arg(long, help = MSG_DOCKER_IMAGE_TAG_OPTION)] pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] pub server_db_url: Option, diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs index 655c505ec965..85ddb9eec234 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/genesis/server.rs @@ -2,13 +2,14 @@ use clap::Parser; use common::server::ExecutionMode; use serde::{Deserialize, Serialize}; +use super::MSG_DOCKER_IMAGE_TAG_OPTION; use crate::{commands::args::run::Mode, utils::docker::select_tag}; #[derive(Clone, Debug, Serialize, Deserialize, Parser)] pub struct GenesisServerArgs { #[arg(long, default_value = "release")] pub mode: Mode, - #[arg(long)] + #[arg(long, help = MSG_DOCKER_IMAGE_TAG_OPTION)] pub tag: Option, } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs index 25ee51c901ff..1d4c08de9435 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/args/init/mod.rs @@ -12,9 +12,9 @@ use crate::{ }, defaults::LOCAL_RPC_URL, messages::{ - MSG_DEPLOY_PAYMASTER_PROMPT, MSG_DEV_ARG_HELP, MSG_L1_RPC_URL_HELP, - MSG_L1_RPC_URL_INVALID_ERR, MSG_L1_RPC_URL_PROMPT, MSG_NO_PORT_REALLOCATION_HELP, - MSG_SERVER_DB_NAME_HELP, MSG_SERVER_DB_URL_HELP, + MSG_DEPLOY_PAYMASTER_PROMPT, MSG_DEV_ARG_HELP, MSG_DOCKER_IMAGE_TAG_OPTION, + MSG_L1_RPC_URL_HELP, MSG_L1_RPC_URL_INVALID_ERR, MSG_L1_RPC_URL_PROMPT, + MSG_NO_PORT_REALLOCATION_HELP, MSG_SERVER_DB_NAME_HELP, MSG_SERVER_DB_URL_HELP, }, }; @@ -28,7 +28,7 @@ pub struct InitArgs { pub forge_args: ForgeScriptArgs, #[arg(long, default_value = "release")] pub mode: Mode, - #[arg(long)] + #[arg(long, help = MSG_DOCKER_IMAGE_TAG_OPTION)] pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] pub server_db_url: Option, diff --git a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs index 14f35316112a..da54d0fe7646 100644 --- a/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs +++ b/zkstack_cli/crates/zkstack/src/commands/ecosystem/args/init.rs @@ -11,9 +11,9 @@ use crate::{ defaults::LOCAL_RPC_URL, messages::{ MSG_DEPLOY_ECOSYSTEM_PROMPT, MSG_DEPLOY_ERC20_PROMPT, MSG_DEV_ARG_HELP, - MSG_L1_RPC_URL_HELP, MSG_L1_RPC_URL_INVALID_ERR, MSG_L1_RPC_URL_PROMPT, - MSG_NO_PORT_REALLOCATION_HELP, MSG_OBSERVABILITY_HELP, MSG_OBSERVABILITY_PROMPT, - MSG_SERVER_DB_NAME_HELP, MSG_SERVER_DB_URL_HELP, + MSG_DOCKER_IMAGE_TAG_OPTION, MSG_L1_RPC_URL_HELP, MSG_L1_RPC_URL_INVALID_ERR, + MSG_L1_RPC_URL_PROMPT, MSG_NO_PORT_REALLOCATION_HELP, MSG_OBSERVABILITY_HELP, + MSG_OBSERVABILITY_PROMPT, MSG_SERVER_DB_NAME_HELP, MSG_SERVER_DB_URL_HELP, }, }; @@ -88,7 +88,7 @@ pub struct EcosystemInitArgs { pub deploy_paymaster: Option, #[arg(long, default_value = "release")] pub mode: Mode, - #[arg(long)] + #[arg(long, help = MSG_DOCKER_IMAGE_TAG_OPTION)] pub tag: Option, #[clap(long, help = MSG_SERVER_DB_URL_HELP)] pub server_db_url: Option, diff --git a/zkstack_cli/crates/zkstack/src/commands/prover/args/run.rs b/zkstack_cli/crates/zkstack/src/commands/prover/args/run.rs index 4b3a16a38fca..cc6a8d2089e4 100644 --- a/zkstack_cli/crates/zkstack/src/commands/prover/args/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/prover/args/run.rs @@ -16,8 +16,8 @@ use crate::{ WITNESS_VECTOR_GENERATOR_DOCKER_IMAGE, }, messages::{ - MSG_ROUND_SELECT_PROMPT, MSG_RUN_COMPONENT_PROMPT, MSG_THREADS_PROMPT, - MSG_WITNESS_GENERATOR_ROUND_ERR, + MSG_DOCKER_IMAGE_TAG_OPTION, MSG_ROUND_SELECT_PROMPT, MSG_RUN_COMPONENT_PROMPT, + MSG_THREADS_PROMPT, MSG_WITNESS_GENERATOR_ROUND_ERR, }, }; @@ -35,7 +35,7 @@ pub struct ProverRunArgs { pub circuit_prover_args: CircuitProverArgs, #[clap(long)] pub docker: Option, - #[clap(long)] + #[arg(long, help = MSG_DOCKER_IMAGE_TAG_OPTION)] pub tag: Option, } diff --git a/zkstack_cli/crates/zkstack/src/messages.rs b/zkstack_cli/crates/zkstack/src/messages.rs index 572b767daf05..3b7029eb33e4 100644 --- a/zkstack_cli/crates/zkstack/src/messages.rs +++ b/zkstack_cli/crates/zkstack/src/messages.rs @@ -267,6 +267,7 @@ pub(super) const MSG_SERVER_ADDITIONAL_ARGS_HELP: &str = "Additional arguments that can be passed through the CLI"; pub(super) const MSG_SERVER_URING_HELP: &str = "Enables uring support for RocksDB"; pub(super) const MSG_SERVER_SELECT_DOCKER_IMAGE_TAG: &str = "Select Docker image tag:"; +pub(super) const MSG_DOCKER_IMAGE_TAG_OPTION: &str = "Select a specific Docker image tag"; /// Accept ownership related messages pub(super) const MSG_ACCEPTING_GOVERNANCE_SPINNER: &str = "Accepting governance..."; From 1939883fb8b4e5715a956c7da2495861ae3822e1 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Thu, 28 Nov 2024 15:07:34 +0100 Subject: [PATCH 35/44] chore: update autocompletion files --- .../crates/zkstack/completion/_zkstack.zsh | 18 +++++++++--------- .../crates/zkstack/completion/zkstack.fish | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh index 2be4338d1e32..4e10f23883b7 100644 --- a/zkstack_cli/crates/zkstack/completion/_zkstack.zsh +++ b/zkstack_cli/crates/zkstack/completion/_zkstack.zsh @@ -127,7 +127,7 @@ _arguments "${_arguments_options[@]}" : \ '*--additional-args=[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '--deploy-paymaster=[Deploy Paymaster contract]' \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '-o+[Enable Grafana]' \ @@ -283,7 +283,7 @@ _arguments "${_arguments_options[@]}" : \ '*-a+[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[List of additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--deploy-paymaster=[]' \ @@ -312,7 +312,7 @@ _arguments "${_arguments_options[@]}" : \ (configs) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--l1-rpc-url=[L1 RPC URL]:L1_RPC_URL:_default' \ @@ -360,7 +360,7 @@ esac (genesis) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ @@ -386,7 +386,7 @@ _arguments "${_arguments_options[@]}" : \ (init-database) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--server-db-url=[Server database url without database name]:SERVER_DB_URL:_default' \ '--server-db-name=[Server database name]:SERVER_DB_NAME:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ @@ -404,7 +404,7 @@ _arguments "${_arguments_options[@]}" : \ (server) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ '-v[Verbose mode]' \ '--verbose[Verbose mode]' \ @@ -1940,7 +1940,7 @@ _arguments "${_arguments_options[@]}" : \ '-m+[]:MAX_ALLOCATION:_default' \ '--max-allocation=[]:MAX_ALLOCATION:_default' \ '--docker=[]:DOCKER:(true false)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '--chain=[Chain to use]:CHAIN:_default' \ '-v[Verbose mode]' \ '--verbose[Verbose mode]' \ @@ -2019,7 +2019,7 @@ esac (server) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '*--components=[Components of server to run]:COMPONENTS:_default' \ '*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ @@ -2054,7 +2054,7 @@ _arguments "${_arguments_options[@]}" : \ (run) _arguments "${_arguments_options[@]}" : \ '--mode=[]:MODE:(release debug docker)' \ -'--tag=[]:TAG:_default' \ +'--tag=[Select a specific Docker image tag]:TAG:_default' \ '*--components=[Components of server to run]:COMPONENTS:_default' \ '*-a+[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ '*--additional-args=[Additional arguments that can be passed through the CLI]:ADDITIONAL_ARGS:_default' \ diff --git a/zkstack_cli/crates/zkstack/completion/zkstack.fish b/zkstack_cli/crates/zkstack/completion/zkstack.fish index 7eb9eab5a6d3..b5a086fad7aa 100644 --- a/zkstack_cli/crates/zkstack/completion/zkstack.fish +++ b/zkstack_cli/crates/zkstack/completion/zkstack.fish @@ -104,7 +104,7 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_se complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -s a -l additional-args -d 'List of additional arguments that can be passed through the CLI' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l deploy-paymaster -d 'Deploy Paymaster contract' -r -f -a "{true\t'',false\t''}" complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" -complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l tag -r +complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l tag -d 'Select a specific Docker image tag' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l server-db-url -d 'Server database url without database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -l server-db-name -d 'Server database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand ecosystem; and __fish_seen_subcommand_from init" -s o -l observability -d 'Enable Grafana' -r -f -a "{true\t'',false\t''}" @@ -184,7 +184,7 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_s complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l verifier-api-key -d 'Verifier API key' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -s a -l additional-args -d 'List of additional arguments that can be passed through the CLI' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" -complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l tag -r +complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l tag -d 'Select a specific Docker image tag' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l server-db-url -d 'Server database url without database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l server-db-name -d 'Server database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -l deploy-paymaster -r -f -a "{true\t'',false\t''}" @@ -200,7 +200,7 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_s complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -f -a "configs" -d 'Initialize chain configs' complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from init" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" -complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l tag -r +complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l tag -d 'Select a specific Docker image tag' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l server-db-url -d 'Server database url without database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l server-db-name -d 'Server database name' -r complete -c zkstack -n "__fish_zkstack_using_subcommand chain; and __fish_seen_subcommand_from genesis" -l chain -d 'Chain to use' -r @@ -509,7 +509,7 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -s h -l heavy-wvg-count -r complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -s m -l max-allocation -r complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -l docker -r -f -a "{true\t'',false\t''}" -complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -l tag -r +complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -l tag -d 'Select a specific Docker image tag' -r complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -l chain -d 'Chain to use' -r complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -s v -l verbose -d 'Verbose mode' complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from run" -l ignore-prerequisites -d 'Ignores prerequisites checks' @@ -532,7 +532,7 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "compressor-keys" -d 'Download compressor keys' complete -c zkstack -n "__fish_zkstack_using_subcommand prover; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" -complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l tag -r +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l tag -d 'Select a specific Docker image tag' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l components -d 'Components of server to run' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -s a -l additional-args -d 'Additional arguments that can be passed through the CLI' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and not __fish_seen_subcommand_from build run wait help" -l chain -d 'Chain to use' -r @@ -550,7 +550,7 @@ complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_ complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -l ignore-prerequisites -d 'Ignores prerequisites checks' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from build" -s h -l help -d 'Print help' complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l mode -r -f -a "{release\t'',debug\t'',docker\t''}" -complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l tag -r +complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l tag -d 'Select a specific Docker image tag' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l components -d 'Components of server to run' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -s a -l additional-args -d 'Additional arguments that can be passed through the CLI' -r complete -c zkstack -n "__fish_zkstack_using_subcommand server; and __fish_seen_subcommand_from run" -l chain -d 'Chain to use' -r From bbe5b7d3152d373aea47c13496762d5e694412d1 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 29 Nov 2024 12:08:34 +0100 Subject: [PATCH 36/44] feat: add port mapping to server's docker run --- zkstack_cli/crates/common/src/server.rs | 39 ++++++++++++------- .../src/commands/chain/genesis/server.rs | 8 ++++ .../crates/zkstack/src/commands/server/run.rs | 18 +++++++-- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index f8f8708314c1..092356b938e9 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -54,6 +54,8 @@ impl Server { secrets_path: P, contracts_path: P, mut additional_args: Vec, + rpc_port: String, + healthcheck_port: String, ) -> anyhow::Result<()> where P: AsRef, @@ -80,6 +82,8 @@ impl Server { additional_args, execution_mode, server_mode, + rpc_port, + healthcheck_port, ) .await?; @@ -116,6 +120,8 @@ async fn run_server

( additional_args: Vec, execution_mode: ExecutionMode, server_mode: ServerMode, + rpc_port: String, + healthcheck_port: String, ) -> anyhow::Result<()> where P: AsRef, @@ -152,6 +158,8 @@ where contracts_path, additional_args, tag, + rpc_port, + healthcheck_port, ), }; @@ -207,6 +215,8 @@ fn docker_run

( contracts_path: P, additional_args: Vec, tag: String, + rpc_port: String, + healthcheck_port: String, ) -> Cmd<'_> where P: AsRef, @@ -214,19 +224,20 @@ where Cmd::new(cmd!( shell, "docker run - --platform linux/amd64 - --net=host - -v {genesis_path}:/config/genesis.yaml - -v {wallets_path}:/config/wallets.yaml - -v {general_path}:/config/general.yaml - -v {secrets_path}:/config/secrets.yaml - -v {contracts_path}:/config/contracts.yaml - matterlabs/server-v2:{tag} - --genesis-path /config/genesis.yaml - --wallets-path /config/wallets.yaml - --config-path /config/general.yaml - --secrets-path /config/secrets.yaml - --contracts-config-path /config/contracts.yaml - {additional_args...}" + --platform linux/amd64 + -v {genesis_path}:/config/genesis.yaml + -v {wallets_path}:/config/wallets.yaml + -v {general_path}:/config/general.yaml + -v {secrets_path}:/config/secrets.yaml + -v {contracts_path}:/config/contracts.yaml + -p {rpc_port}:{rpc_port} + -p {healthcheck_port}:{healthcheck_port} + matterlabs/server-v2:{tag} + --genesis-path /config/genesis.yaml + --wallets-path /config/wallets.yaml + --config-path /config/general.yaml + --secrets-path /config/secrets.yaml + --contracts-config-path /config/contracts.yaml + {additional_args...}" )) } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 99a03d7ba440..4f0e6266488c 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -39,6 +39,12 @@ pub async fn run_server_genesis( shell: &Shell, execution_mode: ExecutionMode, ) -> anyhow::Result<()> { + let general_config = chain_config.get_general_config()?; + let api_config = general_config.api_config.context("Missing API config")?; + + let rpc_port = api_config.web3_json_rpc.http_port.to_string(); + let healthcheck_port = api_config.healthcheck.port.to_string(); + let server = Server::new(None, chain_config.link_to_code.clone(), false); server .run( @@ -51,6 +57,8 @@ pub async fn run_server_genesis( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], + rpc_port, + healthcheck_port, ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 5f1fdaf5d849..b85c04583abb 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -4,14 +4,14 @@ use common::{ server::{Server, ServerMode}, }; use config::{ - traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, GeneralConfig, GenesisConfig, - SecretsConfig, WalletsConfig, + traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, EcosystemConfig, + GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, }; use xshell::Shell; use crate::{ commands::args::run::RunServerArgs, - messages::{MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, + messages::{MSG_CHAIN_NOT_FOUND_ERR, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, }; pub(super) async fn run_server( @@ -21,6 +21,16 @@ pub(super) async fn run_server( ) -> anyhow::Result<()> { let args = args.fill_values_with_prompt().await; + let ecosystem_config = EcosystemConfig::from_file(shell)?; + let chain = ecosystem_config + .load_current_chain() + .expect(MSG_CHAIN_NOT_FOUND_ERR); + let general_config = chain.get_general_config()?; + let api_config = general_config.api_config.context("Missing API config")?; + + let rpc_port = api_config.web3_json_rpc.http_port.to_string(); + let healthcheck_port = api_config.healthcheck.port.to_string(); + logger::info(MSG_STARTING_SERVER); let server = Server::new( args.components.clone(), @@ -45,6 +55,8 @@ pub(super) async fn run_server( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], + rpc_port, + healthcheck_port, ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) From 698e558bffbad0d5dc3a1a769dc092ae9ec31826 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 29 Nov 2024 12:55:31 +0100 Subject: [PATCH 37/44] feat: expose all required ports from the server --- zkstack_cli/crates/common/src/server.rs | 79 ++++++++++++------- .../src/commands/chain/genesis/server.rs | 17 ++-- .../crates/zkstack/src/commands/server/run.rs | 26 +++--- 3 files changed, 70 insertions(+), 52 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 092356b938e9..9b84aca018b5 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -54,8 +54,7 @@ impl Server { secrets_path: P, contracts_path: P, mut additional_args: Vec, - rpc_port: String, - healthcheck_port: String, + ports: Vec, ) -> anyhow::Result<()> where P: AsRef, @@ -82,8 +81,7 @@ impl Server { additional_args, execution_mode, server_mode, - rpc_port, - healthcheck_port, + ports, ) .await?; @@ -120,8 +118,7 @@ async fn run_server

( additional_args: Vec, execution_mode: ExecutionMode, server_mode: ServerMode, - rpc_port: String, - healthcheck_port: String, + ports: Vec, ) -> anyhow::Result<()> where P: AsRef, @@ -158,8 +155,7 @@ where contracts_path, additional_args, tag, - rpc_port, - healthcheck_port, + ports, ), }; @@ -215,29 +211,54 @@ fn docker_run

( contracts_path: P, additional_args: Vec, tag: String, - rpc_port: String, - healthcheck_port: String, + ports: Vec, ) -> Cmd<'_> where P: AsRef, { - Cmd::new(cmd!( - shell, - "docker run - --platform linux/amd64 - -v {genesis_path}:/config/genesis.yaml - -v {wallets_path}:/config/wallets.yaml - -v {general_path}:/config/general.yaml - -v {secrets_path}:/config/secrets.yaml - -v {contracts_path}:/config/contracts.yaml - -p {rpc_port}:{rpc_port} - -p {healthcheck_port}:{healthcheck_port} - matterlabs/server-v2:{tag} - --genesis-path /config/genesis.yaml - --wallets-path /config/wallets.yaml - --config-path /config/general.yaml - --secrets-path /config/secrets.yaml - --contracts-config-path /config/contracts.yaml - {additional_args...}" - )) + let genesis_path = genesis_path.as_ref().to_string_lossy(); + let wallets_path = wallets_path.as_ref().to_string_lossy(); + let general_path = general_path.as_ref().to_string_lossy(); + let secrets_path = secrets_path.as_ref().to_string_lossy(); + let contracts_path = contracts_path.as_ref().to_string_lossy(); + + // do not expose postgres and reth ports + let ports = ports + .into_iter() + .filter(|p| *p != 5432 && *p != 8545) + .collect::>(); + + let mut cmd = cmd!(shell, "docker run") + .arg("--platform") + .arg("linux/amd64") + .arg("-v") + .arg(format!("{genesis_path}:/config/genesis.yaml")) + .arg("-v") + .arg(format!("{wallets_path}:/config/wallets.yaml")) + .arg("-v") + .arg(format!("{general_path}:/config/general.yaml")) + .arg("-v") + .arg(format!("{secrets_path}:/config/secrets.yaml")) + .arg("-v") + .arg(format!("{contracts_path}:/config/contracts.yaml")); + + for p in ports { + cmd = cmd.arg("-p").arg(format!("{p}:{p}")); + } + + cmd = cmd + .arg(format!("matterlabs/server-v2:{tag}")) + .arg("--genesis-path") + .arg("/config/genesis.yaml") + .arg("--wallets-path") + .arg("/config/wallets.yaml") + .arg("--config-path") + .arg("/config/general.yaml") + .arg("--secrets-path") + .arg("/config/secrets.yaml") + .arg("--contracts-config-path") + .arg("/config/contracts.yaml") + .args(additional_args); + + Cmd::new(cmd) } diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 4f0e6266488c..5898fb230d72 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -16,6 +16,7 @@ use crate::{ MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_GENESIS_COMPLETED, MSG_STARTING_GENESIS_SPINNER, }, + utils::ports::EcosystemPortsScanner, }; pub async fn run(args: GenesisServerArgs, shell: &Shell) -> anyhow::Result<()> { @@ -39,13 +40,9 @@ pub async fn run_server_genesis( shell: &Shell, execution_mode: ExecutionMode, ) -> anyhow::Result<()> { - let general_config = chain_config.get_general_config()?; - let api_config = general_config.api_config.context("Missing API config")?; - - let rpc_port = api_config.web3_json_rpc.http_port.to_string(); - let healthcheck_port = api_config.healthcheck.port.to_string(); - + let ports = EcosystemPortsScanner::scan(shell)?; let server = Server::new(None, chain_config.link_to_code.clone(), false); + server .run( shell, @@ -57,8 +54,12 @@ pub async fn run_server_genesis( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - rpc_port, - healthcheck_port, + ports + .ports + .keys() + .into_iter() + .map(|p| p.to_owned()) + .collect(), ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index b85c04583abb..4575223a38ba 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -4,14 +4,15 @@ use common::{ server::{Server, ServerMode}, }; use config::{ - traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, EcosystemConfig, - GeneralConfig, GenesisConfig, SecretsConfig, WalletsConfig, + traits::FileConfigWithDefaultName, ChainConfig, ContractsConfig, GeneralConfig, GenesisConfig, + SecretsConfig, WalletsConfig, }; use xshell::Shell; use crate::{ commands::args::run::RunServerArgs, - messages::{MSG_CHAIN_NOT_FOUND_ERR, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, + messages::{MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, + utils::ports::EcosystemPortsScanner, }; pub(super) async fn run_server( @@ -20,16 +21,7 @@ pub(super) async fn run_server( shell: &Shell, ) -> anyhow::Result<()> { let args = args.fill_values_with_prompt().await; - - let ecosystem_config = EcosystemConfig::from_file(shell)?; - let chain = ecosystem_config - .load_current_chain() - .expect(MSG_CHAIN_NOT_FOUND_ERR); - let general_config = chain.get_general_config()?; - let api_config = general_config.api_config.context("Missing API config")?; - - let rpc_port = api_config.web3_json_rpc.http_port.to_string(); - let healthcheck_port = api_config.healthcheck.port.to_string(); + let ports = EcosystemPortsScanner::scan(shell)?; logger::info(MSG_STARTING_SERVER); let server = Server::new( @@ -55,8 +47,12 @@ pub(super) async fn run_server( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - rpc_port, - healthcheck_port, + ports + .ports + .keys() + .into_iter() + .map(|p| p.to_owned()) + .collect(), ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) From fc211f935edd4a55005603edc1d07bac698c14f2 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 29 Nov 2024 17:19:48 +0100 Subject: [PATCH 38/44] feat: adjust host to execution mode --- Cargo.lock | 1 + core/lib/config/Cargo.toml | 1 + core/lib/config/src/configs/general.rs | 16 +++++++++ core/lib/config/src/configs/secrets.rs | 36 +++++++++++++++++++ zkstack_cli/Cargo.lock | 1 + .../src/commands/chain/genesis/server.rs | 4 ++- .../crates/zkstack/src/commands/server/run.rs | 4 ++- .../crates/zkstack/src/utils/docker.rs | 33 ++++++++++++++++- 8 files changed, 93 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e8f33f35c13d..8388f226be0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11267,6 +11267,7 @@ dependencies = [ "serde", "serde_json", "tracing", + "url", "zksync_basic_types", "zksync_concurrency", "zksync_consensus_utils", diff --git a/core/lib/config/Cargo.toml b/core/lib/config/Cargo.toml index 46c0b27d4b03..474377dc6363 100644 --- a/core/lib/config/Cargo.toml +++ b/core/lib/config/Cargo.toml @@ -22,6 +22,7 @@ anyhow.workspace = true rand.workspace = true secrecy.workspace = true serde = { workspace = true, features = ["derive"] } +url.workspace = true [dev-dependencies] serde_json.workspace = true diff --git a/core/lib/config/src/configs/general.rs b/core/lib/config/src/configs/general.rs index dfb81af1cf8c..e69be36d449f 100644 --- a/core/lib/config/src/configs/general.rs +++ b/core/lib/config/src/configs/general.rs @@ -1,3 +1,5 @@ +use url::Url; + use crate::{ configs::{ base_token_adjuster::BaseTokenAdjusterConfig, @@ -61,3 +63,17 @@ pub struct GeneralConfig { pub prover_job_monitor_config: Option, pub timestamp_asserter_config: Option, } + +impl GeneralConfig { + pub fn set_prometheus_host(&mut self, host: &str) -> anyhow::Result<()> { + if let Some(api) = self.api_config.as_mut() { + if let Some(url) = api.prometheus.pushgateway_url.as_mut() { + let mut new_url = Url::parse(url)?; + new_url.set_host(Some(host))?; + *url = new_url.to_string(); + } + } + + Ok(()) + } +} diff --git a/core/lib/config/src/configs/secrets.rs b/core/lib/config/src/configs/secrets.rs index 75ff067c2473..155f300635eb 100644 --- a/core/lib/config/src/configs/secrets.rs +++ b/core/lib/config/src/configs/secrets.rs @@ -33,6 +33,42 @@ pub struct Secrets { pub data_availability: Option, } +impl Secrets { + pub fn set_prover_url_host(&mut self, host: &str) -> anyhow::Result<()> { + if let Some(database) = self.database.as_mut() { + if let Some(url) = database.prover_url.as_mut() { + let mut new_url = url.expose_url().clone(); + new_url.set_host(Some(host))?; + *url = SensitiveUrl::from(new_url); + } + } + + Ok(()) + } + + pub fn set_server_url_host(&mut self, host: &str) -> anyhow::Result<()> { + if let Some(database) = self.database.as_mut() { + if let Some(url) = database.server_url.as_mut() { + let mut new_url = url.expose_url().clone(); + new_url.set_host(Some(host))?; + *url = SensitiveUrl::from(new_url); + } + } + + Ok(()) + } + + pub fn set_l1_rpc_url_host(&mut self, host: &str) -> anyhow::Result<()> { + if let Some(l1) = &mut self.l1 { + let mut new_url = l1.l1_rpc_url.expose_url().clone(); + new_url.set_host(Some(host))?; + l1.l1_rpc_url = SensitiveUrl::from(new_url); + } + + Ok(()) + } +} + impl DatabaseSecrets { /// Returns a copy of the master database URL as a `Result` to simplify error propagation. pub fn master_url(&self) -> anyhow::Result { diff --git a/zkstack_cli/Cargo.lock b/zkstack_cli/Cargo.lock index a23b566eaf19..5f3b7d36005d 100644 --- a/zkstack_cli/Cargo.lock +++ b/zkstack_cli/Cargo.lock @@ -6547,6 +6547,7 @@ dependencies = [ "rand", "secrecy", "serde", + "url", "zksync_basic_types", "zksync_concurrency", "zksync_consensus_utils", diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 5898fb230d72..394a32f9a23e 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -16,7 +16,7 @@ use crate::{ MSG_CHAIN_NOT_INITIALIZED, MSG_FAILED_TO_RUN_SERVER_ERR, MSG_GENESIS_COMPLETED, MSG_STARTING_GENESIS_SPINNER, }, - utils::ports::EcosystemPortsScanner, + utils::{docker::adjust_host_to_execution_mode, ports::EcosystemPortsScanner}, }; pub async fn run(args: GenesisServerArgs, shell: &Shell) -> anyhow::Result<()> { @@ -43,6 +43,8 @@ pub async fn run_server_genesis( let ports = EcosystemPortsScanner::scan(shell)?; let server = Server::new(None, chain_config.link_to_code.clone(), false); + adjust_host_to_execution_mode(shell, &execution_mode, &chain_config)?; + server .run( shell, diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 4575223a38ba..07f661f1f152 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -12,7 +12,7 @@ use xshell::Shell; use crate::{ commands::args::run::RunServerArgs, messages::{MSG_FAILED_TO_RUN_SERVER_ERR, MSG_STARTING_SERVER}, - utils::ports::EcosystemPortsScanner, + utils::{docker::adjust_host_to_execution_mode, ports::EcosystemPortsScanner}, }; pub(super) async fn run_server( @@ -36,6 +36,8 @@ pub(super) async fn run_server( ServerMode::Normal }; + adjust_host_to_execution_mode(shell, &args.mode, chain_config)?; + server .run( shell, diff --git a/zkstack_cli/crates/zkstack/src/utils/docker.rs b/zkstack_cli/crates/zkstack/src/utils/docker.rs index c8a56dfc75bd..106092534527 100644 --- a/zkstack_cli/crates/zkstack/src/utils/docker.rs +++ b/zkstack_cli/crates/zkstack/src/utils/docker.rs @@ -1,4 +1,6 @@ -use common::{github::GitHubTagFetcher, PromptSelect}; +use common::{github::GitHubTagFetcher, server::ExecutionMode, PromptSelect}; +use config::{traits::SaveConfigWithBasePath, ChainConfig}; +use xshell::Shell; use crate::messages::MSG_SERVER_SELECT_DOCKER_IMAGE_TAG; @@ -16,3 +18,32 @@ pub async fn select_tag() -> anyhow::Result { Ok(PromptSelect::new(MSG_SERVER_SELECT_DOCKER_IMAGE_TAG, tags).ask()) } + +pub fn adjust_host_to_execution_mode( + shell: &Shell, + mode: &ExecutionMode, + chain_config: &ChainConfig, +) -> anyhow::Result<()> { + let mut secrets = chain_config.get_secrets_config()?; + let mut general = chain_config.get_general_config()?; + + match mode { + ExecutionMode::Release | ExecutionMode::Debug => { + general.set_prometheus_host("localhost")?; + secrets.set_prover_url_host("localhost")?; + secrets.set_server_url_host("localhost")?; + secrets.set_l1_rpc_url_host("localhost")?; + } + ExecutionMode::Docker { tag: _ } => { + general.set_prometheus_host("host.docker.internal")?; + secrets.set_prover_url_host("host.docker.internal")?; + secrets.set_server_url_host("host.docker.internal")?; + secrets.set_l1_rpc_url_host("host.docker.internal")?; + } + } + + secrets.save_with_base_path(shell, &chain_config.configs)?; + general.save_with_base_path(shell, &chain_config.configs)?; + + Ok(()) +} From f0541180dec79070a221227ab64ea58b5ff0051b Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 29 Nov 2024 17:40:26 +0100 Subject: [PATCH 39/44] fix: fix debug execution mode --- zkstack_cli/crates/common/src/server.rs | 37 +++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/zkstack_cli/crates/common/src/server.rs b/zkstack_cli/crates/common/src/server.rs index 9b84aca018b5..7b355f97d341 100644 --- a/zkstack_cli/crates/common/src/server.rs +++ b/zkstack_cli/crates/common/src/server.rs @@ -183,22 +183,31 @@ fn cargo_run<'a, P>( where P: AsRef, { - let compilation_mode: &str = if release { "--release" } else { "" }; + let mut cmd = cmd!(shell, "cargo run"); - Cmd::new( - cmd!( - shell, - "cargo run {compilation_mode} --bin zksync_server {uring...} -- - --genesis-path {genesis_path} - --wallets-path {wallets_path} - --config-path {general_path} - --secrets-path {secrets_path} - --contracts-config-path {contracts_path} - " - ) + if release { + cmd = cmd.arg("--release"); + } + + cmd = cmd + .arg("--bin") + .arg("zksync_server") + .args(uring) + .arg("--") + .arg("--genesis-path") + .arg(genesis_path) + .arg("--wallets-path") + .arg(wallets_path) + .arg("--config-path") + .arg(general_path) + .arg("--secrets-path") + .arg(secrets_path) + .arg("--contracts-config-path") + .arg(contracts_path) .args(additional_args) - .env_remove("RUSTUP_TOOLCHAIN"), - ) + .env_remove("RUSTUP_TOOLCHAIN"); + + Cmd::new(cmd) } #[allow(clippy::too_many_arguments)] From 1bb08b3cf67696951f80adea1bee6c676780968f Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 29 Nov 2024 17:42:35 +0100 Subject: [PATCH 40/44] refactor: clippy --- .../crates/zkstack/src/commands/chain/genesis/server.rs | 9 ++------- zkstack_cli/crates/zkstack/src/commands/server/run.rs | 7 +------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs index 394a32f9a23e..837d99296370 100644 --- a/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs +++ b/zkstack_cli/crates/zkstack/src/commands/chain/genesis/server.rs @@ -43,7 +43,7 @@ pub async fn run_server_genesis( let ports = EcosystemPortsScanner::scan(shell)?; let server = Server::new(None, chain_config.link_to_code.clone(), false); - adjust_host_to_execution_mode(shell, &execution_mode, &chain_config)?; + adjust_host_to_execution_mode(shell, &execution_mode, chain_config)?; server .run( @@ -56,12 +56,7 @@ pub async fn run_server_genesis( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - ports - .ports - .keys() - .into_iter() - .map(|p| p.to_owned()) - .collect(), + ports.ports.keys().map(|p| p.to_owned()).collect(), ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) diff --git a/zkstack_cli/crates/zkstack/src/commands/server/run.rs b/zkstack_cli/crates/zkstack/src/commands/server/run.rs index 07f661f1f152..c5671a498335 100644 --- a/zkstack_cli/crates/zkstack/src/commands/server/run.rs +++ b/zkstack_cli/crates/zkstack/src/commands/server/run.rs @@ -49,12 +49,7 @@ pub(super) async fn run_server( SecretsConfig::get_path_with_base_path(&chain_config.configs), ContractsConfig::get_path_with_base_path(&chain_config.configs), vec![], - ports - .ports - .keys() - .into_iter() - .map(|p| p.to_owned()) - .collect(), + ports.ports.keys().map(|p| p.to_owned()).collect(), ) .await .context(MSG_FAILED_TO_RUN_SERVER_ERR) From a58cf2744fc85cc5568354c08c82ee238ade5c40 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Fri, 29 Nov 2024 18:02:36 +0100 Subject: [PATCH 41/44] chore: update lock file --- zkstack_cli/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zkstack_cli/Cargo.lock b/zkstack_cli/Cargo.lock index 6322af55b897..e14b01745ba1 100644 --- a/zkstack_cli/Cargo.lock +++ b/zkstack_cli/Cargo.lock @@ -713,7 +713,7 @@ dependencies = [ "futures", "git_version_macro", "once_cell", - "reqwest 0.12.8", + "reqwest 0.12.9", "semver", "serde", "serde_json", From 55b0a6c550aa617faf6a0a596c565ef1726b6dd1 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Sat, 30 Nov 2024 14:43:19 +0100 Subject: [PATCH 42/44] fix: adjust host only when required --- core/lib/config/src/configs/general.rs | 8 +++ core/lib/config/src/configs/secrets.rs | 20 +++++++ .../crates/zkstack/src/utils/docker.rs | 57 ++++++++++++++++--- 3 files changed, 77 insertions(+), 8 deletions(-) diff --git a/core/lib/config/src/configs/general.rs b/core/lib/config/src/configs/general.rs index e69be36d449f..614e48dda42e 100644 --- a/core/lib/config/src/configs/general.rs +++ b/core/lib/config/src/configs/general.rs @@ -65,6 +65,14 @@ pub struct GeneralConfig { } impl GeneralConfig { + pub fn prometheus_host(&self) -> Option { + self.api_config + .as_ref() + .and_then(|api| api.prometheus.pushgateway_url.as_ref()) + .and_then(|url| Url::parse(url).ok()) + .and_then(|url| url.host_str().map(String::from)) + } + pub fn set_prometheus_host(&mut self, host: &str) -> anyhow::Result<()> { if let Some(api) = self.api_config.as_mut() { if let Some(url) = api.prometheus.pushgateway_url.as_mut() { diff --git a/core/lib/config/src/configs/secrets.rs b/core/lib/config/src/configs/secrets.rs index 495c6c2ac71e..282f33441b0a 100644 --- a/core/lib/config/src/configs/secrets.rs +++ b/core/lib/config/src/configs/secrets.rs @@ -35,6 +35,13 @@ pub struct Secrets { } impl Secrets { + pub fn prover_url_host(&self) -> Option { + self.database + .as_ref() + .and_then(|database| database.prover_url.as_ref()) + .map(|url| url.expose_url().host_str().unwrap().to_string()) + } + pub fn set_prover_url_host(&mut self, host: &str) -> anyhow::Result<()> { if let Some(database) = self.database.as_mut() { if let Some(url) = database.prover_url.as_mut() { @@ -47,6 +54,13 @@ impl Secrets { Ok(()) } + pub fn server_url_host(&self) -> Option { + self.database + .as_ref() + .and_then(|database| database.server_url.as_ref()) + .map(|url| url.expose_url().host_str().unwrap().to_string()) + } + pub fn set_server_url_host(&mut self, host: &str) -> anyhow::Result<()> { if let Some(database) = self.database.as_mut() { if let Some(url) = database.server_url.as_mut() { @@ -59,6 +73,12 @@ impl Secrets { Ok(()) } + pub fn l1_rpc_url_host(&self) -> Option { + self.l1 + .as_ref() + .map(|l1| l1.l1_rpc_url.expose_url().host_str().unwrap().to_string()) + } + pub fn set_l1_rpc_url_host(&mut self, host: &str) -> anyhow::Result<()> { if let Some(l1) = &mut self.l1 { let mut new_url = l1.l1_rpc_url.expose_url().clone(); diff --git a/zkstack_cli/crates/zkstack/src/utils/docker.rs b/zkstack_cli/crates/zkstack/src/utils/docker.rs index 106092534527..2450eb0583d0 100644 --- a/zkstack_cli/crates/zkstack/src/utils/docker.rs +++ b/zkstack_cli/crates/zkstack/src/utils/docker.rs @@ -4,6 +4,9 @@ use xshell::Shell; use crate::messages::MSG_SERVER_SELECT_DOCKER_IMAGE_TAG; +const DOCKER_INTERNAL: &str = "host.docker.internal"; +const LOCALHOST: &str = "localhost"; + pub async fn select_tag() -> anyhow::Result { let fetcher = GitHubTagFetcher::new(None)?; let gh_tags = fetcher.get_newest_core_tags(Some(5)).await?; @@ -29,16 +32,50 @@ pub fn adjust_host_to_execution_mode( match mode { ExecutionMode::Release | ExecutionMode::Debug => { - general.set_prometheus_host("localhost")?; - secrets.set_prover_url_host("localhost")?; - secrets.set_server_url_host("localhost")?; - secrets.set_l1_rpc_url_host("localhost")?; + if let Some(host) = general.prometheus_host() { + if host == DOCKER_INTERNAL { + general.set_prometheus_host(LOCALHOST)?; + } + } + + if let Some(host) = secrets.prover_url_host() { + if host == DOCKER_INTERNAL { + secrets.set_prover_url_host(LOCALHOST)?; + } + } + if let Some(host) = secrets.server_url_host() { + if host == DOCKER_INTERNAL { + secrets.set_server_url_host(LOCALHOST)?; + } + } + if let Some(host) = secrets.l1_rpc_url_host() { + if host == DOCKER_INTERNAL { + secrets.set_l1_rpc_url_host(LOCALHOST)?; + } + } } ExecutionMode::Docker { tag: _ } => { - general.set_prometheus_host("host.docker.internal")?; - secrets.set_prover_url_host("host.docker.internal")?; - secrets.set_server_url_host("host.docker.internal")?; - secrets.set_l1_rpc_url_host("host.docker.internal")?; + if let Some(host) = general.prometheus_host() { + if is_localhost(host.as_str()) { + general.set_prometheus_host(DOCKER_INTERNAL)?; + } + } + + if let Some(host) = secrets.prover_url_host() { + if is_localhost(host.as_str()) { + secrets.set_prover_url_host(DOCKER_INTERNAL)?; + } + } + if let Some(host) = secrets.server_url_host() { + if is_localhost(host.as_str()) { + secrets.set_server_url_host(DOCKER_INTERNAL)?; + } + } + if let Some(host) = secrets.l1_rpc_url_host() { + if is_localhost(host.as_str()) { + secrets.set_l1_rpc_url_host(DOCKER_INTERNAL)?; + } + } } } @@ -47,3 +84,7 @@ pub fn adjust_host_to_execution_mode( Ok(()) } + +fn is_localhost(host: &str) -> bool { + host == "127.0.0.1" || host == "localhost" +} From c09b95eb82fd4fa09bc94bdabb966adfc859c862 Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Sat, 30 Nov 2024 14:55:46 +0100 Subject: [PATCH 43/44] fix: remove unwrapping --- core/lib/config/src/configs/secrets.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/lib/config/src/configs/secrets.rs b/core/lib/config/src/configs/secrets.rs index 282f33441b0a..960d14c0c102 100644 --- a/core/lib/config/src/configs/secrets.rs +++ b/core/lib/config/src/configs/secrets.rs @@ -39,7 +39,8 @@ impl Secrets { self.database .as_ref() .and_then(|database| database.prover_url.as_ref()) - .map(|url| url.expose_url().host_str().unwrap().to_string()) + .and_then(|url| url.expose_url().host_str()) + .map(String::from) } pub fn set_prover_url_host(&mut self, host: &str) -> anyhow::Result<()> { @@ -58,7 +59,8 @@ impl Secrets { self.database .as_ref() .and_then(|database| database.server_url.as_ref()) - .map(|url| url.expose_url().host_str().unwrap().to_string()) + .and_then(|url| url.expose_url().host_str()) + .map(String::from) } pub fn set_server_url_host(&mut self, host: &str) -> anyhow::Result<()> { @@ -76,7 +78,8 @@ impl Secrets { pub fn l1_rpc_url_host(&self) -> Option { self.l1 .as_ref() - .map(|l1| l1.l1_rpc_url.expose_url().host_str().unwrap().to_string()) + .and_then(|l1| l1.l1_rpc_url.expose_url().host_str()) + .map(String::from) } pub fn set_l1_rpc_url_host(&mut self, host: &str) -> anyhow::Result<()> { From 2180bd90e9cb708c672c69e11f5ca7bff885656a Mon Sep 17 00:00:00 2001 From: Manuel Mauro Date: Tue, 3 Dec 2024 10:29:25 +0100 Subject: [PATCH 44/44] chore: update cargo lock --- prover/Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 453a768c0678..eefbec3b98eb 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -8235,6 +8235,7 @@ dependencies = [ "secrecy 0.8.0", "serde", "tracing", + "url", "zksync_basic_types", "zksync_concurrency", "zksync_consensus_utils",