The kit gives you 3 pre-filled files to work from as you go through this wizard. All the mainnet settings are already filled in โ you only need to add 3 personal values that you'll generate during setup.
PRIVATE_KEYโ your worker wallet private key (Step 4)ECDH_PRIVATE_KEYโ encryption key you generate (Step 8)WORKER_ADDRESSโ your worker wallet address (Step 4)
~/), and open .env in a text editor. Keep it open alongside this wizard โ you'll paste in each key as you generate it. When all 3 are filled in, run bash run-worker.sh instead of the long docker command in Step 10.
| Component | Minimum | Recommended |
|---|---|---|
| CPU | 4 cores (x86_64) | 16+ cores (AMD/Intel) |
| RAM | 16 GB DDR4 | 32โ64 GB DDR5 ๐ Keiko runs 32GB |
| Storage | 512 GB NVMe SSD | 2 TB NVMe Gen4 |
| GPU VRAM | 8 GB (llama3-8b) | 12โ24 GB ๐ RTX 5070 12GB |
| Internet | 100 Mbps up/down | 1 Gbps symmetric |
| OS | Ubuntu 22.04+ | Ubuntu 22.04 or 26.04 |
Already on Ubuntu with NVIDIA drivers installed? Click below to automatically check if your machine meets the requirements โ no copy-paste needed.
lsb_release -a
curl -s -X POST -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
https://rpc.mainnet.lightchain.aisudo ubuntu-drivers autoinstall sudo reboot
nvidia-smi
curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER && newgrp docker
cast command โ used for generating keys, checking balances, and funding the worker wallet.curl -L https://foundry.paradigm.xyz | bash foundryup
sudo apt install redis-server -y sudo systemctl enable redis-server sudo systemctl start redis-server
sudo systemctl status redis-server โ should show "active (running)"cast wallet new # Copy the output, then export both values: export WORKER_ADDR=0x... # Address from output export WORKER_PRIVKEY=0x... # Private key from output # Verify the key matches the address: cast wallet address --private-key "$WORKER_PRIVKEY"
export RPC_URL=https://rpc.mainnet.lightchain.ai export WORKER_REGISTRY_ADDRESS=0x0000000000000000000000000000000000001002 export AI_CONFIG_ADDRESS=$(cast call $WORKER_REGISTRY_ADDRESS \ "aiConfig()(address)" --rpc-url $RPC_URL) export JOB_REGISTRY_ADDRESS=$(cast call $WORKER_REGISTRY_ADDRESS \ "jobRegistry()(address)" --rpc-url $RPC_URL) echo "AI_CONFIG_ADDRESS=$AI_CONFIG_ADDRESS" echo "JOB_REGISTRY_ADDRESS=$JOB_REGISTRY_ADDRESS"
0x24D11533C354092ed6E18b964257819cE78Ce77DJobRegistry proxy:
0xfB15F90298e4CcD7106E76fFB5e520315cC42B0bThese can change after upgrades โ always resolve live as shown above.
curl -fsSL https://ollama.com/install.sh | sh ollama serve & ollama pull llama3:8b ollama cp llama3:8b llama3-8b
ollama cp llama3:8b llama3-8b) creates an alias with a dash instead of a colon. The worker looks for llama3-8b (dash) not llama3:8b (colon). Without this alias, the worker can't serve jobs even though the model is downloaded.SUPPORTED_MODELS=llama3-8b in the Docker command โ the dash is correct. Using a colon (llama3:8b) will silently break the model registration. This is one of the most common mistakes new operators make.ollama pull llama3.1:8b ollama cp llama3.1:8b llama3.1-8b ollama pull gemma2:9b ollama cp gemma2:9b gemma2-9b
curl -s http://127.0.0.1:11434/api/tags | python3 -m json.tool
ollama serve is running.docker pull us-central1-docker.pkg.dev/lightchain/lightchain-mainnet-public-docker/worker:latest
<YOUR_PASSWORD> with a strong password you'll remember โ you'll need it every time the container starts.mkdir -p ~/lightchain-worker/keys docker run --rm \ -v ~/lightchain-worker/keys:/data \ --entrypoint /bin/lightchain-worker \ us-central1-docker.pkg.dev/lightchain/lightchain-mainnet-public-docker/worker:latest \ import-key \ --private-key "$WORKER_PRIVKEY" \ --password <YOUR_PASSWORD> \ --output /data/eth-keystore
$WORKER_ADDR. If they differ, stop โ wrong key was imported.docker run --rm \ -v ~/lightchain-worker/keys:/data \ -e WORKER_KEYSTORE_PATH=/data/eth-keystore/$(ls ~/lightchain-worker/keys/eth-keystore/ | head -1) \ -e WORKER_KEYSTORE_PASSWORD=<YOUR_PASSWORD> \ -e ENCRYPTION_KEYSTORE_PATH=/data/worker-encryption.key \ -e RPC_URL=https://rpc.mainnet.lightchain.ai \ -e CHAIN_ID=9200 \ -e WORKER_REGISTRY_ADDRESS=0x0000000000000000000000000000000000001002 \ -e AI_CONFIG_ADDRESS=$AI_CONFIG_ADDRESS \ -e SUPPORTED_MODELS=llama3-8b \ --entrypoint /bin/lightchain-worker \ us-central1-docker.pkg.dev/lightchain/lightchain-mainnet-public-docker/worker:latest \ keygen
<FUNDER_PRIVKEY> with your main wallet's private key.export FUNDER_PRIVKEY=0x...
cast send "$WORKER_ADDR" \
--value 50005ether \
--rpc-url "$RPC_URL" \
--private-key "$FUNDER_PRIVKEY"
# Verify the worker received the funds:
cast balance "$WORKER_ADDR" --rpc-url "$RPC_URL" \
| awk '{printf "%.4f LCAI\n", $1/1e18}'$WORKER_ADDR. They don't auto-forward anywhere. You'll need to manually sweep earnings to your main wallet periodically. Your stake (50,000 LCAI) stays locked until you deregister.docker run --rm \ -v ~/lightchain-worker/keys:/data \ -e WORKER_KEYSTORE_PATH=/data/eth-keystore/$(ls ~/lightchain-worker/keys/eth-keystore/ | head -1) \ -e WORKER_KEYSTORE_PASSWORD=<YOUR_PASSWORD> \ -e ENCRYPTION_KEYSTORE_PATH=/data/worker-encryption.key \ -e RPC_URL=https://rpc.mainnet.lightchain.ai \ -e CHAIN_ID=9200 \ -e WORKER_REGISTRY_ADDRESS=0x0000000000000000000000000000000000001002 \ -e AI_CONFIG_ADDRESS=$AI_CONFIG_ADDRESS \ -e SUPPORTED_MODELS=llama3-8b \ --entrypoint /bin/lightchain-worker \ us-central1-docker.pkg.dev/lightchain/lightchain-mainnet-public-docker/worker:latest \ register
workers.lightchain.ai โ search for your worker address. You should see it listed with status "Online" within a few minutes of starting the container in the next step.
docker run -d \ --restart always \ --user root \ --name lightchain-worker \ --add-host=host.docker.internal:host-gateway \ -v ~/lightchain-worker/keys:/data \ -e WORKER_KEYSTORE_PATH=/data/eth-keystore/$(ls ~/lightchain-worker/keys/eth-keystore/ | head -1) \ -e WORKER_KEYSTORE_PASSWORD=<YOUR_PASSWORD> \ -e ENCRYPTION_KEYSTORE_PATH=/data/worker-encryption.key \ -e RPC_URL=https://rpc.mainnet.lightchain.ai \ -e CHAIN_ID=9200 \ -e WORKER_REGISTRY_ADDRESS=0x0000000000000000000000000000000000001002 \ -e AI_CONFIG_ADDRESS=$AI_CONFIG_ADDRESS \ -e JOB_REGISTRY_ADDRESS=$JOB_REGISTRY_ADDRESS \ -e SUPPORTED_MODELS=llama3-8b \ -e OLLAMA_URL=http://host.docker.internal:11434 \ -e BEACON_API_URL=https://beacon.mainnet.lightchain.ai \ -e BLOB_MODE=beacon \ -e SESSION_KEY_FILE=/data/session-keys.enc \ -e WORKER_GATEWAY_URL=https://worker-gateway.mainnet.lightchain.ai \ us-central1-docker.pkg.dev/lightchain/lightchain-mainnet-public-docker/worker:latest
docker logs lightchain-worker --tail 30
worker registration validated โ on-chain key matches local key
blob mode: eip-4844 (beacon)
authenticated with worker-gateway
worker service initialized (gateway mode)
worker sidecar running (gateway mode)
websocket connected to gateway
Runs all 10 checks on your machine instantly โ no copy-paste needed. Requires the Node Builder server to be running at localhost:8185.
docker ps --filter name=lightchain-worker
docker logs lightchain-worker --tail 50
sudo systemctl status redis-server --no-pager
ollama list
curl -s http://127.0.0.1:11434/api/tags | python3 -m json.tool
mullvad status
nvidia-smi
df -h ~
docker stats lightchain-worker --no-stream
curl -s -X POST -H 'content-type: application/json' \
--data '{"query":"{ workers(where:{id:\"0xYOUR_WORKER_ADDRESS\"}){ id status active_job_count jobs_completed total_earned offense_count stake } }"}' \
https://workers-api.mainnet.lightchain.ai/graphql | python3 -m json.toolDownload pre-filled config files. All mainnet settings are already correct โ just fill in your 3 personal values and run the script. No copy-paste errors, no guessing.
Think of it as renting out your gaming PC's GPU to process AI requests. When someone uses an AI app built on Lightchain, their request gets routed to a worker node like yours. You provide the computing power, they pay in LCAI, you keep the earnings. Your computer does the work, you get paid while you sleep.
Yes โ that's your stake, which is a security deposit that proves you're a serious operator. You get it back when you stop running the node. The 1 extra LCAI (above 50,000) is just to satisfy the minimum. You keep ownership of it the whole time; it's just locked while you're registered.
A gaming PC with an NVIDIA GPU (RTX 3080 or better), at least 32GB of RAM, and 100GB+ of free storage. MacBooks don't work. AMD graphics cards don't work. Most modern gaming desktops qualify โ if you bought it for gaming in the last 3-4 years, there's a good chance it'll work. The GPU does the AI processing, so that's the most important part.
The official setup requires Ubuntu Linux. You can install Ubuntu as your main OS, or set up dual-boot to run Ubuntu alongside Windows (you choose at startup). Running inside a virtual machine (like VirtualBox) is NOT recommended โ it can't properly access your GPU. Ubuntu is free to download and install, and it's what Step 2 of this wizard covers.
Docker is a tool that runs software in an isolated container โ like a locked box that keeps the node software separate from the rest of your computer. You don't need to understand how it works. You just install it, and the wizard handles the rest. Think of it as a safe sandbox where the node lives.
Ollama is the software that runs the AI model (llama3) on your computer. When a job comes in from the network, Ollama processes it using your GPU. Think of it as a mini ChatGPT running locally on your machine. You install it, pull the model, and your node uses it to answer AI requests and earn LCAI.
A private key is the password to a crypto wallet โ except it can never be changed or recovered if lost. Anyone who has it controls that wallet completely. The wizard has you generate a separate worker wallet just for the node โ different from your main wallet. That way, even in the worst case, your main LCAI balance is untouchable. Write your worker private key down on paper and store it somewhere safe. Never share it. Never put it in an email or chat.
Staking means depositing LCAI as a security deposit when you register your node. This 50,001 LCAI stays locked in the contract while your node is active. You're not spending it โ it's still yours. You get it back when you officially stop running the node (deregister). The stake exists so operators have skin in the game and behave reliably.
Slashing means losing part of your stake as a penalty โ approximately 7,500 LCAI. This happens if you deregister your node while it still has pending jobs. The fix is simple: never deregister suddenly. If something goes wrong, restart the Docker container first. Only deregister when you're sure there are no pending jobs. The slash is rare and entirely avoidable with careful operation.
Ideally yes โ your node only earns when it's online and available. Downtime means missed jobs. Two things help: a UPS (uninterruptible power supply, about $60-150) protects you during power outages, and a phone hotspot gives you backup internet if your ISP goes down. Your node can come back online after being off without losing your stake โ you just don't earn while it's offline.
Each completed job pays approximately 0.016 LCAI to your node. How many jobs you get depends on your stake (more stake = higher routing priority), network traffic, and uptime. The network is still young โ there are only about 13 community nodes right now. Job volume will increase as more dApps launch on Lightchain. Right now is early-adopter territory: low competition, high future upside.
The node runs inside Docker (isolated) and only talks to official Lightchain endpoints โ it doesn't open any ports to the internet on its own. Your worker private key is used only for signing transactions, not for accessing your main wallet. Using a VPN as recommended adds another layer. Keep your Ubuntu system updated, don't run random scripts from strangers, and you're fine.
Most things that look like errors are actually normal. "WebSocket EOF" every hour is the auth token refreshing โ completely expected. "worker_ollama_up=0" is cosmetic and doesn't affect jobs. "batch release succeeded" is actually great news (payouts processing). If you're not sure, paste the log line into the AI assistant and ask โ it knows the difference between real errors and normal noise.
You use two completely separate wallets. Your funder wallet (your main wallet) holds your LCAI and sends the 50,001 stake to get the node registered. Your worker wallet is a brand new wallet you generate just for the node โ it only needs a small amount of LCAI for gas fees. This way your main funds are never at risk even if something goes wrong with the node config.
A VPN routes your internet traffic through a different server, which bypasses blocks your internet provider might have in place. Some ISPs (Cox is a known one) block the connections your node needs to reach the Lightchain network. If your setup commands keep timing out or failing to connect, try Mullvad VPN first โ connect it before starting your node. Not everyone needs it, but it's worth having ready.
VRAM is your GPU's dedicated memory โ separate from your regular RAM. The AI model (llama3) needs about 5GB of it to run. To check how much you have, open a terminal and type: nvidia-smi. Look for the memory line (e.g. "8192 MiB"). If you have 8GB or more, you're fine. If you have other GPU-heavy apps running (like image generation software), you may need to close them to free up VRAM.
This is the #1 issue for running operators. The container may restart, but if Ollama isn't running or VPN isn't connected, jobs silently stop. Here's the one-time fix that makes your node bulletproof after any reboot:
sudo systemctl enable docker
sudo systemctl enable ollama
docker update --restart unless-stopped lcai-worker
mullvad auto-connect set on mullvad connect
This is the most frustrating scenario โ logs look healthy, container is up, but no jobs. Work through this checklist in order:
Jobs can only come in if the WebSocket is active. Check logs:
docker logs lcai-worker --tail 30 2>&1 | grep -i websocket
You need to see: websocket connected to gateway
If absent or showing errors โ restart the container and check VPN.
mullvad status
Must show "Connected". If disconnected: mullvad connect
If you're on Cox or another blocking ISP and VPN is off, your node can't reach the gateway.
ollama list | grep llama3-8b
You need a model named exactly llama3-8b (dash, not colon). If missing after an Ollama update, recreate it: ollama cp llama3:8b llama3-8b
Check workers.lightchain.ai and search your worker address. If your node shows as "offline" or "suspended", that's the real problem โ not a config issue.
Routing priority is proportional to your stake. If you're registered with the minimum (50,001 LCAI) and there are nodes with larger stakes, you may simply be getting fewer jobs. This is expected โ staking more increases your share. This isn't a bug, it's the system working as designed.
Query the subgraph to see recent network job activity:
curl -s -X POST https://workers-api.mainnet.lightchain.ai/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ jobs(first:5,orderBy:submittedAt,orderDirection:desc) { id state submittedAt } }"}' | python3 -m json.toolIf total recent jobs is very low, the network is quiet โ nothing is wrong with your node.
First, read the logs to find the real error:
docker logs lcai-worker --tail 100 2>&1
Your PRIVATE_KEY or ENCRYPTION_KEYSTORE_PATH env variable is wrong or the file path doesn't exist inside the container. Verify the key format (must start with 0x) and that any mounted paths are correct.
The container can't reach the Lightchain RPC. Check VPN status (mullvad status) and that Ollama is running (curl http://localhost:11434/api/tags).
Try running without -d (detached) to see output in real-time: docker run --rm [all your flags] lightchain/lcai-worker:latest
Check GPU VRAM: nvidia-smi. If another app (ComfyUI, Stable Diffusion, etc.) is using VRAM, close it. The model needs ~5GB free.
nvidia-smi
When a job is processing, GPU utilization should spike. If it stays at 0% during a job, Ollama isn't getting the request.
If you run image generation (ComfyUI, A1111) alongside your node, they compete for VRAM. Check total VRAM usage in nvidia-smi. Ollama needs ~5GB free to process jobs without swapping.
curl http://localhost:11434/api/generate \
-d '{"model":"llama3-8b","prompt":"say hello","stream":false}'Should return a response within 30 seconds. If it hangs or errors, Ollama itself is the problem.
If it's disconnecting more frequently (every few minutes):
Your Mullvad VPN server might be overloaded or having issues. Switch to a different server โ US or EU servers generally work well.
mullvad relay set location us # try US servers mullvad reconnect
Frequent disconnects can mean unstable internet. A phone hotspot as backup internet can help. The container auto-reconnects โ but if your ISP connection is flapping, jobs during that window are missed.
First, check your actual stake โ you may not have been slashed yet:
curl -s -X POST https://workers-api.mainnet.lightchain.ai/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ workers(where:{id:\"YOUR_WORKER_ADDRESS\"}) { stake offenseCount suspendedUntil } }"}' | python3 -m json.toolYou received a warning/offense but haven't been slashed yet. Your node may be temporarily suspended. Wait for the suspendedUntil timestamp to pass, then resume operations normally.
You were slashed. The penalty is approximately 7,500 LCAI. Your node may still be registered and operational if stake is above the minimum. Top up your stake if needed, and do not deregister until all pending jobs are clear.
Never deregister suddenly. Set up the auto-restart procedure (first section above) so your node survives power loss. If you need to stop the node, restart the Docker container first instead of deregistering.
Something's wrong and you need to restart everything cleanly. Run these commands in order:
mullvad connect && mullvad status
sudo systemctl start ollama sleep 5 curl http://localhost:11434/api/tags | python3 -m json.tool
ollama cp llama3:8b llama3-8b
docker restart lcai-worker 2>/dev/null || docker restart lightchain-worker 2>/dev/null
docker logs -f lcai-worker 2>/dev/null || docker logs -f lightchain-worker 2>/dev/null
The bug: the indexer watches WorkerRegistry events but doesn't reset is_registered to true when a new WorkerJoined event follows an earlier ExitFinalized. So the API is wrong โ your on-chain state is correct.
Check workers.lightchain.ai and search your worker address. The explorer reads on-chain state directly โ if it shows you as active with your stake intact, you are registered. Ignore the API status.
Nothing โ your node is fine. Report the discrepancy in the Lightchain Discord so the team can fix the indexer. Do NOT deregister and re-register again trying to fix the display โ that risks another slash.
gemma4:e2b is listed as whitelisted and enabled in the model registry, but AddSupportedModel reverts with no error message when you try to register it. The contract is broken for this model. llama3-8b works correctly.The worker binary registers the node, then tries to add gemma4:e2b as a supported model, gets a revert, and rolls back via DeregisterWorker. This triggers an endless loop of register โ deregister โ register. This also triggers Bug #1 above (status stuck as deregistered). Do not attempt to use this model until the team fixes the contract.
Use llama3-8b only. It is confirmed working and is the standard model for Lightchain worker nodes. Remove any reference to gemma4:e2b from your SUPPORTED_MODELS environment variable.