Skip to content

Release Candidate 2026.1.0 (dev -> main) aka ChronoGuard#5053

Draft
mur-me wants to merge 55 commits into
mainfrom
dev
Draft

Release Candidate 2026.1.0 (dev -> main) aka ChronoGuard#5053
mur-me wants to merge 55 commits into
mainfrom
dev

Conversation

@mur-me

@mur-me mur-me commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator

Mainnet Release v2026.1.0

TODO: The dedicated hardfork PR will document the final activation epoch/block, operator deadline, and hardfork-specific compatibility notes.

Attention mainnet node operators. There will be a mandatory upgrade as a hardfork will occur at:

  • epoch TBD
  • block TBD
  • approximately on TBD

Validator and Explorer/RPC nodes are strongly encouraged to upgrade, because this release contains a significant amount of code changes across p2p startup, stream sync, consensus timestamp handling, RPC/tracing, EVM compatibility, node configuration.

Caution

Validator operators must configure Chrony before running this release, follow the official validator Chrony setup guide: https://docs.harmony.one/home/network/validators/node-setup/0.-recommended-chrony-setup-for-validator-nodes.

The released version: v2026.1.0-0-g<commit>

Set of changes:

Consensus Timestamp Safety
  • Adds stricter block timestamp validation rules behind chain configuration.
  • Ensures new block timestamps are strictly greater than the parent block timestamp.
  • Adds future-time bounds to reduce acceptance of blocks with excessive local-clock skew.
  • Updates proposal flow to pass the current local time explicitly into block creation.
  • Fixes cascading block-time skew by capping proposer waiting behavior when local time is behind the parent block timestamp.
  • Prevents validators from hanging indefinitely while waiting for local wall-clock time to catch up.
  • Improves view-change behavior when timestamp skew would otherwise stall proposal flow.
  • Adds tests covering strict parent timestamp checks, future timestamp bounds, catch-up behavior, and view-change safety.

Important

This is a consensus-safety and liveness improvement. Validators should upgrade because this release improves timestamp validation and prevents proposer stalls caused by block-time skew.


Time Synchronization / Mandatory Chrony Setup

Important

Chrony setup is mandatory for validator nodes. Incorrect local time may cause block proposal delays, future-block validation failures, or view-change instability.


Stream Sync & P2P Startup Reliability
  • Adds SetEnoughStreamsCallback support to StreamManager, allowing the sync pipeline to leave startup mode as soon as enough valid streams are available.
  • Improves startup-mode behavior by reducing unnecessary waiting during peer discovery.
  • Optimizes peer discovery timing, DHT request limits, and target valid peer thresholds.
  • Adds deterministic and race-safe startup-mode state handling.
  • Adds a stream discovery watchdog to prevent nodes from waiting indefinitely when not enough streams are discovered.
  • Adds recovery logic to reset stream-manager runtime state without resetting staged sync progress.
  • Improves stream lifecycle cleanup and reduces aggressive stream removal in recoverable cases.
  • Adds and updates test coverage for startup mode, advertise behavior, stream discovery, DHT request limits, and watchdog recovery.

Important

This improves node startup and sync recovery behavior. It does not require a hardfork activation by itself.


RPC, Tracer & Explorer Compatibility
  • Reorganizes block tracer code for readability and maintainability.
  • Moves Parity block tracer implementation into the native tracer package.
  • Removes deprecated block_tracer.go and block_tracer_storage.go files.
  • Renames tracer tests for package consistency.
  • Adds JavaScript callTracer implementation with asset loading.
  • Updates tracer gas context handling to use the dynamic gas value instead of the original gas limit.
  • Removes debug output from tracer execution paths.
  • Improves legacy structLog JSON encoding compatibility.
  • Improves trace-result encoding compatibility for older clients and explorer tooling.
  • Adds sentinel error handling for ABI event signature mismatches.
  • Verifies event signature topics before unpacking ABI logs.
  • Adds rate limiting support for auth trace APIs.
  • Adds rate-limiter guard logic so invalid non-positive limits do not break RPC startup.
  • Separates auth HTTP and WebSocket server tracking.
  • Caches method-filter regex compilation for auth RPC filtering.

Important

Explorer/RPC operators should upgrade because this release includes trace API compatibility fixes and rate-limiting safeguards for expensive RPC paths.


EVM / Ethereum Compatibility Groundwork
  • Adds EIP-7939 CLZ opcode support and chain-rule plumbing.
  • Adds EIP-5656 MCOPY opcode support and rule checks.
  • Adds EIP-6780 SELFDESTRUCT behavior rule plumbing.
  • Adds EIP-3860 initcode size limit and initcode gas-metering support.
  • Adds EIP-3855 PUSH0 opcode support.
  • Adds Prague fork configuration and rule plumbing.
  • Adds EIP-2935 block hash history support under Prague-related rules.
  • Adds EIP-8024 support, including new stack-manipulation opcode plumbing.
  • Adds automatic epoch-based EIP activation checks where applicable.
  • Adds tests for EIP activation boundaries, disabled-rule behavior, gas accounting, opcode availability, and fork-rule configuration.

Important

This section documents code support and EVM compatibility groundwork.
Mainnet hardfork activation details are intentionally not included here and should be added by the dedicated hardfork PR.


Node Configuration, BLS Keys & Runtime Safety
  • Updates default BLSKeys.MaxKeys from 10 to 11.
  • Bumps config handling for the new BLS key limit.
  • Uses read locks for decider read paths to reduce unnecessary lock contention.
  • Improves method-filter handling for authenticated RPC servers.
  • Improves startup and shutdown behavior in stream and RPC-related services.
  • Adds tests for config migration, decider access, RPC auth server behavior, and rate-limiter edge cases.

Important

Hardfork activation is intentionally not documented in this changelog.

A separate hardfork PR should add:

  • activation epoch / block details
  • validator upgrade deadline
  • explorer/RPC operator upgrade deadline
  • hardfork-specific mandatory-upgrade wording
  • compatibility notes for old nodes
  • any rollback or monitoring instructions required for the activation window

PR / commit list:

Full Changelog: main...dev

mur-me and others added 30 commits March 3, 2026 10:41
- Add SetEnoughStreamsCallback method to Operator interface
- Implement SetEnoughStreamsCallback in streamManager struct
- Add enoughStreamsCallback field to streamManager
- Call callback when softHaveEnoughStreams() is true
- Enables early exit from startup mode when enough streams are found
- Add startup mode with faster timings for initial peer discovery
- Centralize all timing constants in const.go
- Add network-specific DHT request limits and target valid peer counts
- Align target valid peers with stream sync configuration requirements
- Improve adaptive sleep logic with SleepDecreaseRatio
- Add comprehensive timing constants for startup vs normal modes
- Add startup mode with faster timings for initial peer discovery
- Implement early exit from startup mode when enough streams found
- Add network-specific peer discovery limits and validation
- Improve advertise() function with better error handling and logging
- Add isValidPeer() stub for future peer validation logic
- Use configurable DHT request limits instead of hardcoded values
- Add target valid peer counting and filtering
- Improve advertiseLoop() with adaptive timing based on discovery success
- Add TestProtocol_Advertise with mock discovery and proper setup
- Add TestProtocol_AdvertiseLoop with timing validation
- Add TestProtocol_ExitStartupMode for startup mode functionality
- Add TestProtocol_GetDHTRequestLimit for network-specific limits
- Add TestProtocol_GetTargetValidPeers for target peer validation
- Fix interface compilation errors by adding SetEnoughStreamsCallback stubs
- Add mockDiscovery struct to properly mock discovery interface
- Update tests to handle nil pointer scenarios and proper initialization
… - 194*6%==11 bls keys and we already have validators in the mainnet using this (#5015)
* Add block timestamp validation

* test(chain): fix timestamp validation tests by seeding parent header
* Move TLOAD/TSTORE to Ethereum addresses (0x5c/0x5d)

* initial version of eip-5656
* feat(ntp): update NTP offset every minute and use it for block timestamps

- Add NTPTime interface and periodic offset refresh (every 1 minute) via Run()
- Store NTP time provider in Registry with Now() accessor
- Pass NTP-corrected time to Worker.UpdateCurrent() when proposing blocks
- Fix consensus_block_proposing.go to use registry.Now() for block timestamp
- Wire NTP provider in main.go with go impl.Run(ctx, time.Minute)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(ntp): add NTPEpoch activation epoch (disabled, set to EpochTBD)

- Add NTPEpoch field to ChainConfig with EpochTBD in all network configs
- Add IsNTP(epoch) helper method
- Use NTP-corrected time in ProposeNewBlock only when IsNTP is active

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs(ntp): add comments to NTP time provider and block proposing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ntp): update NTPEpoch and TimestampValidationEpoch to 47170

* refactor(config): reorder TimestampValidationEpoch in configuration
* EIP-2935 initial version

* refactor EIP-2935 implementation

* remove unused method: newPraugeInstructionSet

* eip-2935: update contract code & addr

* expose EVM Config

* core: fix ProcessParentBlockHash ringIndex calculation

* Fix EIP-2935 implementation to match Ethereum specification

- Add ProcessBlockHashHistory function that properly populates the entire history buffer
- Fix ProcessParentBlockHash function signature and implementation
- Implement correct ring buffer logic for 8192-block history window
- Handle transition from old 256-block window to new 8192-block window
- Ensure proper parameter ordering and function calls
- Fix test compilation issues

* Fix TestProcessBlockHashHistory test compilation issues

- Simplify test to use direct state database creation instead of complex test environment
- Remove debug panic statements that were added for troubleshooting
- Add proper imports for rawdb and state packages
- Ensure test can run without nil pointer dereference errors

* fix conflicts and issues after rebase with new ethereum upgrade

* fix: correct EIP-2935 implementation

- Fix ProcessBlockHashHistory fork block detection logic
- Update BLOCKHASH opcode to support history storage contract (8192 blocks)
- Add IsPrague flag to Rules struct for EVM chain rules

* fix: correct EIP-2935 blockhash history implementation

- Fix opBlockhash to exclude 256-block window from history lookup
- Fix ProcessBlockHashHistory to store correct block hashes
- Add nil check for genesis block case
* remove(ntp): eliminate NTP-related configurations and functionality

* refactor(consensus): pass current time to ProposeNewBlock for accurate timestamp handling
Frozen and others added 5 commits May 20, 2026 13:07
* feat(tracers): add call tracer implementation with asset loading

* refactor(tracers): remove unnecessary log statement from call tracer registration

* refactor(tracers): remove init function for call tracer registration

* fix(goja): update gas context value to use dynamic gas variable

* refactor(tracers): remove debug print statement from ParityBlockTracer
* update(config): set specific epochs for EIP7939, EIP5656, EIP3855, EIP3860, and EIP8024

* feat(config): set specific epochs for EIP7939, EIP5656, EIP3855, EIP3860, and EIP8024 to 7163

* feat(config): set TimestampValidationEpoch on the testnet to the 7170

* feat(config): set EIP6780Epoch for devnet and testnet

* fix(tests): remove NTPEpoch from tests

---------

Co-authored-by: Uladzislau Muraveika <uladzislau.muraveika@protofire.io>
@mur-me mur-me requested review from Frozen and GheisMohammadi June 5, 2026 12:01
@mur-me

mur-me commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator Author

Hello @Frozen and @GheisMohammadi, let's together agree on the epoch/dates for the hardfork 🙏

Please also review the description, I'll reuse into the release

Frozen and others added 17 commits June 12, 2026 19:36
* fix: gate duplicate beacon slash evidence behind fork epoch

* fix slashes check for dublicate entries

* add regression tests for Slash Evidence Uniqueness

* fix goimporrts issue
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* core: Fix slash group ordering with canonical sort

* test: add slash group state order tests
* slash: reject double-sign evidence with epoch-height mismatch

* add double sign rebind tests

* fix goimports issue

* fix double sign tests

* fix slash group tests
* feat(config): add CXReceiptStateRollbackEpoch for cross-shard receipt handling

* refactor(interpreter): improve EIP activation by using a copy of the JumpTable
* feat(engine): reject shard state on non-last blocks and add corresponding test

* update shard state verification to reject empty states and adjust corresponding tests
@mur-me mur-me requested a review from GheisMohammadi June 26, 2026 14:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants