Dual EL client
Native Ethash for ETC mainnet and Mordor. Engine API for post-Merge Ethereum, validated on Sepolia with 21+ EL peers. One binary, two worlds.
Fukuii is an EVM-compliant execution layer client in Scala 3. Run it on ETC and Mordor natively, or pair it with any consensus client — Lighthouse, Prysm, Teku, Lodestar, Nimbus — to follow Ethereum mainnet or Sepolia via Engine API V1–V4 through Prague/Electra.
Forked from Mantis (IOHK's abandoned Scala client), modernised, and pointed at a single goal: be a credible second non-Geth EVM client for both Ethereum Classic and post-Merge Ethereum.
Native Ethash for ETC mainnet and Mordor. Engine API for post-Merge Ethereum, validated on Sepolia with 21+ EL peers. One binary, two worlds.
Three layers: fukuii-core (chain-agnostic EVM), fukuii-env
(sync, RPC, networking), and a consensus module you can swap.
Ethash today, more tomorrow.
Chordodes Fukuii is a horsehair worm that hijacks a mantis. Fukuii hijacks Mantis and drives it toward Olympia — ECIP-1111, 1112, 1121.
Run a PoW node on Ethereum Classic, follow Sepolia under any consensus client, or stand up Ethereum mainnet — all from the same codebase.
Production · full sync validated
Production · full sync validated
Validated · 21+ EL peers
Configuration available
Sync modes, EVM forks, Engine API, JSON-RPC, Hive compliance, operational glue. Click around — keyboard works too.
Three sync modes with bootstrap checkpoints from well-known fork blocks, automatic fallback between modes, and in-place pivot refresh so a stale state root doesn't cost you the whole sync.
ExcludingPeers selectors and exponential backoffFull mainnet hard-fork coverage on the Ethereum side, plus the Olympia ECIPs on the ETC side.
JWT-authenticated authrpc on port 8551 with the full V1–V4 method set. Validated on Sepolia paired with Lighthouse.
engine_newPayloadV1..V4engine_forkchoiceUpdatedV1..V3engine_getPayloadV1..V4engine_getPayloadBodiesByHashV1 / ByRangeV1engine_exchangeCapabilitiesStandard Ethereum JSON-RPC over HTTP (8553), WebSocket (8552), and authrpc (8551). Plus a Model Context Protocol server (2025-11-25) so LLM agents can drive the node directly.
eth_*net_*web3_*debug_*trace_*admin_*txpool_*personal_*engine_*Health endpoints: /health · /readiness · /buildinfo
Twelve compliance simulators wired into CI. hive-prague is the gated PR check — every change runs through it before merge.
sync-dispatcher prevents RPC starvationResilientRollingFileAppender for log rotation that survives disk pressureReal changes from real production traffic. Critical first.
DeferredWriteMptStorage flushes per batch, file-backed contractAccounts at ~45M entries, crash-safe progress checkpoints. SNAP no longer eats your heap.
Sync actors moved to a dedicated sync-dispatcher. JSON-RPC stays responsive even under heavy SNAP load.
Protocol messages now decoded before capability messages. Geth and Nethermind peers actually connect.
Phase handoff timeout: Bloom-filter dedup (73.5M → 2M codeHashes), 10K-batch storage streaming, StorageConsistencyChecker skip on SnapSyncDone, recovery actor forwarding, MptStorage.decodeNode() visited-set fix.
Counter persistence across restartSnapSync() with exponential backoff bootstrap retry.
ExcludingPeers selector + backoff + maxBodyFetchRetries. Body downloads no longer get wedged on a single bad peer.
.recover added to eth_call, eth_estimateGas, eth_getCode, personal_sendTransaction. State RPC degrades gracefully during sync.
In-process peerStatusCache. The peer list is no longer an RPC roundtrip storm.
Capability check, stagnation watchdog, partial-range resume, dynamic concurrency, in-place pivot refresh, peer dedup, stale-root guard. Seven independent fixes, one calmer SNAP coordinator.
Config cache (ConfigFactory.invalidateCaches()), FastSync best-block tracking, JSON-RPC null-id coercion, actor name-collision generation counter, ResilientRollingFileAppender for log rotation under disk pressure.
Chain-agnostic at the bottom, opinionated at the top. Swap consensus without touching the EVM.
Engine API, beacon root handling, fork choice integration. Ethash today; pluggable tomorrow.
Networking, JSON-RPC, sync controllers, Prometheus metrics, storage glue. The "everything around the EVM" layer.
EVM, state trie, RLP, txpool. Chain-agnostic. The library you'd reach for to build the next client.
Source build for hackers, Docker for operators, Sepolia + Lighthouse for the brave.
Build from source and SNAP-sync the ETC testnet.
git clone https://github.com/chippr-robotics/fukuii
cd fukuii
sbt assembly
java -Xmx4g \
-Dfukuii.datadir=/var/lib/fukuii \
-Dfukuii.network=mordor \
-jar target/fukuii-assembly-<ver>.jar mordor
Signed images on GHCR. Mount a datadir and go.
docker pull ghcr.io/chippr-robotics/fukuii:latest
docker run -d \
--name fukuii \
-p 8553:8553 \
-p 30305:30305 \
-v fukuii-data:/var/lib/fukuii \
ghcr.io/chippr-robotics/fukuii:latest etc
Pair with any consensus client over Engine API.
java -Xmx8g \
-Dfukuii.network=sepolia \
-Dfukuii.engine.enabled=true \
-Dfukuii.engine.port=8551 \
-Dfukuii.engine.jwt-secret=/etc/fukuii/jwt.hex \
-jar fukuii-assembly-<ver>.jar sepolia
# then point Lighthouse / Prysm / Teku / Lodestar / Nimbus
# at http://localhost:8551 with the same JWT secret
The full docs live at chippr-robotics.github.io/fukuii. These are the four most common entry points.
Fukuii is alpha. Things will misbehave on edge networks and exotic configs. File issues, start discussions — that's the whole point of the alpha.