Get Started
Run a Worker on Mainnet
Workers are the supply side of the Lightchain AI network. A worker runs whitelisted models via Ollama alongside the Worker Sidecar (shipped as a Docker image), claims inference sessions directly on-chain, streams answers to users through the public Worker Gateway, and earns fees for every completed job. This guide walks through the end-to-end lifecycle on Mainnet — from generating a worker key and funding it to registering on-chain, going live, and deregistering when you're done. Mainnet runs in dispatcher-free mode: no central service hands out jobs. Your worker watches the chain, wins sessions by sortition, and serves them itself — see Dispatcher-free Mode for how that works. Everything below configures the external profile from that page: no Redis, no VPN, no inbound ports. Already running a mainnet worker? If itsdocker run command sets WORKER_GATEWAY_URL but not SORTITION_ENABLED=true, it connects and sends heartbeats but is never given a job. Go to Move an existing worker to dispatcher-free mode.
Mainnet LCAI is real value. Double-check every address, RPC URL, and chain ID before signing transactions. Funds sent to the wrong address are unrecoverable.
Prerequisites
- Docker installed (the image is
linux/amd64) - GPU machine with enough VRAM for your model (8 GB+ for
llama3-8b, 40 GB+ forllama3-70b) - Ollama installed and running
- Funder wallet holding at least 50,051 LCAI (50,000 stake, a 50 LCAI gas buffer for claim, ack, blob and completion transactions, and a little on top because registering itself spends gas) — this is your existing wallet that pays to bring the worker online. It is NOT the worker key. You will generate a fresh worker key in Step 0 and send LCAI from the funder to it in Step 5.
- Foundry installed (
castis used for key generation, balance checks, and contract reads) - Outbound HTTPS/WSS — nothing needs to be opened inbound
Network reference
https://worker-gateway-v2.mainnet.lightchain.ai is the same gateway service under a second name. A worker that already uses that URL needs no change.
Resolve mainnet contract addresses
AIConfig, JobRegistry and SessionManager are deployed at runtime, so their addresses are best resolved from the predeployed WorkerRegistry rather than hard-coded. Resolve them once and export them — the env file in Step 4 picks them up from your shell:
CodeBASH
Step 0: Generate a fresh worker key
Always use a dedicated, brand-new key for the worker. Do not reuse your funder key — the worker key sits in a Docker container with the keystore password, and should hold only the working capital (stake + small gas buffer) you're comfortable exposing to that machine.CodeBASH
Address and Private key, then export them:
CodeBASH
CodeBASH
$WORKER_ADDR. If it doesn't, stop and re-export — anything sent to the wrong address is unrecoverable, and registering with mismatched keys locks the stake on the wrong account.
Do not set WORKER_PRIVKEY to your funder's private key. The two must be different. The funder pays from your existing wallet (Step 5); the worker is the new key from this step.
Step 1: Install Ollama and pull the model
On-chain model names are the Ollama tags, used verbatim (the on-chainmodelId is keccak256(name)). Pick from Whitelisted models and pull each one into Ollama. Only llama3-8b and llama3-70b are not native Ollama tags — create them as aliases. The example below uses llama3-8b.
CodeBASH
Step 2: Pull the worker image
CodeBASH
/bin/worker (the sidecar, default entrypoint) and /bin/lightchain-worker (the operator CLI for keys, registration, preflight, drain, balance and release).
Pull again even if you already have the image. Since 16 October 2026 latest is worker release v0.0.5. An image pulled before then starts a new worker at the chain's first block, and one pulled before 13 September 2026 does not support dispatcher-free mode, preflight or web search.
Step 3: Import the worker private key
Imports$WORKER_PRIVKEY (set in Step 0) into an encrypted keystore on disk:
CodeBASH
Address: printed by the command must equal $WORKER_ADDR from Step 0. If they differ, stop — the wrong key was imported.
Step 4: Write the worker env file
The sidecar and the CLI read the same variables, so keep them in one file. Write it from the shell where you resolved the addresses (the$… values expand from your exports):
CodeBASH
<YOUR_PASSWORD> with the keystore password from Step 3. Every docker run below passes this file with --env-file.
Generate the ECDH encryption key
Every worker advertises an encryption public key on-chain so users can encrypt prompts for it —keygen produces that pair locally:
CodeBASH
Step 5: Fund the worker from your funder wallet
Send LCAI from your funder wallet (the existing one mentioned in Prerequisites) to$WORKER_ADDR (the fresh address from Step 0). Send 50,051 LCAI: 50,000 for the minimum stake, a 50 LCAI gas buffer, and a little on top. The worker pays for its own claimSession transactions as well as the ack, blob and completion transactions of every job. preflight warns when the balance is below 50 LCAI, and registering spends a little gas, so exactly 50,050 would leave the balance just under that line.
If your funder wallet is in MetaMask/Rabby, send the transfer through the wallet UI. If you have its private key locally and want to use Foundry:
CodeBASH
CodeBASH
Common mistake: setting FUNDER_PRIVKEY to the same value as WORKER_PRIVKEY. That sends LCAI from the worker to itself (a no-op minus gas) and the worker stays unfunded. Cross-check with cast wallet address --private-key "$FUNDER_PRIVKEY" — it must NOT equal $WORKER_ADDR.
Step 6: Register on-chain
CodeBASH
- Stake 50,000 LCAI (auto-queried from
AIConfig) - Register your ECDH public key on-chain
- Add every model in
SUPPORTED_MODELSto your supported models
You can only serve models that are currently whitelisted on AIConfig. Attempting to register for a delisted or non-existent model will revert.
Step 7: Preflight
preflight is a read-only check of everything above in one go — RPC and chain id, registration, suspension, stake against the live on-chain minimum, wallet balance, local ECDH key vs the on-chain key, each model's whitelist / enabled / added state, gateway login, Ollama tags, and the beacon API. It prints one line per check and exits 1 if anything fails, so it is safe to run as often as you like:
CodeBASH
CodeTEXT
preflight --worker 0xADDRESS inspects any address without a keystore — paste its output when asking for help.
Step 8: Run the worker
Start the container
The--add-host flag below makes host.docker.internal resolve to the Docker host on Linux (where it isn't provided by default). On macOS and Windows it's a no-op — Docker Desktop already maps that hostname — so the same command works everywhere.
CodeBASH
Step 9: Verify it's working
CodeBASH
CodeTEXT
no session cursor stored; starting behind the safe head and no job cursor stored; starting behind the safe head, show where the worker begins: 2,000 blocks behind the chain head, not at the chain's first block.
CodeBASH
claimed session request followed by the per-job stages:
CodeBASH
preflight (Step 7) first — the usual causes are a model-name mismatch or a suspension.
Whitelisted models
All of these are registered onAIConfig and whitelisted on WorkerRegistry (values as of 2026-10-21; read the live fee with cast call $AI_CONFIG_ADDRESS "getModelFee(bytes32)(uint256)" $(cast keccak <name>) --rpc-url $RPC_URL):
To serve several models, list them comma-separated in SUPPORTED_MODELS (for example SUPPORTED_MODELS=llama3-8b,gemma4:e2b), pull each into Ollama, and re-run register (or add-models for a worker that is already registered). Every model name must match the on-chain name exactly — a different string hashes to a different modelId and the registration reverts with ModelNotWhitelisted.
Rewards and fund handling
Per-job fees accrue inJobRegistry as the worker's balance: the worker releases each job once its dispute window has passed, and the fee is credited then. withdraw moves that balance to the worker's wallet ($WORKER_ADDR from Step 0). Run the same command with balance in place of withdraw to see the amount first:
CodeBASH
CodeBASH
CodeBASH
Do not drain the worker wallet to zero while the worker is registered and running — it needs gas to claim sessions and to ack and complete jobs. A worker that cannot pay for a transaction misses its deadline, and missed deadlines lead to slashing (see Slashing & Rehabilitation). Top up from your funder if it dips.
WorkerRegistry, not by the worker wallet, and is only released when you deregister (see Deregister and withdraw stake).
Check registration status
preflight (Step 7) is the most complete check. For the bare on-chain registration flags:
CodeBASH
Move an existing worker to dispatcher-free mode
A worker started with the commands this guide gave before October 2026 runs the old gateway profile:WORKER_GATEWAY_URL is set and SORTITION_ENABLED is not. It still authenticates with the gateway and sends heartbeats, and its startup log says worker sidecar running (gateway mode). It is never given a job. The dispatcher that used to assign jobs is retired (since 19 October 2026 getDispatcherAddress() returns the burn address), and workers now claim sessions themselves.
Your key, registration and stake stay as they are. To start earning again:
-
Resolve the addresses in your shell, as in Resolve mainnet contract addresses.
SESSION_MANAGER_ADDRESSis new. - Pull the image again (Step 2). An image pulled before 16 October 2026 reads the chain from its first block when it starts in dispatcher-free mode.
-
Write the env file (Step 4) with the keystore password you already use. Skip
keygen: your encryption key is already registered. -
Top up gas. The worker now pays for its own
claimSessiontransactions. Bring the worker address above 50 LCAI;preflightwarns below that. -
Run
preflight(Step 7) and fix whatever it reports. -
Replace the container. Stop and remove the old one:
Then start the new container (Step 8). It begins 2,000 blocks behind the chain head, not at the jobs your worker was assigned in the past. If the old container was started withoutCodeBASH
RELEASE_STATE_PATH=/data/release_state.json, its release ledger is inside the container anddocker rmdiscards it; the new container rebuilds the ledger from the chain when it starts, as described under "I removed the container" in Drain & Graceful Exit. -
Check the log (Step 9). It must say
worker sidecar running (sortition mode).
docker stop -t 300. lightchain-worker drain no longer takes a worker out of rotation — see Stopping and draining.
Slashing and suspension
Workers that miss deadlines or lose disputes get their stake slashed. After three offenses the worker is automatically suspended for 7 days and must callWorkerRegistry.reinstate() to come back online. Mainnet's slash rates have been 0 since 13 September 2026 (the dispute rate since 10 September), and automatic suspension is off (suspensionThreshold 1,000,000), but offences are still recorded. Full mechanics, live rates, and the step-by-step recovery runbook are in Slashing & Rehabilitation.
Stopping and draining
In dispatcher-free mode a running worker keeps claiming sessions until the process stops, sodrain alone does not take it out of rotation. Stop the process:
CodeBASH
SHUTDOWN_TIMEOUT (240 s in the env file above) to finish; keep docker stop -t above it. Later jobs in sessions you already claimed still target your worker and time out while it is offline. See Dispatcher-free Mode → Stopping, then follow Drain & Graceful Exit for the settlement and deregister sequence — deregister reverts with ActiveJobsExist until the dispute window has passed and the jobs are released.
Deregister and withdraw stake
Run this only after confirmingactiveJobsCount is 0 — otherwise it reverts with ActiveJobsExist. See Drain & Graceful Exit for the full flow.
CodeBASH
Stop the worker
Remove the container oncederegister has succeeded, as in Drain & Graceful Exit.
CodeBASH
Troubleshooting
Mainnet contract addresses
Full address book on the Mainnet Contract Addresses page.Related guides
- Dispatcher-free Mode — run profiles, environment reference, web search, stopping a self-claiming worker.
- AIVM EL Architecture — how inference, verification, and slashing fit together.
- Worker API — the indexer and data model for worker/job activity.
- Model Governance — how models get whitelisted and priced.
- Run a Worker on Testnet — the testnet equivalent of this guide, useful for trial runs before committing real LCAI.