Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
f50435e
add block_proof column and DB queries for storing block proofs
sergerad Mar 1, 2026
9101df8
decouple proving from apply_block and persist proving inputs
sergerad Mar 1, 2026
0ef989a
add concurrent proof scheduler with FuturesOrdered for FIFO completion
sergerad Mar 1, 2026
34f0cdc
Simplify prove fns
sergerad Mar 1, 2026
7a5022a
Simplify retry fn
sergerad Mar 2, 2026
5062cd0
Fix data dir issue
sergerad Mar 2, 2026
ecc067e
add finality parameter to SyncChainMmr endpoint
sergerad Mar 2, 2026
f116fa3
RM flake
sergerad Mar 2, 2026
866b324
Fix lint
sergerad Mar 2, 2026
1f2919b
Undo fmt
sergerad Mar 2, 2026
14e16f4
Wrap up signed block todo
sergerad Mar 2, 2026
1b21962
Pass blockproofrequest down
sergerad Mar 2, 2026
671630a
Lint
sergerad Mar 2, 2026
b6f3d3c
Fix stress tests
sergerad Mar 2, 2026
6856585
Changelog
sergerad Mar 2, 2026
3b0ba10
Fix proving inputs
sergerad Mar 2, 2026
98c0aa6
Handle docstring
sergerad Mar 2, 2026
1189d46
Update genesis comment
sergerad Mar 2, 2026
a2b5952
RM arc clone
sergerad Mar 2, 2026
8a65851
load_proving_inputs comments
sergerad Mar 2, 2026
d355dc5
Comments
sergerad Mar 2, 2026
769d2bf
refactor errors and retries
sergerad Mar 2, 2026
633f761
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 2, 2026
549d808
Tidy up future results
sergerad Mar 2, 2026
dab79e4
Comments
sergerad Mar 2, 2026
98d56fa
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 3, 2026
c08b657
Fix compile
sergerad Mar 3, 2026
258bafc
Rm dead code fields
sergerad Mar 3, 2026
bd8dad7
impl conv::SqlTypeConv for BlockProof
sergerad Mar 3, 2026
2b44192
Add index update query
sergerad Mar 3, 2026
92878d8
Bump timeout
sergerad Mar 3, 2026
7d5ed4c
Update notify
sergerad Mar 3, 2026
2c5a7d7
Specify proving block batch size
sergerad Mar 3, 2026
8b803f7
static lifetime
sergerad Mar 3, 2026
2ca641f
backticks
sergerad Mar 3, 2026
6e52650
replace match
sergerad Mar 3, 2026
295f9d8
Store proofs to file
sergerad Mar 3, 2026
5bfba05
update select proving inputs return value
sergerad Mar 3, 2026
37cb516
RM pub crate
sergerad Mar 3, 2026
ec89137
Fix changelog
sergerad Mar 3, 2026
bc0bd54
Changelog
sergerad Mar 4, 2026
c8a76d4
finality unspecified
sergerad Mar 4, 2026
506ea80
unspecified comment
sergerad Mar 4, 2026
97b320b
More comments
sergerad Mar 4, 2026
820261d
source not from
sergerad Mar 4, 2026
b3f0238
arc clone
sergerad Mar 4, 2026
228d38b
rename proof scheduler handle
sergerad Mar 4, 2026
d272347
refactor proof concurrency
sergerad Mar 4, 2026
4c216c2
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 4, 2026
9b2f3c8
lint
sergerad Mar 4, 2026
03b0415
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 4, 2026
da22438
RM unused query and index
sergerad Mar 4, 2026
359a056
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 8, 2026
0e3145f
Move retry logic to prove_and_save
sergerad Mar 8, 2026
75cca6e
PendingJoinSet
sergerad Mar 8, 2026
20c1720
Simplify scheduling logic
sergerad Mar 8, 2026
3bbb943
Rename var
sergerad Mar 8, 2026
433085b
instrument field name
sergerad Mar 9, 2026
aa4f32a
parameterize max concurrent proofs
sergerad Mar 9, 2026
ee6b74a
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 10, 2026
8a70c04
joinset type specific
sergerad Mar 10, 2026
4238cf1
flatten error
sergerad Mar 10, 2026
2720950
unwrap or
sergerad Mar 10, 2026
e0d9b55
retry loop
sergerad Mar 10, 2026
4e71764
instrument refactor
sergerad Mar 10, 2026
1cb0546
Fix info block num fields
sergerad Mar 10, 2026
3bfce8c
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 12, 2026
3e1e3a9
rm is_proven and wipe proving_inputs on proven
sergerad Mar 12, 2026
28f359f
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 12, 2026
1b0712d
nonzerousize
sergerad Mar 12, 2026
8292df7
Update select block num comment
sergerad Mar 12, 2026
d8bb994
anyhow context
sergerad Mar 12, 2026
3044cea
another anyhow context
sergerad Mar 12, 2026
b8aa91c
Fix fields
sergerad Mar 12, 2026
905a298
log loop errs
sergerad Mar 12, 2026
ca54ff2
assert_matches
sergerad Mar 12, 2026
a605383
std io err
sergerad Mar 12, 2026
7c8fba7
Simplify schedule logic
sergerad Mar 12, 2026
1dd667a
mark proven in prove_and_save
sergerad Mar 12, 2026
e539861
saturating sub
sergerad Mar 16, 2026
3acd808
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 16, 2026
346bf15
rm too many lines
sergerad Mar 17, 2026
db4a206
rm load_proof
sergerad Mar 23, 2026
28ce7c8
rm optional
sergerad Mar 23, 2026
8fa8759
rm inflight_count
sergerad Mar 23, 2026
efc751c
fix fn name
sergerad Mar 25, 2026
313c261
RM ApplyBlockData
sergerad Mar 25, 2026
6a706c7
Add proven_in_sequence col and update queries and logic
sergerad Mar 25, 2026
b064597
Merge branch 'next' of github.com:0xMiden/miden-node into sergerad-de…
sergerad Mar 25, 2026
29c3ab0
Fix compile
sergerad Mar 25, 2026
31fcf29
Add db tests
sergerad Mar 26, 2026
029c131
Return error if non-genesis block inserted without proving inputs
sergerad Mar 26, 2026
a9a27db
rename select_latest_proven_in_sequence_block_num and fix comment
sergerad Mar 26, 2026
463b8d2
rename underlying query fn
sergerad Mar 26, 2026
d1a3696
Handle edge case on startup
sergerad Mar 26, 2026
79e8d00
Fix tests with dummy proving inputs
sergerad Mar 26, 2026
94648c6
Add doc comment for proving inputs
sergerad Mar 26, 2026
0a9051a
Progress sequence transactionally
sergerad Mar 26, 2026
b29202d
Move business logic out of query module
sergerad Mar 27, 2026
1fda3f2
move sequence logging out of scheduler loop
sergerad Mar 27, 2026
07f9157
RM save_block_proof
sergerad Mar 27, 2026
ab55652
Merge branch 'next' into sergerad-deferred-block-proving
bobbinth Mar 27, 2026
c636f8e
Merge branch 'next' into sergerad-deferred-block-proving
bobbinth Mar 28, 2026
4a73960
Update crates/store/src/server/proof_scheduler.rs
bobbinth Mar 28, 2026
1a3d1e4
fix: partially revert last commit to make the project compile
bobbinth Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
- Introduce `SyncChainMmr` RPC endpoint to sync chain MMR deltas within specified block ranges ([#1591](https://github.com/0xMiden/node/issues/1591)).
- Fixed `TransactionHeader` serialization for row insertion on database & fixed transaction cursor on retrievals ([#1701](https://github.com/0xMiden/node/issues/1701)).
- Added KMS signing support in validator ([#1677](https://github.com/0xMiden/node/pull/1677)).
- Added finality field for `SyncChainMmr` requests ([#1725](https://github.com/0xMiden/miden-node/pull/1725)).
- Added per-IP gRPC rate limiting across services as well as global concurrent connection limit ([#1746](https://github.com/0xMiden/node/issues/1746)).
- Added limit to execution cycles for a transaction network, configurable through CLI args (`--ntx-builder.max-tx-cycles`) ([#1801](https://github.com/0xMiden/node/issues/1801)).
- Added monitor version and network name to the network monitor dashboard, network name is configurable via `--network-name` / `MIDEN_MONITOR_NETWORK_NAME` ([#1838](https://github.com/0xMiden/node/pull/1838)).
Expand Down
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 14 additions & 1 deletion bin/node/src/commands/bundled.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
use std::collections::HashMap;
use std::num::NonZeroUsize;
use std::path::PathBuf;

use anyhow::Context;
use miden_node_block_producer::BlockProducer;
use miden_node_rpc::Rpc;
use miden_node_store::Store;
use miden_node_store::{DEFAULT_MAX_CONCURRENT_PROOFS, Store};
use miden_node_utils::clap::{GrpcOptionsExternal, StorageOptions};
use miden_node_utils::grpc::UrlExt;
use miden_node_validator::{Validator, ValidatorSigner};
Expand Down Expand Up @@ -82,6 +83,14 @@ pub enum BundledCommand {
#[arg(long = "enable-otel", default_value_t = false, env = ENV_ENABLE_OTEL, value_name = "BOOL")]
enable_otel: bool,

/// Maximum number of concurrent block proofs to be scheduled.
#[arg(
long = "max-concurrent-proofs",
default_value_t = DEFAULT_MAX_CONCURRENT_PROOFS,
value_name = "NUM"
)]
max_concurrent_proofs: NonZeroUsize,

#[command(flatten)]
grpc_options: GrpcOptionsExternal,

Expand Down Expand Up @@ -125,6 +134,7 @@ impl BundledCommand {
validator,
enable_otel: _,
grpc_options,
max_concurrent_proofs,
storage_options,
} => {
Self::start(
Expand All @@ -135,6 +145,7 @@ impl BundledCommand {
ntx_builder,
validator,
grpc_options,
max_concurrent_proofs,
storage_options,
)
.await
Expand All @@ -151,6 +162,7 @@ impl BundledCommand {
ntx_builder: NtxBuilderConfig,
validator: BundledValidatorConfig,
grpc_options: GrpcOptionsExternal,
max_concurrent_proofs: NonZeroUsize,
storage_options: StorageOptions,
) -> anyhow::Result<()> {
// Start listening on all gRPC urls so that inter-component connections can be created
Expand Down Expand Up @@ -209,6 +221,7 @@ impl BundledCommand {
data_directory: data_directory_clone,
block_prover_url,
grpc_options: grpc_options.into(),
max_concurrent_proofs,
storage_options,
}
.serve()
Expand Down
17 changes: 15 additions & 2 deletions bin/node/src/commands/store.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use std::num::NonZeroUsize;
use std::path::{Path, PathBuf};

use anyhow::Context;
use miden_node_store::Store;
use miden_node_store::genesis::GenesisBlock;
use miden_node_store::{DEFAULT_MAX_CONCURRENT_PROOFS, Store};
use miden_node_utils::clap::{GrpcOptionsInternal, StorageOptions};
use miden_node_utils::fs::ensure_empty_directory;
use miden_node_utils::grpc::UrlExt;
Expand Down Expand Up @@ -65,6 +66,13 @@ pub enum StoreCommand {
#[arg(long = "enable-otel", default_value_t = false, env = ENV_ENABLE_OTEL, value_name = "BOOL")]
enable_otel: bool,

/// Maximum number of concurrent block proofs to be scheduled.
#[arg(
long = "max-concurrent-proofs",
default_value_t = DEFAULT_MAX_CONCURRENT_PROOFS,
value_name = "NUM"
)]
max_concurrent_proofs: NonZeroUsize,
#[command(flatten)]
grpc_options: GrpcOptionsInternal,

Expand All @@ -89,6 +97,7 @@ impl StoreCommand {
data_directory,
enable_otel: _,
grpc_options,
max_concurrent_proofs,
storage_options,
} => {
Self::start(
Expand All @@ -98,6 +107,7 @@ impl StoreCommand {
block_prover_url,
data_directory,
grpc_options,
max_concurrent_proofs,
storage_options,
)
.await
Expand All @@ -113,13 +123,15 @@ impl StoreCommand {
}
}

#[expect(clippy::too_many_arguments)]
async fn start(
rpc_url: Url,
ntx_builder_url: Url,
block_producer_url: Url,
block_prover_url: Option<Url>,
data_directory: PathBuf,
grpc_options: GrpcOptionsInternal,
max_concurrent_proofs: NonZeroUsize,
storage_options: StorageOptions,
) -> anyhow::Result<()> {
let rpc_listener = rpc_url
Expand Down Expand Up @@ -150,6 +162,7 @@ impl StoreCommand {
block_producer_listener,
data_directory,
grpc_options,
max_concurrent_proofs,
storage_options,
}
.serve()
Expand All @@ -167,5 +180,5 @@ pub fn bootstrap_store(data_directory: &Path, genesis_block_path: &Path) -> anyh
let genesis_block =
GenesisBlock::try_from(proven_block).context("genesis block validation failed")?;

Store::bootstrap(&genesis_block, data_directory)
Store::bootstrap(genesis_block, data_directory)
}
14 changes: 10 additions & 4 deletions bin/stress-test/src/seeding/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,13 @@ pub async fn seed_store(
let faucet = create_faucet();
let fee_params = FeeParameters::new(faucet.id(), 0).unwrap();
let signer = EcdsaSecretKey::new();
let genesis_state = GenesisState::new(vec![faucet.clone()], fee_params, 1, 1, signer);
let genesis_state = GenesisState::new(vec![faucet.clone()], fee_params, 1, 1, signer.clone());
let genesis_block = genesis_state
.clone()
.into_block()
.await
.expect("genesis block should be created");
Store::bootstrap(&genesis_block, &data_directory).expect("store should bootstrap");
Store::bootstrap(genesis_block, &data_directory).expect("store should bootstrap");

// start the store
let (_, store_url) = start_store(data_directory.clone()).await;
Expand All @@ -120,6 +120,7 @@ pub async fn seed_store(
&store_client,
data_directory,
accounts_filepath,
&signer,
)
.await;

Expand All @@ -131,6 +132,7 @@ pub async fn seed_store(
///
/// The first transaction in each batch sends assets from the faucet to 255 accounts.
/// The rest of the transactions consume the notes created by the faucet in the previous block.
#[expect(clippy::too_many_arguments)]
async fn generate_blocks(
num_accounts: usize,
public_accounts_percentage: u8,
Expand All @@ -139,6 +141,7 @@ async fn generate_blocks(
store_client: &StoreClient,
data_directory: DataDirectory,
accounts_filepath: PathBuf,
signer: &EcdsaSecretKey,
Comment thread
sergerad marked this conversation as resolved.
) -> SeedingMetrics {
// Each block is composed of [`BATCHES_PER_BLOCK`] batches, and each batch is composed of
// [`TRANSACTIONS_PER_BATCH`] txs. The first note of the block is always a send assets tx
Expand Down Expand Up @@ -217,7 +220,8 @@ async fn generate_blocks(
let block_inputs = get_block_inputs(store_client, &batches, &mut metrics).await;

// update blocks
prev_block_header = apply_block(batches, block_inputs, store_client, &mut metrics).await;
prev_block_header =
apply_block(batches, block_inputs, store_client, &mut metrics, signer).await;
if current_anchor_header.block_epoch() != prev_block_header.block_epoch() {
current_anchor_header = prev_block_header.clone();
}
Expand Down Expand Up @@ -252,11 +256,12 @@ async fn apply_block(
block_inputs: BlockInputs,
store_client: &StoreClient,
metrics: &mut SeedingMetrics,
signer: &EcdsaSecretKey,
) -> BlockHeader {
let proposed_block = ProposedBlock::new(block_inputs, batches).unwrap();
let (header, body) = proposed_block.clone().into_header_and_body().unwrap();
let block_size: usize = header.to_bytes().len() + body.to_bytes().len();
let signature = EcdsaSecretKey::new().sign(header.commitment());
let signature = signer.sign(header.commitment());
// SAFETY: The header, body, and signature are known to correspond to each other.
let signed_block = SignedBlock::new_unchecked(header, body, signature);
let ordered_batches = proposed_block.batches().clone();
Expand Down Expand Up @@ -569,6 +574,7 @@ pub async fn start_store(
block_producer_listener,
data_directory: dir,
grpc_options: GrpcOptionsInternal::bench(),
max_concurrent_proofs: miden_node_store::DEFAULT_MAX_CONCURRENT_PROOFS,
storage_options: StorageOptions::bench(),
}
.serve()
Expand Down
1 change: 1 addition & 0 deletions bin/stress-test/src/store/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,7 @@ async fn sync_chain_mmr(
) -> SyncChainMmrRun {
let sync_request = proto::rpc::SyncChainMmrRequest {
block_range: Some(proto::rpc::BlockRange { block_from, block_to: Some(block_to) }),
finality: proto::rpc::Finality::Committed.into(),
};

let start = Instant::now();
Expand Down
5 changes: 3 additions & 2 deletions crates/block-producer/src/server/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::num::NonZeroUsize;
use std::time::Duration;

use miden_node_proto::generated::block_producer::api_client as block_producer_client;
use miden_node_store::{GenesisState, Store};
use miden_node_store::{DEFAULT_MAX_CONCURRENT_PROOFS, GenesisState, Store};
use miden_node_utils::clap::{GrpcOptionsInternal, StorageOptions};
use miden_node_utils::fee::test_fee_params;
use miden_node_validator::{Validator, ValidatorSigner};
Expand Down Expand Up @@ -136,7 +136,7 @@ async fn start_store(
.into_block()
.await
.expect("genesis block should be created");
Store::bootstrap(&genesis_block, data_directory).expect("store should bootstrap");
Store::bootstrap(genesis_block, data_directory).expect("store should bootstrap");

let dir = data_directory.to_path_buf();
let rpc_listener =
Expand All @@ -159,6 +159,7 @@ async fn start_store(
block_prover_url: None,
data_directory: dir,
grpc_options: GrpcOptionsInternal::bench(),
max_concurrent_proofs: DEFAULT_MAX_CONCURRENT_PROOFS,
storage_options: StorageOptions::bench(),
}
.serve()
Expand Down
7 changes: 5 additions & 2 deletions crates/rpc/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ use http::{HeaderMap, HeaderValue};
use miden_node_proto::clients::{Builder, GrpcClient, Interceptor, RpcClient};
use miden_node_proto::generated::rpc::api_client::ApiClient as ProtoClient;
use miden_node_proto::generated::{self as proto};
use miden_node_store::Store;
use miden_node_store::genesis::config::GenesisConfig;
use miden_node_store::{DEFAULT_MAX_CONCURRENT_PROOFS, Store};
use miden_node_utils::clap::{GrpcOptionsExternal, GrpcOptionsInternal, StorageOptions};
use miden_node_utils::fee::test_fee;
use miden_node_utils::limiter::{
Expand Down Expand Up @@ -464,7 +464,7 @@ async fn start_store(store_listener: TcpListener) -> (Runtime, TempDir, Word, So
.into_block()
.await
.expect("genesis block should be created");
Store::bootstrap(&genesis_block, data_directory.path()).expect("store should bootstrap");
Store::bootstrap(genesis_block, data_directory.path()).expect("store should bootstrap");
let dir = data_directory.path().to_path_buf();
let store_addr =
store_listener.local_addr().expect("store listener should get a local address");
Expand All @@ -487,6 +487,7 @@ async fn start_store(store_listener: TcpListener) -> (Runtime, TempDir, Word, So
block_producer_listener,
data_directory: dir,
grpc_options: GrpcOptionsInternal::test(),
max_concurrent_proofs: DEFAULT_MAX_CONCURRENT_PROOFS,
storage_options: StorageOptions::default(),
}
.serve()
Expand Down Expand Up @@ -530,6 +531,7 @@ async fn restart_store(store_addr: SocketAddr, data_directory: &std::path::Path)
block_producer_listener,
data_directory: dir,
grpc_options: GrpcOptionsInternal::test(),
max_concurrent_proofs: DEFAULT_MAX_CONCURRENT_PROOFS,
storage_options: StorageOptions::default(),
}
.serve()
Expand Down Expand Up @@ -606,6 +608,7 @@ async fn sync_chain_mmr_returns_delta() {

let request = proto::rpc::SyncChainMmrRequest {
block_range: Some(proto::rpc::BlockRange { block_from: 0, block_to: None }),
finality: proto::rpc::Finality::Committed.into(),
};
let response = rpc_client.sync_chain_mmr(request).await.expect("sync_chain_mmr should succeed");
let response = response.into_inner();
Expand Down
1 change: 0 additions & 1 deletion crates/store/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ deadpool-diesel = { features = ["sqlite"], version = "0.6" }
diesel = { features = ["numeric", "sqlite"], version = "2.3" }
diesel_migrations = { features = ["sqlite"], version = "2.3" }
fs-err = { workspace = true }
futures = { workspace = true }
hex = { version = "0.4" }
indexmap = { workspace = true }
libsqlite3-sys = { workspace = true }
Expand Down
Loading
Loading