Skip to content

2.4.0

Choose a tag to compare

@v0d1ch v0d1ch released this 01 Sep 17:06
· 3 commits to master since this release
2.4.0
ce5aec8

Caution

This version is deprecated, please hold off using; 2.4.1 is coming ASAP.

This release brings security fixes to incremental commits: a snapshot now identifies exactly which deposit it approves, and the on-chain validators enforce it, so an increment can only claim the deposit the parties actually signed and a recover transaction can only spend a single deposit. These fixes required changing the Hydra scripts and the snapshot signature payload.

Important

⚠️ Close and fan out any open heads before upgrading. A node upgraded while a head is open can no longer interact with it, and snapshots signed by earlier versions fail verification. The persisted hydra.db is also migrated to a CBOR event encoding on first start — there is no downgrade path.

Important fixes in this release:

  • Closing large heads no longer misses the close transaction validity window.
  • Nodes no longer crash under sustained load due to the local etcd connection (EnhanceYourCalm "too many settings"), and connection hiccups on that link are retried instead of taking the node down.
  • Long-running nodes no longer reject layer 2 transactions carrying validity bounds (OutsideForecast/PastHorizon) once past the era-history forecast horizon.
  • Deposits too large to ever be claimed by an increment transaction are rejected up front with a new DepositTooLarge error, and deposit transactions now get a correctly sized validity window instead of one capped at a flat 100s.
  • The internal wallet no longer sets a script integrity hash on transactions that execute no scripts, which the ledger rejected with PPViewHashesDontMatch.
  • hydra-node no longer withholds log output until 64KB has accumulated.

Notable improvements:

  • hydra-node docker images are now published for linux/arm64 alongside linux/amd64, so Apple Silicon and other ARM hosts pull a native image instead of falling back to emulation.
  • The client API gained an opt-in binary CBOR encoding (WebSocket ?encoding=cbor, HTTP application/cbor), with JSON remaining the default.
  • The Blockfrost chain backend is significantly faster and more robust: a full head lifecycle on preview drops from over an hour to minutes, with roughly 75% fewer API requests.
  • The formal specification was migrated to literate Agda + Typst, with machine-checked security proofs differentially tested against the real validators and head logic.

Further breaking changes to be aware of when upgrading:

  • --deposit-period is now a protocol parameter embedded on-chain at init time and must be configured identically by all parties of a head; a new --deposit-activation flag separately controls when deposits become active.
  • The SyncedStatusReport WebSocket output was removed; chain-sync status remains available via NodeUnsynced/NodeSynced events, Greetings.chainSyncedStatus and the new hydra_chain_drift_seconds / hydra_chain_last_block_timestamp_seconds Prometheus metrics.
  • hydra-tui renamed --cardano-signing-key to --funds-signing-key.
  • The --blockfrost-retry-timeout and --blockfrost-query-timeout options were removed; command lines and config files still using them are rejected.

Build artifacts

  • 📦 Binaries for Linux x86_64, Linux ARM64 and MacOS ARM64
  • 🐋 Docker images (hydra-node now multi-arch: linux/amd64 + linux/arm64)

Hydra Scripts

  • preview: 87c5cf15330f8a2988e2fa6d17868ed3b66791aa30537f54b109468062ca5c65,f517904ab1f6b1f9bf3c808e136dbf3577b20ead877f87d43332385aee9d6640
  • preprod: 984053a3a89480b7c929aa19136078f13b3cbc4db4fa21c4ea25fbbb164ba018,1c6c98c425fd160d787b924b63f32ab5af72c8cc0a42704b5753008757b5f86e
  • mainnet: 58ef9ea83415aacd5723879aa1353154c92c2f32127377dc5dfa744457ae33d5,78326683611fc1b90a52dd1bb062abf62979d9a3abdb45830af6b5f2e901bfd1

See also networks.json

Compatible / tested with

  • cardano-node: 11.0.1
  • cardano-cli: 11.0.0
  • mithril: 2630.0

What's Changed

  • Upgrade hydra-coding-standsrds version to 0.8.0 by @vrom911 in #2766
  • Implement selective partial fanout by @vrom911 in #2750
  • Revised metric approach by @noonio in #2768
  • Re-enable golden tests for the persisted event format by @vrom911 in #2773
  • Make hydra-chain-observer version-aware via script hash detection by @v0d1ch in #2740
  • fix paste in the tui; and also reject invalid values by @noonio in #2770
  • Update Mithril references for the move to IntersectMBO by @jpraynaud in #2774
  • See if benches are more comparable now by @noonio in #2775
  • Complete StateChanged generator and remove orphaned golden tests by @vrom911 in #2781
  • perf-0: Measurement and benchmark infrastructure by @noonio in #2776
  • perf-1: Raise maxTxsPerSnapshot from 100 to 1000 by @noonio in #2777
  • perf-2: Batch etcd broadcast into one Raft commit per revision (protocol v2) by @noonio in #2778
  • perf-3: Encode SQLite events on the write-behind thread by @noonio in #2779
  • perf-4: Compute accumulator commitment via rust FFI and update incrementally by @noonio in #2780
  • Enforce --deposit-period consistency across all head nodes by @v0d1ch in #2734
  • Emit SyncedStatusReport only on sync status change by @vrom911 in #2769
  • Make prop_specIsComplete actually enforce API doc completeness by @vrom911 in #2791
  • Decouple Blockfrost inline-datum test from published script hashes by @vrom911 in #2792
  • Make mac release binaries runnable without nix by @vrom911 in #2795
  • Vary the number of parties in the fanout benchmark by @vrom911 in #2796
  • Fix docs dark mode, benchmark page rendering and version links by @vrom911 in #2799
  • Add --deposit-activation flag to decouple activation from deadline by @vrom911 in #2802
  • Plutus time conversion failure by @v0d1ch in #2803
  • Fix some flaky gens in tests by @vrom911 in #2809
  • Bump Mithril to 2630.0 and switch to the v2 database backend by @vrom911 in #2808
  • Reject deposits too large to be claimed by an increment tx by @v0d1ch in #2807
  • Add partial fanout page in docs by @vrom911 in #2794
  • Fix flakey etcd, TUI and chain-sync tests by @noonio in #2811
  • Make rejectLowDeposits a single pass instead of O(n^2) by @vrom911 in #2805
  • Make withTempDir clean up atomically on success by @vrom911 in #2813
  • Tailor protocol paramaters safely for 10 parties by @v0d1ch in #2815
  • Fix tmpdir bug by @noonio in #2816
  • Fix #2817 by @noonio in #2819
  • Blockfrost speedup by @v0d1ch in #2821
  • Test partial fanout recovers funds with an unburned token by @vrom911 in #2793
  • Remove some dead code by @noonio in #2823
  • CBOR-1: Switch to cbor format in DB by @v0d1ch in #2767
  • CBOR-2: Add opt-in binary CBOR encoding to the client API by @v0d1ch in #2762
  • weeder fixups by @noonio in #2832
  • Fix haddock links; fix some search links by @noonio in #2834
  • Unify docs key naming to fuel and funds by @vrom911 in #2800
  • Some library re-use fixes by @noonio in #2825
  • Remove unused JuliaMono weights and document faster clones by @vrom911 in #2839
  • Flakiness fixes by @noonio in #2838
  • Bench variance pairing 1 by @noonio in #2827
  • Bench variance pairing 2 by @noonio in #2828
  • Forgotten fixes from benchmark variance fixes by @noonio in #2840
  • Strict value utxo by @v0d1ch in #2837
  • Fix the flaky snapshot-UTxO thunk test and harden the deposit ingress by @noonio in #2844
  • Blockfrost query caching by @v0d1ch in #2835
  • Trace the KZG trusted-setup warm-up by @vrom911 in #2843
  • Script integrity and reference scripts by @v0d1ch in #2836
  • Typst agda stacked by @noonio in #2847
  • Publish linux/arm64 hydra-node docker images by @aniadev in #2814
  • Speed up smoke tests by @noonio in #2850

Full Changelog: 2.3.0...2.4.0