AN EXECUTION CLIENT
FOR THE EVM ECOSYSTEM

LinuxmacOSWindowsDocker
Infrastructure

Erecting a network, not only joining one

Most of what a network needs is not the client that joins it. Fukuii carries the rest of it too: bootnodes, state serving, an RPC relay, a faucet and dashboards, as run modes of the same binary rather than a collection of separate tools.

docker run ghcr.io/fukuii-project/fukuii-cli
Scala 3PekkoJVMRocksDB
The pieces

What a network needs besides nodes

A network with only participating nodes has no way for a new one to find it, nothing to sync from, and no endpoint for applications that will not run a node themselves. Those roles are usually assembled from separate projects. Here they are run modes.

Bootnodes

The first peer everyone else finds.

  • Bootnode run mode, no separate binary
  • discv4 and discv5 with ENR records
  • DNS-based peer lists for rotating a set without redeploying

State serving

Somewhere for new nodes to sync from.

  • SNAP serving as a role, not just SNAP receiving
  • Bounded by response size and wall clock so serving cannot exhaust the node
  • Off by default, on for server, archival and bootnode roles

RPC relay

A public endpoint in front of the network.

  • Relay deployment profile with the read surface exposed
  • A gRPC bridge for aggregation gateways upstream of it
  • Pruned storage, because a relay does not need full history

Dashboards and a faucet

The parts a network needs to be usable.

  • Grafana dashboards and alerting rules that ship with the client
  • A faucet for distributing test funds on a network you originated
  • Nothing to assemble from third-party pieces
Two sides of discovery

Consuming discovery, and serving it

Every client consumes discovery. It dials peers it was told about, resolves a list published over DNS, and reads the records other nodes publish describing themselves. That is all it takes to join a network somebody else is already running.

Originating one needs the other side. A node has to answer discovery rather than only ask it, and something has to author and publish the records that describe the network before anyone can look it up: a signed node record carrying the chain identity and fork position, and a DNS tree that lets the peer set be rotated without touching anything that points at it.

Fukuii does both, which is what turns a network's identity into data you publish rather than a list of addresses each participant has to be handed out of band.

Keeping the wrong peers out

A new network shares its wire protocol with every other network using the same one, so discovery's first job is to not waste effort on peers from somewhere else. The checks run in order before a dial is attempted: the network identifier, then the genesis hash, then the fork position. A peer failing any of them is rejected before a connection is opened rather than after a handshake reveals the mismatch. On a network you have just originated, that is what stops its peer set filling with nodes that were never going to agree with it.

Roles

One binary, several jobs

A role is not a separate build or a different download. It selects a composition: which sync path the node takes, whether it answers state requests from others, and how much history it keeps. Each role covers one way a node takes part in a network. Bootnode is listed apart, because serving discovery is infrastructure for the network rather than participation in it.

Node roles, and what each one composes to
RoleWhat it is forServes stateHistory kept
ArchivalDeep history for applications and analyticsYesFull, from genesis
Tip serverServing current data to other nodesYesTo the sync pivot
Mining poolThe node behind a poolYesTo the sync pivot
RPC relayA public read endpoint, prunedOptionalBounded
Resource-lightA machine that is not a serverNoNone below the anchor
ValidatorProof-of-Stake block productionOptionalTo the sync pivot
BootnodeDiscovery infrastructure for the networkYesAs configured

Serving state is off unless the role asks for it. A node that serves is answering requests that cost it disk reads and bandwidth, so the capability is bounded by both response size and elapsed time: a request that would take too long or return too much is cut short rather than allowed to crowd out the node's own work.

Standing one up

From genesis to a usable network

The order matters more than the difficulty. Each step produces something the next one needs, and every one of them is the same binary under a different configuration.

The first step is the one most easily skipped. A network's initial accounts and node identities have to exist before the genesis file that references them can be written, and the client generates both: node keys, encrypted account keys, the addresses derived from them, and the allocation entries that carry those addresses into genesis. Getting this wrong is not recoverable by editing a config afterward, because the genesis hash it produces is the network's identity.

Steps in standing up a network, and what each produces
StepWhat it produces
Generate the identitiesNode keys and accounts, and the genesis allocation entries they become
Define the networkA genesis file: chain identity, consensus algorithm, initial validators
Originate itThe first nodes, all starting from the genesis they agree on
Make it findableBootnodes answering discovery and publishing signed node records, optionally over DNS
Make it syncableAt least one node serving state, so a joining node has a source
Make it reachableAn RPC relay for applications that will not run their own node
Make it observableMetrics, dashboards and alerts across the whole set

This is how a development network, a testnet and a consortium chain all get built. They differ in who is allowed to join and how consensus is chosen, not in the infrastructure they need.

Permissioned and private networks →