Bee v2.8.3 is a stability and operator release. It includes a security fix, so upgrade promptly. There are no P2P protocol changes and no manual migration; any node on v2.8.0 or later can upgrade independently.
📖 Release announcement · 💬 Discord #node-operators
Action required
| If you… | Then… |
|---|---|
| run any node | Upgrade. The first start runs a one-time reserve migration that verifies chunks recorded as non-content-addressed and removes invalid ones; it logs the count. (#5634) |
upload with Swarm-Act on POST /chunks or POST /soc
| Switch to /bytes or /bzz. ACT headers on these two endpoints are now ignored and a plain reference is returned. (#5572)
|
| generate clients from the OpenAPI spec | Regenerate. The spec version is now 8.2.1 (was 8.1.1). (#5614, #5654) |
| have dashboards or alerts on libp2p connection metrics | Update queries. bee_libp2p_created_connection_count and bee_libp2p_handled_connection_count are now labeled by transport and public; bee_libp2p_public_address_connections_total and bee_libp2p_private_address_connections_total are removed. Wrap in sum(...); do not use count(...) as a per-node denominator. (#5565)
|
| alert on log text | Update patterns. stream handler: handshake: handle failed is now warning, not error. The "swarmageddon" error text is now erasure coded content not found. (#5604, #5606)
|
override gas-limit-fallback
| Review it. The default is now 900,000 (was 500,000) and commit/reveal/claim use a floor of 800,000 after Glamsterdam gas changes. (#5655) |
use an RPC provider that limits eth_getLogs ranges (Nethermind 2.0)
| Nothing. Postage sync now pages 1,000 blocks by default. Raise postage-sync-block-range if your provider allows it; catching up from far behind makes more calls. (#5627)
|
Breaking changes
- ACT removed from
POST /chunksandPOST /soc.Swarm-ActandSwarm-Act-History-Addressare no longer handled and theSwarm-Act-History-Addressresponse header is gone. ACT never worked correctly on these endpoints. Existing ACT references still resolve through/bytesand/bzz. (#5572) - OpenAPI 8.2.1. Adds
PATCH /redistributionstate,minimumDepositonGET /stake, a400body onPOST /stake/{amount}, GSOC subscription parameters; removes the ACT parameters above. (#5614, #5654) - libp2p connection metrics changed from counters to labeled counter vectors; two metrics removed. See the table above. (#5565)
Security
- File metadata from untrusted chunks. Span-derived size and shard arithmetic in the joiner and the decryption path is now bounds-checked and overflow-safe; malformed tries are rejected. (#5664)
- Stamp issuer store. Declared lengths are validated before msgpack decoding; fuzzing found inputs that triggered multi-gigabyte allocations. (#5663)
- Single-owner chunks from peers. Pushsync, pullsync and the reserve now verify that a SOC address matches its owner and identifier before storing it. (#5640)
- Broken cheque records. A stored cheque with no cumulative payout is rejected instead of crashing settlements or resetting the next cheque to zero. (#5656)
- Per-peer pullsync stream limit. Max 128
pullsyncand 4cursorsstreams per peer; a peer over the limit is disconnected and counted inbee_pullsync_stream_limit_exceeded. (#5658)
Added
- Pause redistribution without restart.
PATCH /redistributionstatewith{"enabled": false}skips new rounds; sampling continues, an already committed round still reveals and claims.GET /redistributionstateand thebee_storageincentives_redistribution_enabledgauge expose the state. Not persisted across restarts. (#5580) - GSOC field selection.
GET /gsoc/subscribe/{address}acceptsswarm-soc-fields(header or query) to choose which SOC fields each message carries; default is stillpayload.swarm-cache-wrapped-chunkcaches the wrapped chunk so it resolves through/bytes. Backlog per subscription is capped at 256 messages, oldest dropped. (#5614) - Staking pre-checks. Deposits are validated against the contract rules before sending. Too-small deposits return
400withminimumDeposit;GET /stakereportsminimumDeposit. (#5571, #5654) postage-sync-block-rangeoption (BEE_POSTAGE_SYNC_BLOCK_RANGE), default 1000. (#5627)- Metrics.
bee_api_*metrics restored (#5583); transport and public/private labels on connection counters (#5565); hivegossip_coalesce_*and kademliaannounce_*series (#5520).
Fixed
- Uploads stalled permanently on one invalid chunk, including across restarts. The chunk is now dropped and push-sync continues. (#5647)
- Postage listener hammered the RPC endpoint after a failed call while paging history; backoff now applies. (#5586)
- Neighborhood rebroadcast sent wrong peer lists to all but the first neighbor. (#5595)
- Crash on Linux x86-64 with
--use-simd-hashingunder heavy hashing load (stack alignment in keccak assembly). (#5636) - Range reads with
Swarm-Lookahead-Buffer-Size: 0could return incomplete data. (#5619) - GSOC subscriptions could miss the first update delivered right after the WebSocket upgrade. (#5639)
PUT /stewardshipdid not restore dispersed replicas of the root chunk at non-zero redundancy levels. (#5594)- AutoTLS: registration against load-balanced endpoints, health-gated first issuance, renewal of certificates that expired while offline, bounded broker HTTP timeout. (#5605)
- Addressbook remove now takes the lock. (#5573)
- Protobuf reader/writer checks context cancellation before I/O. (#5591)
Changed
- Reserve sampling reuses buffers, loads payloads only for sample candidates and filters excluded batches early; sampling memory more than halved in testing, sample output unchanged. (#5612, #5634)
- Sync convergence: pullsync offers are sent after 250 ms instead of 1 s, historical rate window is 10 min instead of 15. (#5630)
- Hive gossip coalesces single-peer broadcasts per addressee and flushes them in batches. (#5520)
- Postage snapshot uses batch-archive's slim encoding (only the log fields Bee reads) and is refreshed to v0.1.3. (#5587, #5665)
- Gas estimation replaces hardcoded limits for chequebook deployment and redistribution transactions. (#5655)
Dependencies
go-libp2p 0.49.0, p2p-forge 0.10.1, certmagic 0.25.3, google.golang.org/grpc 1.83.2, OpenTelemetry 1.45.0, prometheus/client_golang 1.24.1, batch-archive 0.1.3. (#5605, #5590, #5603, #5620, #5621, #5665)
Internal
Fuzz targets across the codebase and fuzzing guidelines in CODING.md (#5602, #5638); CI moved off self-hosted runners, docs-only PRs satisfy required checks, swarm-cli bump on tag push, test merge race fixed (#5582, #5643, #5607, #5635, #5567).
What's Changed
- fix: limit interfaces in test by @sbackend123 in #5567
- fix: remove self-hosted in ci by @sbackend123 in #5582
- fix(all): codebase hardening to improve protocol and code safety by @acud in #5579
- fix(addressbook): lock remove by @akrem-chabchoub in #5573
- feat: add new metrics by @sbackend123 in #5565
- fix: enable bee_api metrics by @sbackend123 in #5583
- fix: postage listener hot retry loop by @aloknerurkar in #5586
- feat(gsoc): fine grained API by @nugaon in #5497
- chore(deps): bump google.golang.org/grpc from 1.82.1 to 1.83.1 by @dependabot[bot] in #5590
- fix(staking): report minimum deposit when commitment would decrease by @sbackend123 in #5571
- fix: flaky test by checking ctx cancellation before racing I/O in protobuf reader/writer by @akrem-chabchoub in #5591
- refactor: remove act from chunk and soc api by @akrem-chabchoub in #5572
- chore: use slim postage snapshot from batch-archive v0.1.0 by @gacevicljubisa in #5587
- fix(batch): clarify Immutable field description in Batch struct by @akrem-chabchoub in #5592
- fix: undo return by @akrem-chabchoub in #5598
- chore: revert #5497 by @acud in #5609
- feat: redistribution toggle by @sbackend123 in #5580
- chore: decrease log severity by @acud in #5604
- chore: remove swarmageddon mentions by @acud in #5606
- chore(deps): bump google.golang.org/grpc from 1.83.1 to 1.83.2 by @dependabot[bot] in #5603
- chore(deps): bump go-libp2p and p2p-forge, bound broker HTTP timeout by @gacevicljubisa in #5605
- fix(joiner): read into len(buffer), not cap(buffer) by @martinconic in #5619
- chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp 1.43.0 to 1.45.0 by @dependabot[bot] in #5620
- chore(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc 1.43.0 to 1.45.0 by @dependabot[bot] in #5621
- ci: dispatch swarm-cli bump on tag push instead of release by @darkobas2 in #5607
- fix(kademlia): neighborhood rebroadcast sends wrong peer lists by @gacevicljubisa in #5595
- feat: gsoc grained api by @nugaon in #5614
- feat(postage): make listener block page size configurable by @gacevicljubisa in #5627
- perf(storer): reuse buffers and eliminate per-chunk allocations in reserve sample by @gacevicljubisa in #5612
- feat: gossip improvements by @sbackend123 in #5520
- chore: add fuzzing across the codebase by @acud in #5602
- chore: improve protocol convergence times by @acud in #5630
- chore(ci): fix test merge race by @acud in #5635
- fix: validate soc address in pushsync and pullsync handlers by @gacevicljubisa in #5640
- fix(api): subscribe to gsoc before websocket upgrade by @acud in #5639
- docs: add fuzzing guidelines by @akrem-chabchoub in #5638
- fix(keccak): stack pointer alignment by @acud in #5636
- fix: prevent pushsync block on invalid chunk by @sbackend123 in #5647
- fix: stewardship re-upload dispersed replicas by @aloknerurkar in #5594
- ci: let docs-only PRs satisfy required checks by @darkobas2 in #5643
- fix: chequebook deploy and storage incentives gas estimation by @sbackend123 in #5655
- fix: min floor when height > 0 by @sbackend123 in #5654
- fix(pullsync): limit concurrent incoming streams per peer by @acud in #5658
- fix(chequebook): handle nil cumulative payout in cheque processing by @akrem-chabchoub in #5656
- fix(postage): validate stamp issuer data before decoding by @martinconic in #5663
- perf(storer): filter excluded batches and rogue chunks early in reserve sample by @gacevicljubisa in #5634
- fix: file package hardening by @acud in #5664
- chore(deps): bump github.com/ethersphere/batch-archive from 0.1.0 to 0.1.3 by @gacevicljubisa in #5665
Full Changelog: v2.8.2...v2.8.3