Releases: celestiaorg/celestia-node
v0.27.2-mocha
This release includes changes necessary for celestia-app v6 compatibility. It also reduces the storage window from 30 days to 7.
If bumping directly from v0.25.3-mocha to this release, please see release notes for v0.26.1-mocha that contain important changes + features.
What's Changed
- params(share/availability)!: Decrease storage window from 30 days to 7 days + 1 hour by @renaynay in #4521
- chore: bump celestia-app to v6 by @evan-forbes in #4503
- forward-port: config(nodebuilder/header): bumps go-header, removes trustingPeriod by @renaynay in #4529
- chore!: bump go-square and app; use construct EDS by @cmwaters in #4565
- fix(cel-shed): start the store (#4566) by @renaynay in #4569
- chore: use arabica tag by @evan-forbes in #4570
- deps(go.mod): bump app to arabica release by @renaynay in #4578
- deps(go.mod): bump mocha v6 by @renaynay in #4582
Full Changelog: v0.26.2-mocha...v0.27.2-mocha
v0.27.2-arabica
What's Changed
Full Changelog: v0.27.1-arabica...v0.27.2-arabica
v0.26.3-mocha
Contains a bump to celestia-app that should resolve account sequence mismatch errors
What's Changed
- deps(go.mod): Bump celestia-app to newest v5 release by @renaynay in #4584
- chore: bump go-header by @Wondertan in #4589
- chore: bump go-header for tastora by @Wondertan in #4591
Full Changelog: v0.26.2-mocha...v0.26.3-mocha
v0.27.1-arabica
This release includes changes necessary for celestia-app v6 compatibility. It also reduces the storage window from 30 days to 7.
If bumping directly from v0.25.3-arabica to this release, please see release notes for v0.26.0-arabica that contain important changes + features.
What's Changed
- chore!: bump go-square and app; use construct EDS by @cmwaters in #4565
- fix(cel-shed): start the store (#4566) by @renaynay in #4569
- chore: use arabica tag by @evan-forbes in #4570
Full Changelog: v0.27.0-arabica...v0.27.1-arabica
v0.26.2-mocha
See docs for further information.
This release notably introduces...
- a unified share exchange protocol (via unified shrex), a pre-requisite for sampling over our custom share exchange
- header pruning via #4330
Header pruning
In order to use header pruning, please check out the new header configuration parameters in config.toml:
[Header.Syncer]
# PruningWindow defines the duration within which headers are retained before being pruned.
# Default is 337 hours.
PruningWindow = "337h0m0s"
# SyncFromHash is the hash of the header from which the syncer should start syncing.
# Zero value to disable. Value updates up and down the chain are gracefully handled by Syncer.
#
# By default, Syncer maintains PruningWindow number of headers. SyncFromHash overrides this default,
# allowing any user to specify a custom starting point.
#
# SyncFromHash has higher priority than SyncFromHeight.
SyncFromHash = ""
# SyncFromHeight is the height of the header from which the syncer should start syncing.
# Zero value to disable. Value updates up and down the chain are gracefully handled by Syncer.
#
# By default, Syncer maintains PruningWindow number of headers. SyncFromHeight overrides this default,
# allowing any user to specify a custom starting point.
#
# SyncFromHeight has lower priority than SyncFromHash.
SyncFromHeight = 0Please do not copy these values directly into the config -- please use the config-update command. Read the docs here.
For BN (Bridge Node) runners
Please do the following to migrate properly:
make cel-shed
./cel-shed header store-reset <node_path> --tail 1.
Default LNs no longer support historical queries
By default, node maintains a sliding window of headers, bounded by Tail and Head headers. Requests with height below the Tail are rejected (This is, however, temporary, and lazy header fetching will be available with Backward Sync)
To retain the ability to request older queries with LNs, use new configuration fields to set an absolute header that the node will sync from, either the SyncFromHeight or the SyncFromHash field.
LNs only
Pruning for Bridge and Full nodes is disabled. Currently, the p2p protocol for headers cannot distinguish between pruned and non-pruned serving node types. Therefore, to keep stable synchronization of historical headers, we disable pruned servers.
Prolonged Starts
- If your LN stores a significant portion of the history of headers, you may need to increase the
StartTimeoutvalue in the config, as LN prunes on start. If the starting times out, e.g., with the default 20s, the node will attempt to persist the progress, but storage state corruptions may still occur. The complete mainnet header history pruning on moderate hardware takes under 100s, so update your config accordingly. - If you move the tail down the chain (e.g., SyncByHeight 150 -> 100), you may need to increase the
StartTimeoutvalue in the config, as LN syncs the difference during start. (This is, however, temporary, and asynchronous syncing that doesn't block start will be available with Backward Sync).- WARNING: This feature wasn't tested extensively and may break in unknown ways. Use at your own risk!
Config Breaks
Daser.SampleFromfield is no longer supported. UseHeader.Syncer.SyncFromHeightinstead.Header.TrustedHashfield is no longer supported. UseHeader.Syncer.SyncFromHashinstead.Header.TrustedPeriodfield was removed and is now a network-level constant.
Replace
Replace for go-datastore was added, which may break users depending directly on the node's go.mod.
Do the following in your project's root to fix:
go mod edit -replace github.com/ipfs/go-datastore=github.com/celestiaorg/go-datastore@48a63ae && go mod tidy. It's gonna be removed in future releases.
What's Changed
- fix(cel-shed): start the store by @Wondertan in #4566
Full Changelog: v0.26.1-mocha...v0.26.2-mocha
v0.26.1-mocha
See docs for further information.
This release notably introduces...
- a unified share exchange protocol (via unified shrex), a pre-requisite for sampling over our custom share exchange
- header pruning via #4330
Header pruning
In order to use header pruning, please check out the new header configuration parameters in config.toml:
[Header.Syncer]
# PruningWindow defines the duration within which headers are retained before being pruned.
# Default is 337 hours.
PruningWindow = "337h0m0s"
# SyncFromHash is the hash of the header from which the syncer should start syncing.
# Zero value to disable. Value updates up and down the chain are gracefully handled by Syncer.
#
# By default, Syncer maintains PruningWindow number of headers. SyncFromHash overrides this default,
# allowing any user to specify a custom starting point.
#
# SyncFromHash has higher priority than SyncFromHeight.
SyncFromHash = ""
# SyncFromHeight is the height of the header from which the syncer should start syncing.
# Zero value to disable. Value updates up and down the chain are gracefully handled by Syncer.
#
# By default, Syncer maintains PruningWindow number of headers. SyncFromHeight overrides this default,
# allowing any user to specify a custom starting point.
#
# SyncFromHeight has lower priority than SyncFromHash.
SyncFromHeight = 0Please do not copy these values directly into the config -- please use the config-update command. Read the docs here.
Default LNs no longer support historical queries
By default, node maintains a sliding window of headers, bounded by Tail and Head headers. Requests with height below the Tail are rejected (This is, however, temporary, and lazy header fetching will be available with Backward Sync)
To retain the ability to request older queries with LNs, use new configuration fields to set an absolute header that the node will sync from, either the SyncFromHeight or the SyncFromHash field.
LNs only
Pruning for Bridge and Full nodes is disabled. Currently, the p2p protocol for headers cannot distinguish between pruned and non-pruned serving node types. Therefore, to keep stable synchronization of historical headers, we disable pruned servers.
Prolonged Starts
- If your LN stores a significant portion of the history of headers, you may need to increase the
StartTimeoutvalue in the config, as LN prunes on start. If the starting times out, e.g., with the default 20s, the node will attempt to persist the progress, but storage state corruptions may still occur. The complete mainnet header history pruning on moderate hardware takes under 100s, so update your config accordingly. - If you move the tail down the chain (e.g., SyncByHeight 150 -> 100), you may need to increase the
StartTimeoutvalue in the config, as LN syncs the difference during start. (This is, however, temporary, and asynchronous syncing that doesn't block start will be available with Backward Sync).- WARNING: This feature wasn't tested extensively and may break in unknown ways. Use at your own risk!
Config Breaks
Daser.SampleFromfield is no longer supported. UseHeader.Syncer.SyncFromHeightinstead.Header.TrustedHashfield is no longer supported. UseHeader.Syncer.SyncFromHashinstead.Header.TrustedPeriodfield was removed and is now a network-level constant.
Replace
Replace for go-datastore was added, which may break users depending directly on the node's go.mod.
Do the following in your project's root to fix:
go mod edit -replace github.com/ipfs/go-datastore=github.com/celestiaorg/go-datastore@48a63ae && go mod tidy. It's gonna be removed in future releases.
What's Changed
- fix: ensure default core.port is always set via flag by @DeVikingMark in #4440
- test: cleanup tastora framework by @gupadhyaya in #4465
- feat(cmd/share): add range cmd by @vgonkivs in #4464
- shwap!(shrex): unify shrex-nd and shrex-eds by @vgonkivs in #4249
- fix(pruner): change header -> blocks in logs by @renaynay in #4194
- feat: integrate pruning by @Wondertan in #4330
- deps(nodebuilder/tests/tastora): fix go mod by @renaynay in #4517
- chore: fix Go init order + tidy up flags by @hexcow in #4522
- config(nodebuilder/header): bumps go-header, removes trustingPeriod by @renaynay in #4524
- fix(discovery): remove panic in switch statement by @vgonkivs in #4526
- fix(api/client-lib): fix close order for Celestia client lib by @walldiss in #4520
- fix(share/shwap): parallelise namespace data collection by @vgonkivs in #4536
- chore(deps): bump github.com/ulikunitz/xz from 0.5.12 to 0.5.14 by @dependabot[bot] in #4512
- chore(deps): bump actions/setup-go from 5 to 6 by @dependabot[bot] in #4533
- chore(deps): bump actions/setup-node from 4 to 5 by @dependabot[bot] in #4531
- chore(deps): bump codecov/codecov-action from 4.5.0 to 5.5.1 by @dependabot[bot] in #4532
- dep: bump go-square by @vgonkivs in #4540
- chore: bump go-header by @Wondertan in #4544
- fix(pruner): check nil context by @Wondertan in #4546
- deps(go.mod): Bump app by @renaynay in #4547
- chore(deps): bump celestiaorg/.github from 0.4.5 to 0.6.4 by @dependabot[bot] in #4514
- Revert "dep: bump go-square (#4540)" by @renaynay in #4560
New Contributors
- @DeVikingMark made their first contribution in #4440
- @hexcow made their first contribution in #4522
Full Changelog: v0.25.3-mocha...v0.26.1-mocha
v0.27.0-arabica
This release includes changes necessary for celestia-app v6 compatibility. It also reduces the storage window from 30 days to 7.
If bumping directly from v0.25.3-arabica to this release, please see release notes for v0.26.0-arabica that contain important changes + features.
What's Changed
- params(share/availability)!: Decrease storage window from 30 days to 7 days + 1 hour by @renaynay in #4521
- chore: bump celestia-app to v6 by @evan-forbes in #4503
- forward-port: config(nodebuilder/header): bumps go-header, removes trustingPeriod by @renaynay in #4529
Full Changelog: v0.26.0-arabica...v0.27.0-arabica
v0.26.0-arabica
See docs for further information.
This release notably introduces...
- a unified share exchange protocol (via unified shrex), a pre-requisite for sampling over our custom share exchange
- header pruning via #4330
Header pruning
In order to use header pruning, please check out the new header configuration parameters in config.toml:
[Header.Syncer]
# PruningWindow defines the duration within which headers are retained before being pruned.
# Default is 337 hours.
PruningWindow = "337h0m0s"
# SyncFromHash is the hash of the header from which the syncer should start syncing.
# Zero value to disable. Value updates up and down the chain are gracefully handled by Syncer.
#
# By default, Syncer maintains PruningWindow number of headers. SyncFromHash overrides this default,
# allowing any user to specify a custom starting point.
#
# SyncFromHash has higher priority than SyncFromHeight.
SyncFromHash = ""
# SyncFromHeight is the height of the header from which the syncer should start syncing.
# Zero value to disable. Value updates up and down the chain are gracefully handled by Syncer.
#
# By default, Syncer maintains PruningWindow number of headers. SyncFromHeight overrides this default,
# allowing any user to specify a custom starting point.
#
# SyncFromHeight has lower priority than SyncFromHash.
SyncFromHeight = 0Please do not copy these values directly into the config -- please use the config-update command. Read the docs here.
Default LNs no longer support historical queries
By default, node maintains a sliding window of headers, bounded by Tail and Head headers. Requests with height below the Tail are rejected (This is, however, temporary, and lazy header fetching will be available with Backward Sync)
To retain the ability to request older queries with LNs, use new configuration fields to set an absolute header that the node will sync from, either the SyncFromHeight or the SyncFromHash field.
LNs only
Pruning for Bridge and Full nodes is disabled. Currently, the p2p protocol for headers cannot distinguish between pruned and non-pruned serving node types. Therefore, to keep stable synchronization of historical headers, we disable pruned servers.
Prolonged Starts
- If your LN stores a significant portion of the history of headers, you may need to increase the
StartTimeoutvalue in the config, as LN prunes on start. If the starting times out, e.g., with the default 20s, the node will attempt to persist the progress, but storage state corruptions may still occur. The complete mainnet header history pruning on moderate hardware takes under 100s, so update your config accordingly. - If you move the tail down the chain (e.g., SyncByHeight 150 -> 100), you may need to increase the
StartTimeoutvalue in the config, as LN syncs the difference during start. (This is, however, temporary, and asynchronous syncing that doesn't block start will be available with Backward Sync).- WARNING: This feature wasn't tested extensively and may break in unknown ways. Use at your own risk!
Config Breaks
Daser.SampleFromfield is no longer supported. UseHeader.Syncer.SyncFromHeightinstead.Header.TrustedHashfield is no longer supported. UseHeader.Syncer.SyncFromHashinstead.Header.TrustedPeriodfield was removed and is now a network-level constant.
Replace
Replace for go-datastore was added, which may break users depending directly on the node's go.mod.
Do the following in your project's root to fix:
go mod edit -replace github.com/ipfs/go-datastore=github.com/celestiaorg/go-datastore@48a63ae && go mod tidy. It's gonna be removed in future releases.
What's Changed
- fix: ensure default core.port is always set via flag by @DeVikingMark in #4440
- test: cleanup tastora framework by @gupadhyaya in #4465
- feat(cmd/share): add range cmd by @vgonkivs in #4464
- shwap!(shrex): unify shrex-nd and shrex-eds by @vgonkivs in #4249
- fix(pruner): change header -> blocks in logs by @renaynay in #4194
- feat: integrate pruning by @Wondertan in #4330
- deps(nodebuilder/tests/tastora): fix go mod by @renaynay in #4517
- chore: fix Go init order + tidy up flags by @hexcow in #4522
- config(nodebuilder/header): bumps go-header, removes trustingPeriod by @renaynay in #4524
New Contributors
- @DeVikingMark made their first contribution in #4440
- @hexcow made their first contribution in #4522
Full Changelog: v0.25.3-arabica...v0.26.0-arabica
v0.25.3
This release includes significant changes accumulated since May 2025 while waiting for the Celestia App v4/v5 mainnet update. Please review all breaking changes carefully before upgrading.
TL;DR
🚨 This release breaks both API and config!
⚠️ API Breaking Changes- JSON integers now encoded as strings (Tendermint compatibility)
- Blobstream root encoding switched to hex (plus pointer cleanups in Go API)
- Gateway removed → use direct API; configure CORS as needed
- Share Samples API now uses height parameter instead of ExtendedHeader
- Share encoding in Samples response changed to base64 string (was object with data field)
- 🤏🏻 Data Retention Changes
- Full Nodes: Pruning enabled by default (≈30 days)
- Light Nodes: Sampling window reduced to 7 days
- Use
--archivalto keep full history - Update config to remove pruning-related fields
- ✨ API Enhancements – Configurable CORS, new client library, multi-endpoint tx submission
- 🐎 Faster GetRange – Uses shwap protocol for efficient partial retrieval
- 🏎️ Performance Boosts – Parallelized namespace data; optimized blob retrieval
- 🥾 Bootstrap Updates – Added 01node mainnet bootstrap; removed outdated nodes
🚨 Breaking Changes
🗒️ Configuration Breaking Changes
This release contains configuration breaking changes. Node operators must run the config update command before starting their node:
celestia <node_type> config-update --p2p.network (or --node.store)
⚠️ API & JSON Compatibility
- fix(api/header)!: tendermint compatible json marshall #3928 by @zvolin (ported in #4428)
- fix(share)!: tendermint compatible get range result json marshall by @zvolin in #3930
- fix(blob)!: tendermint compatible commitment proof json marshall #3929 by @zvolin (ported in #4434)
Changes:
- Integer values in JSON responses are now encoded as strings for Tendermint compatibility
- Example:
“height”: 67374becomes“height”: “67374”
Migration: Update JSON parsing logic to handle integers as strings in header, share range, and blob commitment proof endpoints.
Share API Consistency Improvements
Samples Method Signature Change
- !fix(api/share) use height in Samples method by [@walldiss](https://github.com/walldiss) in [[#4481](https://github.com/celestiaorg/celestia-node/pull/4481)](https://github.com/celestiaorg/celestia-node/pull/4481)
Changes:
Samplesmethod now acceptsheightparameter directly- No longer requires passing
ExtendedHeader - Brings consistency with other share module methods
Migration:
// Before:
samples, err := client.Share.GetSamples(ctx, header)
// After:
samples, err := client.Share.GetSamples(ctx, height)
Share Encoding in Samples Response
- !fix(api/share) encode share in sample json as base64 by [@walldiss](https://github.com/walldiss) in [#4480](https://github.com/celestiaorg/celestia-node/pull/4480)
Changes:
- Shares in
GetSamplesresponse now encoded as base64 strings - Previously encoded as objects with
datafield - Matches encoding format used by
GetRowand other methods
Migration:
// Before (v0.25.0-v0.25.1):
{
"share": {
"data": "AAAAAAA...base64..."
},
"proof": { ... }
}
// After (v0.25.2+):
{
"share": "AAAAAAA...base64...",
"proof": { ... }
}
Update JSON parsing to expect shares as direct base64 strings rather than nested objects.
❌ Gateway Removal
- refactor(api)!: removing gateway by @distractedm1nd in #4120
Migration: If you were using the gateway, switch to direct API endpoints. Configure CORS policy using the new configurable CORS feature if needed.
🅱️ Blobstream API Changes
- refactor!(blobstream): change DataRootTupleRoot to HexBytes type alias by @vgonkivs in #4390
- fix!(blobstream): change DataRootTupleInclusionProof type by @vgonkivs in #4430
- fix!(blobstream): change GetDataRootTupleRoot return type by @vgonkivs in #4435
- fix(open-rpc): add blobstream api docs by @vgonkivs in #4432
Changes:
DataRootTupleRoot: String encoding changed from base64 to hex bytesDataRootTupleInclusionProof: Removed extra pointer (affects native Go API only, not JSON encoding)GetDataRootTupleRoot: Removed extra pointer in returned value (affects native Go API only)- Blobstream API is now publicly documented
Migration:
- Update code expecting base64 encoded roots to handle hex encoding
- Go API users: Update code to handle direct values instead of pointers
✨ GetRange efficiency improvements
- feat!(share/shwap): implement get range request over shwap by @vgonkivs in #4156
- refactor!(share/shwap): rework range namespace data by @vgonkivs in #4325
Changes:
- GetRange requests now use efficient P2P protocol instead of downloading entire EDS
- Significant performance improvement for partial data retrieval
Migration: Update clients using range requests to use the new shwap protocol implementation.
✨ API New Features + Enhancements
- feat(api): Celestia client lib by @walldiss in #4318
- feat(api): allow configurable CORS policy by @TheRealSibasishBehera in #4266
- feat(nodebuilder/core | state): Multi-core endpoint tx submission by @renaynay in #4380
- feat(nodebuilder)!: Allow disabling DASer by @walldiss in #4511
🤏🏻 Data Pruning Now Default
- refactor(nodebuilder/pruner)!: Remove --experimental-pruning by @renaynay in #4303
- feat(share/availability)!: lower sampling window to 7 days by @renaynay in #4427
- fix(nodebuilder/pruner)!: Remove pruner config from nodes config by [@renaynay](https://github.com/renaynay) in [[#4482](https://github.com/celestiaorg/celestia-node/pull/4482)](https://github.com/celestiaorg/celestia-node/pull/4482)
Changes:
- Data pruning is now enabled by default (stores 30 days of data)
- Sampling window reduced from 30 to 7 days
- Archival nodes must use
--archivalflag to disable pruning - The pruner configuration field has been completely removed from node config files
- Pruning behavior is now controlled exclusively via command-line flags
Migration:
- Remove any pruner-related configuration from your config files
- To run an archival node (disable pruning): MUST use
-archivalflag when starting the node - All other nodes: Remove
-experimental-pruningflag (pruning is now automatic) - Adjust monitoring for the new 7-day sampling window
- Default behavior (without flag): Pruning enabled with 30-day retention
🧪 Testing Infrastructure
- test: Tastora framework integration with test for blob module by @chatton in #4283
- test: tastora remove fullnode and rely on bridge and light nodes only by @gupadhyaya in #4441
- test: use tastora docker types instead of interface types by @gupadhyaya in #4421
🚀 Performance Improvements
- perf(share/eds): parallelise row nd collection in NamespaceData by @renaynay in #4420
- perf(api/da): request all blobs once in da.Get by @walldiss in #4431
🦀 Rust Users – Required Upgrade
Rust ecosystem must upgrade to maintain RPC compatibility with v0.25.
- [celestia-client](https://docs.rs/celestia-client/latest/celestia_client/)
- [celestia-proto v0.9](https://docs.rs/celestia-proto/0.9.0/celestia_proto/index.html)
- [celestia-types v0.14](https://docs.rs/celestia-types/0.14.0/celestia_types/index.html)
- [celestia-rpc v0.12](https://docs.rs/celestia-rpc/0.12.0/celestia_rpc/index.html)
Upgrade timeline:
- If you do not use
header.GetRangeByHeight: upgrade immediately. - If you do use it: upgrade Rust crates & celestia-node together.
🔄 Bootstrap Nodes
- chore: removing the bootstrapper 3 and 4 from lunar by @tty47 in #4302
- chore(bootstrapers): add 01node mainnet bootstrap node by @daemon2k3 in #4270
🔧 Bug Fixes
v0.25.3-mocha
Fixes a potential memory leak in light node (LN) and allows disabling of sampling process (DASer).
This patch release also requires a config update against the previous patch release. Please see docs for more information.
What's Changed
BREAKING
Other
- feat(config): adding a bool flag to enable/disable bitswap by @vgonkivs in #4504
- fix(share/swamp): fix GetSamples in swamp tests by @vgonkivs in #4505
- chore: backport bitswap changes by @Wondertan in #4506
Full Changelog: v0.25.2-mocha...v0.25.3-mocha