Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 23 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,29 @@ jobs:
next_era: [""]
cardano_node_version: ["10.6.2", "10.7.1", "11.0.1"]
hard_fork_latest_era_at_epoch: [0]
run_id: ["#1"]
run_id:
[
"#1",
"#2",
"#3",
"#4",
"#5",
"#6",
"#7",
"#8",
"#9",
"#10",
"#11",
"#12",
"#13",
"#14",
"#15",
"#16",
"#17",
"#18",
"#19",
"#20",
]
extra_args:
[
"--aggregate-signature-type=Concatenation full --check-client-cli-snapshot-converter",
Expand Down
20 changes: 13 additions & 7 deletions docs/website/blog/2026-01-06-dmq-testing-program.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ tags: [DMQ, decentralization, testing program]

### DMQ testing program with SPOs

:::info[Update 2026/08/04]

With the release of the [`2630.0`](https://github.com/input-output-hk/mithril/releases/tag/2630.0) distribution, the DMQ node has been upgraded to its first **stable beta release** version `0.7.0.0` on the `release-mainnet` and `release-preprod` networks.

:::

:::info[Update 2026/04/28]

With the release of the [`2617.0`](https://github.com/input-output-hk/mithril/releases/tag/2617.0) distribution, the DMQ node has been upgraded to version `0.4.2.0` on the `pre-release-preview` network. The testing program with SPOs is extended to keep gathering feedback before the stable release on `release-preprod` and `release-mainnet` networks.
Expand Down Expand Up @@ -47,14 +53,14 @@ The rollout plan of the DMQ network is the following:
- [x] DMQ activation on the `pre-release-preview` network
- [x] Released a [guide](https://mithril.network/doc/manual/operate/run-signer-node/#set-up-the-dmq-node-unstable) for setting up a DMQ node in the SPO infrastructure
- [x] 4-6 weeks testing program with selected SPOs
- [ ] **Distribution [2617](https://github.com/input-output-hk/mithril/releases/tag/2617.0)**: `unstable` on the `pre-release-preview` network (extended testing)
- [x] **Distribution [2617](https://github.com/input-output-hk/mithril/releases/tag/2617.0)**: `unstable` on the `pre-release-preview` network (extended testing)
- [x] Upgraded the DMQ node to version `0.4.2.0` on the `pre-release-preview` network
- [ ] 4-6 weeks extended testing program with selected SPOs
- [ ] **Distribution +3**: `stable` on the `release-preprod` and `release-mainnet` networks with fallback
- [ ] DMQ activation on the `release-preprod` and `release-mainnet` networks
- [ ] Activation of the fallback to the legacy signature registration mechanism for all SPOs
- [ ] Release of an updated guide for setting up a DMQ node in the SPO infrastructure
- [ ] Monitoring and support for SPOs running DMQ nodes
- [x] 4-6 weeks extended testing program with selected SPOs
- [x] **Distribution [2630](https://github.com/input-output-hk/mithril/releases/tag/2630.0)**: `stable` on the `release-preprod` and `release-mainnet` networks with fallback
- [x] DMQ activation on the `release-preprod` and `release-mainnet` networks
- [x] Activation of the fallback to the legacy signature registration mechanism for all SPOs
- [x] Release of an updated guide for setting up a DMQ node in the SPO infrastructure
- [x] Monitoring and support for SPOs running DMQ nodes
- [ ] **Distribution +4**: `stable` on the `release-preprod` and `release-mainnet` networks
- [ ] Deactivation of the fallback to the legacy signature registration mechanism for all SPOs
- [ ] Monitoring and support for SPOs running DMQ nodes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ The rollout plan of the DMQ network is the following:
- [x] Released a [guide](https://mithril.network/doc/manual/operate/run-aggregator-node) for setting up a follower aggregator
- [x] Wait for the DMQ adoption to reach the required threshold until aggregators can produce valid certificates
- [x] 4-6 weeks testing program with selected participants
- [ ] **Distribution [2617](https://github.com/input-output-hk/mithril/releases/tag/2617.0)**: `unstable` on the `pre-release-preview` network (extended testing)
- [ ] 4-6 weeks extended testing program with selected SPOs
- [x] **Distribution [2617](https://github.com/input-output-hk/mithril/releases/tag/2617.0)**: `unstable` on the `pre-release-preview` network (extended testing)
- [x] 4-6 weeks extended testing program with selected SPOs
- [ ] **Distribution +3**: `stable` on the `release-preprod` and `release-mainnet` networks
- [ ] Activation of the feature on the `release-preprod` and `release-mainnet` networks
- [ ] Release of an updated guide for setting up a follower aggregator
Expand Down
10 changes: 10 additions & 0 deletions mithril-test-lab/mithril-end-to-end/src/scenario/full.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,16 @@ impl FullScenario {
.await?;

if aggregator.is_first() || aggregator.version().is_below("0.7.94") {
// Restarting with a certificate chain lagging two epochs behind the chain tip would
// block the aggregator on an unrecoverable epoch gap, so make sure the current epoch
// is certified before stopping
let current_epoch = chain_observer.get_current_epoch().await?.unwrap_or_default();
self.toolkit
.check
.certificate
.is_creating_certificate_with_min_epoch(aggregator, current_epoch)
.await?;

self.toolkit
.exec
.update_protocol_parameters(aggregator, infrastructure.aggregate_signature_type())
Expand Down
20 changes: 18 additions & 2 deletions mithril-test-lab/mithril-end-to-end/src/toolkit/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,21 @@ impl ScenarioToolkitContext {
Backoff::default()
}

/// Backoff polling at a constant tenth of the epoch duration, so that epoch transitions
/// are detected shortly after the epoch boundary.
pub fn tenth_of_epoch_poll_backoff(&self) -> Backoff {
let delay = self.timeout_for_epochs(1) / 10;
Backoff::new(delay, delay, 1)
}

/// Timeout covering the given number of Cardano epochs.
pub fn timeout_for_epochs(&self, epochs: u32) -> Duration {
self.attempt_policy.timeout_for_epochs(epochs)
}

/// Timeout to wait for the aggregator to produce a signed artifact once it is running.
pub fn artifact_production_timeout(&self) -> Duration {
self.timeout_for_epochs(1)
self.timeout_for_epochs(3)
}

/// Timeout to wait for the devnet and aggregator to become ready during startup.
Expand Down Expand Up @@ -96,13 +103,22 @@ mod tests {
assert_eq!(policy.timeout_for_epochs(5), Duration::from_secs(50));
}

#[test]
fn tenth_of_epoch_poll_backoff_polls_at_a_constant_delay() {
let context = ScenarioToolkitContext::new(AttemptPolicy::new(Duration::from_secs(10)));
let mut backoff = context.tenth_of_epoch_poll_backoff();

assert_eq!(backoff.next_delay(), Duration::from_secs(1));
assert_eq!(backoff.next_delay(), Duration::from_secs(1));
}

#[test]
fn named_timeouts_cover_expected_epochs() {
let context = ScenarioToolkitContext::new(AttemptPolicy::new(Duration::from_secs(10)));

assert_eq!(
context.artifact_production_timeout(),
Duration::from_secs(10)
Duration::from_secs(30)
);
assert_eq!(
context.startup_readiness_timeout(),
Expand Down
6 changes: 3 additions & 3 deletions mithril-test-lab/mithril-end-to-end/src/toolkit/exec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ impl ExecToolkit {
aggregator.stop().await?;
let protocol_parameters_new = match aggregate_signature_type {
AggregateSignatureType::Concatenation => ProtocolParameters {
k: 145,
m: 210,
phi_f: 0.80,
k: 83,
m: 130,
phi_f: 0.75,
},
AggregateSignatureType::Snark => ProtocolParameters {
k: 7,
Expand Down
2 changes: 1 addition & 1 deletion mithril-test-lab/mithril-end-to-end/src/toolkit/wait.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ impl WaitToolkit {
let epochs_to_wait = Self::compute_number_of_epochs_to_wait(target_epoch, current_epoch);
let timeout = self.context.timeout_for_epochs(epochs_to_wait);

match poll_until!(timeout, self.context.poll_backoff(), {
match poll_until!(timeout, self.context.tenth_of_epoch_poll_backoff(), {
match aggregator
.chain_observer()
.get_current_epoch()
Expand Down
Loading