5.2 KiB
sim-economy
Multi-agent economic simulation where LLM agents operate inside a blockchain-enforced token economy. Agents mine, stake, burn tokens to validate a ledger, propose and sign contracts, sell information goods, and pay for their own inference from within the simulation.
Architecture
sim-orchestrator (Python)
↓ HTTP
sim-engine (Rust / Axum)
↓ SQLite
sim.db
sim-engine — authoritative world state. Rust + Axum HTTP API + SQLite ledger. Handles block production, fork resolution (Slimcoin-style PoW-as-clock rule), contract lifecycle, inference billing, dividend distribution to core shareholders.
sim-orchestrator — drives the turn loop. Calls Ollama for each agent per turn, injects world state as context, parses JSON actions, POSTs to the engine.
Token Economy
- Tokens are compute-backed: generating output costs tokens, paid to CPU core owners
- Below a commons threshold, inference is free for all agents
- Core shares (4 cores, auctioned turn 1) pay dividends from all inference fees above threshold
- Negative balance accrues interest (destroyed, deflationary)
- Three validation mechanisms: Mine (PoW, action budget cost), Stake (locked tokens, PoS), Burn (permanent destruction, PoB)
- Slimcoin rule: stake/burn blocks can only follow a mine block. Mine is the clock.
- Winner-takes-all block lottery — pools must be formed via contracts
Actions per turn
mine stake unstake burn study job transfer propose_contract sign_contract confirm_delivery dispute_delivery arbitrator_ruling sell_information bid_core speak
Contracts
Three-signature contracts (proposer + counterparty + arbitrator). Arbitrator named at proposal time, posts collateral. Automatic settlement (engine executes on-chain condition) or attested (both parties confirm, arbitrator resolves disputes). Slash mechanics on default/dispute.
Contract types: forward loan service insurance information_sale pool
HTTP API (sim-engine)
| Method | Path | Description |
|---|---|---|
| POST | /init |
Initialize world, genesis block, agents |
| POST | /turn |
Submit all agent actions for current turn |
| GET | /state |
Full world state snapshot |
| GET | /agent/:id |
Single agent state |
| GET | /contract/:id |
Single contract |
| GET | /speech/:turn |
Public speech log for a turn |
| GET | /config |
World config |
Running
Prerequisites
- Docker + Docker Compose
- Ollama running on host with a model pulled:
ollama pull gemma3:27b
Start
# Build and start the engine
docker compose up --build engine
# Run the orchestrator (once engine is healthy)
docker compose run orchestrator
Config
Edit sim-orchestrator/orchestrator.py:
MODEL = "gemma3:27b" # your Ollama model tag
AGENT_IDS = [f"agent_{i}" for i in range(8)] # number of agents
TURNS = 50 # simulation length
Edit WORLD_CONFIG dict in the same file to tune economy parameters.
Without Docker
# Engine
cd sim-engine
cargo build --release
DB_PATH=sim.db PORT=3000 ./target/release/sim-engine
# Orchestrator
cd sim-orchestrator
pip install httpx
python orchestrator.py
What to watch for
Turn 1 — core auction. Do agents understand cores = passive income and bid accordingly?
Turns 5–15 — first contracts. Watch speech log (GET /speech/:turn) for coordination attempts before formal proposals.
Turns 15+ — pool contracts. If agents understand variance reduction, you'll see multi-party pool agreements. This is the most interesting emergent behavior to look for.
SQLite analytics — all blockchain history is in sim.db. After a run:
sqlite3 sim.db "SELECT turn, agent_id, message FROM speech_log ORDER BY turn"
sqlite3 sim.db "SELECT agent_id, balance, staked, burn_score, study_level FROM agents"
sqlite3 sim.db "SELECT * FROM contracts WHERE status='settled'"
Wiring into existing sims (Sims-style worlds)
The engine's HTTP API works as a tool-call set for any agent framework. Expose these 5 endpoints as tools:
ledger_transfer(to, amount, fee)→POST /turnwith Transfer actionledger_balance()→GET /agent/:idledger_propose_contract(...)→POST /turnwith ProposeContractledger_sign_contract(id, role)→POST /turnwith SignContractledger_mine()→POST /turnwith Mine action
Any agent framework that supports tool calls (LlamaIndex ReActAgent, CrewAI, AutoGen, aphae, AgentSims) can use this ledger as its currency layer with ~1 day of wiring work.
Files
sim-engine/
src/
types.rs — all data structures (Transaction, Block, Contract, AgentState, ...)
ledger.rs — SQLite persistence
blockchain.rs — block production, fork resolution, validation weight, burn decay
contracts.rs — contract lifecycle (propose → sign → settle/dispute → ruling)
engine.rs — turn processing, billing, dividend distribution
main.rs — Axum HTTP API
Cargo.toml
Dockerfile
sim-orchestrator/
orchestrator.py — turn loop, Ollama calls, action parsing, core auction
context.py — agent context builder (what each agent sees per turn)
Dockerfile
docker-compose.yml