A high-performance indexer for the Qubic blockchain network. Bob syncs tick data, verifies integrity via logging events, indexes blockchain data, and exposes it through an Ethereum-style JSON-RPC 2.0 API (HTTP & WebSocket) and a REST API.
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 4 cores (AVX2 support required) | 8 cores |
| RAM | 12 GB | 16 GB |
| Storage | 600 GB fast SSD / NVMe (stores 2 epochs of data, default) | 1 TB fast SSD / NVMe |
Choose the method that best fits your setup. If you just want to get Bob running with minimal effort, Option 1 is the way to go.
The standalone image bundles Bob, Redis, and Kvrocks into a single container -- no extra services needed. If you already run your own KeyDB/Kvrocks instances, you can point Bob to them via the config file (see Configuration).
docker run -d --name qubic-bob \
-p 21842:21842 \
-p 40420:40420 \
-v qubic-bob-redis:/data/redis \
-v qubic-bob-kvrocks:/data/kvrocks \
-v qubic-bob-data:/data/bob \
qubiccore/bob:latestCheck the logs to make sure everything is running:
docker logs -f qubic-bobPorts exposed:
| Port | Purpose |
|---|---|
| 21842 | P2P server |
| 40420 | REST API & JSON-RPC |
If you want to build the Docker image yourself instead of pulling from Docker Hub, first change image: qubiccore/bob:latest to image: qubic-bob in docker/examples/docker-compose.yml so compose uses your build:
git clone https://github.com/qubic/core-bob.git
cd core-bob
docker build -t qubic-bob -f docker/Dockerfile .
docker compose -f docker/examples/docker-compose.yml up -dCheck the logs:
docker logs -f qubic-bobsudo apt-get update
sudo apt install -y vim net-tools tmux cmake git libjsoncpp-dev \
build-essential uuid-dev libhiredis-dev zlib1g-dev unzipKeyDB is a Redis-compatible database required by Bob. Follow the KeyDB installation guide.
Optionally, install KVRocks for additional disk-based persistence: KVRocks installation guide.
git clone https://github.com/qubic/core-bob.git
cd core-bob
mkdir build && cd build
cmake ..
make bob -j$(nproc)./bob <path-to-config.json>For example, using the provided default config:
./bob ../default_config_bob.jsonAn example configuration file, default_config_bob.json, ships with the repository. Below is an annotated reference:
{
"p2p_node": ["BM:157.180.10.49:21841:0-0-0-0", "BM:65.109.122.174:21841:0-0-0-0"],
"request_cycle_ms": 100,
"request_logging_cycle_ms": 30,
"future_offset": 10,
"log_level": "info",
"keydb_url": "tcp://127.0.0.1:6379",
"run_server": false,
"server_port": 21842,
"arbitrator_identity": "AFZPUAIYVPNUYGJRQVLUKOPPVLHAZQTGLYAAUUNBXFTVTAMSBKQBLEIEPCVJ",
"tick_storage_mode": "kvrocks",
"kvrocks_url": "tcp://127.0.0.1:6666",
"tx_storage_mode": "kvrocks",
"tx_tick_to_live": 1000,
"max_thread": 8,
"spam_qu_threshold": 0
}Key fields:
| Field | Description |
|---|---|
p2p_node |
Nodes to sync from. Format: BM:IP:PORT[:P0-P1-P2-P3] or bob:IP:PORT[:P0-P1-P2-P3]. Empty or omitted = peer discovery |
request_cycle_ms |
Interval (ms) for tick data requests. Too low may overload the node |
future_offset |
How many ticks ahead to request. Too high may overload the node |
keydb_url |
Redis / KeyDB connection URL |
run_server |
Set to true to serve data to other nodes on server_port |
tick_storage_mode |
"kvrocks", "lastNTick", or "free" |
tx_storage_mode |
"lastNTick", "kvrocks", or "free" |
log_level |
"trace", "debug", "info", "warn", "error", "critical", or "off". Omitted or unknown = logging off |
max_thread |
Max worker threads (0 = auto) |
spam_qu_threshold |
Minimum QU amount to index a transfer |
Once Bob is running you can interact with it via the JSON-RPC or REST API:
- JSON-RPC (HTTP):
POST http://localhost:40420/qubic - JSON-RPC (WebSocket):
ws://localhost:40420/ws/qubic
Example JSON-RPC call:
curl -s -X POST http://localhost:40420/qubic \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"qubic_getTickNumber","params":[],"id":1}'- RELEASE_NOTES.md — human-written changelog of user-visible changes (RPC, REST, WS, config) per version, including migration notes for breaking changes.
- GitHub Releases — every tagged version (
v*.*.*) triggers a GitHub Action that builds and publishes the docker image to Docker Hub asqubiccore/bob:<version>andqubiccore/bob:latest. The release page lists each tag with its build artifacts and the diff against the previous tag. - Docker Hub — pre-built images at
qubiccore/bob. Use:latestfor the newest stable, or pin to a specific:1.4.xtag for reproducibility.