Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f92e7e5
refactor(aggregator): centralize timeout constants for IPFS queries
Alenar Oct 13, 2026
2fe2f6b
feat(aggregator): add IPNS publish query
Alenar Oct 8, 2026
4a9bed4
feat(aggregator): add IPNS directory publishing with fallback logging
Alenar Oct 9, 2026
49b2f80
feat(aggregator): add configurable `ipns_key_name` for IPNS publishing
Alenar Oct 9, 2026
a4340a5
chore(ipfs-devnet): remove cdn download support
Alenar Oct 9, 2026
58417da
refactor(ipfs-devnet): switch to GitHub-based CAR archive downloads f…
Alenar Oct 9, 2026
f04fd66
feat(ipfs-devnet): add port usage checks to prevent swarm conflicts
Alenar Oct 9, 2026
dcae47f
feat(ipfs-devnet): add readiness check with retries for node startup
Alenar Oct 9, 2026
77bd6dc
feat(e2e): create and configure ipfs key name
Alenar Oct 9, 2026
c438079
refactor(e2e): allow `KuboNode` to send query commands
Alenar Oct 12, 2026
28d0de8
feat(e2e): new + enhanced queries + better command with output handling
Alenar Oct 12, 2026
c865328
feat(e2e): check IPNS publication in cardano-db scenario
Alenar Oct 12, 2026
4e90386
refactor(e2e): add polling for the check IPNS directory publish
Alenar Oct 13, 2026
7baba6c
feat(aggregator): add IPNS key verification before directory publishi…
Alenar Oct 13, 2026
9636bed
refactor(aggregator): log IPFS uploader batch outcomes at debug level
Alenar Oct 13, 2026
73631c4
docs(website): add configuration details for IPFS RPC server in aggre…
Alenar Oct 14, 2026
9925d4c
chore: PR reviews adjustments
Alenar Oct 15, 2026
fc398ab
feat(aggregator): make IPNS record lifetime and TTL configurable
Alenar Oct 15, 2026
d95bd12
chore: upgrade crate versions and `mithril-test-lab/ipfs-devnet/VERSI…
Alenar Oct 15, 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
4 changes: 2 additions & 2 deletions Cargo.lock

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

Original file line number Diff line number Diff line change
Expand Up @@ -588,6 +588,7 @@ Here is a list of the available parameters for the serve command:
| `cardano_prover_max_hashes_allowed_by_request` | `--cardano-prover-max-hashes-allowed-by-request` | - | `CARDANO_PROVER_MAX_HASHES_ALLOWED_BY_REQUEST` | Maximum number of hashes allowed by request to the Cardano prover (applies to both transaction hashes and block hashes) | `100` | `100` | - |
| `cardano_transactions_block_streamer_max_roll_forwards_per_poll` | `--cardano-transactions-block-streamer-max-roll-forwards-per-poll` | - | `CARDANO_TRANSACTIONS_BLOCK_STREAMER_MAX_ROLL_FORWARDS_PER_POLL` | Maximum number of roll forwards during a poll of the block streamer when importing transactions | `1000` | `1000` | - |
| `preload_security_parameter` | - | - | `PRELOAD_SECURITY_PARAMETER` | Blocks offset, from the tip of the chain, to exclude during the cardano transactions preload<br/>`[default: 2160]`. | `2160` | - | :heavy_check_mark: |
| `ipfs_rpc_server_config` | - | - | `IPFS_RPC_SERVER_CONFIG` | URL of a Kubo IPFS RPC API, setting this will enable IPFS upload for immutable snapshots<br/><br/>`mfs_folder_name` (optional) allows overriding the name of the folder in the IPFS MFS (Mutable File System)<br/>where the snapshots will be stored. Defaults to "mithril" if not specified.<br/>`ipns_key_name` (optional) if set, publishes the snapshot MFS folder to IPNS under this key name. The<br/>key must already exist in the Kubo node keystore. | - | `{ "url": "http://localhost:5001/" }`or `{ "url": "http://localhost:5001/", "mfs_folder_name": "custom-folder", "ipns_key_name": "ipns-key" }` | - |
| `enable_metrics_server` | `--enable-metrics-server` | - | `ENABLE_METRICS_SERVER` | Enable metrics HTTP server (Prometheus endpoint on /metrics) | `false` | - | - |
| `metrics_server_ip` | `--metrics-server-ip` | - | `METRICS_SERVER_IP` | Metrics HTTP server IP | `0.0.0.0` | - | - |
| `metrics_server_port` | `--metrics-server-port` | - | `METRICS_SERVER_PORT` | Metrics HTTP server listening port | `9090` | - | - |
Expand Down
2 changes: 1 addition & 1 deletion mithril-aggregator/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "mithril-aggregator"
version = "0.10.20"
version = "0.10.21"
description = "A Mithril Aggregator server"
authors = { workspace = true }
edition = { workspace = true }
Expand Down
29 changes: 26 additions & 3 deletions mithril-aggregator/src/configuration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -501,9 +501,11 @@ pub struct ServeCommandConfiguration {
///
/// `mfs_folder_name` (optional) allows overriding the name of the folder in the IPFS MFS (Mutable File System)
/// where the snapshots will be stored. Defaults to "mithril" if not specified.
/// `ipns_key_name` (optional) if set, publishes the snapshot MFS folder to IPNS under this key name. The
/// key must already exist in the Kubo node keystore.
#[example = "\
`{ \"url\": \"http://localhost:5001/\" }`\
or `{ \"url\": \"http://localhost:5001/\", \"mfs_folder_name\": \"custom-folder\" }`\
or `{ \"url\": \"http://localhost:5001/\", \"mfs_folder_name\": \"custom-folder\", \"ipns_key_name\": \"ipns-key\" }`\
"]
#[serde(
default,
Expand Down Expand Up @@ -718,6 +720,12 @@ pub struct IpfsRpcServerConfig {
/// Defaults to "mithril" if not specified.
#[serde(default = "default_mfs_folder_name")]
pub mfs_folder_name: String,

/// Optional name of the IPNS key used to publish the snapshot MFS folder.
///
/// The key must already exist in the IPFS node keystore. If it is missing or the publication
/// fails, a warning is logged and the snapshot upload still succeeds.
pub ipns_key_name: Option<String>,
}

impl IpfsRpcServerConfig {
Expand Down Expand Up @@ -1519,13 +1527,14 @@ mod test {

#[test]
fn deserializing_ipfs_rpc_server_parameters() {
let deserialized_without_mfs_dir: IpfsRpcServerConfig =
let deserialized_with_defaults: IpfsRpcServerConfig =
serde_json::from_str(r#"{ "url": "http://localhost:5001/" }"#).unwrap();
assert_eq!(
deserialized_without_mfs_dir,
deserialized_with_defaults,
IpfsRpcServerConfig {
url: "http://localhost:5001/".to_string(),
mfs_folder_name: default_mfs_folder_name(),
ipns_key_name: None,
}
);

Expand All @@ -1538,6 +1547,20 @@ mod test {
IpfsRpcServerConfig {
url: "http://localhost:5001/".to_string(),
mfs_folder_name: "altered".to_string(),
ipns_key_name: None,
}
);

let deserialized_with_ipns_key_name: IpfsRpcServerConfig = serde_json::from_str(
r#"{ "url": "http://localhost:5001/", "ipns_key_name": "my-key" }"#,
)
.unwrap();
assert_eq!(
deserialized_with_ipns_key_name,
IpfsRpcServerConfig {
url: "http://localhost:5001/".to_string(),
mfs_folder_name: default_mfs_folder_name(),
ipns_key_name: Some("my-key".to_string()),
}
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ impl DependenciesBuilder {
Ok(IpfsUploader::new(
Arc::new(rpc_api_client),
IpfsMfsDirPath::from(ipfs_rpc_config.mfs_folder_name),
ipfs_rpc_config.ipns_key_name,
FileUploadRetryPolicy::default(),
&self.root_logger(),
))
Expand Down
Loading
Loading