Run a Ciphernode
This page shows three ways to install and start a ciphernode: DAppNode, the interfold CLI, and
Docker. It is for operators who have a host that meets the requirements. At
the end, the node runs, syncs the contract history, and waits for
registration. For a release change, follow Upgrades.
Before you start
Prepare these items before you install the node:
- A host that meets the requirements, with the QUIC UDP port open.
- An Ethereum WebSocket endpoint that keeps the full log history. Test it on RPC Endpoints first.
- An Avail HTTP endpoint for data availability. The examples on this page use the defaults of the DAppNode package.
- An operator key: a dedicated Ethereum private key for this node. The node signs ticket submissions and release acknowledgments with it, so it needs ETH for gas.
- A bond owner wallet or Safe that holds the FOLD and the ticket collateral. A wallet that is separate from the operator key is recommended. See Registration & Bonding.
Use a fixed release version on an operator node. Do not use a moving version such as the latest
Docker tag.
Choose a method
| Method | Best for | Configuration | Where the state lives |
|---|---|---|---|
| DAppNode | A DAppNode box with a setup form | The package renders /data/config.yaml from its deployment manifest. | The ciphernode_data volume (/data) |
| CLI | A Linux or macOS server that you manage | You write interfold.config.yaml. | .interfold/ next to the config file |
| Docker | Container hosts (Linux x86-64) | You write config.yaml and mount it read-only. | A named Docker volume |
The CLI and Docker methods use the same configuration file. Write it first, as shown in the next section. The DAppNode packages write their own file from the deployment manifest and the package Config.
Write the configuration file
The configuration file sets the node profile and one entry for each chain. Copy the example for your network and replace the placeholders. The addresses come from the deployment manifest. See Contract addresses.
node:
network: mainnet
quic_port: 9091
chains:
- name: mainnet
chain_id: 1
rpc_url: 'wss://YOUR_MAINNET_ENDPOINT'
data_availability:
mode: avail
rpc_url: 'https://avail-rpc.publicnode.com/'
contracts:
interfold:
address: '0x28cF63B459e6218C69EA97ea7D90541cf648c715'
deploy_block: 25786382
ciphernode_registry:
address: '0xC927A5B2d8F68697bC28C0670df05178c93df2d7'
deploy_block: 25786378
bonding_registry:
address: '0x0ec90465095C21830BEcED07e032809A2Bd2915F'
deploy_block: 25473398
slashing_manager:
address: '0x753109Ee36Dc65cC178875AddA30C6433e5bEEe4'
deploy_block: 25998899
fee_token:
address: '0xdC035D45d973E3EC169d2276DDab16f1e407384F'
deploy_block: 20663730While Avail Turing is down, the Sepolia CRISP program uses a mock data-availability verifier. Nodes
that serve it use data_availability: { mode: mock_http, rpc_url: <CRISP server>/availability }
instead of the Avail block above.
The node applies these rules when it loads the file:
- Every enabled chain must belong to the
node.networkprofile.chain_id: 1belongs tomainnetandchain_id: 11155111belongs tosepolia. One node serves one network. To keep an entry for another network in the file, setenabled: falseon it. - Each enabled entry must be a different chain. The node refuses to start when two enabled entries resolve to the same chain ID.
- Each contract must have a nonzero
deploy_blockwhenrpc_urlis not a local address. Otherwise, startup stops withMisconfiguration: Attempted to query historical events from genesis on a non-local node. - A ciphernode needs
interfold,ciphernode_registry,bonding_registry, and adata_availabilityentry on each enabled chain. The node refuses to start without them. - A ciphernode uses the SlashingManager that the
interfoldcontract names on each enabled chain. It refuses to start when it cannot read that address. A configuredslashing_managerthat differs only causes a warning. - Each
$NAMEor${NAME}in the file is replaced with the value of that environment variable. Use this to keep an API key out of the file, for examplerpc_url: 'wss://example.invalid/v2/${RPC_API_KEY}'.
Keep the chain name as mainnet or sepolia. The interfold config check command matches chains
to the manifest by name, and it skips other names. Also set chain_id, because config check
compares it with the manifest. The command does not query the endpoint.
The first sync starts at the lowest deploy_block of all configured contracts. On mainnet, the
fee_token deploy block (20663730) is about 4.8 million blocks before the bonding_registry
deploy block (25473398). The node does not use fee_token, so you can remove that entry to
shorten the first sync. interfold config check then prints a note for it, but the check passes.
Main configuration keys
The keys below matter most on an operator node. The Configuration Reference lists every node key, and Chain keys lists every chain key.
Key (under node:) | Default | Meaning |
|---|---|---|
network | Inferred from the chains | P2P profile: mainnet, sepolia, or local. |
quic_port | 9091 | UDP port of the QUIC listener. |
peers | Empty (profile DNS bootstrap) | libp2p addresses to dial. See Networking. |
multithread_concurrent_jobs | 2 | Requested prover jobs. The node lowers it to fit memory. |
startup_timeout_secs | 1800 | Time limit for startup and the first sync. After it, the node exits with an error. |
autowallet | false | true generates a random wallet when none is stored. That key is not your registered operator. |
Key (under each chains: entry) | Default | Meaning |
|---|---|---|
rpc_url | Required | WebSocket URL (ws:// or wss://). The node needs it for log subscriptions. |
rpc_auth | No auth | Basic or Bearer credentials. See RPC authentication. |
data_availability | Required | mode: avail and an HTTP rpc_url. See Data availability. |
ingestion_confirmations | 3 | Confirmations before the node applies a log. |
rpc_poll_interval_ms | 7000 | Milliseconds between the polls of an HTTP provider for a receipt or a new block. |
rpc_log_range_blocks | 10000 | Widest block range of one eth_getLogs request. See RPC endpoints. |
enabled | true | false makes the node ignore the entry. |
The defaults of three confirmations and a 7-second poll interval also apply when rpc_url uses
localhost or 127.0.0.1, because that URL can be a proxy to a live chain. Set
ingestion_confirmations: 0 and rpc_poll_interval_ms: 250 only on a single-process development
chain such as Anvil. Do not set them on mainnet or Sepolia.
The node cannot undo a log that it applied, so a chain reorganization deeper than
ingestion_confirmations can leave the node out of step with the chain. Each confirmation also
delays every duty by about 12 seconds. The default leaves room for a sortition ticket in the
10-minute mainnet window and the 3-minute Sepolia window. The node logs the value that it uses for
each chain at startup.
The autonetkey key has no effect in this release. The node derives its libp2p key from the wallet
key.
Start the node
The DAppNode packages use the released ciphernode image. Install the Mainnet or Sepolia package to
select the network. The package supplies the network settings, stores the credentials, and runs
interfold start.
Install the package
Open the DAppNode UI (http://my.dappnode) and install Interfold Ciphernode for Mainnet or
Sepolia. If the package is not listed in the DAppStore, use Installer → Install from IPFS hash
with the hash for that network.
Prepare the credentials file
Create a JSON file with exactly these two fields. The private key is the operator key.
{
"password": "<strong encryption password>",
"private_key": "0x<64 hex characters>"
}The file must be 16 KiB or smaller. Keep an encrypted offline backup of it.
Fill in the setup wizard
On the first installation, upload the credentials file under Node credentials (skip on updates). For updates, leave the upload empty. The package reuses the saved identity. When a release raises the storage schema, the package resets the state before the node starts. See Upgrades.
The network package supplies the chain ID, contract addresses, and deployment blocks from the deployment manifest. The node address comes from the saved wallet.
Check the logs
Open the installed network package under Packages → Logs. Startup logs show the node address and
Starting Interfold ciphernode. after the RPC and identity checks pass.
Open the dashboards
Use Operator Dashboard for wallet transactions, registration, bonding, and tickets. Use Node dashboard to monitor the local node through the DAppNode LAN or VPN.
The default RPC uses the execution client selected in DAppNode Stakers. Enable its WebSocket RPC and wait until the client is synced. Custom RPC URLs and advanced options remain available in package Config. A custom RPC must support HTTP and WebSocket at the same host, port, and path.
AVAIL_RPC_URL defaults to https://avail-rpc.publicnode.com/ for Mainnet and
https://turing-rpc.avail.so/rpc for Sepolia. The packages publish UDP port 37173 for Mainnet and
37174 for Sepolia. Each network package has its own data volume.
The package keeps its state in /data, on the ciphernode_data volume. Its backup includes the
configuration, encryption password, and durable node state, including the encrypted wallet and
libp2p keys. Downloaded circuits and prover caches are excluded. Keep the backup encrypted and
access-controlled because it contains the password that unlocks the keys.
After it stores the credentials, the package deletes the uploaded file. A restart uses the stored state and does not need a new upload. An upload with a different password stops startup.
The package health check confirms that the process runs, the files exist, the QUIC listener is bound, and chain ingestion moves: the node writes a heartbeat file per chain after every successful read of the chain head, and the check fails when the heartbeat is older than 120 seconds or neither the head nor the cursor moved for 10 minutes. From 15 minutes after the node started, every enabled chain must have a heartbeat, so a chain whose RPC endpoint never answers fails the check too. It does not prove that the node is registered. Read the logs and the on-chain status to confirm that.
Check the configuration
Contract addresses change when the protocol is deployed again. A node that points at an old address syncs nothing and reports no error. Before the first start, and after each deployment notice, compare your configuration with the published deployment manifest:
interfold config checkThe command downloads manifest.json from the latest GitHub release and compares each chain entry.
Example output for a current Sepolia entry:
Deployment manifest: release v0.20.0-dev.3
sepolia: up to date
note sepolia is a mock deployment - proofs are accepted without being verifiedExample output for a stale entry:
sepolia:
STALE interfold: config has 0xc5DD9418…, published is 0xb35EE9ed…
warn ciphernode_registry: deploy_block 11855915, published is 12050030
note sepolia is a mock deployment - proofs are accepted without being verified| Line | Meaning | Fails the check |
|---|---|---|
STALE | A contract address or the chain_id does not match the manifest. | Yes |
warn | A deploy_block does not match the manifest. | No |
note | A published contract is not configured, or the network uses mocks. | No |
The command exits with a non-zero status when a line is STALE. You can use it as a gate before a
restart in a process manager or a CI job. Use --chain <name> to check one chain. Use
--manifest-url <url> to check against a specific manifest file.
Watch the node
The -v flag sets the log level. The flags are global, so they work with every command.
| Flag | Level | Output |
|---|---|---|
| (none) | WARN | Warnings and errors only |
-v | INFO | Normal operation |
-vv | DEBUG | Detailed debug output |
-vvv | TRACE | Full trace |
-q | ERROR | Errors only |
Logs at -vv and higher can contain the endpoint URL. If the URL contains an API key, remove it
before you share logs.
These events show the progress of an E3 in the node log:
| Event | Meaning |
|---|---|
E3Requested | The node saw a new E3 request. |
TicketGenerated | The node calculated its best sortition ticket for the E3. |
CiphernodeSelected | The node is a member of the committee. |
KeyshareCreated | The node made its key share. |
PublicKeyAggregated | The committee public key is ready to publish. |
CommitteePublished | The committee public key is on-chain. |
CiphertextOutputPublished | The encrypted output is on-chain. Decryption starts. |
DecryptionshareCreated | The node made its decryption share. |
PlaintextAggregated | The decrypted result is ready to publish. |
PlaintextOutputPublished | The result is on-chain. |
E3RequestComplete | The node started its cleanup for the E3. |
The node writes one heartbeat file for each chain after every successful read of the chain head:
chain-<chain ID>.heartbeat in ingestion/ in the node data directory, for example
data/_default/ingestion/chain-1.heartbeat. The file holds key=value lines: chain_id, head,
cursor, polled_at, and progressed_at (Unix seconds). A monitoring script can read these files,
and they need no RPC request. The DAppNode health check fails when polled_at is older than 120
seconds, or when progressed_at is older than 10 minutes.
When the node runs, some commands run inside the node through the local control port:
ciphernode status, wallet get, net get-peer-id, config get, rev,
print-env --chain <name>, noir status, and events query. See
Commands that run inside a running node.
For a visual view, turn on the node dashboard.
Stop and restart
On SIGINT or SIGTERM, the node stops its actors and writes its event log and store to disk. This
shutdown has a limit of 60 seconds. Set the stop timeout of your process manager above 60 seconds.
The DAppNode package and the examples on this page use 65 seconds.
The node locks its data directory (interfold.lock) while it runs. A second node process with the
same data directory does not start.
After a crash, a restore, or a binary upgrade, check the stored state before you start the node. Do these steps with the node stopped:
Validate the state
interfold node validateThe command changes no files. It ends with VALIDATION PASSED or reports FAIL lines, and it exits
with a non-zero status on a failure. In Docker, run it through the image entrypoint with the same
volume and configuration:
docker run --rm \
-v ciphernode-data:/home/ciphernode/.local/share/interfold \
-v "$PWD/config.yaml":/home/ciphernode/.config/interfold/config.yaml:ro \
"$CIPHERNODE_IMAGE" \
node validate --config /home/ciphernode/.config/interfold/config.yamlRepair a recoverable tail
If the report shows only an uncommitted event-log tail, or a stale sortition projection, run:
interfold node validate --repairThe repair indexes complete uncommitted frames again, cuts a torn tail, or rebuilds the sortition projection from intact events. It never removes an indexed event.
Validation checks the storage schema before it reads or repairs event logs. An unsupported schema reports the recovery instruction and skips all event and snapshot checks.
Start the node
Start the node only when the validation passes.
Do not start a node when validation reports FAIL and the repair cannot fix it. Copy the data
directory before you try a restore or a new sync. The repair cannot fix corruption in committed
records or a storage schema that the binary does not support.
When the node cannot write or flush its event log, it stops so that the process manager can restart it. Repeated storage failures are an infrastructure problem. Stop the node, keep a copy of the data, and run the validation before the next start. When a release changes the storage schema, see Upgrades.
Data and backups
A CLI node keeps all state in a .interfold directory next to its configuration file. The password
file is in .interfold/config/<name>/. The key store and the event log are in
.interfold/data/<name>/. Run interfold config get db_file to print the path on your host. The
requirements page lists the contents. The Docker image
keeps the state on its volume. See Docker state.
Back up the complete .interfold directory as one unit, while the node is stopped. The event log
refers to files in its event-blobs-v1 directory. Do not delete those files to free space.
The key store holds the encrypted operator key, and the password file is next to it. A copy of the directory can sign as your operator. Encrypt backups and control access to them. Do not run two nodes from copies of the same directory. See Migrate a Node.
Docker state
Where the node stores its state
The image entrypoint sets E3_CONFIG_DIR=/home/ciphernode/.local/share/interfold/config and
E3_DATA_DIR=/home/ciphernode/.local/share/interfold/data, unless the container sets them. Thus the
node keeps all of its state on the volume at /home/ciphernode/.local/share/interfold:
| Path on the volume | Contents |
|---|---|
config/_default/key | Key file with the password that encrypts the stored keys |
data/_default/db | Key/value store: wallet key, libp2p keypair, key shares, and protocol snapshots |
data/_default/log.* | Event logs |
A restart, a new container, and a new image all keep this state. docker rm does not delete a named
volume.
These variables override config.yaml, so the entrypoint never uses them to move state that exists.
If config.yaml sets config_dir, data_dir, key_file, or db_file, the node uses that
location. If a key file or database exists at /home/ciphernode/.config/interfold/.interfold, for
example on a volume that is mounted at /home/ciphernode/.config/interfold, the node keeps using
it. If state exists both there and on the volume, the container does not start. Keep only the state
that the node last used, and start the container again. You can also set your own E3_CONFIG_DIR
and E3_DATA_DIR for the container.
In these cases the node does not use the entrypoint's variables, so run other interfold commands
through the entrypoint, which chooses the same location. For example, run
docker exec ciphernode ciphernode-entrypoint.sh wallet get --config /home/ciphernode/.config/interfold/config.yaml.
The command in Validate the state also runs through the entrypoint.
Move state from an earlier image
Earlier images did not set these variables. A node that started from such an image, without a volume
at /home/ciphernode/.config/interfold, keeps its state inside the container, in
/home/ciphernode/.config/interfold/.interfold. That directory is not on the volume. When you
remove or recreate that container, you lose the key file, the key/value store, and the event log.
The key/value store holds the key shares of the node, and the chain cannot restore them.
Do not remove or recreate the old container before you copy its state. docker rm, docker compose down, and docker compose up with a new image all remove the old container. The copy
puts the key file and the stored keys on the volume. Run interfold node reset-data only after
the copy, and only with the new image. Never use interfold nodes purge for this migration.
Do this procedure one time for each node, when the node serves no active E3. An earlier image uses storage schema 7 or earlier, and v0.19.0 uses schema 8. The procedure therefore resets the state after the copy. The reset keeps the operator key and the libp2p keypair. See Reset node state.
The commands use the container name ciphernode and the volume name ciphernode-data. For Docker
Compose, use the names that docker ps -a and docker volume ls show. Each one-off container runs
the new image through its entrypoint, with the same volume and configuration file:
new_image() {
docker run --rm \
-v ciphernode-data:/home/ciphernode/.local/share/interfold \
-v "$PWD/config.yaml":/home/ciphernode/.config/interfold/config.yaml:ro \
"$CIPHERNODE_IMAGE" \
"$@" --config /home/ciphernode/.config/interfold/config.yaml
}-
Set the image of the new release, and pull it. The helper and the later steps use this variable.
export CIPHERNODE_IMAGE='ghcr.io/theinterfold/ciphernode:0.19.0' docker pull "$CIPHERNODE_IMAGE" -
Find out how the old container starts, and whether a stop removes it:
docker inspect -f '{{json .Config.Entrypoint}} {{.HostConfig.AutoRemove}}' ciphernodeContinue only if the output is
["interfold"] false, or one path that ends with/interfoldfollowed byfalse. For all other output, do not stop the container, and contact the protocol team:["ciphernode-entrypoint.sh"]is the entrypoint of the earlier image. At each start, it sets the password again, andinterfold password setrefuses a key file that exists. Such a container cannot start again after a stop.truemeans that the container started with--rm. A stop removes the container and the state inside it.
-
Make sure that no E3 is active on the network. The output must be
0. Get the Interfold address from Contracts and addresses.cast call <Interfold> "activeE3Count()(uint256)" --rpc-url <RPC_URL> -
Record the operator address and the peer ID from the old container, while it runs. If a command fails or prints no value, stop and contact the protocol team.
docker exec ciphernode interfold wallet get --config /home/ciphernode/.config/interfold/config.yaml docker exec ciphernode interfold net get-peer-id --config /home/ciphernode/.config/interfold/config.yaml -
Make sure that the volume has no
dataorconfigdirectory. If the output shows either name, stop and contact the protocol team.docker run --rm \ -v ciphernode-data:/home/ciphernode/.local/share/interfold \ --entrypoint ls \ "$CIPHERNODE_IMAGE" \ -A /home/ciphernode/.local/share/interfold -
Stop the old container. Do not remove it.
docker stop --time 65 ciphernode -
Copy the
dataandconfigdirectories from the old container to the volume.docker cpsends each directory as a tar stream, so the key file does not go to the host disk.for dir in data config; do docker cp "ciphernode:/home/ciphernode/.config/interfold/.interfold/$dir" - | docker run --rm -i \ -v ciphernode-data:/home/ciphernode/.local/share/interfold \ --entrypoint tar \ "$CIPHERNODE_IMAGE" \ -xf - -C /home/ciphernode/.local/share/interfold done -
Make sure that the copy is complete. The output must show
key,db, andlog.0. If a name is missing, stop and contact the protocol team.docker run --rm \ -v ciphernode-data:/home/ciphernode/.local/share/interfold \ --entrypoint ls \ "$CIPHERNODE_IMAGE" \ /home/ciphernode/.local/share/interfold/config/_default \ /home/ciphernode/.local/share/interfold/data/_default -
Reset the state:
new_image node reset-data --yesThe output must end with this line. If it says
No identity was present, stop and contact the protocol team.The operator key and libp2p identity were preserved. Verify with: interfold wallet get --name _defaultIf the command refuses, use the cases in If the command refuses. Add
--allow-active-e3sonly in the last case. In each other case, start the old container again:started=$(date -u +%Y-%m-%dT%H:%M:%SZ) docker start ciphernodeUse
docker startalso for Docker Compose.docker compose upremoves the old container, which holds the state that the node uses. If the container does not start, stop and contact the protocol team, and keep the copy on the volume.The log from before the stop also holds the release lines, so read only the log since the start. When it shows
Ciphernode release is acceptedorAcknowledging ciphernode release, remove the copy from the volume. Then do what the case tells you.docker logs --since "$started" ciphernodedocker run --rm \ -v ciphernode-data:/home/ciphernode/.local/share/interfold \ --entrypoint rm \ "$CIPHERNODE_IMAGE" \ -rf /home/ciphernode/.local/share/interfold/data /home/ciphernode/.local/share/interfold/config -
Run these commands. The address and the peer ID must be equal to the values from step 4. If they differ, or a command fails, stop and contact the protocol team.
new_image wallet get new_image net get-peer-id -
Validate the state. Continue only if the report shows
empty store will be initializedand ends withVALIDATION PASSED — state is intact and consistent.Otherwise, do not start the new image. Keep the old container and the volume, and contact the protocol team.new_image node validate -
Start the new image. For
docker run, rename the old container first, then use the command in Start the container:docker rename ciphernode ciphernode-oldFor Docker Compose, make sure that
CIPHERNODE_IMAGEnames the new image. Remove theentrypoint:line from the service: step 2 required the old container to startinterfolddirectly, but the new image must start through its own entrypoint, which uses the volume. Then rundocker compose up -d. This command replaces the old container. -
Make sure that the log shows
Ciphernode release is accepted, and that this command shows the operator address from step 4:docker exec ciphernode ciphernode-entrypoint.sh wallet get --config /home/ciphernode/.config/interfold/config.yaml -
For
docker run, remove the old container only after step 13 succeeds.
Networking
Open the QUIC UDP port (default 9091) for inbound traffic. Do not open the control port 50505.
Requirements lists all ports.
When peers is empty, the node dials the DNS bootstrap address of its network profile. Mainnet uses
/dnsaddr/bootstrap.interfold.network. Sepolia uses /dnsaddr/bootstrap-sepolia.interfold.network.
The profile also sets a network ID that every Interfold libp2p protocol uses. A mainnet node and a
Sepolia node therefore cannot join the same network, also when a peer address is wrong.
To dial specific peers, list them in the configuration:
node:
network: mainnet
peers:
- '/dns4/node1.example.com/udp/9091/quic-v1'
- '/ip4/192.0.2.10/udp/9091/quic-v1'You can also add a peer at start with interfold start --peer <multiaddr>. A mainnet profile
refuses the Sepolia bootstrap address. A Sepolia profile replaces the mainnet bootstrap address with
the Sepolia one.
Run a bootstrap node
A bootstrap node is a peer that other nodes dial first to find each other. Start it with
interfold start --bootstrap. The node reads the events of the Interfold contract and joins the
network like a full node, but it does not serve on committees, generate proofs, sign votes, or send
transactions. It therefore does not need the memory of the prover, and its address needs no ETH.
When it starts, it fetches the history of open E3s from its peers like a full node. If no peer can
serve that history, it starts without it, so it can start when no other node is running. Its request
router expects no protocol recipients and keeps no deferred protocol backlog.
It needs the same setup as a full node: a configuration with the network profile and the chains, a
password, and a wallet key. The wallet key sets the node address and the libp2p peer ID, so use a
key that no other node uses. The key does not have to belong to a registered operator. Open its QUIC
UDP port, and add its address to the peers of the other nodes, for example
/dns4/bootstrap.example.com/udp/9091/quic-v1.
Give a bootstrap node a data directory of its own. On its first start, a node records its role (full
or bootstrap) in its data directory. A node does not start on a data directory that a node of the
other role used. Releases without bootstrap mode do not check the role, so do not start an older
release on the data directory of a bootstrap node. To change the role of a node, stop the node and
run interfold node reset-data, which keeps the wallet key.
Deferred protocol events
A full node can receive an E3 event before the actor that consumes it starts. The request router keeps these events in order for recipients declared by the installed extensions. Each E3 has a limit of 4,096 deferred entries and 1 GiB of accounted bytes. The router has a shared limit of 16,384 entries and 3 GiB. Each recipient copy counts toward both limits, including shared payload bytes.
Each entry reserves its encoded bytes, nested inline storage, and 64 bytes per allocation candidate. The reservations cover strings, byte buffers, collections, their elements, and shared payload fields. Large contiguous buffers add constant allocation overhead. They have no extra charge per payload byte. Shared bytes retain no spare capacity, and deferred copies compact collections inside shared keys and threshold shares. Each entry also reserves twice its inline event size for queue capacity.
These limits cover four concurrent E3s with the largest supported committee (N=19, H=14) and the secure 8192-degree preset. The slashing recipients start at committee finalization. Keyshare and public-key recipients start at local selection. Only the plaintext recipient retains the complete local DKG history until ciphertext output arrives.
The late-recipient allowance is 1,536 records and 640 MiB per E3. It includes the C1–C3 witnesses, the complete request payloads retained by computation failures, C4 inputs, peer shares, and document envelopes. Four such histories use 2.5 GiB, leaving 512 MiB of margin below the shared byte limit.
The 3 GiB ceiling includes allocation reservations, but it does not measure exact resident memory. In an 8 GiB memory budget, allow another 1.5 GiB for fragmentation, freed storage, and an in-flight event. The remaining 3.5 GiB covers other actors, the process baseline, and the system. The router memory regression checks this allowance with contiguous and separately allocated small payloads. These are buffer allowances, not total node memory requirements or limits on incoming-event decoding. Proof workers need a separate allowance. See Requirements for node sizing.
If a limit is exceeded, the router logs Deferred delivery failed at ERROR and clears the affected
recipient's deferred queue. It retains the failure record until E3 teardown or restart and stops
adding events to that queue. Other E3s and live delivery continue. The affected E3 can fail at its
existing deadline. Deferred queues remain in memory only, so a restart does not restore their
pre-checkpoint events.
Command reference
The commands on this page are start, config check, password set, wallet set,
node validate, and ciphernode setup. Global flags work with every command: --config <path>,
--name <profile>, -v, and -q. The CLI Reference lists every command and
flag. For a schema change that needs interfold node reset-data, see Upgrades.
Next steps
Authorize a bond owner, bond FOLD, register the operator, and buy tickets.
Set upRPC EndpointsTest the log history of an endpoint and read the sync messages.
Set upNode DashboardWatch the node events and status in a local web page.
OperateUpgradesInstall a new release without a gap in committee work.
Maintain