Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

RustBus: The Legendary BSV Microservices Engine

Engine

RustBus EngineCI/CDDockerDependencies

RustBus is a high-performance blockchain explorer, indexer and microservices engine for the BSV blockchain (BSV), engineered to far surpass traditional indexers with exceptional scalability and efficiency. Written in Rust, RustBus harnesses modern technologies—GraphQL, REST, WebSocket APIs, PostgreSQL partitioning, and ZeroMQ—to provide real-time transaction and block indexing for both mainnet and testnet. Ideal for developers querying BSV transactions, miners tracking blocks, or enterprises leveraging BSV's massive blockchain, RustBus is your premier solution.

✨ Features

  • Scalable Indexing: Manages BSV's large-scale blocks and transactions using PostgreSQL table partitioning by block height, optimized for mainnet.
  • Modern APIs:
    • GraphQL: Query transactions, blocks, and OP_RETURN data via a flexible /graphql endpoint with a GraphiQL playground.
    • REST: Retrieve transactions at /tx/{txid} or filter by type at /txs?type=BCAT.
    • WebSocket: Subscribe to real-time transaction notifications at /ws for protocols like RUN, MAP or BCAT.
  • Real-Time Notifications: Connects to BSV nodes via ZeroMQ for instant block updates.
  • Prometheus Metrics: Tracks performance at /metrics (port 8080) with metrics like rustbus_txs_indexed_total.
  • Mainnet & Testnet Support: Configurable with NETWORK=mainnet or NETWORK=testnet.
  • Historical Syncing: Syncs blocks from any starting height (e.g., START_HEIGHT=800000) with reorg handling.
  • Dockerized Deployment: Lightweight (~100MB) Docker image for seamless CI/CD and production.
  • Efficient Storage: Selective indexing with GIN trigram indexes on OP_RETURN for rapid searches.
  • CI/CD Pipeline: Automated testing, linting, and Docker builds via GitHub Actions.

🚀 Quick Start

Launch RustBus in minutes with Docker, PostgreSQL, and a BSV node.

Prerequisites

  • Docker: Install from docker.com.
  • PostgreSQL 15+: Install locally or use a managed service.
  • BSV Node: Run a BSV node with RPC (port 8332) and ZeroMQ (port 28332) enabled.
  • Rust 1.81+ (optional for local builds): Install via rustup.rs.

Setup

  1. Clone the Repository:

    git clone https://github.com/murphsicles/RustBus
    cd RustBus
  2. Configure Environment:

    • Copy the example environment file:
      cp .env.example .env
    • Edit .env with your settings:
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      DATABASE_URL=postgres://user:pass@localhost:5432/rustbus
      BSV_RPC_URL=http://127.0.0.1:8332
      BSV_RPC_USER=rpcuser
      BSV_RPC_PASSWORD=rpcpass
      ZMQ_ADDR=tcp://127.0.0.1:28332
      NETWORK=mainnet
      START_HEIGHT=800000
      METRICS_PORT=9090
      BIND_ADDR=0.0.0.0:8080
  3. Set Up PostgreSQL:

    • Create the database:
      sudo -u postgres createdb rustbus
      sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'pass';"
    • Apply the partitioned schema:
      psql -h localhost -U postgres -d rustbus -f schema.sql
  4. Build and Run with Docker:

    docker build -t rustbus:latest .
    docker run -d --name rustbus -p 8080:8080 --env-file .env rustbus:latest
  5. Verify:

    • GraphQL Playground: Open http://localhost:8080/graphql.
    • Health Check: curl http://localhost:8080/health
    • Metrics: curl http://localhost:8080/metrics
    • Check indexed blocks:
      psql -d rustbus -c "SELECT COUNT(*) FROM blocks;"

🛠️ Environment Variables

Configure RustBus via .env or Docker -e flags:

VariableDescriptionExample
DATABASE_URLPostgreSQL connection stringpostgres://user:pass@localhost:5432/rustbus
BSV_NODEBSV node RPC address (host:port)127.0.0.1:8332
ZMQ_ADDRZeroMQ address for block notificationstcp://127.0.0.1:28332
NETWORKBlockchain networkmainnet or testnet
START_HEIGHTStarting block height for historical sync800000
METRICS_PORTPort for Prometheus metrics8080
  • DATABASE_URL: PostgreSQL connection string (e.g., postgres://user:pass@db:5432/rustbus)
  • BSV_NODE: BSV node address (e.g., bsv-node:8333)
  • ZMQ_ADDR: ZMQ address (e.g., tcp://bsv-node:28332)
  • NETWORK: mainnet or testnet
  • START_HEIGHT: Starting block height (default: 0)
  • BIND_ADDR: HTTP bind address (default: 0.0.0.0:8080)
  • METRICS_PORT: Prometheus metrics port (default: 9090)
  • PROTOCOLS: Transaction protocol regexes (e.g., RUN:run://; MAP:1PuQa7)

📚 API Examples

GraphQL Query

Fetch a transaction by TXID:

query {
transaction(txid: "abc123...") {
txidblock_heighttx_typeop_return
}
}

Run via http://localhost:8080/graphql or curl:

curl -X POST -H "Content-Type: application/json" \
-d '{"query":"query { transaction(txid: \"abc123...\") { txid block_height tx_type op_return } }"}' \
http://localhost:8080/graphql

REST API

Get transactions by type:

curl "http://localhost:8080/txs?type=RUN&limit=10"

Get a single transaction:

curl http://localhost:8080/tx/abc123...

WebSocket Subscription

Subscribe to RUN transactions:

wscat -c ws://127.0.0.1:8080/ws

Send:

{"client_id": "test1", "filter_type": "RUN"}

Prometheus Metrics

Monitor indexing performance:

curl http://localhost:8080/metrics 

Example

output:rustbus_txs_indexed_total{network="mainnet"} 123456
rustbus_block_process_seconds{network="mainnet"} 0.05
rustbus_active_subscriptions 10

🗄️ Database Schema

RustBus uses partitioned PostgreSQL tables for scalability. Key tables (schema.sql): -transactions:

CREATETABLEtransactions (
txid TEXTNOT NULL,
block_height BIGINTNOT NULL,
tx_type TEXTNOT NULL,
op_return TEXT,
tx_hex TEXTNOT NULL,
PRIMARY KEY (txid, block_height)
) PARTITION BY RANGE (block_height);

-Partitions: transactions_p0_100000, transactions_p100000_200000, etc.

-Indexes: GIN trigram on op_return, B-tree on tx_type, block_height. -blocks:

CREATETABLEblocks (
height BIGINTPRIMARY KEY,
hash TEXTNOT NULL,
timestampBIGINTNOT NULL
) PARTITION BY RANGE (height);

Apply:

psql -d rustbus -f schema.sql 

🐳 Docker Deployment

Build and push to Docker Hub:

docker build -t yourusername/rustbus:latest . docker push yourusername/rustbus:latest 

Deploy with Fly.io (example fly.toml):

app = "rustbus"primary_region = "iad"
[http_service]
internal_port = 8080force_https = trueauto_stop_machines = trueauto_start_machines = truemin_machines_running = 1

Run:

flyctl deploy 

🔧 Development

Build and run locally without Docker:

cargo build --release
cargo run

Run tests:

cargo test --verbose

Lint:

cargo clippy --all-targets --all-features -- -D warnings

📋 Planned Features

  • Lite mode for minimal transaction data (tx hash, block height).
  • Advanced filtering for RUN, MAP sub-contexts, with discovery API.
  • Explicit mempool transaction support in GraphQL.

🤝 Contributing

We welcome contributions! Fork the repo, create a branch, and submit a PR. See CONTRIBUTING.md for guidelines.

📜 License

MIT License. See LICENSE.

🌟 Why RustBus?

RustBus redefines BSV exploration with:

  • Performance: Rust's speed and safety for mainnet-scale indexing.
  • Flexibility: GraphQL, REST, and WebSocket APIs for all use cases.
  • Scalability: Partitioned storage and efficient indexing.
  • Reliability: CI/CD with GitHub Actions and Docker.

Join the BSV revolution with RustBus—the explorer that scales as big as your ambitions!

About

The Legendary BSV Microservices Engine

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages