Highlights
- Upgraded to Java 25, Spring Boot 4.1.0, Gradle 9.5.1, GraalVM build tools 1.1.2, Ktor 3.5.1, Springdoc 3.0.3, and
commons6.8.1. POST /transactionsnow waits for confirmation and returns the confirmed transaction.- Added
deduplicatesupport for transaction publishing. - Improved transaction, signer, election, and native-image observability.
- Hardened peer admission, handshake callbacks, peer URI validation, and protocol ingress validation.
- Reworked election/vote persistence to reduce deadlocks, retry bounded failures, and clean stale votes.
API And Runtime
POST /transactionsand/transactions/streamnow share the same confirmation flow.- Publish responses now distinguish confirmed, rejected, dropped, and expired transactions.
ALREADY_CONFIRMEDis treated as a successful publish result.- Transaction rebroadcasting now still happens when validation completes before sender tracking is available.
Election, Votes, And DB
- Added bounded retry/backoff for election processing.
- Prevented duplicate pending elections and ignored votes while consensus persistence is pending.
- Improved vote freshness tracking with persisted
last_vote_timestamp. - Added stale vote block recording, startup reconciliation, stale vote deletion, and stale marker cleanup.
- Added migrations:
V7: enforce non-null transaction timestampsV8: add/backfill transactionblock_typeV9: rebuild weights withlast_vote_timestampV10: addstale_vote_block
Network And Protocol
- Added stricter peer URI validation for scheme, host, path/query/fragment, loopback/private hosts, and allowlisted default nodes.
- Routed inbound handshakes/websockets through Guardian admission.
- Banned peers now get
403; rate-limited peers get429. - Tightened validation for keep-alive neighbours, transaction requests, and transaction stream ranges.
- Added broader protocol ingress tests.
Observability
- Added signer latency metric:
signer.signature.latency. - Added transaction pipeline latency by stage/type:
transactions.pipeline.latency. - Added transaction rejected/dropped counters.
- Added active election and election processor buffer/batch metrics.
Build, CI, Docs
- CI now uses GraalVM Java 25.
- Native image builds use committed reachability metadata.
- Native image min heap is set to
400m. - Added README instructions for regenerating native metadata.
- Added
NETWORK.mdandTRANSACTION-PROCESSING.md. - Removed the old image cleanup workflow.
Full Changelog: v1.32...v1.33