Node v1.0.0 release notes
For the complete documentation index, see llms.txt
- Version: v1.0.0
- Date: May 20, 2026
- Environment: All public networks at time of release
Docker images
docker pull midnightntwrk/midnight-node:1.0.0
docker pull midnightntwrk/midnight-node-toolkit:1.0.0
High-level summary
Node v1.0.0 is the mainnet GA release. It bumps spec_version to 1_000_000 and transaction_version to 3. The runtime adopts TransactionExtension, replacing the deprecated SignedExtension, tightens the throttle pallet, and lands the Midnight-side handler hooks for the Cardano-to-Midnight bridge. The bridge itself is not enabled in this release; the hooks are preparatory plumbing only. The runtime also migrates to measured benchmark weights.
The node aligns with the polkadot-stable2603 Substrate SDK, gains a self-describing rpc.discover endpoint serving an OpenRPC v1.4 spec, and picks up midnight-ledger 8.1.0 along with a number of audit-driven hardenings. The toolkit now ships as an independently versioned image with substantial new transaction-generation, caching, and observability features.
This release requires a runtime upgrade. SDK consumers using polkadot.js or subxt see no breakage: the new AuthorizeCall and WeightReclaim extensions are zero-sized, so the encoded transaction bytes are unchanged. Only the implicit transaction_version mixed into the signature hash differs, and live signers fetch it from chain state on every sign. The only genuine breakage is pre-signed extrinsics held across the upgrade boundary, which is true for any spec_version bump.
Audience
This release note is relevant for:
- Node operators (all networks): required upgrade. Roll the binary, then submit the runtime upgrade. Re-check
networkIdagainst your chainspec, which is now validated on boot. - DApp developers and SDK consumers: no action required for live signing. polkadot.js and subxt fetch
transaction_versionandspec_versionfrom chain state on every sign, and the two newTransactionExtensionentries are zero-sized, so encoded transaction bytes are unchanged. Pre-signed extrinsics held across the upgrade need re-signing. Userpc.discoverif you generate clients from a spec. - Toolkit users and load-test operators: required upgrade. The toolkit is now independently versioned and ships a new structured-logging stack plus new
show-block,batch-single-tx, and per-seed caching subcommands. - Governance signers: a new
proposal_weight_boundparameter is required onmotion_close. The toolkitruntime-upgradeandupdate-ledger-parameterscommands accept long-form--council-membersand--technical-committee-membersflags. - Cardano bridge consumers: the Cardano-to-Midnight bridge is not enabled at 1.0.0. The handler hooks ship in the runtime so you can develop against the on-chain shape, but no transfers flow until the bridge is turned on in a later release.
What changed (Summary of updates)
The updates below describe the key changes introduced in this release, grouped by area.
Runtime
- Migrated from
SignedExtensiontoTransactionExtension, adding zero-sizedAuthorizeCallandWeightReclaimextensions and bumpingtransaction_versionfrom 2 to 3. - Throttle pallet adds a per-account transaction-count limit (
MaxTxs) with anAccountUsagestorage migration. motion_closegains a requiredproposal_weight_boundparameter and is promoted to the operational dispatch class.- Measured benchmark weights replace default weights across FRAME and local pallets.
- Early block-weight check in the midnight pallet rejects oversized transactions with
ExhaustsResourcesbefore expensive ledger validation runs. - Aligned node, runtime, relay, and partner-chains with the
polkadot-stable2603Substrate SDK. - Landed the Cardano-to-Midnight bridge handler hooks: events,
McTxHashon each transfer, and a handler return value attached to bridge events. Preparatory only; the bridge is not enabled.
Node
- Bumped
midnight-ledgerto 8.1.0, picking up storage-core 1.2.0 incremental garbage collection plus race-condition, panic, leak, and lock-ordering fixes. - New
rpc.discoverendpoint serves an OpenRPC v1.4 spec covering 16 custom and 52 Substrate methods with JSON Schema types. networkIdis validated on node boot against the genesis state.- Genesis file loading rejects symlinks, non-regular files, and files over 10 MB. A new
unsafe_allow_symlinksoption (default off) restores symlink support where needed. - New
ssl_root_certconfiguration option for Postgres connections. - Database host, port, and name are redacted from error logs. Full details remain available at debug level.
- cNIGHT observation queries are faster through an in-memory
multi_asset.idcache and coarse primary-key range bounds that let Postgres prune rows before joins. - Fixed chain-state truncation after unclean shutdown.
Toolkit
- Toolkit images are now versioned independently with
toolkit-X.Y.Ztags. - New
show-blockdiagnostic command andbatch-single-txbulk transaction generation with file-based caches. - Structured logging moves to
tracing_subscriberwith--log-json,--verbose, and--quietflags. The JSON log format change is breaking for log consumers. - Support for multiple shielded coin inputs, fallible contract calls, and zswap state chaining in batched intents.
- Upgraded subxt from v0.44 to v0.50, plus numerous audit-driven correctness and security fixes.
New features
Cardano-to-Midnight bridge handler
The runtime implements the Midnight-side handler for the Cardano-to-Midnight bridge. The bridge emits events, each transfer carries an McTxHash, and the handler returns a value that is attached to bridge events. This is preparatory plumbing: no transfers flow until the bridge is enabled in a later release.
Self-describing JSON-RPC API (rpc.discover)
The node serves an OpenRPC v1.4 specification through a new rpc.discover endpoint, covering 16 custom Midnight methods and 52 Substrate methods with JSON Schema types. The spec is also committed to the repository as docs/openrpc.json for offline client generation.
Throttle pallet: per-account transaction-count limit
The throttle pallet gains a MaxTxs per-account transaction-count limit, with a storage migration for the new AccountUsage item.
Diagnostic show-block toolkit command
The toolkit can render the contents of a block for diagnostics with the new show-block subcommand.
Bulk transaction generation
The toolkit adds batch-single-tx for bulk transaction generation, file-based caches keyed per seed, and a --seeds option on fetch.
Per-SQL-query Prometheus timing
The midnight data source exposes per-SQL-query Prometheus timing metrics, giving operators visibility into db-sync query costs.
New features requiring configuration updates
--max-tx-gas-costtransaction-pool filter, carried forward from v0.22.5.ssl_root_certPostgres TLS option.unsafe_allow_symlinksfile-loading option (default off). See the known issue below.networkIdvalidation on boot. Confirm your chainspecnetworkIdmatches the genesis state before upgrading.
Deprecations
SignedExtensionandSignedExtraruntime extension types, replaced byTransactionExtension.- The toolkit
structured_loggerJSON log format, replaced bytracing_subscriber. - The toolkit positional
new_authorityargument onmaintain-contract, replaced by named flags. - The
*-hfledger feature flags andcfg(hardfork_test)test configuration.
Breaking changes or required actions
transaction_versionbumped to 3: live signers are unaffected because they fetch version material from chain state, but pre-signed extrinsics held across the upgrade boundary must be re-signed.- Cardano-to-Midnight bridge handler API changed: handlers now return a value attached to bridge events, and each transfer carries an
McTxHash. motion_closesignature changed: governance signers must supply the newproposal_weight_boundparameter.- Throttle pallet storage migration: the
AccountUsagemigration runs as part of the runtime upgrade. - Toolkit JSON log format changed: log consumers that parse the old
structured_loggeroutput must be updated for thetracing_subscriberformat. - Toolkit image tag scheme changed: toolkit images are now tagged independently as
toolkit-X.Y.Z.
Bug fixes and quality improvements
Many fixes in this release come from the Least Authority Q1 2026 node audit. The most user-visible fixes:
- Toolkit: encoding zswap state used the nullifier as the nonce. Fixed, with regression tests covering the nonce/nullifier distinction.
- Node: chain-state truncation after unclean shutdown, fixed by explicitly dropping the database backend so parity-db drains its write-ahead log.
- Toolkit:
DustWalletcould return already-spent outputs across consecutive spends. - Toolkit: the Dust address format was off-spec and is now aligned with the specification.
- Toolkit: silent overflow in offer-creation arithmetic now returns an explicit
OfferBuildError, and wallet seed increments return an explicit error on overflow. - Toolkit: intent-file reads are capped at 64 MB, and the parent-block-hash fallback now uses a cryptographically secure RNG.
- Node: unknown system transaction types are rejected with an explicit error instead of being silently accepted.
- Node: the genesis loader no longer accepts symlinks or files over 10 MB by default.
- Security:
rustls-webpki(RUSTSEC-2026-0049) andastral-tokio-tar(RUSTSEC-2026-0066) advisories addressed.
Known issues
Config error: missing field unsafe_allow_symlinks
unsafe_allow_symlinks is a new configuration value that tells the node to follow symbolic links. The field is required in this release, so nodes that run without a TOML configuration file fail to boot with a missing-field error. Provide the value to avoid the error, for example UNSAFE_ALLOW_SYMLINKS=true. Fixed in v1.0.1, which gives the field a default.
Initial sync performance
Initial sync from genesis is slow on some operator hardware, with around 0.2 blocks per second observed. If a curated paritydb snapshot is published for your network, use it; otherwise allow extra time on first bootstrap. Tracked in #1298.