Skip to main content

Mithril Team Update

· 3 min read
Jean-Philippe Raynaud
Mithril Tech Lead

High level overview​

This week, the Mithril team released the 2642 distribution. This version reads the protocol configuration from the Cardano chain in the signer and the aggregator, supports the Cardano node 11.1.3 and the DMQ node 0.7.2.0, and removes the support for the Gzip compressed snapshot archives. It also introduces a certificate chain cache in the client, support for compact SNARK certificates with a genesis-signed registry of the trusted circuit verification keys, and preliminary support for IPFS as a storage location of the immutable files (all unstable). It includes various bug fixes and improvements as well.

The team also published the immutable archives directory of the aggregator under an IPNS name, and selected a crate for the user interaction of the setup command. They kept working on the deterministic resolution of the SNARK verification key collisions in the key registration, the progressive rollout strategy of the IPFS distribution, the new mithril-setup crate, and the findings of the M1.1 milestone audit.

Finally, they worked on the upgrade to Cardano node 11.2, the renaming of DeprecatedCommand to RemovedCommand in the client CLI, the cleanup of the mithril-test-lab directory, and the investigation of the blocks and transactions verification failure on the testing-preview network.

Low level overview​

Features​

  • Completed the issue Publish the immutable archives directory under an IPNS name in the aggregator #3606
  • Completed the issue Identify a crate to use for the user interaction (TUI) of the setup command #3618
  • Worked on the issue Resolve SNARK verification key collisions deterministically in the key registration #3591
  • Worked on the issue Define the progressive rollout strategy of the IPFS distribution #3607
  • Worked on the issue Create a new mithril-setup crate #3616
  • Worked on the issue Address the findings of the M1.1 milestone audit #3635

Protocol maintenance​

Plutus Core Team Update

· 2 min read
Ziyang Liu
Software Engineering Lead

High level summary​

The Plutus team has enabled multiIndexArray (CIP-0156) and the new Value builtins policies, assetCount, keepPolicies and dropPolicies (CIP-0168) at Dijkstra for all Plutus ledger language versions. These require the Dijkstra hard fork before they can be used on-chain. We've also added conformance tests for multiIndexArray, brought the specification's versioning section up-to-date, and added casing on Data to the Agda metatheory.

The guardrail script now supports optional parameters that governance proposals can set or unset, and the Plinth compiler can report timings for individual compilation stages. Work in progress includes generating Agda typechecking tests from conformance tests, and CEK machine optimizations.

Key Pull Requests Merged​

Pull Requests In Progress​

Consensus Team Update

· 5 min read
Damian Nadales
Consensus Team Lead

High level summary​

  • Leios implementation on main (Treasury Funding Initiative 4: Ouroboros Leios Implementation):
    • Merged the Praos2 protocol into main. Praos2 is Praos plus the Leios overlay. One definition, PolyPraos, now has all the Praos rules, and both Praos and Praos2 are variants of it. When a later Praos variant comes, it will extend PolyPraos instead of adding a new protocol next to it (#2386). A follow-up fixes the translation of the LedgerView from Conway to Dijkstra, a defect that #2386 kept from the old code (#2399).
    • An Endorser Block can no longer get its certificate in a later era or a later epoch than the block that announced it. The era rule avoids open design questions about a block that crosses an era boundary. The epoch rule keeps the interface between consensus and the ledger simpler (#2409).
    • Moved the LeiosNotify clients from the leios-prototype branch to main. A client disconnects from a peer that sends a message that an honest node would not send. A new test suite runs the real node against peers that can send any message (#2403).
    • Moved the LeiosFetch servers from the leios-prototype branch to main (#2416). The next step is the logic that decides which Endorser Blocks to fetch, and the clients that fetch them.
    • Fixed a defect in the LeiosDB garbage collection. If an exception stopped a collection pass, the rows that the pass marked for deletion stayed in the database. The next pass now finds and deletes them (#2401).
    • The Leios design document now has a detailed section on Endorser Block diffusion. It gives the plan that came out of the LeiosFetch design work, and how the node keeps its memory use bounded (ouroboros-leios#1005).
  • Leios prototype development (Treasury Funding Initiative 4: Ouroboros Leios Implementation):
    • Merged a large change that makes Endorser Block diffusion in the prototype close to the production design (#2282). Some examples:
      • The node fetches an Endorser Block only when an election or a certificate justifies it, never because a peer offers it.
      • A peer can offer only an Endorser Block that it announced, and each part only once. If a peer breaks a rule, the node disconnects from it.
      • If an announcement gives the wrong size for an Endorser Block, the node does not relay that block and does not vote for it.
      • The node checks the certificate in a ranking block when the block arrives, before chain selection.
    • Before #2282, the prototype used the Leios header format in all eras. It now uses the Leios format from Dijkstra only, and the unchanged Praos format before. The testnet starts before Dijkstra, so we must restart its chain from genesis, and every node must update.
    • LeiosNotify has two new messages, MsgQuit and MsgCanceled, so the node can stop a session while it waits for a reply. Before, this was not possible. So when the peer governor moved a peer from hot to warm, the node closed the whole connection (#2344).
    • Backported the epoch rule from #2409 to the prototype (#2415).
  • Maintenance and support (Treasury Funding Initiative 17: Maintenance and Support):
    • Released ouroboros-consensus 5.1.0.1. The tool db-truncater has a new flag, --leios. Without the flag, the tool does not need the LeiosDB files and does not change them (#2393).
    • Tracing now shows the Dijkstra ledger predicate failures. Before, the log formatting for these failures called error, so a Dijkstra block that failed validation crashed the thread that wrote the trace (#2406, ported to main in #2407).
    • Added the local state query GetStakePoolState, which the ledger defines in cardano-ledger#6162 (#2412, for #2405).
    • Added golden tests for the ledger queries. They catch a change to the encoding of a query or its result, which would break client tools. Queries that the ledger already defines, such as NonMyopicMemberRewards, now come from the ledger (#2348).
    • A ledger snapshot now has one version number at the top level, instead of one number for each part. New tests check the golden snapshot files against the CDDL specification, which catches an encoding that does not match the specification. This change also fixes the Peras CDDL (#2395).
    • db-synthesizer now uses the forge function and the mempool of the node, instead of its own copy of the forging logic. One visible change: every slot leader now forges a block, so the synthesized chain can have forks (#2284).

Ledger Team Update

· 4 min read
Alexey Kuleshevich
Ledger Team Software Engineer

High level summary​

Leios continued to be the main focus this cycle and moved well beyond prototype on several fronts. Dijkstra forecasting for Leios landed, the forecasting itself was simplified by keeping stake data only in snapshots, and DijkstraEraForecast was extended with the Peras protocol parameters. We defined Leios' EndorserBlock, added a ledger state query for the Leios committee, switched the Leios header KES signature verification to use MemoBytes, and fixed pool BLS key handling so the key's epoch number is only renewed when the key is actually new. These were backed by tests for the Leios committee and stake distribution when injecting genesis data, and by integration of the latest Leios changes for week 41.

PlutusV4 reached a milestone for the Dijkstra era: eraMaxLanguage is now set to PlutusV4, and AlonzoTxWits encodes and decodes PlutusV4 scripts starting with Dijkstra. Work on sub-transactions continued, with allInputsTxBodyF now looking into sub-transactions, top-level supplemental datums allowed for sub-transactions, and tests added for refunds in the consumed value across a batch. On the Dijkstra era more broadly, we fixed VRF reuse at the epoch boundary, started tracking the VRF key hashes of genesis stake pools, moved NonMyopicMemberRewards into the ledger, added missing getters to AnyEraTxBody, and renamed requiredTopLevelGuardsL while bringing in its outstanding tests.

On testing and releasing we added further Entities tests, treasury value and reference-script size tests, enabled bootstrap addresses in conformance, updated the formal ledger specification, and bumped the Plinth version in the Plutus preprocessor modules. Infrastructure changes included a cardano-data changelog fix for the pointWise to pointwise rename, a round of package version bumps across the changelogs following a CHaP release, and the usual dependency bump.

Low level summary​

Features​

  • PR-6124 - Make AlonzoTxWits decode and encode PlutusV4 scripts starting with Dijkstra
  • PR-6129 - Switch allInputsTxBodyF to look into sub-transactions
  • PR-6130 - Move NonMyopicMemberRewards to Ledger
  • PR-6140 - Add missing getters to AnyEraTxBody
  • PR-6120 - Use MemoBytes for Leios header KES signature verification
  • PR-6134 - Simplify forecasting by keeping stake data only in snapshots
  • PR-6137 - Allow TopTx SupplementalDatums for SubTx
  • PR-6148 - Add Dijkstra forecasting for Leios
  • PR-6092 - Fix VRF reuse at epoch boundary in Dijkstra
  • PR-6133 - Track the VRF key hashes of genesis stake pools in Dijkstra
  • PR-6136 - Rename requiredTopLevelGuardsL and add tests from #6020
  • PR-6126 - Extend DijkstraEraForecast with Peras protocol parameters
  • PR-6168 - Add ledger state query for Leios committee
  • PR-6170 - Renew pool BLS key epoch number only when the key is new
  • PR-6174 - Define Leios' EndorserBlock

Testing​

  • PR-6125 - Tests for refunds in the consumed value across a batch
  • PR-6109 - Set Dijkstra's eraMaxLanguage to PlutusV4, fix tests
  • PR-6141 - Bump Plinth version in plutus preprocessor modules
  • PR-6132 - Additional Entities tests
  • PR-6156 - TreasuryValue and RefScriptSize tests
  • PR-6167 - Add tests for verifying Leios committee and stake distribution when injecting genesis data
  • PR-6149 - Update formal ledger specification
  • PR-6182 - Enable boostrap addresses in conformance

Infrastructure and releasing​

  • PR-6131 - Fix cardano-data CHANGELOG with Data.CanonicalMaps.pointWise rename to pointwise
  • PR-6135 - Bump package version in all CHANGELOG.md files following release in CHaP
  • PR-6143 - Bump urllib3 from 2.7.0 to 2.8.0 in /doc
  • PR-6166 - Leios: integrate latest changes for 2026w41

Mithril Team Update

· 3 min read
Jean-Philippe Raynaud
Mithril Tech Lead

High level overview​

This week, the Mithril team completed hardening the SNARK primitives and distinguishing the canonical bytes encoding in the STM library. They kept working on resolving the SNARK verification key collisions deterministically in the key registration, publishing the immutable archives directory under an IPNS name in the aggregator, and identifying a crate for the user interaction of the setup command.

The team completed the upgrade to Cardano node 11.1.3, adding a keypair generation tool in the aggregator CLI, and detecting the yanked crates in the CI. They also worked on the new distribution release, the upgrade to Cardano node 11.2, the update of the DMQ node to 0.7.2.0, and kept investigating the blocks and transactions verification failure on the testing-preview network.

Finally, they fixed the WASM client tests which terminated themselves, the firewall configuration in the infrastructure which opened unused Mithril relay ports when the real DMQ node is used, and the DMQ node SRV record prefix in the signer documentation.

Low level overview​

Features​

  • Completed the issue SNARK primitives hardening #3557
  • Completed the issue Distinguish canonical bytes encoding in the STM library #3572
  • Worked on the issue Resolve SNARK verification key collisions deterministically in the key registration #3591
  • Worked on the issue Publish the immutable archives directory under an IPNS name in the aggregator #3606
  • Worked on the issue Identify a crate to use for the user interaction (TUI) of the setup command #3618

Protocol maintenance​

  • Completed the issue Upgrade to Cardano 11.1.3 #3601
  • Completed the issue Add generate keypair tool in aggregator CLI #3584
  • Completed the issue Detect yanked crates in the CI #3589
  • Completed the issue Fix make -C mithril-client-wasm test which terminates itself #3590
  • Completed the issue Firewall opens unused Mithril relay ports when the real DMQ node is used #3611
  • Completed the issue Fix DMQ node SRV record prefix in the signer documentation #3620
  • Worked on the issue Release 2642 distribution #3498
  • Worked on the issue Upgrade to Cardano 11.2 #3585
  • Worked on the issue Update DMQ node to 0.7.2.0 #3602
  • Worked on the issue Blocks and transaction verification fails on testing-preview #3526