From 577449e5bc3d3a2c11516298655cb6a00adb6812 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Thu, 18 Jun 2026 12:12:59 +0200 Subject: [PATCH 1/7] fix(aggregator): handle genesis epoch at startup Clamp the signer retrieval epoch to the genesis epoch when computing the network configuration, so the aggregator can start at epoch 0. --- internal/mithril-protocol-config/src/http.rs | 5 +--- .../src/services/epoch_service.rs | 5 +--- .../network_configuration_provider.rs | 6 +---- .../src/store/epoch_settings_storer.rs | 4 ++- mithril-common/src/entities/epoch.rs | 26 +++++++++++++++++++ .../src/mithril/infrastructure.rs | 8 ++++++ 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/internal/mithril-protocol-config/src/http.rs b/internal/mithril-protocol-config/src/http.rs index ac29d6fe764..36a1bbb3e67 100644 --- a/internal/mithril-protocol-config/src/http.rs +++ b/internal/mithril-protocol-config/src/http.rs @@ -64,10 +64,7 @@ impl MithrilNetworkConfigurationProvider for HttpMithrilNetworkConfigurationProv &self, epoch: Epoch, ) -> StdResult { - let aggregation_epoch = - epoch.offset_to_signer_retrieval_epoch().with_context(|| { - format!("MithrilNetworkConfigurationProvider could not compute aggregation epoch from epoch: {epoch}") - })?; + let aggregation_epoch = epoch.offset_to_signer_retrieval_epoch_saturating(); let next_aggregation_epoch = epoch.offset_to_next_signer_retrieval_epoch(); let registration_epoch = epoch.offset_to_next_signer_retrieval_epoch().next(); diff --git a/mithril-aggregator/src/services/epoch_service.rs b/mithril-aggregator/src/services/epoch_service.rs index 4edc7a761b6..3b49bd22f54 100644 --- a/mithril-aggregator/src/services/epoch_service.rs +++ b/mithril-aggregator/src/services/epoch_service.rs @@ -296,10 +296,7 @@ impl EpochService for MithrilEpochService { let mithril_era = self.era_checker.current_era(); - let signer_retrieval_epoch = - epoch.offset_to_signer_retrieval_epoch().with_context(|| { - format!("EpochService could not compute signer retrieval epoch from epoch: {epoch}") - })?; + let signer_retrieval_epoch = epoch.offset_to_signer_retrieval_epoch_saturating(); let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch(); let signer_registration_epoch = epoch.offset_to_recording_epoch(); diff --git a/mithril-aggregator/src/services/network_configuration_provider.rs b/mithril-aggregator/src/services/network_configuration_provider.rs index da25fad59cd..6a16cf91c34 100644 --- a/mithril-aggregator/src/services/network_configuration_provider.rs +++ b/mithril-aggregator/src/services/network_configuration_provider.rs @@ -1,7 +1,6 @@ use std::collections::BTreeSet; use std::sync::Arc; -use anyhow::Context; use async_trait::async_trait; use slog::{Logger, warn}; @@ -96,10 +95,7 @@ impl MithrilNetworkConfigurationProvider for LocalMithrilNetworkConfigurationPro &self, epoch: Epoch, ) -> StdResult { - let aggregation_epoch = - epoch.offset_to_signer_retrieval_epoch().with_context(|| { - format!("MithrilNetworkConfigurationProvider could not compute aggregation epoch from epoch: {epoch}") - })?; + let aggregation_epoch = epoch.offset_to_signer_retrieval_epoch_saturating(); let next_aggregation_epoch = epoch.offset_to_next_signer_retrieval_epoch(); let registration_epoch = epoch.offset_to_next_signer_retrieval_epoch().next(); diff --git a/mithril-aggregator/src/store/epoch_settings_storer.rs b/mithril-aggregator/src/store/epoch_settings_storer.rs index 2a6f37f9b86..2ea55f77045 100644 --- a/mithril-aggregator/src/store/epoch_settings_storer.rs +++ b/mithril-aggregator/src/store/epoch_settings_storer.rs @@ -47,7 +47,9 @@ pub trait EpochSettingsStorer: ) -> StdResult<()> { for (epoch, epoch_configuration) in [ ( - network_configuration.epoch.offset_to_signer_retrieval_epoch()?, + network_configuration + .epoch + .offset_to_signer_retrieval_epoch_saturating(), &network_configuration.configuration_for_aggregation, ), ( diff --git a/mithril-common/src/entities/epoch.rs b/mithril-common/src/entities/epoch.rs index 60aef7a6320..b92eb9affbb 100644 --- a/mithril-common/src/entities/epoch.rs +++ b/mithril-common/src/entities/epoch.rs @@ -62,6 +62,16 @@ impl Epoch { self.offset_by(Self::SIGNER_RETRIEVAL_OFFSET) } + /// Apply the [retrieval offset][Self::SIGNER_RETRIEVAL_OFFSET] to this epoch, saturating at + /// the genesis epoch. + /// + /// Unlike [offset_to_signer_retrieval_epoch][Self::offset_to_signer_retrieval_epoch], this + /// returns the genesis epoch instead of failing when the offset would yield a negative epoch + /// (i.e. at the genesis epoch itself). + pub fn offset_to_signer_retrieval_epoch_saturating(&self) -> Self { + self.offset_to_signer_retrieval_epoch().unwrap_or(Epoch(0)) + } + /// Apply the [next signer retrieval offset][Self::NEXT_SIGNER_RETRIEVAL_OFFSET] to this epoch pub fn offset_to_next_signer_retrieval_epoch(&self) -> Self { *self + Self::NEXT_SIGNER_RETRIEVAL_OFFSET @@ -308,6 +318,22 @@ mod tests { assert!(Epoch(0).previous().is_err()); } + #[test] + fn offset_to_signer_retrieval_epoch_saturating_clamps_at_genesis() { + assert_eq!( + Epoch(2), + Epoch(3).offset_to_signer_retrieval_epoch_saturating() + ); + assert_eq!( + Epoch(0), + Epoch(1).offset_to_signer_retrieval_epoch_saturating() + ); + assert_eq!( + Epoch(0), + Epoch(0).offset_to_signer_retrieval_epoch_saturating() + ); + } + #[test] fn test_next() { assert_eq!(Epoch(4), Epoch(3).next()); diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs index 9aab6571419..9ccabdc8b82 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/infrastructure.rs @@ -123,6 +123,14 @@ impl MithrilInfrastructure { .await?; Self::register_startup_era(&toolkit, &leader_aggregator, config).await?; + toolkit + .wait + .for_aggregator_at_target_epoch( + &leader_aggregator, + Epoch(1), + "minimal epoch for the aggregator to handle startup discrepancies".to_string(), + ) + .await?; leader_aggregator.serve().await?; let follower_aggregator_endpoints = follower_aggregators From 1f8b552a56e565c23ed06fee04ee675afffab533 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 17 Jun 2026 15:08:22 +0200 Subject: [PATCH 2/7] wip(e2e): update genesis keys to dual --- mithril-test-lab/mithril-end-to-end/src/mithril/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/mithril/mod.rs b/mithril-test-lab/mithril-end-to-end/src/mithril/mod.rs index cd3630d89f2..291009e2be0 100644 --- a/mithril-test-lab/mithril-end-to-end/src/mithril/mod.rs +++ b/mithril-test-lab/mithril-end-to-end/src/mithril/mod.rs @@ -21,8 +21,8 @@ pub use signer::Signer; pub const DEVNET_MAGIC_ID: mithril_common::MagicId = 42; pub const DEVNET_DMQ_MAGIC_ID: mithril_common::MagicId = 2147483690; -pub const GENESIS_VERIFICATION_KEY: &str = "5b33322c3235332c3138362c3230312c3137372c31312c3131372c3133352c3138372c3136372c3138312c3138382c32322c35392c3230362c3130352c3233312c3135302c3231352c33302c37382c3231322c37362c31362c3235322c3138302c37322c3133342c3133372c3234372c3136312c36385d"; -pub const GENESIS_SECRET_KEY: &str = "5b3131382c3138342c3232342c3137332c3136302c3234312c36312c3134342c36342c39332c3130362c3232392c38332c3133342c3138392c34302c3138392c3231302c32352c3138342c3136302c3134312c3233372c32362c3136382c35342c3233392c3230342c3133392c3131392c31332c3139395d"; +pub const GENESIS_VERIFICATION_KEY: &str = "012020fdbac9b10b7587bba7b5bc163bce69e796d71e4ed44c10fcb4488689f7a1444069c10d42f944c2a7a5138391aafe3dbe1e40e8516a9e174aff16dddfe5c3f303e65a3fa2187e10860541ff2dfc59296f15833b6ba549ff83153f9cde07d0eb26"; +pub const GENESIS_SECRET_KEY: &str = "012076b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7202c9dc80e956510c4461bdc39bda7e96a88a3f7a4635ff5e66e3040b5baa08e04"; pub const ERA_MARKERS_VERIFICATION_KEY: &str = "5b33322c3235332c3138362c3230312c3137372c31312c3131372c3133352c3138372c3136372c3138312c3138382c32322c35392c3230362c3130352c3233312c3135302c3231352c33302c37382c3231322c37362c31362c3235322c3138302c37322c3133342c3133372c3234372c3136312c36385d"; pub const ERA_MARKERS_SECRET_KEY: &str = "5b3131382c3138342c3232342c3137332c3136302c3234312c36312c3134342c36342c39332c3130362c3232392c38332c3133342c3138392c34302c3138392c3231302c32352c3138342c3136302c3134312c3233372c32362c3136382c35342c3233392c3230342c3133392c3131392c31332c3139395d"; pub const ANCILLARY_MANIFEST_VERIFICATION_KEY: &str = "5b33322c3235332c3138362c3230312c3137372c31312c3131372c3133352c3138372c3136372c3138312c3138382c32322c35392c3230362c3130352c3233312c3135302c3231352c33302c37382c3231322c37362c31362c3235322c3138302c37322c3133342c3133372c3234372c3136312c36385d"; From dbf0a68d82eb0ec3d0ee365828713a16e61adfef Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 19 Jun 2026 15:18:47 +0200 Subject: [PATCH 3/7] wip(common): activate bytes codec for SNARK proofs --- mithril-common/src/crypto_helper/types/wrappers.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/mithril-common/src/crypto_helper/types/wrappers.rs b/mithril-common/src/crypto_helper/types/wrappers.rs index a015cd3ea47..06d28985ef5 100644 --- a/mithril-common/src/crypto_helper/types/wrappers.rs +++ b/mithril-common/src/crypto_helper/types/wrappers.rs @@ -60,20 +60,16 @@ pub type ProtocolAncillaryProverData = ProtocolKey; pub type ProtocolAncillaryVerifierData = ProtocolKey; impl_codec_and_type_conversions_for_protocol_key!( - json_hex_codec => AggregateSignature, ed25519_dalek::VerifyingKey, ed25519_dalek::SigningKey, AggregateVerificationKeyForConcatenation, + json_hex_codec => ed25519_dalek::VerifyingKey, ed25519_dalek::SigningKey, AggregateVerificationKeyForConcatenation, MKProof, VerificationKeyProofOfPossessionForConcatenation, Sum6KesSig, OpCert, SingleSignature ); impl_codec_and_type_conversions_for_protocol_key!( - bytes_hex_codec => ed25519_dalek::Signature, AncillaryProverData, AncillaryVerifierData + bytes_hex_codec => ed25519_dalek::Signature, AncillaryProverData, AncillaryVerifierData, + AggregateSignature ); #[cfg(feature = "future_snark")] impl_codec_and_type_conversions_for_protocol_key!( - json_hex_codec => VerificationKeyForSnark -); - -#[cfg(feature = "future_snark")] -impl_codec_and_type_conversions_for_protocol_key!( - bytes_hex_codec => AggregateVerificationKeyForSnark + bytes_hex_codec => AggregateVerificationKeyForSnark, VerificationKeyForSnark ); From 3c3cf02a2d2fa818b58d6b3798384440d00e5032 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 19 Jun 2026 15:21:53 +0200 Subject: [PATCH 4/7] wip(ci): run IVC SNARK proofs in e2e tests --- .github/workflows/ci.yml | 70 +++++----------------------------------- 1 file changed, 8 insertions(+), 62 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 35ca9403bbf..8745e7e88a7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,12 +50,12 @@ jobs: - name: Cargo build - Tooling if: matrix.os == 'ubuntu-24.04' shell: bash - run: cargo build --release --bins --package mithril-end-to-end + run: cargo build --release --bins --package mithril-end-to-end --features future_snark - name: Build Mithril workspace & publish artifacts uses: ./.github/workflows/actions/build-upload-mithril-artifact with: - binaries-build-args: --bins --package mithril-aggregator --package mithril-signer --package mithril-client-cli --package mithril-relay --target=${{ matrix.musl_target }} + binaries-build-args: --bins --package mithril-aggregator --package mithril-signer --package mithril-client-cli --package mithril-relay --target=${{ matrix.musl_target }} --features future_snark libraries-build-args: --package mithril-stm --package mithril-client --features rustls,full,unstable binaries-to-check-static: mithril-aggregator,mithril-signer,mithril-client,mithril-relay binaries-build-target: ${{ matrix.musl_target }} @@ -334,77 +334,23 @@ jobs: e2e: runs-on: ubuntu-24.04 needs: [build-ubuntu] + # GitHub-hosted runners cap job execution at 6h; any higher value is not honored. + timeout-minutes: 360 strategy: fail-fast: false matrix: mode: ["std"] - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras) }} + era: ["lagrange"] next_era: [""] - cardano_node_version: ["10.6.2", "10.7.1", "11.0.1"] + cardano_node_version: ["11.0.1"] hard_fork_latest_era_at_epoch: [0] run_id: ["#1"] extra_args: [ "--aggregate-signature-type=Concatenation full --check-client-cli-snapshot-converter", + "--aggregate-signature-type IvcSnark --cardano-slot-length 1.0 --cardano-epoch-length 2400 --mithril-run-interval 240000 minimal --signed-entity-type CardanoStakeDistribution", ] - include: - # Include a test for partial decentralization with leader/follower signer registration and P2P signature registration with Haskell DMQ node (without fallback signature delayer) - - mode: "leader-follower-dmq-haskell-skip-delayer" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: [""] - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--skip-signature-delayer --number-of-aggregators=2 --use-relays --relay-signer-registration-mode=passthrough --relay-signature-registration-mode=p2p --aggregate-signature-type=Concatenation --use-dmq --dmq-node-flavor=haskell --dmq-node-version 0.6.0.0" - # Include a test for partial decentralization with leader/follower signer registration and P2P signature registration with Haskell DMQ node (with fallback signature delayer) - - mode: "leader-follower-dmq-haskell-with-delayer" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: [""] - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--number-of-aggregators=2 --use-relays --relay-signer-registration-mode=passthrough --relay-signature-registration-mode=p2p --aggregate-signature-type=Concatenation --use-dmq --dmq-node-flavor=haskell --dmq-node-version 0.6.0.0" - # Include a test for partial decentralization with leader/follower signer registration and P2P signature registration with fake DMQ node - - mode: "leader-follower-dmq-fake" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: [""] - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--number-of-aggregators=2 --use-relays --relay-signer-registration-mode=passthrough --relay-signature-registration-mode=p2p --aggregate-signature-type=Concatenation --use-dmq --dmq-node-flavor=fake" - # Include a test for partial decentralization with leader/follower signer registration and P2P signature registration with Mithril relay - - mode: "leader-follower-relay" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: [""] - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--number-of-aggregators=2 --use-relays --relay-signer-registration-mode=passthrough --relay-signature-registration-mode=p2p --aggregate-signature-type=Concatenation" - # Include a test for full dedentralization P2P signer registration and P2P signature registration - - mode: "decentralized" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: "" - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--number-of-aggregators=2 --use-relays --relay-signer-registration-mode=p2p --relay-signature-registration-mode=p2p --aggregate-signature-type=Concatenation" - # Include a test for the era switch without regenesis - - mode: "std-era-switch-no-genesis" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[1] }} - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--aggregate-signature-type=Concatenation" - # Include a test for the era switch with regenesis - - mode: "std-era-genesis" - era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[0] }} - next_era: ${{ fromJSON(needs.build-ubuntu.outputs.eras)[1] }} - cardano_node_version: "10.6.2" - hard_fork_latest_era_at_epoch: 0 - run_id: "#1" - extra_args: "--mithril-era-regenesis-on-switch --aggregate-signature-type=Concatenation" steps: - name: Checkout sources uses: actions/checkout@v6 @@ -435,7 +381,7 @@ jobs: shell: bash max_attempts: 3 retry_on_exit_code: 2 - timeout_minutes: 10 + timeout_minutes: 720 warning_on_retry: true command: | cat > ./mithril-end-to-end.sh << EOF From 4787de0c12c911e75ae4b8465601e4acac32e1a5 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 19 Jun 2026 15:36:46 +0200 Subject: [PATCH 5/7] wip(docs): add guide to run SNARK tests --- RUN-IVC-SNARK-TESTS.md | 139 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 RUN-IVC-SNARK-TESTS.md diff --git a/RUN-IVC-SNARK-TESTS.md b/RUN-IVC-SNARK-TESTS.md new file mode 100644 index 00000000000..211e0927f34 --- /dev/null +++ b/RUN-IVC-SNARK-TESTS.md @@ -0,0 +1,139 @@ +# Running SNARK Proofs Tests + +This guide walks you through running SNARK proof tests for Mithril, covering both unit tests and the full end-to-end test suite. + +## Prerequisites + +- **Operating System**: Linux (Ubuntu 24.04 or later) +- **Rust toolchain**: latest stable version +- **Hardware Requirements**: At least 32GB (64GB recommended) of RAM and 16 CPU cores for optimal performance. If you computer has less CPU cores, you will need to adjust the `cardano-epoch-length` by the ratio of your CPU cores to 16. For example, if you have 8 CPU cores, double the `cardano-epoch-length`. + +## Getting Started + +Clone the Mithril repository: + +```bash +git clone git@github.com:input-output-hk/mithril.git +cd mithril +``` + +### Branch Setup + +Switch to the dedicated SNARK end-to-end test branch: + +```bash +git switch jpraynaud/3142-ivc-snark-e2e-tests +``` + +## Unit Tests + +Run the full workspace unit tests with the `future_snark` feature enabled: + +```bash +cargo test --all-features --features future_snark +``` + +## End-to-End Test + +### Working Directory Configuration + +> **Important**: The working directory path must be kept short because the Cardano node uses local socket files with path length limitations. Use an absolute path such as the example below. **Do not** use `.` as the working directory, this could delete your entire repository. + +Set the working directory environment variable: + +```bash +WORK_DIRECTORY=~/Desktop/mithril/artifacts +``` + +### Running the Test + +The following command compiles all required nodes and runs the end-to-end test with SNARK proofs. Expect the full process to take approximately **100 minutes** on the recommended hardware configuration(otherwise the time will be multiplied by the ratio of your CPU cores to 16): + +```bash +cargo build --release --features future_snark \ + -p mithril-aggregator \ + -p mithril-signer \ + -p mithril-client-cli \ + -p mithril-relay \ + -p mithril-end-to-end \ +&& RUST_BACKTRACE=1 ./target/release/mithril-end-to-end -vvvv \ + --bin-directory ./target/release/ \ + --work-directory=$WORK_DIRECTORY \ + --devnet-scripts-directory=./mithril-test-lab/cardano-devnet \ + --cardano-node-version=11.0.1 \ + --mithril-era=lagrange \ + --aggregate-signature-type IvcSnark \ + --cardano-slot-length 1.0 \ + --cardano-epoch-length 1200 \ + --mithril-run-interval 60000 \ + minimal \ + --signed-entity-type CardanoStakeDistribution +``` + +## Explorer + +In a separate terminal, you can run the explorer to visualize the devnet by switching to the `mithril-explorer` directory: + +```bash +cd mithril-explorer +``` + +Then build the WASM client with the `future_snark` feature enabled: + +```bash +WASM_PACK_ARGS="-- --features future_snark" make -C ../mithril-client-wasm build +``` + +Then, run the development server: + +```bash +make dev +``` + +Open [http://localhost:3000/explorer/?aggregator=https%3A%2F%2Faggregator.dev-follower-preview.api.mithril.network%2Faggregator](http://localhost:3000/explorer/?aggregator=https%3A%2F%2Faggregator.dev-follower-preview.api.mithril.network%2Faggregator) with your browser to see the result. + +## Client + +In order to verify some transaction on the `ivc-snark-preview` devnet, you can use the client CLI with the following command: + +First compile the client CLI with the `future_snark` feature enabled: + +```bash +cargo build --release -p mithril-client-cli --features future_snark && mv target/release/mithril-client . +``` + +Then, setup the environment variables: + +```bash +export AGGREGATOR_ENDPOINT=https://aggregator.ivc-snark-preview.api.mithril.network/aggregator +export GENESIS_VERIFICATION_KEY=$(wget -q -O - https://raw.githubusercontent.com/input-output-hk/mithril/jpraynaud/3142-ivc-snark-e2e-tests/mithril-infra/configuration/ivc-snark-preview/genesis.vkey) +``` + +Finally, you can verify a transaction with the following command: + +```bash +./mithril-client -vvv --json cardano-transaction certify 476b70373def274898ff32a95b6c00eecaff6db1937aec328d055121f84e39b8 +``` + +This should return a valid proof for the transaction, confirming that it has been certified by the Mithril protocol using SNARK proofs: + +```bash +{"mithril_client_cli_version":"0.13.17"} +Jun 30 15:09:45.564 DEBG Mithril Client CLI version: 0.13.17 +Jun 30 15:09:45.564 DEBG Run Mode: dev +Jun 30 15:09:45.564 DEBG Reading configuration file './config/dev.json'. +src: MithrilCertificateVerifier + Jun 30 15:09:45.570 DEBG New MithrilCertificateVerifier created +{"timestamp": "2026-06-30T13:09:45.574372758+00:00", "step_num": 1, "total_steps": 4, "message": "Fetching a proof for the given transactions…"} +Jun 30 15:09:45.574 DEBG GET /proof/cardano-transaction?transaction_hashes=476b70373def274898ff32a95b6c00eecaff6db1937aec328d055121f84e39b8, aggregator: https://aggregator.ivc-snark-preview.api.mithril.network/aggregator/ +{"timestamp": "2026-06-30T13:09:45.710021572+00:00", "step_num": 2, "total_steps": 4, "message": "Verifying the proof…"} +Jun 30 15:09:45.710 DEBG Got Proof from aggregator, proof: CardanoTransactionsProofsMessage { certificate_hash: "8352001d7f0bdf688db035808e44236b97ab0fe379df300dd82d574706f5ada4", certified_transactions: [CardanoTransactionsSetProofMessagePart { transactions_hashes: ["476b70373def274898ff32a95b6c00eecaff6db1937aec328d055121f84e39b8"], proof: "7b226d61737465725f70726f6f66223a7b22696e6e65725f726f6f74223a7b2268617368223a5b31302c3131302c3132362c37342c362c3230302c34342c36342c35322c3133342c31332c3233302c37362c39302c38342c3136352c3235342c3136332c3137342c3139352c3235322c32372c3230362c3136302c38342c312c3230392c3132392c33372c3230362c3138362c36335d7d2c22696e6e65725f6c6561766573223a5b5b36353337372c7b2268617368223a5b39372c302c3135392c372c35372c38372c37312c3131362c3130372c3131342c39362c3130362c3232322c3232332c37302c34332c37372c3135332c3234352c3135302c32312c39312c3132352c35372c32392c3232362c39342c3139302c3139392c3130392c38312c3130315d7d5d5d2c22696e6e65725f70726f6f665f73697a65223a3537373133312c22696e6e65725f70726f6f665f6974656d73223a5b7b2268617368223a5b3138392c3232312c3234362c38332c3235302c3230392c3136302c362c32372c31392c3136382c3233372c3235342c34322c3135382c3131312c32312c3234342c3233302c322c34352c3231352c3138302c37362c3235302c342c31362c3132332c3133382c31312c3132392c3131315d7d2c7b2268617368223a5b3134382c3230382c3134312c3133312c3136382c3137342c39312c38302c3232332c31322c3139322c3138332c3232342c36372c3230362c3135342c35302c3231372c39382c35362c36342c3133372c332c3235302c37342c36392c362c35302c3130332c34392c3131362c385d7d2c7b2268617368223a5b3136342c34352c3137312c37362c3131312c33372c34352c3231372c3132342c3230382c31302c36372c37362c38332c35372c3132362c3133392c3138312c3232382c3233352c39322c34382c31382c33322c3134342c3133392c35352c3133312c33362c31322c39312c3135335d7d2c7b2268617368223a5b3132352c3139362c3232362c302c3137342c3131302c3131352c3135342c33362c3133382c3233392c362c3132372c3230382c3230302c3138302c322c31332c35342c3136342c37372c3234332c3136382c3138332c3234352c35302c38342c35392c3133302c3235332c3138332c3136345d7d2c7b2268617368223a5b33392c392c3130302c37312c3133392c3234322c3234322c3130312c3235332c3136312c34372c3231352c36322c3231322c3139352c3138362c3235352c36322c3234362c39322c36352c33372c31392c3131382c362c33392c3139352c39302c3130382c31362c3231342c34315d7d2c7b2268617368223a5b36312c3231392c34342c3135322c33342c39342c3139372c3235332c3137312c3131362c38312c31342c33352c3131382c3139392c31322c3139312c3235322c33302c3137302c3232352c3132382c3233352c31372c34322c3134382c3135302c3230322c3137392c39342c3232332c3136305d7d2c7b2268617368223a5b33382c3135382c3132322c3235302c3230392c3138322c3138372c3231362c33352c372c38392c31332c3134332c3139382c38382c3139382c33332c32302c3131312c3139362c3131312c3136372c3234382c3134332c38312c3235312c3139362c3234322c3234312c3136382c3133332c34335d7d2c7b2268617368223a5b352c3133352c392c3138392c37382c3230332c3133352c35342c3136392c3136322c3235312c3231352c312c3132382c3235352c33362c3234362c3232302c3139392c3137322c3235332c3138342c36352c3235322c34312c3137312c3130342c3233362c3232342c32332c3132322c36325d7d2c7b2268617368223a5b3132382c39312c38322c3135332c3137342c38312c35342c31392c3139312c302c33342c34372c36372c332c3131382c3135392c34372c342c33302c3138312c33352c3233312c3235322c3135322c3130382c3134372c3137362c3233372c332c35332c35302c3137355d7d2c7b2268617368223a5b37352c3230382c39322c3136392c3230322c37382c36332c33332c32332c38392c3231312c3136392c3234352c37372c322c35312c39382c33362c38322c39382c35302c38342c3137352c34372c35352c3136352c3230302c32372c36342c3234322c3234392c3136325d7d2c7b2268617368223a5b33342c36302c3230302c3131322c3232302c31352c3132322c3234372c3133332c3232332c39352c3233352c31362c3230322c3136322c3132372c3233342c3135312c3133382c362c3235352c37372c38332c3136332c34382c38302c3234332c3136392c3235302c3137382c31352c3231355d7d2c7b2268617368223a5b3231392c3233372c3135352c3135342c3138312c38322c3233342c3133322c3135362c3233342c3136392c3231392c32362c3230302c3232382c3137312c35372c3131342c39332c32342c3234392c3138302c34322c3230342c36382c3133322c35382c3233312c392c342c3233342c345d7d2c7b2268617368223a5b32342c3230352c39322c3139362c38312c31312c35332c3131392c36392c37302c3130312c3132312c33332c3230342c3138302c32372c32382c3133332c3232312c3135332c3139382c35352c3234332c3232332c32352c3139312c3135352c33312c3138342c3136332c34342c3136365d7d2c7b2268617368223a5b3133302c3139342c3135392c32302c3231302c35392c3137342c372c31362c3138352c36302c33322c3232372c35302c3235302c3133312c3234342c31372c3131382c39332c31382c3135312c3135332c3232312c32352c32342c3137362c35392c3235332c3235352c39352c3138385d7d2c7b2268617368223a5b352c37382c3134382c3134302c38342c3232332c3138332c3232362c3133362c39392c34382c3231352c362c35392c332c3139332c35302c3137332c3130302c32342c3131372c32302c3230322c3133352c3138312c32382c3230332c372c3135372c3130382c3234332c3134315d7d2c7b2268617368223a5b37342c3232382c3135312c3133372c3134382c32342c362c35362c3231352c3136382c35372c3134302c3231322c37352c39332c34342c3233322c3131392c36332c3135332c3235312c34302c3133352c3130352c3230312c36302c3233332c3132382c352c3231312c3132372c3233335d7d2c7b2268617368223a5b35382c3138322c312c32302c3130302c3130382c3138342c3130312c34302c392c392c302c32352c3135372c3135392c31312c3231332c3138372c32312c3234372c38362c3133392c3234352c332c39392c37302c3133342c37362c37372c37322c3134372c3131355d7d2c7b2268617368223a5b3137312c382c36382c3132322c34332c3131372c3137392c31342c35302c302c3134302c31302c3131332c33362c3130322c3136322c3139372c31362c3132372c3233382c36362c3132372c3135332c34372c35332c3232392c32342c3230352c36392c3135372c3131372c3232355d7d2c7b2268617368223a5b33342c352c3231352c3135302c3138352c3231372c3136392c3234362c38382c3132352c35302c3131382c3138302c3230392c39342c3235332c3139312c31372c342c3233332c31372c3136362c3232382c33362c3138312c3235312c3230382c38302c3134342c37332c3137302c34395d7d5d7d2c227375625f70726f6f6673223a5b5b7b22696e6e65725f72616e6765223a7b227374617274223a3532363032302c22656e64223a3532363033357d7d2c7b226d61737465725f70726f6f66223a7b22696e6e65725f726f6f74223a7b2268617368223a5b3233372c3230362c392c33362c33392c35302c3233382c3131312c3138332c3132302c3136372c3135312c3139382c3133352c3130332c36322c3134372c3135362c3134322c3138322c31342c3134312c3232392c3130362c33382c3130322c34392c3235332c3234382c3230362c35342c3131305d7d2c22696e6e65725f6c6561766573223a5b5b37332c7b2268617368223a5b35322c35352c35342c39382c35352c34382c35312c35352c35312c3130302c3130312c3130322c35302c35352c35322c35362c35372c35362c3130322c3130322c35312c35302c39372c35372c35332c39382c35342c39392c34382c34382c3130312c3130312c39392c39372c3130322c3130322c35342c3130302c39382c34392c35372c35312c35352c39372c3130312c39392c35312c35302c35362c3130302c34382c35332c35332c34392c35302c34392c3130322c35362c35322c3130312c35312c35372c39382c35365d7d5d5d2c22696e6e65725f70726f6f665f73697a65223a313135302c22696e6e65725f70726f6f665f6974656d73223a5b7b2268617368223a5b35322c39382c35372c39382c35362c3130302c35362c3130312c3130302c35322c3130302c35372c39372c39392c35302c35322c34392c35372c39392c3130312c3130312c35352c3130322c35302c3130312c35302c3130322c39372c39392c39372c35332c3130312c35322c34382c3130322c39392c34392c35362c35342c35332c35302c39392c35352c35372c35322c34392c34392c3130312c35342c3130322c3130302c35362c39392c3130312c39392c35312c39372c35372c3130312c35372c39372c35312c35372c35305d7d2c7b2268617368223a5b3232342c38352c3131342c3232302c38312c37322c37362c3130342c3137382c31362c3232372c3134322c3135322c3138342c3230332c36362c3235332c31372c3230322c3233362c31352c3137342c34392c3137322c3139392c3136302c3230302c35352c33332c38372c3233372c3134375d7d2c7b2268617368223a5b3137332c36352c3130342c33382c3134312c33382c3132302c3139322c3235312c3232352c34352c34332c37352c3234362c3234382c33332c35352c31362c3134362c35362c3138332c32372c33352c3231372c34332c39302c39372c3233342c3134302c31392c36342c3232385d7d2c7b2268617368223a5b31302c38302c3135302c3232332c38382c38362c3138342c3234362c35392c3232352c3135382c3233352c3134312c3132342c3130352c3136332c34302c39302c39312c39362c372c31392c3134332c3139382c3139312c332c3133342c3137332c3130302c302c3139312c32385d7d2c7b2268617368223a5b382c31342c34322c3132302c3137342c3234392c3133342c3230372c3137372c37382c36332c33332c3131312c32392c38342c3135392c3234392c3133302c3136352c3230362c33302c31312c33302c32392c3137392c3139392c3230382c35372c37352c3136332c33302c3233375d7d2c7b2268617368223a5b3233362c35362c3235302c38312c31362c3235352c3133322c3233332c3231312c31342c3230392c35342c33352c3131332c3139332c3130332c3137352c38372c3139372c3133362c3137392c3132342c3232382c32302c3131352c36332c3133312c38352c36352c3137382c31372c3132385d7d2c7b2268617368223a5b37392c3230322c37322c33362c3132382c36322c3139312c3231352c3234382c39302c3135372c3138372c3136312c3135372c3132382c3131362c3135342c3230382c31392c3134342c32362c34352c3133342c3134362c33322c37312c35382c39362c3136392c3130362c3138312c3138395d7d2c7b2268617368223a5b36322c3133392c34362c37312c3234342c36312c3131392c36322c3137302c3232372c36342c38332c3130322c3232362c372c3233352c3131392c3133322c3133332c3230312c32302c3234362c3231342c3137302c37362c36302c34352c34322c3134392c36392c33342c3131375d7d2c7b2268617368223a5b3131312c3130372c35382c3131372c3134312c3137342c35342c3130352c3131342c3135342c37362c36342c3233332c3137372c3232352c3139382c3132352c3133312c33382c33382c3136342c312c3133332c3230382c3139302c3138372c3137392c37372c3131352c3232392c3134312c3235355d7d2c7b2268617368223a5b3131312c3235342c3137332c32372c3139312c3234322c3231372c3131362c3235312c3233352c33392c3132362c3230302c3233332c3130342c3230392c3139392c3131362c36342c3137322c352c33302c37312c3233302c3235312c3230362c3136342c34362c39362c3131322c3232352c3137315d7d5d7d2c227375625f70726f6f6673223a5b5d7d5d5d7d" }], non_certified_transactions: [], latest_block_number: BlockNumber(4428599) } +{"timestamp": "2026-06-30T13:09:45.710151054+00:00", "step_num": 3, "total_steps": 4, "message": "Fetching the associated certificate and verifying the certificate chain…"} +Jun 30 15:09:45.710 DEBG GET /certificate/8352001d7f0bdf688db035808e44236b97ab0fe379df300dd82d574706f5ada4, aggregator: https://aggregator.ivc-snark-preview.api.mithril.network/aggregator/ + src: MithrilCertificateVerifier + Jun 30 15:09:45.806 DEBG Verifying certificate, certificate_signed_entity_type: CardanoTransactions(Epoch(1344), BlockNumber(4428599)), certificate_epoch: Epoch(1344), certificate_previous_hash: 3a707182de1938f2d923def7d3bd3cef853c86575db5837f0be95261f3722d5d, certificate_hash: 8352001d7f0bdf688db035808e44236b97ab0fe379df300dd82d574706f5ada4 + Jun 30 15:09:45.807 DEBG Verify multi signature for "65336365396665393065646263326236613138343439323665366638383531393364353262306165613064656166623861323334303034383463313332656234" +{"timestamp": "2026-06-30T13:09:45.819705265+00:00", "step_num": 4, "total_steps": 4, "message": "Verify that the proof is signed in the associated certificate"} +{"certified_transactions": ["476b70373def274898ff32a95b6c00eecaff6db1937aec328d055121f84e39b8"], "non_certified_transactions": []} + +``` From ba74f64e3e5d381fb74f3af238d00486e851bf8c Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 22 Jun 2026 12:56:03 +0200 Subject: [PATCH 6/7] wip(infra): add dual genesis verification key for ivc-snark-preview Publish the dual (Ed25519 + Schnorr) genesis verification key bundle for the ivc-snark-preview environment. --- mithril-infra/configuration/ivc-snark-preview/genesis.vkey | 1 + 1 file changed, 1 insertion(+) create mode 100644 mithril-infra/configuration/ivc-snark-preview/genesis.vkey diff --git a/mithril-infra/configuration/ivc-snark-preview/genesis.vkey b/mithril-infra/configuration/ivc-snark-preview/genesis.vkey new file mode 100644 index 00000000000..ed62428c252 --- /dev/null +++ b/mithril-infra/configuration/ivc-snark-preview/genesis.vkey @@ -0,0 +1 @@ +01207f497ca1068983d5cf75c655b0c7a2f1447b77910de8f331e502f9cdcd27eb2c40a20e8b2f087f148fcdf72680234a572039e3e4a4f4d270cd3030f5edc9e8f5023c038b0f08f6331b7b5215107f7199bbd62240e111825254d4c0ad1438551663 \ No newline at end of file From c2a383a8c4d63eb28d272bdd90fb45b87711c6fd Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Wed, 26 Jun 2024 18:01:19 +0200 Subject: [PATCH 7/7] wip(common): deactivate signer certification --- mithril-common/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index bddf5da4b4a..07062933090 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -19,7 +19,7 @@ rustdoc-args = ["--cfg", "docsrs"] ignored = ["serde_bytes"] [features] -default = ["num-integer-backend"] +default = ["num-integer-backend", "allow_skip_signer_certification"] # Enables `rug-backend` features for `mithril-stm` dependency rug-backend = ["mithril-stm/rug-backend"]