Skip to content

0.10.0 — JDK 25, transaction parity, portable chain files

Promotion of staging (0.9.x series, through 0.9.127) to main. 0.10.0 brings no hard fork and no fork schedule change: nothing in it needs an upgrade by a fixed date. Full detail is in the changelog.

Read before upgrading

  • JDK 25 is required, and every JVM must run with the C2 workaround (#1642, #1643). HotSpot C2 on JDK 23 and later miscompiles ReduceAllocationMerges (JDK-8385993), a consensus-divergence risk. bin/fukuii, the Docker images and the Debian package carry -XX:+UnlockDiagnosticVMOptions -XX:-ReduceAllocationMerges. A hand-written java -jar command or systemd unit must add both flags, or the node refuses to start (exit status 78). The escape hatch is -Dfukuii.allow-c2-reduce-allocation-merges=true or FUKUII_ALLOW_C2_REDUCE_ALLOCATION_MERGES=true. See ADR INF-007 and docs/runbooks/known-issues.md Issue 16.
  • Debian installs now read /etc/fukuii/application.ini (#1644). Before this release, deb installs never applied it. After the upgrade the JVM runs with the shipped heap (-Xmx3g). Raise it there for a large mainnet node.
  • Custom ETH-family chain configs need a blob-schedule for every blob fork they declare (#1637, #1646), or the node refuses to load them. If you run Ephemery, re-run scripts/ephemery/fetch-genesis.sh: before this release, Ephemery blocks at or above its blob target failed import.
  • RPC transaction submission follows go-ethereum's rules (#1641, #1647).
  • Transactions without replay protection (no EIP-155 chain id) are refused unless fukuii.network.rpc.allow-unprotected-txs = true.
  • There is a fee cap: rpc.tx-fee-cap, default 1 ether.
  • On ETH-family chains, the pool's replacement, overdraft and blob/non-blob reservation rules apply.
  • eth_getTransactionCount(addr, "pending") answers the pool's next nonce (#1647).
  • A fresh ETC node answers eth_gasPrice with 1 gwei instead of 1 wei (#1640).

What's new

  • Typed transactions on every RPC interface (#1629). Legacy, EIP-2930, EIP-1559, EIP-4844 and EIP-7702 transactions are handled on JSON-RPC and GraphQL with go-ethereum's rules, error strings and defaults. New eth_signTransaction, personal_signTransaction and eth_fillTransaction; call and estimate methods accept state and block overrides; there is a gas price oracle ported from geth.
  • Portable chain files (#1651). fukuii <network> export|import (offline) and admin_exportChain / admin_importChain read and write go-ethereum's chain format, gzipped when the name ends in .gz. Files move between fukuii and geth in either direction. See docs/runbooks/backup-restore.md, "Portable Chain Snapshots".
  • Per-chain blob schedules (#1637, #1646) (EIP-7840 blobSchedule, EIP-7892 BPO forks).
  • Ephemery is a known network (#1628).

Fixes worth knowing

  • discv4 no longer saturates the CPU (#1648). On a 4-core Ephemery node, CPU dropped from about 286% to about 15%, and Engine API requests no longer queue behind discovery crypto. Inbound discovery requests are now rate-limited per IP.
  • The SNAP pivot block is stored with its body (#1652, every chain). A one-time startup repair fixes nodes that synced with an earlier release.
  • Checkpoint archives carry the exact total difficulty (#1653, ETC/Mordor).
  • A tx pool memory leak is fixed: during SNAP sync, blob sidecars were kept, and a Sepolia node held 2.6 GB of them.

Validation

  • Unit and integration tests: testEssential, 6,428 passed and 0 failed (staging 21f2e6127); testStandard, 6,424 passed, 0 failed and 3 ignored (staging 980227f49). CI, the hive gates, EEST Amsterdam and Gate Integrity are green on the release candidate. The three-hour testComprehensive suite was not run for this release.
  • Ephemery load run (blocks 145,609–147,609):
  • 51,067 typed transactions and 2,000 blob transactions sent through fukuii's RPC;
  • 0 errors and 0 gas mismatches;
  • 6,753 consensus-layer withdrawals imported, in every 20th block from 135,090 to 149,638, with state roots matching the network.
  • Chain files:
  • a 12,520-block Ephemery file written by Erigon imports, and re-exports byte-identical;
  • a 2,000-block Mordor range imports into core-geth, which validates proof of work, and also re-exports byte-identical.
  • Mordor checkpoint archive: produced (pivot 17,207,611, matching public RPC), then imported by a fresh node, which regular-synced 1,324 blocks past it.

Known issues

  • ETC/Mordor checkpoint archives from SNAP-synced nodes. checkpoint export refuses until header backfill reaches genesis. Don't publish archives made with --allow-estimated-td on a SNAP-synced node, or archives made before 0.10.0.
  • Total difficulty rewritten on restart (#1654, ETC/Mordor, present since 0.7.0). Can bias fork choice between branches that fork below the rewritten block. A fix is in progress.
  • Deposits and execution-layer withdrawal and consolidation requests (EIP-6110/7002/7251) have hive and EEST coverage but have not yet been exercised on a live network (#1655, planned after the next Ephemery reset).
  • sbt formatCheck fails (#1656). Tooling only.

Upgrade steps

  1. Install JDK 25. If you launch fukuii with your own java command or unit, add the two C2 flags above.
  2. Stop the node and replace the binary or image. A 0.9.x datadir needs no migration. On first start, the pivot-body repair runs once.
  3. If you run a custom ETH-family chain, add blob-schedule. If you run Ephemery, regenerate its config.
  4. Start the node, then confirm the version, the peers, and that the head is following.