diff --git a/CHANGELOG.md b/CHANGELOG.md index 73fadb21f0..29e1f59759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # 2026-04-13 - #2721 Adds support for fallback gRPC endpoints to celestia-adapter. Optional new field +- #2725 splits demo rollup for DA and ZKVM features - #2735 Internal change: moves EVM RPC tests to sov-ethereum from sov-demo-rollup # 2026-04-08 diff --git a/Makefile b/Makefile index 6693b1be75..14c278a1bd 100644 --- a/Makefile +++ b/Makefile @@ -75,6 +75,8 @@ total-clean: test: ## Runs test suite using next test @cargo nextest run --no-fail-fast --status-level skip --all-features + @echo "Running demo-rollup SP1 prover tests..." + @cargo nextest run --no-fail-fast --status-level skip -p sov-demo-rollup --no-default-features --features mock_da,sp1 test-all: ## Runs test suite using nextest, across the whole workspace cargo switcheroo save _backup @@ -166,10 +168,22 @@ lint-fix: ## cargo fmt, fix and clippy. Skip clippy on guest code since it's no SKIP_GUEST_BUILD=1 cargo clippy --fix --allow-dirty -- -A clippy::too_many_arguments check-features: ## Checks that project compiles with all combinations of features. - cargo hack check --feature-powerset --exclude-features default --partition $(CARGO_HACK_PARTITION_N)/$(CARGO_HACK_PARTITION_M) --all-targets + cargo hack check --feature-powerset --exclude-features default --exclude sov-demo-rollup --partition $(CARGO_HACK_PARTITION_N)/$(CARGO_HACK_PARTITION_M) --all-targets + $(MAKE) check-demo-rollup-features check-features-default-targets: - cargo hack check --feature-powerset --exclude-features default --partition $(CARGO_HACK_PARTITION_N)/$(CARGO_HACK_PARTITION_M) + cargo hack check --feature-powerset --exclude-features default --exclude sov-demo-rollup --partition $(CARGO_HACK_PARTITION_N)/$(CARGO_HACK_PARTITION_M) + $(MAKE) check-demo-rollup-features + +check-demo-rollup-features: ## Checks demo-rollup compiles with each meaningful DA+ZKVM combination. + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --no-default-features --features mock_da,mock_zkvm + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --no-default-features --features celestia_da,mock_zkvm + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --no-default-features --features mock_da,risc0 + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --no-default-features --features mock_da,sp1 + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --no-default-features --features celestia_da,risc0 + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --no-default-features --features celestia_da,sp1 + SKIP_GUEST_BUILD=1 cargo check -p sov-demo-rollup --all-targets --all-features check-constant-overriding-is-disabled-in-release-mode: # Passes in release mode... diff --git a/examples/demo-rollup/Cargo.toml b/examples/demo-rollup/Cargo.toml index 3ca0126090..ea76354117 100644 --- a/examples/demo-rollup/Cargo.toml +++ b/examples/demo-rollup/Cargo.toml @@ -15,8 +15,8 @@ workspace = true [dependencies] # non-optional dependencies sov-address = { workspace = true, features = ["evm"] } -sov-celestia-adapter = { workspace = true, features = ["native"] } -sov-mock-da = { workspace = true, features = ["native"] } +sov-celestia-adapter = { workspace = true, features = ["native"], optional = true } +sov-mock-da = { workspace = true, features = ["native"], optional = true } sov-rollup-interface = { workspace = true, features = ["native"] } sov-stf-runner = { workspace = true } sov-metrics = { workspace = true, features = ["native"] } @@ -36,9 +36,9 @@ sov-modules-api = { workspace = true, features = ["native"] } sov-modules-rollup-blueprint = { workspace = true, features = ["native"] } sov-modules-stf-blueprint = { workspace = true, features = ["native"] } sov-solana-offchain-auth = { workspace = true } -sov-risc0-adapter = { workspace = true, features = ["native"] } +sov-risc0-adapter = { workspace = true, features = ["native"], optional = true } sov-sequencer = { workspace = true } -sov-sp1-adapter = { workspace = true, features = ["native"] } +sov-sp1-adapter = { workspace = true, features = ["native"], optional = true } rustls = { workspace = true, features = ["ring"] } sov-full-node-configs = { workspace = true } sov-state = { workspace = true, features = ["native"] } @@ -46,8 +46,8 @@ sov-eth-dev-signer = { workspace = true } demo-stf = { workspace = true, features = ["native"] } -risc0 = { path = "./provers/risc0" } -sp1 = { path = "./provers/sp1" } +risc0-prover = { path = "./provers/risc0", package = "risc0", optional = true } +sp1-prover = { path = "./provers/sp1", package = "sp1", optional = true } borsh = { workspace = true, features = ["bytes", "derive"] } async-trait = { workspace = true } @@ -78,14 +78,13 @@ secp256k1 = { workspace = true, features = ["global-context", "recovery"] } alloy = { workspace = true, features = ["genesis"] } alloy-primitives = { workspace = true } alloy-rlp = { workspace = true } +sov-zkvm-utils = { workspace = true } [dev-dependencies] sov-eth-client = { workspace = true } jsonrpsee = { workspace = true } sov-address = { workspace = true, features = ["native"] } -sov-risc0-adapter = { workspace = true, features = ["native"] } -sov-celestia-adapter = { workspace = true, features = ["native"] } sov-mock-zkvm = { workspace = true, features = ["native"] } sov-rollup-interface = { workspace = true } sov-modules-api = { workspace = true, features = [ @@ -140,9 +139,23 @@ sov-zkvm-utils = { workspace = true } [features] -default = [] +default = ["mock_da", "mock_zkvm"] + +# DA layer features +mock_da = ["sov-mock-da"] +celestia_da = ["sov-celestia-adapter"] + +# ZKVM features (enable exactly one) +mock_zkvm = [] +risc0 = [ + "sov-risc0-adapter", + "risc0-prover", + "sov-metrics/risc0" +] +sp1 = ["sov-sp1-adapter", "sp1-prover"] + # Used for using different encoding between host and guest -bincode = ["risc0/bincode", "sov-risc0-adapter/bincode"] +bincode = ["risc0", "risc0-prover/bincode", "sov-risc0-adapter/bincode"] migration-script = [ "dep:sov-blob-storage", "dep:rockbound", @@ -165,6 +178,7 @@ path = "src/main.rs" [[bin]] name = "demo-celestia-tester" path = "src/da_tester/demo_celestia_tester.rs" +required-features = ["celestia_da"] [[bin]] name = "mockda-to-celestia-migrate" @@ -174,3 +188,13 @@ required-features = ["migration-script"] [[bin]] name = "sov-hive-genesis-adapter" path = "src/hive/genesis_adapter.rs" + +[[test]] +name = "all_tests" +path = "tests/all_tests.rs" +required-features = ["mock_da", "mock_zkvm"] + +[[test]] +name = "prover_tests" +path = "tests/prover_tests.rs" +required-features = ["sp1"] diff --git a/examples/demo-rollup/Makefile b/examples/demo-rollup/Makefile index 2eff940a5e..67e04b2fbb 100644 --- a/examples/demo-rollup/Makefile +++ b/examples/demo-rollup/Makefile @@ -155,6 +155,9 @@ celestia-logs: build: cargo build --bins +build-celestia: + cargo build --bins --no-default-features --features celestia_da,mock_zkvm + test-create-token: check-sov-cli test-create-token: $(SOV_CLI_REL_PATH) node set-url http://127.0.0.1:12346 diff --git a/examples/demo-rollup/README.md b/examples/demo-rollup/README.md index 4237eaf553..3724b38ed5 100644 --- a/examples/demo-rollup/README.md +++ b/examples/demo-rollup/README.md @@ -16,6 +16,7 @@ - [What is This?](#what-is-this) - [Getting Started](#getting-started) + - [Feature flags](#feature-flags) - [Run a local DA layer instance](#run-a-local-da-layer-instance) - [Start the Rollup Full Node](#start-the-rollup-full-node) - [Sanity Check: Creating a Token](#sanity-check-creating-a-token) @@ -49,8 +50,30 @@ understand how to build your own state transition function, check out at the doc If you are looking for a simple rollup with minimal dependencies as a starting point, please have a look here: [sov-rollup-starter](https://github.com/Sovereign-Labs/sov-rollup-starter/) -If you don't need ZK guest to be compiled, -for faster compilation time you can export `export SKIP_GUEST_BUILD=1`environment variable in each terminal you run. +#### Feature flags + +The demo-rollup uses compile-time feature flags to select the DA layer and ZKVM: + +| Feature | Description | +|---------|-------------| +| `mock_da` (default) | Use mock DA (pass `--external` for RPC mode) | +| `celestia_da` | Use Celestia DA | +| `mock_zkvm` (default) | Use mock ZKVM (fastest compilation) | +| `risc0` | Use Risc0 ZKVM | +| `sp1` | Use SP1 ZKVM | + +Default features (`mock_da` + `mock_zkvm`) give the fastest compilation. To use a different DA or ZKVM: + +```sh +# Build with Celestia DA +cargo build -p sov-demo-rollup --no-default-features --features celestia_da,mock_zkvm + +# Build with SP1 ZKVM +cargo build -p sov-demo-rollup --no-default-features --features mock_da,sp1 +``` + +If you don't need ZK guest to be compiled, +for faster compilation time you can export `export SKIP_GUEST_BUILD=1` environment variable in each terminal you run. There are multiple options available: - `export SKIP_GUEST_BUILD=1` or `export SKIP_GUEST_BUILD=true`: both guest VMs builds are skipped * `export SKIP_GUEST_BUILD=risc0`: only risc0 VM build is skipped, sp1 guest is built. @@ -173,6 +196,7 @@ You'll need the `sov-cli` binary in order to create transactions. Build it with ```bash,test-ci,bashtestmd:compare-output # Make sure you're still in `examples/demo-rollup` +# sov-cli works with default features (mock_da). For Celestia, use --features celestia_da --no-default-features $ SKIP_GUEST_BUILD=1 cargo build --bin sov-cli $ ./../../target/debug/sov-cli --help Usage: sov-cli diff --git a/examples/demo-rollup/README_CELESTIA.md b/examples/demo-rollup/README_CELESTIA.md index 552e35f2a5..d0de220a49 100644 --- a/examples/demo-rollup/README_CELESTIA.md +++ b/examples/demo-rollup/README_CELESTIA.md @@ -67,11 +67,11 @@ If you are looking for a simple rollup with minimal dependencies as a starting p $ echo $MY_PERSONAL_GITHUB_TOKEN | docker login ghcr.io -u $MY_GITHUB_USERNAME --password-stdin ``` -3. Switch to the `examples/demo-rollup` directory (which is where this `README.md` is located!), and compile the application: +3. Switch to the `examples/demo-rollup` directory (which is where this `README.md` is located!), and compile the application with the Celestia DA feature: ```shell,test-ci $ cd examples/demo-rollup/ -$ make build +$ make build-celestia ``` 4. Spin up a local Celestia instance as your DA layer. We've built a small Makefile to simplify that process: @@ -87,8 +87,8 @@ $ make start Now run the demo-rollup full node, as shown below. You will see it consuming blocks from the Celestia node running inside Docker: ```sh,test-ci,bashtestmd:long-running,bashtestmd:wait-until=rest_address -# Make sure you're still in the examples/demo-rollup directory and `make build` has been executed before -$ ./../../target/debug/sov-demo-rollup --da-layer celestia --rollup-config-path demo_rollup_config.toml --genesis-config-dir ../test-data/genesis/demo/celestia +# Make sure you're still in the examples/demo-rollup directory +$ ./../../target/debug/sov-demo-rollup --rollup-config-path demo_rollup_config.toml --genesis-config-dir ../test-data/genesis/demo/celestia 2025-03-07T13:13:20.453543Z INFO sov_modules_rollup_blueprint::native_only::logging: Open Telemetry exporter is not enabled 2025-03-07T13:13:20.466922Z INFO sov_demo_rollup: Running demo rollup with prover config prover_config_disc=None 2025-03-07T13:13:20.467830Z DEBUG sov_demo_rollup: Starting rollup on mock DA config_path="mock_rollup_config.toml" @@ -369,7 +369,7 @@ It is possible to run several nodes and sequencers on the same host. But this re 6. Run second node: ``` -cargo run -- --da-layer celestia --rollup-config-path demo_rollup_config_1.toml --genesis-config-dir ../test-data/genesis/demo/celestia +cargo run -p sov-demo-rollup --no-default-features --features celestia_da,mock_zkvm -- --rollup-config-path demo_rollup_config_1.toml --genesis-config-dir ../test-data/genesis/demo/celestia ``` Note that it uses newly generated config and also passes a different option for prometheus exporter. diff --git a/examples/demo-rollup/src/celestia_rollup.rs b/examples/demo-rollup/src/celestia_rollup.rs index b03cb06a49..d73a3165bb 100644 --- a/examples/demo-rollup/src/celestia_rollup.rs +++ b/examples/demo-rollup/src/celestia_rollup.rs @@ -9,7 +9,7 @@ use sov_celestia_adapter::CelestiaService; use sov_db::ledger_db::LedgerDb; use sov_db::storage_manager::NomtStorageManager; use sov_ethereum::EthRpcConfig; -use sov_mock_zkvm::{MockCodeCommitment, MockZkvm, MockZkvmHost}; +use sov_mock_zkvm::MockCodeCommitment; use sov_modules_api::configurable_spec::ConfigurableSpec; use sov_modules_api::execution_mode::Native; use sov_modules_api::rest::StateUpdateReceiver; @@ -19,8 +19,6 @@ use sov_modules_rollup_blueprint::proof_sender::SovApiProofSender; use sov_modules_rollup_blueprint::{ FullNodeBlueprint, RollupBlueprint, SequencerCreationReceipt, WalletBlueprint, }; -use sov_risc0_adapter::host::Risc0Host; -use sov_risc0_adapter::{Risc0, Risc0CryptoSpec}; use sov_rollup_interface::da::{DaSpec, DaVerifier}; use sov_rollup_interface::execution_mode::WitnessGeneration; use sov_rollup_interface::zk::CryptoSpec; @@ -31,6 +29,7 @@ use sov_stf_runner::processes::{ParallelProverService, ProverService, RollupProv use sov_stf_runner::RollupConfig; use crate::solana_offchain_endpoint::solana_offchain_router; +use crate::zk::{self, InnerCryptoSpec, InnerZkvm, OuterZkvm, OuterZkvmHost}; use crate::{eth_dev_signer, ROLLUP_BATCH_NAMESPACE, ROLLUP_PROOF_NAMESPACE}; /// Rollup with CelestiaDa @@ -39,17 +38,17 @@ pub struct CelestiaDemoRollup { phantom: std::marker::PhantomData, } -type Hasher = ::Hasher; +type Hasher = ::Hasher; type NativeStorage = NomtProverStorage, ::SlotHash>; type CelestiaRollupSpec = ConfigurableSpec< CelestiaSpec, - Risc0, - MockZkvm, + InnerZkvm, + OuterZkvm, MultiAddressEvmSolana, M, - Risc0CryptoSpec, + InnerCryptoSpec, NativeStorage, >; @@ -162,14 +161,12 @@ impl FullNodeBlueprint for CelestiaDemoRollup { async fn create_prover_service( &self, - prover_config: RollupProverConfig, + prover_config: RollupProverConfig, rollup_config: &RollupConfig<::Address, Self::DaService>, _da_service: &Self::DaService, ) -> Self::ProverService { - let (elf, prover_config_disc) = prover_config.split(); - let inner_vm = Risc0Host::new(*elf); - - let outer_vm = MockZkvmHost::new_non_blocking(); + let (inner_vm, prover_config_disc) = zk::create_inner_vm(prover_config); + let outer_vm = OuterZkvmHost::new_non_blocking(); let rollup_params = RollupParams { rollup_batch_namespace: ROLLUP_BATCH_NAMESPACE, diff --git a/examples/demo-rollup/src/external_mock_rollup.rs b/examples/demo-rollup/src/external_mock_rollup.rs index 0a4013ba3f..f95fbaf10d 100644 --- a/examples/demo-rollup/src/external_mock_rollup.rs +++ b/examples/demo-rollup/src/external_mock_rollup.rs @@ -9,7 +9,7 @@ use sov_db::storage_manager::NomtStorageManager; use sov_ethereum::EthRpcConfig; use sov_mock_da::storable::rpc::StorableMockDaClient; use sov_mock_da::MockDaSpec; -use sov_mock_zkvm::{MockCodeCommitment, MockZkvm, MockZkvmHost}; +use sov_mock_zkvm::MockCodeCommitment; use sov_modules_api::configurable_spec::ConfigurableSpec; use sov_modules_api::execution_mode::{Native, WitnessGeneration}; use sov_modules_api::rest::StateUpdateReceiver; @@ -18,9 +18,6 @@ use sov_modules_api::{NodeEndpoints, Spec, Storage, SyncStatus, ZkVerifier}; use sov_modules_rollup_blueprint::pluggable_traits::PluggableSpec; use sov_modules_rollup_blueprint::proof_sender::SovApiProofSender; use sov_modules_rollup_blueprint::{FullNodeBlueprint, RollupBlueprint, SequencerCreationReceipt}; -use sov_risc0_adapter::host::Risc0Host; -use sov_risc0_adapter::Risc0; -use sov_risc0_adapter::Risc0CryptoSpec; use sov_rollup_interface::da::DaSpec; use sov_sequencer::{ProofBlobSender, Sequencer}; use sov_state::nomt::prover_storage::NomtProverStorage; @@ -30,19 +27,20 @@ use sov_stf_runner::RollupConfig; use crate::eth_dev_signer; use crate::solana_offchain_endpoint::solana_offchain_router; +use crate::zk::{self, InnerCryptoSpec, InnerZkvm, OuterZkvm, OuterZkvmHost}; -type Hasher = ::Hasher; +type Hasher = ::Hasher; type NativeStorage = NomtProverStorage, ::SlotHash>; /// The default spec of the rollup pub type ExternalMockRollupSpec = ConfigurableSpec< MockDaSpec, - Risc0, - MockZkvm, + InnerZkvm, + OuterZkvm, MultiAddressEvmSolana, M, - Risc0CryptoSpec, + InnerCryptoSpec, NativeStorage, >; @@ -154,21 +152,19 @@ impl FullNodeBlueprint for ExternalMockDemoRollup { async fn create_prover_service( &self, - prover_config: RollupProverConfig, + prover_config: RollupProverConfig, rollup_config: &RollupConfig<::Address, Self::DaService>, _da_service: &Self::DaService, ) -> Self::ProverService { - let (host_args, prover_config_discriminant) = prover_config.split(); - let inner_vm = Risc0Host::new(*host_args); - - let outer_vm = MockZkvmHost::new_non_blocking(); + let (inner_vm, prover_config_disc) = zk::create_inner_vm(prover_config); + let outer_vm = OuterZkvmHost::new_non_blocking(); let da_verifier = Default::default(); ParallelProverService::new_with_default_workers( inner_vm, outer_vm, da_verifier, - prover_config_discriminant, + prover_config_disc, rollup_config.proof_manager.prover_address, ) } diff --git a/examples/demo-rollup/src/lib.rs b/examples/demo-rollup/src/lib.rs index 34965b3f96..19f9180e1b 100644 --- a/examples/demo-rollup/src/lib.rs +++ b/examples/demo-rollup/src/lib.rs @@ -6,31 +6,46 @@ use std::str::FromStr; -use sov_celestia_adapter::types::Namespace; -use sov_modules_api::macros::config_value; +// DA rollup modules compile when their feature is enabled. +// mock_da compiles both in-process and external (RPC) mock variants; +// the binary selects at runtime via --external. +#[cfg(feature = "mock_da")] mod mock_rollup; - +#[cfg(feature = "mock_da")] pub use mock_rollup::*; -mod celestia_rollup; -pub use celestia_rollup::*; - +#[cfg(feature = "mock_da")] mod external_mock_rollup; +#[cfg(feature = "mock_da")] pub use external_mock_rollup::*; +#[cfg(feature = "celestia_da")] +mod celestia_rollup; +#[cfg(feature = "celestia_da")] +pub use celestia_rollup::*; + mod solana_offchain_endpoint; -mod zk; +/// Feature-gated inner ZKVM selection. +pub mod zk; pub use zk::*; /// The rollup stores its data in the namespace b"sov-test" on Celestia /// You can change this constant by modifying BATCH_NAMESPACE in constants.toml -pub const ROLLUP_BATCH_NAMESPACE: Namespace = Namespace::const_v0(config_value!("BATCH_NAMESPACE")); +#[cfg(feature = "celestia_da")] +pub const ROLLUP_BATCH_NAMESPACE: sov_celestia_adapter::types::Namespace = + sov_celestia_adapter::types::Namespace::const_v0(sov_modules_api::macros::config_value!( + "BATCH_NAMESPACE" + )); /// The rollup stores the zk proofs in the namespace b"sov-test-p" on Celestia. /// You can change this constant by modifying PROOF_NAMESPACE in constants.toml -pub const ROLLUP_PROOF_NAMESPACE: Namespace = Namespace::const_v0(config_value!("PROOF_NAMESPACE")); +#[cfg(feature = "celestia_da")] +pub const ROLLUP_PROOF_NAMESPACE: sov_celestia_adapter::types::Namespace = + sov_celestia_adapter::types::Namespace::const_v0(sov_modules_api::macros::config_value!( + "PROOF_NAMESPACE" + )); fn sequencer_type( config: &sov_full_node_configs::sequencer::SequencerConfig, diff --git a/examples/demo-rollup/src/main.rs b/examples/demo-rollup/src/main.rs index 8839ceaeef..36ef3a104d 100644 --- a/examples/demo-rollup/src/main.rs +++ b/examples/demo-rollup/src/main.rs @@ -5,44 +5,55 @@ use anyhow::Context as _; use clap::Parser; use demo_stf::genesis_config::GenesisPaths; use demo_stf::MultiAddressEvmSolana; -use sov_celestia_adapter::CelestiaService; use sov_db::config::{ RocksDbKind, RocksdbCfCustomization, RocksdbOptionsCustomization, RollupDbConfig, RollupDbConfigWithCustomizations, VersionedColumnFamilyKind, }; -use sov_demo_rollup::{ - celestia_risc0_host_args, mock_da_risc0_host_args, CelestiaDemoRollup, ExternalMockDemoRollup, - MockDemoRollup, -}; -use sov_mock_da::storable::rpc::StorableMockDaClient; -use sov_mock_da::storable::StorableMockDaService; +use sov_demo_rollup::zk::{self, InnerZkvm}; use sov_modules_api::capabilities::RollupHeight; use sov_modules_api::execution_mode::Native; use sov_modules_rollup_blueprint::logging::initialize_logging; use sov_modules_rollup_blueprint::{FullNodeBlueprint, Rollup}; -use sov_risc0_adapter::Risc0; use sov_stf_runner::processes::{RollupProverConfig, RollupProverConfigDiscriminants}; use sov_stf_runner::{from_toml_path, RollupConfig}; use tracing::debug; +#[cfg(not(any(feature = "mock_da", feature = "celestia_da")))] +compile_error!("At least one DA feature must be enabled: mock_da or celestia_da"); + /// Main demo runner. Initializes a DA chain, and starts a demo-rollup using the provided. /// If you're trying to sign or submit transactions to the rollup, the `sov-cli` binary /// is the one you want. You can run it `cargo run --bin sov-cli`. #[derive(Parser, Debug)] #[command(author, version, about, long_about = None)] struct Args { - /// The data layer type. - #[arg(long, default_value = "mock")] - da_layer: SupportedDaLayer, - /// The path to the rollup config. - #[arg(long, default_value = "configs/mock_rollup_config.toml")] + #[cfg_attr( + feature = "mock_da", + arg(long, default_value = "configs/mock_rollup_config.toml") + )] + #[cfg_attr( + all(feature = "celestia_da", not(feature = "mock_da")), + arg(long, default_value = "configs/celestia_rollup_config.toml") + )] rollup_config_path: String, /// The path to the genesis configs. - #[arg(long, default_value = "../test-data/genesis/demo/mock")] + #[cfg_attr( + feature = "mock_da", + arg(long, default_value = "../test-data/genesis/demo/mock") + )] + #[cfg_attr( + all(feature = "celestia_da", not(feature = "mock_da")), + arg(long, default_value = "../test-data/genesis/demo/celestia") + )] genesis_config_dir: PathBuf, + /// Use external mock DA (RPC client) instead of in-process mock DA. + #[cfg(feature = "mock_da")] + #[arg(long, default_value_t = false)] + external: bool, + /// Stops the rollup at a given height. #[arg(long, default_value = None)] stop_at_rollup_height: Option, @@ -52,13 +63,6 @@ struct Args { start_at_rollup_height: Option, } -#[derive(clap::ValueEnum, Clone, Debug)] -enum SupportedDaLayer { - Celestia, - Mock, - ExternalMock, -} - #[tokio::main] async fn main() { // Keep for preventing a opentelemtry export shutdown @@ -93,24 +97,12 @@ async fn run() -> anyhow::Result<()> { let start_at_rollup_height = args.start_at_rollup_height.map(RollupHeight::new); let stop_at_rollup_height = args.stop_at_rollup_height.map(RollupHeight::new); - match args.da_layer { - SupportedDaLayer::Mock => { - let prover_config = prover_config_disc - .map(|config_disc| config_disc.into_config(mock_da_risc0_host_args())); - let rollup = new_rollup_with_mock_da( - &GenesisPaths::from_dir(&args.genesis_config_dir), - rollup_config_path, - prover_config, - start_at_rollup_height, - stop_at_rollup_height, - ) - .await - .context("Failed to initialize MockDa rollup")?; - rollup.run().await - } - SupportedDaLayer::ExternalMock => { - let prover_config = prover_config_disc - .map(|config_disc| config_disc.into_config(mock_da_risc0_host_args())); + #[cfg(feature = "mock_da")] + { + let prover_config = + prover_config_disc.map(|config_disc| config_disc.into_config(zk::mock_da_host_args())); + + if args.external { let rollup = new_rollup_with_external_mock_da( &GenesisPaths::from_dir(&args.genesis_config_dir), rollup_config_path, @@ -121,11 +113,8 @@ async fn run() -> anyhow::Result<()> { .await .context("Failed to initialize ExternalMockDa rollup")?; rollup.run().await - } - SupportedDaLayer::Celestia => { - let prover_config = prover_config_disc - .map(|config_disc| config_disc.into_config(celestia_risc0_host_args())); - let rollup = new_rollup_with_celestia_da( + } else { + let rollup = new_rollup_with_mock_da( &GenesisPaths::from_dir(&args.genesis_config_dir), rollup_config_path, prover_config, @@ -133,10 +122,26 @@ async fn run() -> anyhow::Result<()> { stop_at_rollup_height, ) .await - .context("Failed to initialize Celestia rollup")?; + .context("Failed to initialize MockDa rollup")?; rollup.run().await } } + + #[cfg(all(feature = "celestia_da", not(feature = "mock_da")))] + { + let prover_config = + prover_config_disc.map(|config_disc| config_disc.into_config(zk::celestia_host_args())); + let rollup = new_rollup_with_celestia_da( + &GenesisPaths::from_dir(&args.genesis_config_dir), + rollup_config_path, + prover_config, + start_at_rollup_height, + stop_at_rollup_height, + ) + .await + .context("Failed to initialize Celestia rollup")?; + rollup.run().await + } } fn parse_prover_config() -> anyhow::Result> { @@ -207,22 +212,28 @@ fn example_tune_live_nomt_table_for_small_writes( )) } -async fn new_rollup_with_celestia_da( +#[cfg(feature = "mock_da")] +async fn new_rollup_with_mock_da( rt_genesis_paths: &GenesisPaths, rollup_config_path: &str, - prover_config: Option>, + prover_config: Option>, start_at_rollup_height: Option, stop_at_rollup_height: Option, -) -> anyhow::Result, Native>> { - debug!(config_path = rollup_config_path, "Starting Celestia rollup"); +) -> anyhow::Result, Native>> { + debug!( + config_path = rollup_config_path, + "Starting rollup on mock DA" + ); - let rollup_config: RollupConfig = - from_toml_path(rollup_config_path).with_context(|| { - format!("Failed to read rollup configuration from {rollup_config_path}") - })?; + let rollup_config: RollupConfig< + MultiAddressEvmSolana, + sov_mock_da::storable::StorableMockDaService, + > = from_toml_path(rollup_config_path).with_context(|| { + format!("Failed to read rollup configuration from {rollup_config_path}") + })?; - let celestia_rollup = CelestiaDemoRollup::::default(); - celestia_rollup + let mock_rollup = sov_demo_rollup::MockDemoRollup::::default(); + mock_rollup .create_new_rollup( rt_genesis_paths, rollup_config, @@ -234,24 +245,27 @@ async fn new_rollup_with_celestia_da( .await } -async fn new_rollup_with_mock_da( +#[cfg(feature = "mock_da")] +async fn new_rollup_with_external_mock_da( rt_genesis_paths: &GenesisPaths, rollup_config_path: &str, - prover_config: Option>, + prover_config: Option>, start_at_rollup_height: Option, stop_at_rollup_height: Option, -) -> anyhow::Result, Native>> { +) -> anyhow::Result, Native>> { debug!( config_path = rollup_config_path, - "Starting rollup on mock DA" + "Starting rollup on external-mock DA" ); - let rollup_config: RollupConfig = - from_toml_path(rollup_config_path).with_context(|| { - format!("Failed to read rollup configuration from {rollup_config_path}") - })?; + let rollup_config: RollupConfig< + MultiAddressEvmSolana, + sov_mock_da::storable::rpc::StorableMockDaClient, + > = from_toml_path(rollup_config_path).with_context(|| { + format!("Failed to read rollup configuration from {rollup_config_path}") + })?; - let mock_rollup = MockDemoRollup::::default(); + let mock_rollup = sov_demo_rollup::ExternalMockDemoRollup::::default(); mock_rollup .create_new_rollup( rt_genesis_paths, @@ -264,25 +278,23 @@ async fn new_rollup_with_mock_da( .await } -async fn new_rollup_with_external_mock_da( +#[cfg(all(feature = "celestia_da", not(feature = "mock_da")))] +async fn new_rollup_with_celestia_da( rt_genesis_paths: &GenesisPaths, rollup_config_path: &str, - prover_config: Option>, + prover_config: Option>, start_at_rollup_height: Option, stop_at_rollup_height: Option, -) -> anyhow::Result, Native>> { - debug!( - config_path = rollup_config_path, - "Starting rollup on external-mock DA" - ); +) -> anyhow::Result, Native>> { + debug!(config_path = rollup_config_path, "Starting Celestia rollup"); - let rollup_config: RollupConfig = + let rollup_config: RollupConfig = from_toml_path(rollup_config_path).with_context(|| { format!("Failed to read rollup configuration from {rollup_config_path}") })?; - let mock_rollup = ExternalMockDemoRollup::::default(); - mock_rollup + let celestia_rollup = sov_demo_rollup::CelestiaDemoRollup::::default(); + celestia_rollup .create_new_rollup( rt_genesis_paths, rollup_config, diff --git a/examples/demo-rollup/src/mock_rollup.rs b/examples/demo-rollup/src/mock_rollup.rs index af6998e894..f3fb102d33 100644 --- a/examples/demo-rollup/src/mock_rollup.rs +++ b/examples/demo-rollup/src/mock_rollup.rs @@ -9,16 +9,16 @@ use sov_db::storage_manager::NomtStorageManager; use sov_ethereum::EthRpcConfig; use sov_mock_da::storable::StorableMockDaService; use sov_mock_da::MockDaSpec; -use sov_mock_zkvm::{MockCodeCommitment, MockZkvm, MockZkvmHost}; +use sov_mock_zkvm::MockCodeCommitment; use sov_modules_api::configurable_spec::ConfigurableSpec; use sov_modules_api::execution_mode::{Native, WitnessGeneration}; use sov_modules_api::rest::StateUpdateReceiver; use sov_modules_api::{CryptoSpec, NodeEndpoints, Spec, SyncStatus, ZkVerifier}; use sov_modules_rollup_blueprint::pluggable_traits::PluggableSpec; use sov_modules_rollup_blueprint::proof_sender::SovApiProofSender; -use sov_modules_rollup_blueprint::{FullNodeBlueprint, RollupBlueprint, SequencerCreationReceipt}; -use sov_risc0_adapter::host::Risc0Host; -use sov_risc0_adapter::{Risc0, Risc0CryptoSpec}; +use sov_modules_rollup_blueprint::{ + FullNodeBlueprint, RollupBlueprint, SequencerCreationReceipt, WalletBlueprint, +}; use sov_rollup_interface::da::DaSpec; use sov_sequencer::{ProofBlobSender, Sequencer}; use sov_state::nomt::prover_storage::NomtProverStorage; @@ -28,25 +28,26 @@ use sov_stf_runner::RollupConfig; use crate::eth_dev_signer; use crate::solana_offchain_endpoint::solana_offchain_router; +use crate::zk::{self, InnerCryptoSpec, InnerZkvm, OuterZkvm, OuterZkvmHost}; -/// Rollup with a [`ConfigurableSpec`] with [`MockDaSpec`] as Da spec, [`Risc0`] inner vm and [`MockZkvm`] for outer vm +/// Rollup with a [`ConfigurableSpec`] with [`MockDaSpec`] as Da spec #[derive(Default, Clone, Copy)] pub struct MockDemoRollup { phantom: std::marker::PhantomData, } -type Hasher = ::Hasher; +type Hasher = ::Hasher; type NativeStorage = NomtProverStorage, ::SlotHash>; /// The default spec of the rollup pub type MockRollupSpec = ConfigurableSpec< MockDaSpec, - Risc0, - MockZkvm, + InnerZkvm, + OuterZkvm, MultiAddressEvmSolana, M, - Risc0CryptoSpec, + InnerCryptoSpec, NativeStorage, >; @@ -151,21 +152,19 @@ impl FullNodeBlueprint for MockDemoRollup { async fn create_prover_service( &self, - prover_config: RollupProverConfig, + prover_config: RollupProverConfig, rollup_config: &RollupConfig<::Address, Self::DaService>, _da_service: &Self::DaService, ) -> Self::ProverService { - let (host_args, prover_config_discriminant) = prover_config.split(); - let inner_vm = Risc0Host::new(*host_args); - - let outer_vm = MockZkvmHost::new_non_blocking(); + let (inner_vm, prover_config_disc) = zk::create_inner_vm(prover_config); + let outer_vm = OuterZkvmHost::new_non_blocking(); let da_verifier = Default::default(); ParallelProverService::new_with_default_workers( inner_vm, outer_vm, da_verifier, - prover_config_discriminant, + prover_config_disc, rollup_config.proof_manager.prover_address, ) } @@ -186,3 +185,5 @@ impl FullNodeBlueprint for MockDemoRollup { Ok(Self::ProofSender::new(sequence_number_provider)) } } + +impl WalletBlueprint for MockDemoRollup {} diff --git a/examples/demo-rollup/src/sov-cli/main.rs b/examples/demo-rollup/src/sov-cli/main.rs index a98ce1ae6e..9e57dd7dba 100644 --- a/examples/demo-rollup/src/sov-cli/main.rs +++ b/examples/demo-rollup/src/sov-cli/main.rs @@ -1,11 +1,17 @@ use demo_stf::runtime::RuntimeSubcommand; -use sov_demo_rollup::CelestiaDemoRollup; use sov_modules_api::cli::{FileNameArg, JsonStringArg}; use sov_modules_rollup_blueprint::WalletBlueprint; +// DA priority: mock_da > celestia_da (same fallback as the rest of the crate) +#[cfg(feature = "mock_da")] +use sov_demo_rollup::MockDemoRollup as DemoRollup; + +#[cfg(all(feature = "celestia_da", not(feature = "mock_da")))] +use sov_demo_rollup::CelestiaDemoRollup as DemoRollup; + #[tokio::main] async fn main() -> anyhow::Result<()> { - CelestiaDemoRollup::run_wallet::< + DemoRollup::run_wallet::< RuntimeSubcommand, RuntimeSubcommand, >() diff --git a/examples/demo-rollup/src/zk.rs b/examples/demo-rollup/src/zk.rs index 604db02a9e..33f09a6e44 100644 --- a/examples/demo-rollup/src/zk.rs +++ b/examples/demo-rollup/src/zk.rs @@ -1,33 +1,153 @@ -//! Small utilities for zk tooling +//! Feature-gated inner ZKVM selection. +//! +//! ZKVM priority: `mock_zkvm` > `risc0` > `sp1`. +//! When multiple ZKVM features are enabled (e.g. `--all-features`), `mock_zkvm` wins. -use std::sync::Arc; +// Outer VM is always MockZkvm regardless of inner VM selection +pub use sov_mock_zkvm::MockCodeCommitment; +pub use sov_mock_zkvm::MockZkvm as OuterZkvm; +pub use sov_mock_zkvm::MockZkvmHost as OuterZkvmHost; -/// Returns the risc0 host arguments for a rollup with mock da. This is the code that is zk-proven by the rollup -pub fn mock_da_risc0_host_args() -> Arc<&'static [u8]> { - // Don't try to read the elf file if we're not building the risc0 guest! - if should_skip_guest_build() { - return Arc::new(vec![].leak()); +// --------------------------------------------------------------------------- +// Inner ZKVM: mock (highest priority, and ultimate fallback if nothing is set) +// --------------------------------------------------------------------------- +#[cfg(any( + feature = "mock_zkvm", + all(not(feature = "risc0"), not(feature = "sp1")) +))] +mod inner { + use std::sync::Arc; + + use sov_mock_zkvm::{MockZkvm, MockZkvmCryptoSpec, MockZkvmHost}; + use sov_rollup_interface::zk::CryptoSpec; + + #[allow(missing_docs)] + pub type InnerZkvm = MockZkvm; + #[allow(missing_docs)] + pub type InnerCryptoSpec = MockZkvmCryptoSpec; + #[allow(missing_docs)] + pub type Hasher = ::Hasher; + + /// Returns host arguments for the mock inner ZKVM (unit type). + pub fn mock_da_host_args() -> Arc<()> { + Arc::new(()) + } + + /// Returns host arguments for celestia DA with mock inner ZKVM (unit type). + #[cfg(feature = "celestia_da")] + pub fn celestia_host_args() -> Arc<()> { + Arc::new(()) } - Arc::new(risc0::MOCK_DA_ELF) + /// Creates the inner VM from a prover config, returning the VM and the config discriminant. + pub fn create_inner_vm( + prover_config: sov_stf_runner::processes::RollupProverConfig, + ) -> ( + MockZkvmHost, + sov_stf_runner::processes::RollupProverConfigDiscriminants, + ) { + let (_, disc) = prover_config.split(); + (MockZkvmHost::new_non_blocking(), disc) + } } -/// Returns the risc0 host arguments for a rollup with celestia da. This is the code that is zk-proven by the rollup -pub fn celestia_risc0_host_args() -> Arc<&'static [u8]> { - // Don't try to read the elf file if we're not building the risc0 guest! - if should_skip_guest_build() { - return Arc::new(vec![].leak()); +// --------------------------------------------------------------------------- +// Inner ZKVM: risc0 (only when mock_zkvm is NOT enabled) +// --------------------------------------------------------------------------- +#[cfg(all(feature = "risc0", not(feature = "mock_zkvm")))] +mod inner { + use std::sync::Arc; + + use sov_risc0_adapter::host::Risc0Host; + use sov_risc0_adapter::{Risc0, Risc0CryptoSpec}; + use sov_rollup_interface::zk::CryptoSpec; + + #[allow(missing_docs)] + pub type InnerZkvm = Risc0; + #[allow(missing_docs)] + pub type InnerCryptoSpec = Risc0CryptoSpec; + #[allow(missing_docs)] + pub type Hasher = ::Hasher; + + /// Returns the risc0 host arguments for a rollup with mock DA. + #[cfg(feature = "mock_da")] + pub fn mock_da_host_args() -> Arc<&'static [u8]> { + if sov_zkvm_utils::should_skip_guest_build("risc0") { + return Arc::new(&[]); + } + Arc::new(risc0_prover::MOCK_DA_ELF) + } + + /// Returns the risc0 host arguments for a rollup with celestia DA. + #[cfg(feature = "celestia_da")] + pub fn celestia_host_args() -> Arc<&'static [u8]> { + if sov_zkvm_utils::should_skip_guest_build("risc0") { + return Arc::new(&[]); + } + Arc::new(risc0_prover::ROLLUP_ELF) } - Arc::new(risc0::ROLLUP_ELF) + /// Creates the inner VM from a prover config, returning the VM and the config discriminant. + pub fn create_inner_vm( + prover_config: sov_stf_runner::processes::RollupProverConfig, + ) -> ( + Risc0Host<'static>, + sov_stf_runner::processes::RollupProverConfigDiscriminants, + ) { + let (host_args, disc) = prover_config.split(); + (Risc0Host::new(*host_args), disc) + } } -fn should_skip_guest_build() -> bool { - match std::env::var("SKIP_GUEST_BUILD") - .as_ref() - .map(|arg0: &String| String::as_str(arg0)) - { - Ok("1") | Ok("true") | Ok("risc0") => true, - Ok("0") | Ok("false") | Ok(_) | Err(_) => false, +// --------------------------------------------------------------------------- +// Inner ZKVM: sp1 (only when mock_zkvm and risc0 are NOT enabled) +// --------------------------------------------------------------------------- +#[cfg(all(feature = "sp1", not(feature = "mock_zkvm"), not(feature = "risc0")))] +mod inner { + use std::sync::Arc; + + use sov_rollup_interface::zk::CryptoSpec; + use sov_sp1_adapter::host::SP1Host; + use sov_sp1_adapter::{SP1CryptoSpec, SP1}; + + #[allow(missing_docs)] + pub type InnerZkvm = SP1; + #[allow(missing_docs)] + pub type InnerCryptoSpec = SP1CryptoSpec; + #[allow(missing_docs)] + pub type Hasher = ::Hasher; + + /// Returns the sp1 host arguments for a rollup with mock DA. + #[cfg(feature = "mock_da")] + pub fn mock_da_host_args() -> Arc<&'static [u8]> { + if sov_zkvm_utils::should_skip_guest_build("sp1") { + return Arc::new(&[]); + } + Arc::new(&sp1_prover::SP1_GUEST_MOCK_ELF) + } + + /// Returns the sp1 host arguments for a rollup with celestia DA. + #[cfg(feature = "celestia_da")] + pub fn celestia_host_args() -> Arc<&'static [u8]> { + if sov_zkvm_utils::should_skip_guest_build("sp1") { + return Arc::new(&[]); + } + Arc::new(&sp1_prover::SP1_GUEST_CELESTIA_ELF) + } + + /// Creates the inner VM from a prover config, returning the VM and the config discriminant. + pub fn create_inner_vm( + prover_config: sov_stf_runner::processes::RollupProverConfig, + ) -> ( + SP1Host, + sov_stf_runner::processes::RollupProverConfigDiscriminants, + ) { + let (host_args, disc) = prover_config.split(); + let host = SP1Host::new(*host_args).expect("SP1Host should be created successfully"); + (host, disc) } } + +// Re-export the active inner ZKVM module. +// Falls back to mock_zkvm if no ZKVM feature is explicitly set (see `mod inner` above). +pub use inner::*; diff --git a/examples/demo-rollup/stf/Cargo.toml b/examples/demo-rollup/stf/Cargo.toml index 066878ad86..fc92c816f8 100644 --- a/examples/demo-rollup/stf/Cargo.toml +++ b/examples/demo-rollup/stf/Cargo.toml @@ -59,51 +59,51 @@ sov-build = { workspace = true } [features] default = [] arbitrary = [ - "demo-stf-declaration/arbitrary", - "sov-accounts/arbitrary", - "sov-address/arbitrary", - "sov-bank/arbitrary", - "sov-evm/arbitrary", - "sov-modules-api/arbitrary", - "sov-paymaster/arbitrary", - "sov-rollup-interface/arbitrary", - "sov-sequencer-registry/arbitrary", - "sov-state/arbitrary", - "sov-test-utils?/arbitrary", - "sov-uniqueness/arbitrary", - "sov-mock-da/arbitrary", - "sov-mock-zkvm/arbitrary", - "sov-hyperlane-integration/arbitrary" + "demo-stf-declaration/arbitrary", + "sov-accounts/arbitrary", + "sov-address/arbitrary", + "sov-bank/arbitrary", + "sov-evm/arbitrary", + "sov-modules-api/arbitrary", + "sov-paymaster/arbitrary", + "sov-rollup-interface/arbitrary", + "sov-sequencer-registry/arbitrary", + "sov-state/arbitrary", + "sov-test-utils?/arbitrary", + "sov-uniqueness/arbitrary", + "sov-mock-da/arbitrary", + "sov-mock-zkvm/arbitrary", + "sov-hyperlane-integration/arbitrary" ] native = [ - "demo-stf-declaration/native", - "sov-accounts/native", - "sov-attester-incentives/native", - "sov-bank/native", - "sov-capabilities/native", - "sov-chain-state/native", - "sov-evm/native", - "sov-hyperlane-integration/native", - "sov-revenue-share/native", - "sov-kernels/native", - "sov-modules-api/native", - "sov-modules-stf-blueprint/native", - "sov-uniqueness/native", - "sov-operator-incentives/native", - "sov-prover-incentives/native", - "sov-rollup-interface/native", - "sov-sequencer-registry/native", - "sov-state/native", - "sov-synthetic-load/native", - "sov-blob-storage/native", - "sov-rollup-apis", - "serde_json", - "sov-paymaster/native", - "sov-address/native", - "sov-test-modules/native", - "sov-solana-offchain-auth/native", - "sov-mock-da/native", - "sov-mock-zkvm/native" + "demo-stf-declaration/native", + "sov-accounts/native", + "sov-attester-incentives/native", + "sov-bank/native", + "sov-capabilities/native", + "sov-chain-state/native", + "sov-evm/native", + "sov-hyperlane-integration/native", + "sov-revenue-share/native", + "sov-kernels/native", + "sov-modules-api/native", + "sov-modules-stf-blueprint/native", + "sov-uniqueness/native", + "sov-operator-incentives/native", + "sov-prover-incentives/native", + "sov-rollup-interface/native", + "sov-sequencer-registry/native", + "sov-state/native", + "sov-synthetic-load/native", + "sov-blob-storage/native", + "sov-rollup-apis", + "serde_json", + "sov-paymaster/native", + "sov-address/native", + "sov-test-modules/native", + "sov-solana-offchain-auth/native", + "sov-mock-da/native", + "sov-mock-zkvm/native" ] # We only activate test-utils if we also have native since all our test-code use native by default. diff --git a/examples/demo-rollup/tests/all_tests.rs b/examples/demo-rollup/tests/all_tests.rs index 0f4dafa4b7..e583c6182a 100644 --- a/examples/demo-rollup/tests/all_tests.rs +++ b/examples/demo-rollup/tests/all_tests.rs @@ -1,7 +1,7 @@ mod bank; mod evm; mod forced_sequencer_registration; -mod prover; +// prover tests moved to separate [[test]] binary (prover_tests.rs, requires "sp1" feature) mod replica; mod rest_api; mod restart; diff --git a/examples/demo-rollup/tests/bank/helpers.rs b/examples/demo-rollup/tests/bank/helpers.rs index bae93891dd..b4ae2a5f42 100644 --- a/examples/demo-rollup/tests/bank/helpers.rs +++ b/examples/demo-rollup/tests/bank/helpers.rs @@ -5,7 +5,7 @@ use futures::StreamExt; use sov_bank::event::Event as BankEvent; use sov_bank::TokenId; use sov_cli::NodeClient; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup}; +use sov_demo_rollup::{mock_da_host_args, MockDemoRollup}; use sov_full_node_configs::sequencer::{RecoveryStrategy, SequencerKindConfig}; use sov_mock_zkvm::{MockCodeCommitment, MockZkVerifier}; use sov_modules_api::transaction::Transaction; @@ -283,7 +283,7 @@ pub async fn start_test_rollup( TEST_DEFAULT_MOCK_DA_PERIODIC_PRODUCING, test_case.finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 16777216; c.rollup_prover_config = prover_config; diff --git a/examples/demo-rollup/tests/bank/op_rollup/bank_tests.rs b/examples/demo-rollup/tests/bank/op_rollup/bank_tests.rs index 0e740db3eb..406976a3c1 100644 --- a/examples/demo-rollup/tests/bank/op_rollup/bank_tests.rs +++ b/examples/demo-rollup/tests/bank/op_rollup/bank_tests.rs @@ -10,7 +10,7 @@ use futures::StreamExt; use serde::Deserialize; use sov_api_spec::types::AcceptTxBody; use sov_cli::NodeClient; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup}; +use sov_demo_rollup::{mock_da_host_args, MockDemoRollup}; use sov_full_node_configs::sequencer::{RecoveryStrategy, SequencerKindConfig}; use sov_mock_da::storable::StorableMockDaService; use sov_modules_api::default_spec::DefaultSpec; diff --git a/examples/demo-rollup/tests/evm/evm_test_helper.rs b/examples/demo-rollup/tests/evm/evm_test_helper.rs index e1914b6876..1177152c9c 100644 --- a/examples/demo-rollup/tests/evm/evm_test_helper.rs +++ b/examples/demo-rollup/tests/evm/evm_test_helper.rs @@ -15,13 +15,12 @@ use jsonrpsee::core::client::ClientT; use jsonrpsee::rpc_params; use reqwest::Url; use serde::Serialize; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup, MockRollupSpec}; +use sov_demo_rollup::{mock_da_host_args, InnerZkvm, MockDemoRollup, MockRollupSpec}; use sov_eth_client::SimpleStorageClient; use sov_evm_test_utils::LegacySimpleStorage; use sov_mock_da::BlockProducingConfig; use sov_modules_api::execution_mode::Native; use sov_modules_api::Spec; -use sov_risc0_adapter::Risc0; use sov_sequencer::{SeqConfigExtension, SovRateLimiterConfig}; use sov_stf_runner::processes::RollupProverConfig; use sov_test_utils::test_rollup::{ @@ -40,7 +39,7 @@ pub(crate) const EVM_EXTENSION: SeqConfigExtension = SeqConfigExtension { pub(crate) const MAX_FEE_PER_GAS: u128 = 1_000_000_000; async fn start_node( - _rollup_prover_config: RollupProverConfig, + _rollup_prover_config: RollupProverConfig, finalization_blocks: u32, extension: Option, rate_limiter: Option as Spec>::Address>>, @@ -53,7 +52,7 @@ async fn start_node( }, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .with_rate_limiter(rate_limiter) .set_config(|c| { c.max_concurrent_blobs = 65536; @@ -120,7 +119,7 @@ pub async fn setup_test_rollup( finalization_blocks: u32, extension: SeqConfigExtension, ) -> TestRollup> { - let host_args = mock_da_risc0_host_args(); + let host_args = mock_da_host_args(); let config = get_appropriate_rollup_prover_config::>(host_args); start_node(config, finalization_blocks, Some(extension), None, 3).await } @@ -141,7 +140,7 @@ pub async fn setup_test_rollup_with_paymaster( }, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.rollup_prover_config = None; @@ -173,7 +172,7 @@ pub async fn setup_test_rollup_with_selective_paymaster( }, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.rollup_prover_config = None; diff --git a/examples/demo-rollup/tests/forced_sequencer_registration/mod.rs b/examples/demo-rollup/tests/forced_sequencer_registration/mod.rs index 32b5b58d10..a37d4f8839 100644 --- a/examples/demo-rollup/tests/forced_sequencer_registration/mod.rs +++ b/examples/demo-rollup/tests/forced_sequencer_registration/mod.rs @@ -19,11 +19,12 @@ use secp256k1::SecretKey; use sov_api_spec::types as api_types; use sov_bank::config_gas_token_id; use sov_cli::NodeClient; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup}; +use sov_demo_rollup::{mock_da_host_args, MockDemoRollup}; use sov_eth_dev_signer::Signer; use sov_evm::{EthereumAuthenticator, RlpEvmTransaction}; use sov_evm_test_utils::LegacySimpleStorage; use sov_mock_da::{BlockProducingConfig, MockAddress, MockDaSpec}; +use sov_mock_zkvm::crypto::private_key::Ed25519PrivateKey; use sov_modules_api::capabilities::TransactionAuthenticator; use sov_modules_api::capabilities::UniquenessData; use sov_modules_api::execution_mode::Native; @@ -32,7 +33,6 @@ use sov_modules_api::PrivateKey; use sov_modules_api::PublicKey as _; use sov_modules_api::{Amount, CryptoSpec, OperatingMode, RawTx, Runtime as RuntimeT, Spec}; use sov_modules_macros::config_value; -use sov_risc0_adapter::crypto::private_key::Risc0PrivateKey; use sov_rollup_interface::node::da::DaService; use sov_sequencer::ForcedTxBatchNotification; use sov_synthetic_load::CallMessage as SyntheticLoadCall; @@ -353,7 +353,7 @@ async fn setup_with_block_producing( block_producing, FINALIZATION_BLOCKS, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.automatic_batch_production = true; @@ -684,11 +684,13 @@ async fn forced_txs_resync_test_case( // - funded_key: has gas tokens, so its txs will succeed // - unfunded_key: no gas tokens, so its txs will fail (tests error handling) // - post_resync_recipient: separate recipient so post-resync txs don't affect main balance checks - let funded_key = Risc0PrivateKey::generate(); + let funded_key = Ed25519PrivateKey::generate(); let funded_address = funded_key.pub_key().credential_id().into(); - let unfunded_key = Risc0PrivateKey::generate(); - let post_resync_recipient: ::Address = - Risc0PrivateKey::generate().pub_key().credential_id().into(); + let unfunded_key = Ed25519PrivateKey::generate(); + let post_resync_recipient: ::Address = Ed25519PrivateKey::generate() + .pub_key() + .credential_id() + .into(); let preferred_transfer = 50u128; let forced_transfer = 5u128; diff --git a/examples/demo-rollup/tests/prover/network.rs b/examples/demo-rollup/tests/prover/network.rs index f744e0e546..56801224d9 100644 --- a/examples/demo-rollup/tests/prover/network.rs +++ b/examples/demo-rollup/tests/prover/network.rs @@ -36,7 +36,7 @@ type TestNetworkProverService = NetworkProverService< async fn test_network_proof_generation() { tracing_subscriber::fmt::init(); - let elf: &[u8] = *sp1::SP1_GUEST_MOCK_ELF; + let elf: &[u8] = *sp1_prover::SP1_GUEST_MOCK_ELF; assert!( !elf.is_empty(), "SP1 guest ELF is empty — build the guest first" diff --git a/examples/demo-rollup/tests/prover/parallel.rs b/examples/demo-rollup/tests/prover/parallel.rs index ad3e2aeff0..833945afdc 100644 --- a/examples/demo-rollup/tests/prover/parallel.rs +++ b/examples/demo-rollup/tests/prover/parallel.rs @@ -34,7 +34,7 @@ type TestParallelProverService = ParallelProverService< async fn test_parallel_proof_generation() { tracing_subscriber::fmt::init(); - let elf: &[u8] = *sp1::SP1_GUEST_MOCK_ELF; + let elf: &[u8] = *sp1_prover::SP1_GUEST_MOCK_ELF; assert!( !elf.is_empty(), "SP1 guest ELF is empty — build the guest first" @@ -54,7 +54,7 @@ async fn test_parallel_proof_generation() { .await .unwrap(); - let agg_elf: &[u8] = *sp1::SP1_GUEST_AGGREGATION_MOCK_ELF; + let agg_elf: &[u8] = *sp1_prover::SP1_GUEST_AGGREGATION_MOCK_ELF; let outer_vm = tokio::task::spawn_blocking(move || { SP1AggregationHost::new(agg_elf, code_commitment).unwrap() diff --git a/examples/demo-rollup/tests/prover/sp1_cpu_prover.rs b/examples/demo-rollup/tests/prover/sp1_cpu_prover.rs index 73621b36b5..c6cff45626 100644 --- a/examples/demo-rollup/tests/prover/sp1_cpu_prover.rs +++ b/examples/demo-rollup/tests/prover/sp1_cpu_prover.rs @@ -84,10 +84,10 @@ struct TestHost { impl TestHost { async fn new(with_proof: bool) -> (Self, SP1MethodId) { let (code_commitment, host, mock_host) = tokio::task::spawn_blocking(move || { - let host = SP1Host::new(*sp1::SP1_GUEST_MOCK_ELF) + let host = SP1Host::new(*sp1_prover::SP1_GUEST_MOCK_ELF) .expect("SP1Host should be created successfully"); - let mock_host = MockSp1Prover::new(*sp1::SP1_GUEST_MOCK_ELF) + let mock_host = MockSp1Prover::new(*sp1_prover::SP1_GUEST_MOCK_ELF) .expect("MockSp1Prover should be created successfully"); ( diff --git a/examples/demo-rollup/tests/prover_tests.rs b/examples/demo-rollup/tests/prover_tests.rs new file mode 100644 index 0000000000..f5b9c86859 --- /dev/null +++ b/examples/demo-rollup/tests/prover_tests.rs @@ -0,0 +1,3 @@ +mod prover; +#[allow(dead_code)] +mod test_helpers; diff --git a/examples/demo-rollup/tests/rest_api/mod.rs b/examples/demo-rollup/tests/rest_api/mod.rs index ee7e3e1e76..c1d74d00a8 100644 --- a/examples/demo-rollup/tests/rest_api/mod.rs +++ b/examples/demo-rollup/tests/rest_api/mod.rs @@ -9,7 +9,7 @@ use futures::StreamExt; use serde::Deserialize; use sov_bank::config_gas_token_id; use sov_cli::wallet_state::PrivateKeyAndAddress; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup}; +use sov_demo_rollup::{mock_da_host_args, MockDemoRollup}; use sov_modules_api::execution_mode::Native; use sov_modules_api::OperatingMode; use sov_test_utils::test_rollup::{read_private_key, RollupBuilder}; @@ -34,7 +34,7 @@ async fn trailing_slashes_handled() -> anyhow::Result<()> { TEST_DEFAULT_MOCK_DA_ON_SUBMIT, 0, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .with_standard_sequencer() .start() .await?; @@ -71,7 +71,7 @@ async fn setup() -> anyhow::Result { TEST_DEFAULT_MOCK_DA_PERIODIC_PRODUCING, 0, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .start() .await?; diff --git a/examples/demo-rollup/tests/restart/crash.rs b/examples/demo-rollup/tests/restart/crash.rs index 2f7d78508a..2c60369701 100644 --- a/examples/demo-rollup/tests/restart/crash.rs +++ b/examples/demo-rollup/tests/restart/crash.rs @@ -8,7 +8,7 @@ use sov_cli::wallet_state::PrivateKeyAndAddress; use sov_cli::NodeClient; use sov_db::test_utils::CommitFaultInjectionLocation; use sov_db::test_utils::CRASH_ON_COMMIT_ENV_NAME; -use sov_demo_rollup::mock_da_risc0_host_args; +use sov_demo_rollup::mock_da_host_args; use sov_demo_rollup::MockDemoRollup; use sov_demo_rollup::MockRollupSpec; use sov_mock_da::storable::layer::StorableMockDaLayer; @@ -38,7 +38,7 @@ async fn start_node( BlockProducingConfig::Manual, 0, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_da_config(|da_config: &mut MockDaConfig| { da_config.da_layer = Some(da_layer); }) diff --git a/examples/demo-rollup/tests/restart/graceful.rs b/examples/demo-rollup/tests/restart/graceful.rs index 2d9b311945..956e71b13e 100644 --- a/examples/demo-rollup/tests/restart/graceful.rs +++ b/examples/demo-rollup/tests/restart/graceful.rs @@ -14,13 +14,13 @@ use rand::rngs::StdRng; use rand::seq::SliceRandom; use rand::{Rng, SeedableRng}; use sov_bank::config_gas_token_id; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup}; +use sov_demo_rollup::InnerZkvm; +use sov_demo_rollup::{mock_da_host_args, MockDemoRollup}; use sov_mock_da::storable::layer::StorableMockDaLayer; use sov_mock_da::{BlockProducingConfig, MockDaConfig}; use sov_modules_api::execution_mode::Native; use sov_modules_api::{CryptoSpec, OperatingMode, PrivateKey, PublicKey, Spec}; use sov_modules_rollup_blueprint::logging::default_rust_log_value; -use sov_risc0_adapter::Risc0; use sov_rollup_interface::da::BlockHeaderTrait; use sov_sequencer::SequencerKindConfig; use sov_stf_runner::processes::RollupProverConfig; @@ -194,7 +194,7 @@ fn initialize_logging_for_restart(collector: LogCollector, with_stdout: bool) { async fn start_stop_empty( operation_mode: OperatingMode, finalization_blocks: u32, - rollup_prover_config: RollupProverConfig, + rollup_prover_config: RollupProverConfig, seed: u64, collector: &LogCollector, ) -> anyhow::Result<()> { @@ -222,7 +222,7 @@ async fn start_stop_empty( TEST_DEFAULT_MOCK_DA_PERIODIC_PRODUCING, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.storage = StoragePath::Tmp(rollup_storage_dir.clone()); @@ -325,7 +325,7 @@ async fn flaky_test_start_stop_optimistic_non_instant_finality() -> anyhow::Resu async fn start_stop_under_load( operation_mode: OperatingMode, finalization_blocks: u32, - rollup_prover_config: RollupProverConfig, + rollup_prover_config: RollupProverConfig, seed: u64, collector: &LogCollector, ) -> anyhow::Result<()> { @@ -362,7 +362,7 @@ async fn start_stop_under_load( TEST_DEFAULT_MOCK_DA_PERIODIC_PRODUCING, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.storage = StoragePath::Tmp(rollup_storage_dir.clone()); @@ -553,7 +553,7 @@ async fn test_start_prover_manual() -> anyhow::Result<()> { }, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.storage = StoragePath::Tmp(rollup_storage_dir.clone()); @@ -710,7 +710,7 @@ async fn check_with_increasing_stf_infos( BlockProducingConfig::Manual, finalization_blocks, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.max_concurrent_blobs = 65536; c.storage = StoragePath::Tmp(rollup_storage_dir.clone()); diff --git a/examples/demo-rollup/tests/resync/mod.rs b/examples/demo-rollup/tests/resync/mod.rs index 3294ef5a07..726c249ab5 100644 --- a/examples/demo-rollup/tests/resync/mod.rs +++ b/examples/demo-rollup/tests/resync/mod.rs @@ -12,12 +12,12 @@ use base64::Engine; use demo_stf::runtime::{Runtime as DemoRuntime, RuntimeCall}; use futures::StreamExt; use sov_api_spec::types::{SyncStatus, TxStatus}; -use sov_demo_rollup::{mock_da_risc0_host_args, MockDemoRollup}; +use sov_demo_rollup::{mock_da_host_args, MockDemoRollup}; use sov_full_node_configs::sequencer::SequencerKindConfig; +use sov_mock_zkvm::crypto::private_key::Ed25519PrivateKey; use sov_modules_api::execution_mode::Native; use sov_modules_api::{OperatingMode, RawTx, Runtime, TxHash}; use sov_modules_rollup_blueprint::logging::default_rust_log_value; -use sov_risc0_adapter::crypto::private_key::Risc0PrivateKey; use sov_test_utils::logging::LogCollector; use sov_test_utils::test_rollup::StoragePath; use sov_test_utils::test_rollup::{read_private_key, RollupBuilder, TestRollup}; @@ -64,7 +64,7 @@ const CHECK_TRANSACTION_VALUE: u64 = 13; const DA_SLOTS_TO_GENERATE: u64 = 100; const FINALIZATION_SLOTS: u32 = 5; -fn tx_set_value_for_check(key: Risc0PrivateKey, value: u64, generation: u64) -> RawTx { +fn tx_set_value_for_check(key: Ed25519PrivateKey, value: u64, generation: u64) -> RawTx { let msg: RuntimeCall = RuntimeCall::SyntheticLoad(sov_synthetic_load::CallMessage::ReadAndSetHeavyState { number_of_new_values: value, @@ -103,7 +103,7 @@ async fn start_rollup( StoragePath::Tmp(rollup_storage_path.clone()), false, ) - .with_zkvm_host_args(mock_da_risc0_host_args()) + .with_zkvm_host_args(mock_da_host_args()) .set_config(|c| { c.rollup_prover_config = None; c.aggregated_proof_block_jump = 10; diff --git a/examples/demo-rollup/tests/test_helpers.rs b/examples/demo-rollup/tests/test_helpers/mod.rs similarity index 93% rename from examples/demo-rollup/tests/test_helpers.rs rename to examples/demo-rollup/tests/test_helpers/mod.rs index 5c5d162b00..a48c17edb5 100644 --- a/examples/demo-rollup/tests/test_helpers.rs +++ b/examples/demo-rollup/tests/test_helpers/mod.rs @@ -8,20 +8,20 @@ use sov_address::EthereumAddress; use sov_address::FromVmAddress; use sov_bank::Coins; use sov_bank::TokenId; -use sov_demo_rollup::MockDemoRollup; use sov_hyperlane_integration::HyperlaneAddress; use sov_modules_api::capabilities::UniquenessData; -use sov_modules_api::execution_mode::Native; use sov_modules_api::transaction::Transaction; use sov_modules_api::Base58Address; use sov_modules_api::CryptoSpec; use sov_modules_api::OperatingMode; use sov_modules_api::Spec; -use sov_modules_rollup_blueprint::RollupBlueprint; use sov_test_utils::default_test_tx_details; use sov_test_utils::test_rollup::GenesisSource; use sov_test_utils::test_signed_transaction; -pub type DemoRollupSpec = as RollupBlueprint>::Spec; + +#[cfg(feature = "mock_da")] +pub type DemoRollupSpec = + as sov_modules_rollup_blueprint::RollupBlueprint>::Spec; pub fn test_genesis_source(operating_mode: OperatingMode) -> GenesisSource> where