Enclave is now The Interfold.
Run a Ciphernode
Node Dashboard

Node Dashboard

The Interfold has two dashboards. The local node dashboard runs inside your ciphernode process and shows what that node knows. The hosted dashboard is a public web app that reads the chain. This page is for operators who monitor a ciphernode. At the end, you can enable the local dashboard and open it safely from another computer. You can also read its JSON API, send alerts from it, and you know when to use the hosted dashboard.

DashboardWhere it runsData sourceUse it to
Local dashboardIn the interfold start process, on 127.0.0.1The EventStore of the node, live P2P state, logs, and RPC readsCheck peers, E3 traces, protocol events, and logs of one node
Hosted dashboardhttps://dashboard.theinterfold.comContract events and views of one networkInspect any E3, watch CRISP polls, and set up an operator from a browser wallet

Local node dashboard

The interfold binary includes the local dashboard. It needs no separate installation. It is off until you set a port.

Enable the dashboard

Set the dashboard port

Add dashboard_port to the node definition in the configuration file. For the default node, use the node key:

# interfold.config.yaml
node:
  dashboard_port: 9092

For a named node, set the key under nodes.<name>. Select a free port. The default quic_port is 9091 and the default ctrl_port is 50505.

To set the port with an environment variable, use E3_NODE__DASHBOARD_PORT=9092. For a named node, use E3_NODES__<NAME>__DASHBOARD_PORT.

Restart the node

Stop the node, then start it again with interfold start -v.

The dashboard starts after the node finishes its startup. With -v, the log shows this line:

Dashboard available at http://127.0.0.1:9092

Open the dashboard

On the computer that runs the node, open http://127.0.0.1:9092 in a browser.

The page title is Interfold · Node Observatory. The chip at the top right shows the node name.

⚠️

The dashboard has no authentication. Its API returns detailed protocol payloads and node diagnostics. The server binds only to 127.0.0.1 for this reason. A port forward to a public interface exposes this data to every client that can reach it.

Open the dashboard from another computer

The dashboard listens only on the loopback interface of the host that runs the node. To open it from your own computer, use an SSH tunnel:

ssh -L 9092:127.0.0.1:9092 user@your-server

Keep the SSH session open, then open http://127.0.0.1:9092 on your own computer.

In a container, 127.0.0.1 is the loopback interface of the container. A port that you publish with Docker does not reach it. Open the dashboard from the network namespace of the node process.

Views

The dashboard has six views. The address of each view is #<view>, for example #logs, so you can bookmark it. The views refresh automatically while the browser tab is visible.

ViewWhat it shows
OverviewOperator address and peer ID. Network reach (connected and configured peers), registered and active nodes, E3 counts, and the number of durable events. The connected peers with remote address and direction. The on-chain operator state for each chain. The 12 newest protocol events.
E3 tracesEach E3 that this node saw. For the selected E3, the events of each phase: Request, Committee formation, DKG · C0, DKG · C1–C4, Key publication · C5, Encrypted computation, Decryption · C6–C7, and Output & rewards.
Flow graphThe events of one E3 as a graph by phase, with an arrow from each event to the events that it caused.
EventsUp to 2,000 recent durable events from the EventStore. You can search, and filter by source (Local, Network, EVM) and by level (Errors, Warnings, Info, Debug).
LogsThe operational log entries that the node keeps in memory. You can search, and filter by level. Each entry shows its fields, and the E3 ID and stage when they are present.
UpdatesThe installed version, the latest stable GitHub release and its notes, the number of active E3s, and a safe update sequence. The count is the E3s that this node is in while they run, and failed ones for one day after the failure. For failed E3s the count is an estimate: their slash reports are due until one day after the lifecycle deadline (see the report deadline), which the dashboard does not know. The dashboard does not replace the binary.

The Operator state card on the Overview reads the chain at most once every 15 s. It shows the status: Active, Registered, Not registered, or Exit queued. It also shows the available tickets, the ticket balance, the ciphernode bond, and the node counts. The ticket balance and the ciphernode bond are raw token base units. Hover over a value to see the full number.

The Rewards count on the card shows the number of E3 rewards that the operator earned as a committee member. The dashboard finds the reward of the operator in the RewardsDistributed and RewardCredited events of each E3. The count includes rewards that go to a separate bond owner wallet. See Rewards.

The Events view gives each event a level:

LevelEvents
ErrorsInterfoldError, E3Failed, CommitteeFormationFailed, ProofVerificationFailed, SignedProofFailed, ThresholdShareCollectionFailed, EncryptionKeyCollectionFailed, ComputeRequestError, CommitmentConsistencyViolation
WarningsProofFailureAccusation, AccusationVote, AccusationQuorumReached, SlashExecuted, CommitteeMemberExpelled, and unknown EVM logs
InfoOther events that belong to an E3 phase
DebugAll other events

When a refresh fails, the dashboard keeps the last data and shows Live refresh paused with the error.

Common tasks

  • Trace one E3. Open E3 traces and select the E3. The current phase opens first. A trace that stops in a phase shows where the E3 stopped.
  • Find errors. Open Events and set the level to Errors. Open an event to read its payload.
  • Check the network after a restart. On Overview, compare the connected peers with the configured peers. A network error appears in the Connected nodes panel.
  • Prepare an upgrade. Open Updates. Wait until the active E3 count is 0 before you stop the node. See Upgrades.

JSON API

The dashboard gets its data from a JSON API on the same port. You can call the API with curl on the host that runs the node:

curl -s http://127.0.0.1:9092/api/snapshot | jq '.network'

The API has five endpoints: /api/snapshot, /api/e3, /api/events, /api/logs, and /api/updates. Dashboard API gives the parameters, the response fields, and the errors of each endpoint. For OpenAPI tools, use the OpenAPI description.

Protocol events come from the durable EventStore of the node. Log entries come from a bounded in-memory store, and the node also writes them to ciphernode.jsonl in the node data directory. Log entries are diagnostics, not protocol records.

Monitor the node with the API

A monitoring system can read the API and send an alert when a value is out of range. This procedure makes a check that sends an alert when the node has fewer than 10 connected peers. The check needs curl and jq on the host of the node.

Install the check script

Save this script as /usr/local/bin/check-interfold-peers.sh. Set PORT to your dashboard_port, and set MIN_PEERS to your limit.

#!/usr/bin/env bash
# Exit 0 when the peer count is good, 1 when it is low, 2 when the check fails.
PORT=9092
MIN_PEERS=10
 
body=$(curl -sf --max-time 10 "http://127.0.0.1:${PORT}/api/snapshot") || {
  echo "CRITICAL: dashboard API does not answer"
  exit 2
}
peers=$(jq -e '.network.connected_peers | if type == "array" then length else error("no peer list") end' <<<"$body" 2>/dev/null) || {
  echo "CRITICAL: response is not a dashboard snapshot"
  exit 2
}
if [ "$peers" -lt "$MIN_PEERS" ]; then
  echo "WARNING: ${peers} connected peers (minimum ${MIN_PEERS})"
  exit 1
fi
echo "OK: ${peers} connected peers"

Make the script executable:

sudo chmod 755 /usr/local/bin/check-interfold-peers.sh

The exit codes follow the Nagios plugin convention: 0 is OK, 1 is a warning, and 2 is a critical failure. The script also fails when the node is stopped, and when the response is not a snapshot, for example HTML or a JSON object without a peer list.

Test the script

Run /usr/local/bin/check-interfold-peers.sh on the host of the node. The script shows the peer count, for example OK: 21 connected peers.

Connect the script to your monitoring system

Use a monitoring agent that runs a command and reads its exit code. Without such an agent, use a cron entry that runs your alert command when the check fails:

*/5 * * * * /usr/local/bin/check-interfold-peers.sh || /usr/local/bin/send-alert "interfold peers"

/usr/local/bin/send-alert is an example. Replace it with the command that sends your alert.

Poll /api/snapshot at an interval of 30 s or more. Each request reads the new EventStore events and can start chain RPC reads.

You can make checks for other values with the same method:

ConditionEndpointjq expression or field
Few connected peers/api/snapshot.network.connected_peers | length
Few peers on the gossip topic/api/snapshot.network.gossip_subscribed_peers
Network error/api/snapshot.network.last_error is present
Operator not active on a chain/api/snapshot.operator.chains[] | select(.operator_active | not) | .chain_name
Chain RPC read failed/api/snapshot.operator.error is present
More failed or degraded E3s/api/snapshot.protocol.e3_failed and .protocol.e3_degraded increase between two polls
New error log entries/api/logs?level=error&since=<next_cursor of the previous poll> returns entries
New release/api/updates.update_available is true

Hosted dashboard

The hosted dashboard at https://dashboard.theinterfold.com reads contract events and views directly from the chain. It does not connect to your ciphernode, so it cannot show peers, logs, or the local state of your node. Each page reads one network, and the page shows the network name. The VITE_NETWORK_HOSTS build variable maps each domain to a network (sepolia or mainnet). Other hosts use the VITE_NETWORK build variable, default sepolia.

It has three views:

ViewLinkWhat it shows
E3 inspector#inspectorEach E3 on the network: request, committee, key generation, input window, compute, decryption, publication, failure, fees, and the event log.
CRISP#crispThe CRISP polls of the network and their stages. The view only shows data.
Run a ciphernode#operator (opens in a new tab)An interactive operator guide that sends transactions from a browser wallet.

The operator guide is the only view that writes to the chain. It reads the bond size, the ticket price, the minimum ticket count, and the exit delay from BondingRegistry. It has five steps:

  1. Connect a wallet.
  2. Authorize the bond owner. The operator key sends setBondOwner.
  3. Bond the ciphernode bond. The bond owner approves FOLD and sends bondCiphernodeFor.
  4. Register the ciphernode. The bond owner sends registerOperatorFor.
  5. Buy tickets. The bond owner approves the ticket collateral and sends addTicketBalanceFor.

After setup, Manage the position sends the other transactions of the interfold ciphernode commands: refreshOperatorStatus (refresh the status), removeTicketBalanceFor (burn tickets), unbondCiphernodeFor (unbond FOLD), deregisterOperatorFor (leave the network), claimExitsFor (claim exits), proposeBondOwner, and acceptBondOwner. It shows the collateral in the exit queue and the part whose exit delay has ended. An open slash proposal, or a committee of the operator that is not released yet, can still hold a claim. The bond owner sends each of them, except that the operator key can also deregister, any wallet can refresh the status and claim tickets, and the proposed owner accepts a transfer. A node that runs without the CLI, for example a DAppNode package, uses these actions.

E3 rewards, at the top of the page, shows the amount that the operator's recipient can claim and a Claim rewards action. The recipient is the bond owner of the operator at committee finalization, or the operator key when it had no bond owner. Connect the recipient wallet to claim. The action sends claimRewards(e3Ids) for the completed E3s, then claimHonestNodeReward(e3Id, operator) for each failed E3. Below it, the committee history shows each E3 that selected the operator, with its outcome, its amount, and a claim status: In progress, Claimable, Claimed, On hold (an open expulsion proposal holds the payment), Forfeited (an executed expulsion), Needs processing, Not eligible (not an honest member of a failed E3), or No reward. Point to a status to see its reason. A failed E3 needs processE3Failure(e3Id) before its honest members can claim. Any connected wallet can send it with Process in the history.

The guide simulates each transaction before the wallet prompt, so a contract error, for example NotBondOwner, shows before you sign. The guide manages the on-chain position only. The ciphernode must run with the same operator key. See Registration for the CLI procedure.

Next steps