Skip to content

Commit 90c8988

Browse files
feat(storage): replace alpen storage with local sled implementation (#59)
* feat(storage): replace alpen storage with local sled implementation Introduces crates/storage (strata-asm-storage) with two sled-backed backends that replace three alpen crates: - AsmStateDb: anchor state + aux data persistence (replaces strata-state + strata-storage's AsmStateManager) - MmrDb: manifest hash MMR with proof generation (replaces strata-db-store-sled's MmrIndexDb + strata-storage's MmrIndexManager) The asm-runner binary now has zero alpen dependencies. All storage is self-contained within the ASM repo. Removed from bin/asm-runner: - strata-state (alpen git dep) - strata-storage (alpen git dep) - strata-db-store-sled (alpen git dep) - threadpool (no longer needed without AsmStateManager's pool) * test(storage): add unit tests for AsmStateDb and MmrDb
1 parent 7b547c5 commit 90c8988

File tree

12 files changed

+516
-513
lines changed

12 files changed

+516
-513
lines changed

Cargo.lock

Lines changed: 18 additions & 383 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ members = [
3131
"crates/test-utils/btcio",
3232
"crates/test-utils/checkpoint",
3333
"crates/worker",
34+
"crates/storage",
3435

3536
# tests
3637
"tests",
@@ -77,6 +78,7 @@ strata-asm-txs-bridge-v1 = { path = "crates/txs/bridge-v1" }
7778
strata-asm-txs-checkpoint = { path = "crates/txs/checkpoint" }
7879
strata-asm-txs-test-utils = { path = "crates/txs/test-utils" }
7980
strata-asm-worker = { path = "crates/worker" }
81+
asm-storage = { path = "crates/storage" }
8082
strata-bridge-types = { path = "crates/bridge-types" }
8183
strata-btc-verification = { path = "crates/btc-verification" }
8284
strata-checkpoint-types-ssz = { path = "crates/checkpoint-types" }
@@ -191,5 +193,6 @@ strata-asm-txs-bridge-v1 = { path = "crates/txs/bridge-v1" }
191193
strata-asm-txs-checkpoint = { path = "crates/txs/checkpoint" }
192194
strata-asm-txs-test-utils = { path = "crates/txs/test-utils" }
193195
strata-asm-worker = { path = "crates/worker" }
196+
asm-storage = { path = "crates/storage" }
194197
strata-btc-verification = { path = "crates/btc-verification" }
195198
strata-checkpoint-types-ssz = { path = "crates/checkpoint-types" }

bin/asm-runner/Cargo.toml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ strata-asm-txs-bridge-v1.workspace = true
2525
strata-asm-worker.workspace = true
2626
strata-btc-types.workspace = true
2727

28-
# Storage deps — now only needed by the runner binary, not ASM library crates
29-
# TODO(STR-2544): eliminate it completely
30-
strata-db-store-sled = { git = "https://github.com/alpenlabs/alpen.git", rev = "02fe60d1b74470da3db67352b2f74625eb2e0ed1" }
31-
strata-state = { git = "https://github.com/alpenlabs/alpen.git", rev = "02fe60d1b74470da3db67352b2f74625eb2e0ed1" }
32-
strata-storage = { git = "https://github.com/alpenlabs/alpen.git", rev = "02fe60d1b74470da3db67352b2f74625eb2e0ed1" }
28+
asm-storage.workspace = true
3329

3430
strata-identifiers.workspace = true
3531
strata-merkle.workspace = true
@@ -45,9 +41,9 @@ futures.workspace = true
4541
jsonrpsee = { workspace = true, features = ["server", "macros"] }
4642
serde.workspace = true
4743
serde_json.workspace = true
44+
sled.workspace = true
4845
ssz.workspace = true
4946
strata-asm-sp1-guest-builder = { path = "../../guest-builder/sp1", optional = true }
50-
threadpool = "1.8"
5147
tokio.workspace = true
5248
toml.workspace = true
5349
tracing.workspace = true

bin/asm-runner/src/bootstrap.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ use crate::{
1717
config::{AsmRpcConfig, BitcoinConfig},
1818
prover::{InputBuilder, ProofOrchestrator},
1919
rpc_server::run_rpc_server,
20-
storage::create_storage_managers,
20+
storage::create_storage,
2121
worker_context::AsmWorkerContext,
2222
};
2323
pub(crate) async fn bootstrap(
2424
config: AsmRpcConfig,
2525
params: AsmParams,
2626
executor: TaskExecutor,
2727
) -> Result<()> {
28-
// 1. Create storage managers (AsmStateManager + MmrHandle)
29-
let (asm_manager, mmr_handle) = create_storage_managers(&config.database)?;
28+
// 1. Create storage
29+
let (state_db, mmr_db) = create_storage(&config.database)?;
3030

3131
// 2. Connect to Bitcoin node
3232
let bitcoin_client = Arc::new(connect_bitcoin(&config.bitcoin).await?);
@@ -36,8 +36,8 @@ pub(crate) async fn bootstrap(
3636
let worker_context = AsmWorkerContext::new(
3737
runtime_handle.clone(),
3838
bitcoin_client.clone(),
39-
asm_manager.clone(),
40-
mmr_handle,
39+
state_db.clone(),
40+
mmr_db.clone(),
4141
);
4242

4343
// 4. Launch ASM worker
@@ -80,7 +80,7 @@ pub(crate) async fn bootstrap(
8080
AsmStfProofProgram::native_host()
8181
};
8282

83-
let input_builder = InputBuilder::new(asm_manager.clone(), bitcoin_client.clone());
83+
let input_builder = InputBuilder::new(state_db.clone(), bitcoin_client.clone());
8484
let mut orchestrator =
8585
ProofOrchestrator::new(proof_db, host, orch_config, input_builder, rx);
8686

@@ -121,7 +121,7 @@ pub(crate) async fn bootstrap(
121121
let rpc_port = config.rpc.port;
122122
executor.spawn_critical_async_with_shutdown("rpc_server", move |shutdown| {
123123
run_rpc_server(
124-
asm_manager,
124+
state_db,
125125
asm_worker,
126126
bitcoin_client,
127127
proof_db_for_rpc,

bin/asm-runner/src/prover/input.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use std::sync::Arc;
66

77
use anyhow::{Context, Result};
8+
use asm_storage::AsmStateDb;
89
use bitcoind_async_client::{Client, traits::Reader};
910
use moho_runtime_impl::RuntimeInput;
1011
use moho_runtime_interface::MohoProgram;
@@ -14,18 +15,17 @@ use strata_asm_proof_types::L1Range;
1415
use strata_btc_types::{BlockHashExt, L1BlockIdBitcoinExt};
1516
use strata_btc_verification::{self, TxidInclusionProof};
1617
use strata_identifiers::L1BlockCommitment;
17-
use strata_storage::AsmStateManager;
1818

1919
/// Builds [`RuntimeInput`] for proof generation, dispatching by proof type.
2020
pub(crate) struct InputBuilder {
21-
asm_manager: Arc<AsmStateManager>,
21+
state_db: Arc<AsmStateDb>,
2222
bitcoin_client: Arc<Client>,
2323
}
2424

2525
impl InputBuilder {
26-
pub(crate) fn new(asm_manager: Arc<AsmStateManager>, bitcoin_client: Arc<Client>) -> Self {
26+
pub(crate) fn new(state_db: Arc<AsmStateDb>, bitcoin_client: Arc<Client>) -> Self {
2727
Self {
28-
asm_manager,
28+
state_db,
2929
bitcoin_client,
3030
}
3131
}
@@ -47,8 +47,8 @@ impl InputBuilder {
4747

4848
// 2. Fetch the auxiliary data stored during STF execution.
4949
let aux_data = self
50-
.asm_manager
51-
.get_aux_data(commitment)
50+
.state_db
51+
.get_aux_data(&commitment)
5252
.context("failed to fetch aux data")?
5353
.context("aux data not found for block")?;
5454

@@ -69,8 +69,8 @@ impl InputBuilder {
6969
let parent_commitment = L1BlockCommitment::new(parent_height, parent_hash.to_l1_block_id());
7070

7171
let asm_state = self
72-
.asm_manager
73-
.get_state(parent_commitment)
72+
.state_db
73+
.get(&parent_commitment)
7474
.context("failed to fetch parent anchor state")?
7575
.context("parent anchor state not found")?;
7676
let anchor_state = asm_state.state();

bin/asm-runner/src/rpc_server.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use std::{fmt::Display, sync::Arc};
44

55
use anyhow::Result;
6+
use asm_storage::AsmStateDb;
67
use async_trait::async_trait;
78
use bitcoin::BlockHash;
89
use bitcoind_async_client::{Client, traits::Reader};
@@ -20,7 +21,6 @@ use strata_asm_txs_bridge_v1::BRIDGE_V1_SUBPROTOCOL_ID;
2021
use strata_asm_worker::{AsmWorkerHandle, AsmWorkerStatus};
2122
use strata_btc_types::BlockHashExt;
2223
use strata_identifiers::L1BlockCommitment;
23-
use strata_storage::AsmStateManager;
2424
use strata_tasks::ShutdownGuard;
2525
use tracing::info;
2626

@@ -31,7 +31,7 @@ fn to_rpc_error(e: impl Display) -> ErrorObjectOwned {
3131

3232
/// ASM RPC server implementation
3333
pub(crate) struct AsmRpcServer {
34-
asm_manager: Arc<AsmStateManager>,
34+
state_db: Arc<AsmStateDb>,
3535
asm_worker: Arc<AsmWorkerHandle>,
3636
bitcoin_client: Arc<Client>,
3737
proof_db: Option<SledProofDb>,
@@ -40,13 +40,13 @@ pub(crate) struct AsmRpcServer {
4040
impl AsmRpcServer {
4141
/// Create a new ASM RPC server
4242
pub(crate) fn new(
43-
asm_manager: Arc<AsmStateManager>,
43+
state_db: Arc<AsmStateDb>,
4444
asm_worker: Arc<AsmWorkerHandle>,
4545
bitcoin_client: Arc<Client>,
4646
proof_db: Option<SledProofDb>,
4747
) -> Self {
4848
Self {
49-
asm_manager,
49+
state_db,
5050
asm_worker,
5151
bitcoin_client,
5252
proof_db,
@@ -69,10 +69,7 @@ impl AsmRpcServer {
6969
.to_block_commitment(block_hash)
7070
.await
7171
.map_err(to_rpc_error)?;
72-
let state = self
73-
.asm_manager
74-
.get_state(commitment)
75-
.map_err(to_rpc_error)?;
72+
let state = self.state_db.get(&commitment).map_err(to_rpc_error)?;
7673
match state {
7774
Some(state) => {
7875
let bridge_state = state
@@ -140,15 +137,15 @@ impl AssignmentsApiServer for AsmRpcServer {
140137

141138
/// Run the RPC server
142139
pub(crate) async fn run_rpc_server(
143-
asm_manager: Arc<AsmStateManager>,
140+
state_db: Arc<AsmStateDb>,
144141
asm_worker: Arc<AsmWorkerHandle>,
145142
bitcoin_client: Arc<Client>,
146143
proof_db: Option<SledProofDb>,
147144
rpc_host: String,
148145
rpc_port: u16,
149146
shutdown: ShutdownGuard,
150147
) -> Result<()> {
151-
let rpc_server = AsmRpcServer::new(asm_manager, asm_worker, bitcoin_client, proof_db);
148+
let rpc_server = AsmRpcServer::new(state_db, asm_worker, bitcoin_client, proof_db);
152149

153150
let server = ServerBuilder::default()
154151
.build(format!("{}:{}", rpc_host, rpc_port))

bin/asm-runner/src/storage.rs

Lines changed: 9 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,16 @@
1-
//! Storage manager setup using SledDB from [Alpen](https://github.com/alpenlabs/alpen)
1+
//! Storage setup for the ASM runner.
22
3-
use std::{sync::Arc, time::Duration};
3+
use std::sync::Arc;
44

55
use anyhow::Result;
6-
use strata_db_store_sled::{AsmDBSled, MmrIndexDb, SledDbConfig, open_sled_database};
7-
use strata_storage::{AsmStateManager, MmrId, MmrIndexHandle, MmrIndexManager};
8-
use threadpool::ThreadPool;
6+
use asm_storage::{AsmStateDb, MmrDb};
97

108
use crate::config::DatabaseConfig;
119

12-
/// Default number of threads for database operations.
13-
const DEFAULT_NUM_THREADS: usize = 4;
14-
15-
/// Default number of retries for failed database operations.
16-
const DEFAULT_RETRY_COUNT: u16 = 4;
17-
18-
/// Default delay between retries for failed database operations.
19-
const DEFAULT_DELAY: Duration = Duration::from_millis(150);
20-
21-
/// Sled database name for MMR data.
22-
const MMR_DB_NAME: &str = "mmr";
23-
24-
/// Sled database name for ASM state data.
25-
const ASM_DB_NAME: &str = "asm";
26-
27-
/// Create storage managers for ASM state and MMR
28-
///
29-
/// Returns a tuple of (AsmStateManager, MmrHandle) that can be used by the
30-
/// WorkerContext and RPC server.
31-
pub(crate) fn create_storage_managers(
32-
config: &DatabaseConfig,
33-
) -> Result<(Arc<AsmStateManager>, MmrIndexHandle)> {
34-
// Create thread pools for database operations
35-
let pool = ThreadPool::new(config.num_threads.unwrap_or(DEFAULT_NUM_THREADS));
36-
37-
// Open sled databases
38-
let asm_sled_db = open_sled_database(&config.path, ASM_DB_NAME)?;
39-
let mmr_sled_db = open_sled_database(&config.path, MMR_DB_NAME)?;
40-
41-
// Create database instances with default config
42-
let config = SledDbConfig::new_with_constant_backoff(
43-
config.retry_count.unwrap_or(DEFAULT_RETRY_COUNT),
44-
config.delay.unwrap_or(DEFAULT_DELAY).as_millis() as u64,
45-
);
46-
let asm_db = Arc::new(AsmDBSled::new(asm_sled_db, config.clone())?);
47-
let mmr_db = Arc::new(MmrIndexDb::new(mmr_sled_db, config)?);
48-
49-
// Create managers
50-
let asm_manager = Arc::new(AsmStateManager::new(pool.clone(), asm_db));
51-
let mmr_manager = MmrIndexManager::new(pool, mmr_db);
52-
53-
// Get a handle for the ASM manifest MMR
54-
let mmr_handle = mmr_manager.get_handle(MmrId::Asm);
55-
56-
Ok((asm_manager, mmr_handle))
10+
/// Create storage backends for the ASM runner.
11+
pub(crate) fn create_storage(config: &DatabaseConfig) -> Result<(Arc<AsmStateDb>, Arc<MmrDb>)> {
12+
let db = sled::open(&config.path)?;
13+
let state_db = Arc::new(AsmStateDb::open(&db)?);
14+
let mmr_db = Arc::new(MmrDb::open(&db)?);
15+
Ok((state_db, mmr_db))
5716
}

0 commit comments

Comments
 (0)