From 964800f7650b544db3e6d954c4a9b968c3b9d655 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Tue, 17 Feb 2026 18:33:29 -0300 Subject: [PATCH 1/3] add standalone feature for running sequencer without bedrock using mocked components --- sequencer_core/src/lib.rs | 3 +++ sequencer_rpc/Cargo.toml | 5 +++++ sequencer_rpc/src/lib.rs | 6 ++++++ sequencer_rpc/src/net_utils.rs | 11 ++++++++++- sequencer_runner/Cargo.toml | 5 +++++ sequencer_runner/src/lib.rs | 30 +++++++++++++++++++++++------- 6 files changed, 52 insertions(+), 8 deletions(-) diff --git a/sequencer_core/src/lib.rs b/sequencer_core/src/lib.rs index 9a2ca2b1..cad7e20e 100644 --- a/sequencer_core/src/lib.rs +++ b/sequencer_core/src/lib.rs @@ -28,6 +28,9 @@ pub mod indexer_client; #[cfg(feature = "mock")] pub mod mock; +#[cfg(feature = "mock")] +pub use mock::SequencerCoreWithMockClients; + pub struct SequencerCore< BC: BlockSettlementClientTrait = BlockSettlementClient, IC: IndexerClientTrait = IndexerClient, diff --git a/sequencer_rpc/Cargo.toml b/sequencer_rpc/Cargo.toml index 36b7f7a1..210f3077 100644 --- a/sequencer_rpc/Cargo.toml +++ b/sequencer_rpc/Cargo.toml @@ -27,3 +27,8 @@ borsh.workspace = true [dev-dependencies] sequencer_core = { workspace = true, features = ["mock"] } + +[features] +default = [] +# Includes types to run the sequencer in standalone mode +standalone = ["sequencer_core/mock"] diff --git a/sequencer_rpc/src/lib.rs b/sequencer_rpc/src/lib.rs index 6898c17c..ac92ff45 100644 --- a/sequencer_rpc/src/lib.rs +++ b/sequencer_rpc/src/lib.rs @@ -49,3 +49,9 @@ pub fn rpc_error_responce_inverter(err: RpcError) -> RpcError { data: content, } } + +#[cfg(feature = "standalone")] +use sequencer_core::mock::{MockBlockSettlementClient, MockIndexerClient}; + +#[cfg(feature = "standalone")] +pub type JsonHandlerWithMockClients = JsonHandler; diff --git a/sequencer_rpc/src/net_utils.rs b/sequencer_rpc/src/net_utils.rs index 5e33e76b..ee9f6aa1 100644 --- a/sequencer_rpc/src/net_utils.rs +++ b/sequencer_rpc/src/net_utils.rs @@ -9,10 +9,19 @@ use common::{ use futures::{Future, FutureExt}; use log::info; use mempool::MemPoolHandle; +#[cfg(not(feature = "standalone"))] use sequencer_core::SequencerCore; +#[cfg(feature = "standalone")] +use sequencer_core::SequencerCoreWithMockClients as SequencerCore; + +#[cfg(not(feature = "standalone"))] +use super::JsonHandler; + +#[cfg(feature = "standalone")] +type JsonHandler = super::JsonHandlerWithMockClients; + use tokio::sync::Mutex; -use super::JsonHandler; use crate::process::Process; pub const SHUTDOWN_TIMEOUT_SECS: u64 = 10; diff --git a/sequencer_runner/Cargo.toml b/sequencer_runner/Cargo.toml index 04861c7f..5e627ed2 100644 --- a/sequencer_runner/Cargo.toml +++ b/sequencer_runner/Cargo.toml @@ -18,3 +18,8 @@ actix.workspace = true actix-web.workspace = true tokio.workspace = true futures.workspace = true + +[features] +default = [] +# Runs the sequencer in standalone mode without depending on Bedrock and Indexer services. +standalone = ["sequencer_core/mock", "sequencer_rpc/standalone"] diff --git a/sequencer_runner/src/lib.rs b/sequencer_runner/src/lib.rs index b3020e93..e4d5289c 100644 --- a/sequencer_runner/src/lib.rs +++ b/sequencer_runner/src/lib.rs @@ -5,11 +5,12 @@ use anyhow::{Context as _, Result}; use clap::Parser; use common::rpc_primitives::RpcConfig; use futures::{FutureExt as _, never::Never}; -use log::{error, info, warn}; -use sequencer_core::{ - SequencerCore, block_settlement_client::BlockSettlementClientTrait as _, - config::SequencerConfig, -}; +use log::{error, info}; +#[cfg(not(feature = "standalone"))] +use sequencer_core::SequencerCore; +#[cfg(feature = "standalone")] +use sequencer_core::SequencerCoreWithMockClients as SequencerCore; +use sequencer_core::config::SequencerConfig; use sequencer_rpc::new_http_server; use tokio::{sync::Mutex, task::JoinHandle}; @@ -156,6 +157,7 @@ async fn main_loop(seq_core: Arc>, block_timeout: Duration) } } +#[cfg(not(feature = "standalone"))] async fn retry_pending_blocks_loop( seq_core: Arc>, retry_pending_blocks_timeout: Duration, @@ -180,8 +182,8 @@ async fn retry_pending_blocks_loop( "Resubmitting pending block with id {}", block.header.block_id ); - // TODO: We could cache the inscribe tx for each pending block to avoid re-creating it - // on every retry. + // TODO: We could cache the inscribe tx for each pending block to avoid re-creating + // it on every retry. let (tx, _msg_id) = block_settlement_client .create_inscribe_tx(block) .context("Failed to create inscribe tx for pending block")?; @@ -199,6 +201,7 @@ async fn retry_pending_blocks_loop( } } +#[cfg(not(feature = "standalone"))] async fn listen_for_bedrock_blocks_loop(seq_core: Arc>) -> Result { use indexer_service_rpc::RpcClient as _; @@ -235,6 +238,19 @@ async fn listen_for_bedrock_blocks_loop(seq_core: Arc>) -> } } +#[cfg(feature = "standalone")] +async fn listen_for_bedrock_blocks_loop(_seq_core: Arc>) -> Result { + std::future::pending::>().await +} + +#[cfg(feature = "standalone")] +async fn retry_pending_blocks_loop( + _seq_core: Arc>, + _retry_pending_blocks_timeout: Duration, +) -> Result { + std::future::pending::>().await +} + pub async fn main_runner() -> Result<()> { env_logger::init(); From 01dc41cc470c04310c9d6b38b60821fd22e7779a Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Tue, 17 Feb 2026 19:32:43 -0300 Subject: [PATCH 2/3] fix --- sequencer_runner/src/lib.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sequencer_runner/src/lib.rs b/sequencer_runner/src/lib.rs index e4d5289c..74ebae49 100644 --- a/sequencer_runner/src/lib.rs +++ b/sequencer_runner/src/lib.rs @@ -5,12 +5,14 @@ use anyhow::{Context as _, Result}; use clap::Parser; use common::rpc_primitives::RpcConfig; use futures::{FutureExt as _, never::Never}; -use log::{error, info}; #[cfg(not(feature = "standalone"))] -use sequencer_core::SequencerCore; +use log::warn; +use log::{error, info}; #[cfg(feature = "standalone")] use sequencer_core::SequencerCoreWithMockClients as SequencerCore; use sequencer_core::config::SequencerConfig; +#[cfg(not(feature = "standalone"))] +use sequencer_core::{SequencerCore, block_settlement_client::BlockSettlementClientTrait as _}; use sequencer_rpc::new_http_server; use tokio::{sync::Mutex, task::JoinHandle}; From b008982eeba05795c2c366d4cf2dec7c71f70f93 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Tue, 17 Feb 2026 19:37:44 -0300 Subject: [PATCH 3/3] update readme --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 364ee2a5..7bcfa25e 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,8 @@ RUST_LOG=info RISC0_DEV_MODE=1 cargo run $(pwd)/configs/debug all ## Running Manually - -The sequencer and node can be run locally: - +### Normal mode +The sequencer and logos blockchain node can be run locally: 1. On one terminal go to the `logos-blockchain/logos-blockchain` repo and run a local logos blockchain node: - `git checkout master; git pull` - `cargo clean` @@ -141,10 +140,16 @@ The sequencer and node can be run locally: - `./target/debug/logos-blockchain-node --deployment nodes/node/standalone-deployment-config.yaml nodes/node/standalone-node-config.yaml` 2. On another terminal go to the `logos-blockchain/lssa` repo and run indexer service: - - `RUST_LOG=info cargo run --release -p indexer_service indexer/service/configs/indexer_config.json` + - `RUST_LOG=info cargo run -p indexer_service indexer/service/configs/indexer_config.json` 3. On another terminal go to the `logos-blockchain/lssa` repo and run the sequencer: - - `RUST_LOG=info RISC0_DEV_MODE=1 cargo run --release -p sequencer_runner sequencer_runner/configs/debug` + - `RUST_LOG=info cargo run -p sequencer_runner sequencer_runner/configs/debug` + +### Standalone mode +The sequencer can be run in standalone mode with: +```bash +RUST_LOG=info cargo run --features standalone -p sequencer_runner sequencer_runner/configs/debug +``` ## Running with Docker