2.4.0
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
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
DepositTooLargeerror, 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-nodeno longer withholds log output until 64KB has accumulated.
Notable improvements:
hydra-nodedocker images are now published forlinux/arm64alongsidelinux/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, HTTPapplication/cbor), with JSON remaining the default. - The Blockfrost chain backend is significantly faster and more robust: a full head lifecycle on
previewdrops 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-periodis now a protocol parameter embedded on-chain at init time and must be configured identically by all parties of a head; a new--deposit-activationflag separately controls when deposits become active.- The
SyncedStatusReportWebSocket output was removed; chain-sync status remains available viaNodeUnsynced/NodeSyncedevents,Greetings.chainSyncedStatusand the newhydra_chain_drift_seconds/hydra_chain_last_block_timestamp_secondsPrometheus metrics. hydra-tuirenamed--cardano-signing-keyto--funds-signing-key.- The
--blockfrost-retry-timeoutand--blockfrost-query-timeoutoptions 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-nodenow 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.1cardano-cli:11.0.0mithril: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