Release Notes - v0.70.0
v0.70.0
Section titled “v0.70.0”Title: Strengthen ledger validation, node reliability, and operator security
Date: Not provided
Version: v0.70.0
This release strengthens Byron validation and replay recovery, improves synchronization and shutdown reliability, expands API security and query capabilities, and updates operator tooling, dependencies, and documentation.
Recommended Network Compatibility ⚠️
Section titled “Recommended Network Compatibility ⚠️”| Network | Compatible |
|---|---|
| mainnet | ⛔ |
| preprod-testnet | ✅ |
| preview-testnet | ✅ |
| musashi | ✅ |
✨ Highlights
Section titled “✨ Highlights”-
Fixed Byron replay by recovering valid redeem witnesses wrapped in CBOR tag 24 from the original transaction data, verifying signatures with the configured Byron protocol magic and domain tags, and matching each witness to the correct input address root. Mainnet from genesis replay now accepts valid Byron inputs, including inputs from private networks with custom protocol magic.
-
Improved rollback and resynchronization by publishing
ChainsyncResyncevents after synchronization locks are released. Subscriber backpressure no longer deadlocks rollback or resynchronization and stalls chainsync. -
Preserved DevNet failure evidence by saving observed chain snapshots, container status, and bounded service logs in separate scenario artifact directories during cleanup. Intermittent scenario failures retain diagnostics after teardown.
-
Added cryptographic and header checks for Byron PBFT blocks, along with issuer and delegation state reconstruction, caching, and Mithril trust boundary handling. These checks reject invalid historical headers while valid processing remains consistent across restarts and rollbacks; current slot clock errors no longer trigger header recovery.
-
Updated
github.com/klauspost/compressto1.19.2, incorporating upstream zstd and huff0 fixes and improvements. -
Introduced an opt-in parallel block decode pipeline with two workers, configurable through
blockPipelineEnabled,DINGO_BLOCK_PIPELINE_ENABLED, or--block-pipeline-enabled. Validation and application retain serial ordering, startup rejects the option on Musashi, and retry handling remains isolated; this experimental option stays disabled by default. -
Refreshed the workflow checkout action pins to
7.0.1, bringing upstream checkout safety fixes into continuous integration. -
Included AWS SDK serialization fixes and a recursive collection panic fix by updating
github.com/aws/smithy-goto1.27.7. -
Expanded API listener security with shared
api.tlsandapi.authdefaults, provider-level overrides underplugins.api.<name>.config, and token authentication for Blockfrost, Mesh, and UTxORPC. The configuration rejects incomplete TLS or authentication settings before listeners start, bypasses authentication for CORS preflight requests, and preserves legacy UTxORPC TLS behavior. -
Changed the default PostgreSQL metadata connection from
sslmode=disabletosslmode=require. Explicit connection strings remain unchanged, while deployments that require plaintext must setsslMode: disableexplicitly. -
Resolved blockfetch stalls by releasing locks around requests, draining earlier work for each connection, ignoring stale generations, moving continuations to workers, and bounding shutdown. Synchronization and shutdown no longer wedge under callback or backpressure interactions, and repeated in-flight timeouts now log at
Warn. -
Established on-chain Leios BLS key and proof of possession verification with deterministic committees selected by stake coverage. Dingo no longer uses derived fallback keys and requires configured signing keys to match registered on-chain keys; this experimental behavior prevents keyless or mismatched operators from contributing verified votes.
-
Corrected reward withdrawal accounting by exposing
LedgerView.RewardAccountBalance, rejecting withdrawals above the available balance, subtracting partial withdrawals, and retaining zero-withdrawal validation. Balances now remain consistent across partial withdrawals, replay, and rollback. -
Retained configured Genesis fork selection during live restore and truncate operations, so the selection remains active without a restart.
-
Isolated the pprof bind address with
debugBindAddr,DINGO_DEBUG_BIND_ADDR, and--debug-bind-addr. The debug listener now defaults to loopback independently of public or private binds across serve and Mithril paths; wildcard exposure requires explicit configuration. -
Enabled
UtxosByTxInqueries to accept multiple transaction inputs through batched, deduplicated, and chunked lookups. Ledger queries omit missing live inputs, while UTxORPC retains its error on missing contract. -
Refined the Google API dependency set with
google.golang.org/api0.292.0and aligned gRPC and genproto dependencies, refreshing client definitions and checksums. -
Completed partially fetched Leios endorser blocks when peers re-offer them by retaining sparse transaction progress and requesting only missing tail entries. An expiry limit for incomplete cache entries prevents indefinite retention; this experimental behavior helps near-tip blocks finish instead of restarting partial fetches.
-
Hardened release validation with race-enabled checks, timeouts, safer shell handling, multi-architecture manifest checks, pinned actions, and reduced permissions. Release automation now protects published releases from deletion or overwrite during reruns.
-
Recovered from deterministic replay transaction failures by identifying duplicate inputs, performing bounded rewind and fresh intersection recovery, and throttling repeated attempts with a latch. These failures no longer cause endless peer rotation or replay stalls.
-
Configured root peer selection through
targetNumberOfRootPeers,DINGO_TARGET_ROOT_PEERS, or--target-root-peers. Dingo settings take precedence over Cardano settings, the default is60,-1means unlimited, live reinitialization applies changes without a restart, and Dingo preserves local roots. -
Secured Mithril archive extraction by rejecting destination symlinks and time-of-check-to-time-of-use races, verifying digests, and publishing vetted trees atomically. Exclusive, merge, and replace policies control extraction, and an exclusive extraction into a non-empty destination now requires the replace policy.
-
Protected storage after an incomplete ledger drain by skipping database and plugin shutdown and returning an explicit error. This avoids closing storage while ledger work may still be active and reduces corruption risk.
-
Redacted secret-bearing configuration from startup logs with structured, fail-safe handling for tokens, keys, passwords, DSNs, and unknown fields. Text and JSON logs retain troubleshooting details without exposing secrets.
-
Documented standardized discovery through
docs/README.mdanddocs/code-reference.md. Repository guidance files now link to these pages so readers and coding agents can find version-matched documentation. -
Corrected epoch forecasting at hard-fork and era boundaries so cached parameters never cross a confirmed or configured boundary; the ledger applies successor-era parameters during full rollover and retains deferred header-verification classification.
-
Expanded Mesh and Rosetta contract coverage and corrected block height and index translation. Historical
/account/balancerequests now use the requested block, returnblock-not-foundfor unresolved points, and advertise historical lookup. -
Protected Unix socket paths with metadata, liveness, and identity checks, removing only confirmed stale sockets. Startup now preserves regular files, symlinks, directories, live sockets, and ambiguous paths and reports a clear failure.
-
Updated the Sundae Preview example dependency
@sundaeswap/coreto2.13.1and its transitive@sundaeswap/mathdependency to0.3.0; the latter requires TypeScript 5 for the example build environment. -
Enhanced development and build tooling for the Sundae Preview example by updating the
vitedevelopment dependency inexamples/dingo-sundae-previewfrom8.2.0to8.2.1and refreshing its matching lockfile and dependency graph. -
Refreshed the Blockfrost Explorer example Vite dependency to
8.2.1with matching lockfile updates, bringing upstream fixes and improvements. -
Improved DevNet cleanup so it remains best effort without replacing the underlying test exit status. Temporary stake keys now retain the host user and group ownership, and cleanup handles temporary directories more reliably.
-
Verified exact ChainSync messages exchanged between peers through shared protocol fixtures and a side-effect-free client lookup, making protocol regressions visible through actual message behavior.
-
Hardened reward and withdrawal parity checks with nil-safe helpers and modern iteration, keeping pre-commit static analysis clean without changing production behavior.
-
Aligned deployable Blockfrost Explorer, Gov Lens, and Sundae Preview Kubernetes examples with Dingo
0.70.0image pins and matching README versions. -
Enabled optional API-mode synchronization with CIP-26 token registries and local metadata caching for Blockfrost asset responses. Operators can configure the source, interval, timeouts, size limits, logo storage, and private-address allowance through YAML, environment variables, or CLI flags; the feature is disabled by default and the mainnet registry is approximately
240 MB. -
Restored Byron-era state at slot
0during genesis sync for Byron-genesis networks, avoiding Shelley-shaped parameters and skipping inappropriate Byron reward calculation. Existing stale epoch-cache geometry now triggers a warning that requires an empty-database resync; Dingo does not repair it automatically. -
Clarified Windows keyfile permission checks by distinguishing an unresolvable DACL trustee from a foreign trustee. The
LAalias is accepted only for Built-in Administrators ownership, while unsafe ownership remains rejected. -
Strengthened remote restore recovery with preflight validation, rollback backups for metadata and blob pairs, compensating rollback, and a retryable
RestoreRecoveryhandle. Failed external restores no longer leave mixed provider state, and nodes remain stopped while rollback requires attention. -
Implemented UTxORPC v1beta
QueryService.ReadStatefor CardanoGetStakePoolDistributionwith deterministic ordering, a consistent ledger tip, bounded validated filters, and structured unavailable errors. Clients no longer receiveUNIMPLEMENTEDfor this query. -
Closed the EventBus in the unsubscribe test so its asynchronous worker exits, preventing the event package tests from leaving a worker behind without changing production behavior.
-
Improved YAML parse and decode errors by including the resolved configuration file path, and kept the bundled example configuration parseable. Startup failures now identify the file that requires correction.
-
Updated AWS SDK credentials and related module versions and checksums, bringing upstream maintenance and S3 response-handling fixes to builds.
-
Forwarded accepted peer votes through Leios relays by reusing the diffusion queue without duplicating diffusion across live lifecycle rebuilds. This experimental behavior lets relay-connected prototype block producers receive forwarded peer votes.
-
Adjusted OpenTelemetry dependencies so OTLP HTTP endpoints without a path no longer append
/v1/traces; endpoint configurations may need an explicit signal path such as/v1/traces, and Retry-After handling has changed. OTLP HTTP trace export now supportsattribute.MAPvalues. -
Renamed the metadata transaction-handle interface from
metadata.TransactionStoretometadata.TxnStorewhile splitting narrower storage interfaces. Downstream code that usesmetadata.TransactionStorefor transaction handles must switch tometadata.TxnStore. -
Pinned Docker Buildx action references to
4.3.0, so CI and publishing use the newer pinned action. -
Limited consumed UTxO cleanup to bounded batches and made blockfetch waits observe ledger cancellation, keeping catch-up and teardown responsive.
-
Added PostgreSQL
statementTimeoutandlockTimeoutsettings and MySQLstatementTimeout,lockTimeout,readTimeout, andwriteTimeoutsettings for metadata work. SQL transactions now propagate cancellation and validate timeout values; all fields default to zero, and explicit DSNs ignore these provider timeout fields. -
Introduced scheduled and manual benchmark comparisons with persistent run history, statistically significant slowdown reporting, and symlink and path safety. Benchmark drift is surfaced without gating merges.
-
Scoped imported reward parameters to the relevant positive-stake snapshots, aggregated incomplete-pool errors deterministically, and corrected skip-warning attribution. Mithril-imported reward seeding now avoids unrelated pools and reports all incomplete inputs.
-
Made mempool eviction optional:
evictionWatermark: 0disables FIFO eviction, the defaults are nowevictionWatermark: 0andrejectionWatermark: 1.0instead of0.90and0.95, positive eviction values must remain below the rejection watermark, and transaction submission now considers available admission headroom. -
Enabled database snapshot, restore, and truncate commands for PostgreSQL, MySQL, S3, and GCS metadata and data:
dingo database snapshot,dingo database restore, anddingo database truncate. The commands validate before destructive resets, cloud backups use framed data,snapshotDirmust be writable, and Docker database environments include UID/GID1000:1000and database client tools. -
Prevented nodes from silently stopping chain following by resolving event delivery and network to chain stalls and deferred header liveness wedges. Leader threshold and pipeline telemetry now expose progress, imported reward bases receive their initial state, and SQLite WAL startup is more reliable.
-
Added support for the Musashi
2026w32prototype respin with updated genesis, protocol, topology, and snapshot data. The respin requires node version11.1.0-prototype-2026w32and uses the updated snapshot schema. -
Updated the SQLite driver and embedded engine dependencies.
-
Deferred consumed UTxO cleanup during catch-up when the node is materially behind a known upstream tip and prevented overlapping cleanup runs. When the upstream tip is unknown, cleanup falls back to the local tip.
-
Normalized Mithril snapshot metadata before checking cache paths by validating network and digest identity and applying consistent v1 and v2 cache and extraction paths.
-
Improved chain selection and recovery by trusting delivered peer frontiers instead of advertised tips, including history that remains safe across rollbacks.
-
Stabilized database telemetry with consistent signal behavior, connection pool health checks, and Unix socket DSN parsing fixes. Legacy signals and the opt in setting are no longer available.
-
Refreshed the Blockfrost Explorer development type definitions for Node.js.
-
Defined Koios parity coverage with a coverage matrix, strict epoch matching, and explicit parity omissions in reports.
-
Hardened continuous integration attestations with the updated attestation action.
-
Expanded streamed UTxO CBOR maps to support up to
100,000,000entries, while generic maps remain limited to10,000,000entries. -
Scoped Conway feature checks to the scripts that require them, so unrelated available Plutus V1 and V2 reference scripts no longer cause Conway feature rejection.
-
Updated the OpenTelemetry stdout exporter dependency.
-
Quieted routine Mithril snapshot messages by moving per file synchronization details to
DEBUGwhile keeping aggregate progress visible. -
Clarified Leios peer vote diffusion: peer votes now receive a one hop echo through the relay.
-
Handled multi era boundary blocks by validating authorized two era transitions, applying the source transition before the successor transition, and recording the final era protocol version in the snapshot.
-
Ignored historical primary chain headers during primary chain replay so they no longer trigger fork resolution, and kept local header lookup from falling back to archive storage.
-
Preserved the wire sizes of reconstructed pre Alonzo Shelley and Allegra update transactions for fee and size validation. Typed nil protocol parameters now return an incompatibility error.
-
Synchronized terminal recovery resync handling so recovery reaches its final state deterministically.
-
Hardened strict Koios preview validation by propagating parity failures as fatal errors, skipping pre staking account scans, setting the default account reward history request body limit to
4 KiB, and correcting ledger boundary transition ordering and timing. -
Admitted locally forged blocks synchronously without EventBus proposal matching, then ran observers after admission.
-
Rejected future ChainSync headers by recording network arrival time, waiting until slot onset within a two-second clock skew window when appropriate, and dropping headers outside the window without changing state or penalizing peers. A single coalesced resynchronization per connection now starts at the earliest dropped slot, and shutdown or connection removal cancels pending timers.
-
Updated the AWS SDK configuration dependency from
1.32.31to1.32.37, including upstream maintenance for S3 response body handling. -
Introduced optional experimental VRF and KES validation in the block processing pipeline through
blockPipelineValidateEnabled,--block-pipeline-validate-enabled, orDINGO_BLOCK_PIPELINE_VALIDATE_ENABLED. Block processing must also be enabled; validation, recovery, and metrics improvements apply only when this option is explicitly enabled, and it remains disabled by default. -
Accelerated event-driven DevNet scenarios, aligned test user and group identities with the host, protected pending publishes with locks, and preserved failure artifacts for diagnosis.
-
Restricted Musashi validation bypasses to an unambiguous prototype profile and rejected conflicting network identity combinations, establishing a clear prototype compatibility boundary.
-
Extracted the ChainSync stall recycler into a lifecycle-managed component while preserving its behavior and improving shutdown handling and testability.
-
Expanded
GetUTxOByAddressto accept multiple addresses with exact filtering, chunked lookups, and duplicate removal. -
Required HTTPS for Mithril aggregator and artifact URLs by default. Local development and tests can use the default-false
mithril.allowInsecureHttpsetting,--mithril-allow-insecure-http, or theDINGO_MITHRIL_ALLOW_INSECURE_HTTPescape hatch. -
Upgraded the pgx PostgreSQL driver from
5.9.2to5.10.0, incorporating decoder bounds, TLSCancelRequest, and connection handling fixes. -
Refreshed the Sundae Preview development dependency
@types/nodefrom26.1.2to26.2.0. -
Corrected full final Plutus ExUnits accounting for slippage batches and expanded typed validation coverage.
-
Changed Ouroboros construction to require dependency injection, safely close and replace instances during live restore, and preserve handlers. Library callers must provide the required dependencies when constructing Ouroboros instances.
-
Controlled CIP-0163 delegator inactivity witness writes with top-level
delegatorInactivityEnabledanddelegatorInactivitysettings and matching CLI and environment bindings. This consensus-affecting feature remains off by default and cannot run with Mithril bootstrap enabled. -
Rebuilt the Musashi prototype cardano configs image as
20260817-1; prototype deployments must rebuild and redeploy with the updated image. -
Bounded PeerGovernor shutdown and ledger peer DNS and discovery with contexts and a shared shutdown timeout.
-
Added artifact and snapshot identity, phase, and aggregate archive file counts to Mithril progress and logs, with one callback for concurrent immutable downloads.
-
Improved shared blob and metadata storage conformance and migration tests and corrected S3 handling for empty pages and
404responses. -
Preserved and repaired
transaction_idindexes required by witness cleanup during deferred index drops and rebuilds, preventing API mode backfill degradation. -
Upgraded the root gouroboros dependency from a pseudo-version to released
v0.194.0and updated protobuf, including upstream deep-fork chain selection behavior. -
Raised nested-module Go toolchain floors to
1.26.7, addedgovulncheckcontinuous integration and pre-commit instructions, and updated the scanner invocation policy. -
Hardened optional experimental block pipeline validation so replay rejects invalid OpCert and KES cases, propagates errors, and recovers persisted failures. Admission cryptography remains fail closed, and the enabled combination requires a nonzero Shelley
slotsPerKESPeriod; the option remains disabled by default. -
Staged ledger Apply events until durable commit and serialized Apply and Undo ordering around rollback. Failed transactions no longer emit Apply events.
-
Returned read-only stake distribution transaction cleanup errors and joined them with calculation errors. Callers can receive a distribution together with a non-nil error.
-
Refined analyzer cleanliness and test and benchmark hygiene without changing production behavior.
-
Secured Mithril snapshot download and extraction filesystem operations with verified
os.Roothandles to prevent time-of-check-to-time-of-use symlink escapes. The Go toolchain floor is1.26.7, andgovulnchecknow gates releases. -
Fixed rollback handling for accounts imported from Mithril or genesis data by restoring active, pool, and DRep status when no registration certificate is available. Dingo upgrades existing databases automatically and keeps account state and its rollback reference atomic.
-
Halted ledger processing when Mithril trust-window validation cannot recover through the permitted paths. Persistent halt and unrecoverable trust-window signals, together with repeated error announcements, identify when a newer snapshot or a genesis resynchronization is required.
-
Shared block and header decoding across peer connections for identical data with bounded caching and hit and miss metrics, reducing repeated decoding work while keeping failures isolated.
-
Corrected the Docker build configuration so BuildKit checks pass before an image build begins, preventing undefined environment expansions from reaching the build.
-
Preserved the Byron EBB parent state when resuming genesis or bootstrap processing, ensuring that the first Byron block after the slot-zero EBB receives the correct validation. An unavailable parent classification no longer bypasses normal validation.
-
Limited decoded block buffering to one commit batch for BlockFetch subscribers and one 50-block batch during chain replay, reducing retained memory while preserving lossless backpressure.
-
Expanded Koios reward-account parity to compare every account exactly per epoch, with coverage-aware fetching and caching, mismatch reporting, optional standalone account checks, and validation that rejects negative grace periods. In-process observer checks are enabled by default and may increase Koios requests.
-
Improved DevNet portability by deriving expected Docker user and group IDs from Bash
id, so cleanup assertions work on Linux, macOS, and Windows Git Bash. -
Recovered queued blockfetch operations after an unavailable range by retrying on the active best peer, reporting recovery only after it starts successfully, and clearing stale peer selection when every attempt fails.
-
Skipped Mithril directory-swap regression checks on platforms that cannot rename open directories, while retaining coverage where the operation is supported.
-
Added Windows build and test coverage outside the release path for pushes to
mainand manual runs, with bounded jobs and diagnostics for hung tests. -
Released the transaction commit barrier exactly once on each terminal path, including blob synchronization failures, so later writers and snapshot operations do not stall.
-
Updated the Antithesis validation environment to gouroboros
v0.194.0, plutigov0.3.0, and testifyv1.12.0, along with refreshed indirect dependencies. -
Restored post-Mithril leader checks using the imported capture point, ensuring stake-threshold validation applies to the first complete epoch after a mid-epoch bootstrap while retaining legacy exact-anchor compatibility.
-
Removed the unavailable
backbone.mainnet.emurgornd.com:3001endpoint from the mainnet topology, so nodes no longer attempt to use that bootstrap peer after redeployment. -
Bumped
aws-sdk-go-v2from1.43.6to1.43.7, bringing upstream S3 presigning and HTTP 200 error-handling fixes. -
Persisted effective Shelley and Musashi extra genesis pools and delegations before capturing the genesis snapshot, rejecting ambiguous duplicate pool assignments without requiring a schema change.
Full Changelog: v0.69.0…v0.70.0
Docs authored by Doc Holiday