Tools: RustChain Developer Tutorial: Build on the Proof-of-Antiquity Blockchain

Tools: RustChain Developer Tutorial: Build on the Proof-of-Antiquity Blockchain

RustChain Developer Tutorial: Build on the Proof-of-Antiquity Blockchain

Table of Contents

Introduction

Why RustChain?

What You'll Build

Who This Is For

Prerequisites

Hardware Requirements

Software Requirements

Network Requirements

Verify Your Environment

Quick Start (5 Minutes)

Step 1: Run the Installer

Step 2: Start Mining

Step 3: Verify It's Working

Expected Output

Understanding Proof-of-Antiquity

The Core Concept

The 6 Hardware Fingerprint Checks

How Rewards Are Calculated

Example: PowerPC G4 Mining

Setup Deep Dive

Manual Installation (Alternative to Script)

Step 1: Create Directory Structure

Step 2: Create Virtual Environment

Step 3: Install Dependencies

Step 4: Download Miner

Step 5: Configure Wallet

Step 6: Download Fingerprint Module

Installation Verification

File Structure After Setup

Your First Mining Session

Starting the Miner

Understanding Miner Output

Monitoring Your Miner

Real-time Logs

Query Network Status

Check Your Balance

Stopping the Miner

Making Transactions

Understanding RustChain Transactions

Sending RTC via API

Transaction Status

Using the CLI Helper

Practical Examples

Example 1: Multi-Miner Setup

Example 2: Automated Monitoring Script

Example 3: Auto-Restart on Failure

Example 4: Mining Dashboard (Python)

Example 5: Bridge RTC ↔ wRTC Programmatically

Troubleshooting

Common Issues and Solutions

Issue: Miner Fails to Start

Issue: Attestation Checks Fail

Issue: No Rewards Accumulating

Issue: SSL/Certificate Errors

Issue: Python Virtual Environment Problems

Issue: Auto-Start Service Fails

Debug Mode

Getting Help

Advanced Topics

Running a Full Node

Custom Mining Strategies

Dynamic Interval Adjustment

Building on RustChain

Integrating RustChain Payments

Security Considerations

Next Steps

Continue Your Journey

Quick Reference

Related Documentation

Appendix A: Supported Hardware Reference

PowerPC Systems

x86 Systems

Other Architectures

Appendix B: API Quick Reference

Endpoints

Example Responses A comprehensive guide for developers — From zero to mining RTC tokens on vintage hardware. Last updated: March 2026

Network: Mainnet (https://rustchain.org)

Token: RTC (native), wRTC (Solana wrapped) RustChain is the first blockchain that rewards vintage hardware for being old, not fast. Unlike traditional proof-of-work chains that favor the latest GPUs, RustChain's Proof-of-Antiquity (PoA) consensus gives higher mining multipliers to older CPUs. By the end of this tutorial, you will: Your hardware determines your mining multiplier. RustChain rewards older CPUs: 💡 Tip: Check your CPU's eligibility before proceeding. See CPU_ANTIQUITY_SYSTEM.md for the complete multiplier table. For developers who want to get mining immediately, here's the fastest path: 🎉 Congratulations! You're now mining RustChain. Continue reading for a deeper understanding. Proof-of-Antiquity flips traditional mining economics: RustChain prevents VMs and emulators from earning rewards through 6 independent checks: If you prefer manual control or the script fails: Create ~/.rustchain/config.json: Run these checks to ensure everything is set up correctly: Or use the convenience script: RustChain transactions are simple value transfers between wallets: RustChain provides clawrtc for command-line operations: Run miners on multiple vintage machines, all reporting to one wallet: Create monitor_miner.sh: Enable verbose logging for troubleshooting: For developers who want to run a full RustChain node: See DOCKER_DEPLOYMENT.md for containerized deployment. Adjust mining frequency based on network conditions: Explore advanced topics: This tutorial is maintained by the RustChain community. Found an issue? Submit a PR or claim a bounty at rustchain-bounties. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Command

Copy

# Check Python version python3 --version # Expected: Python 3.6.0 or higher # Check -weight: 500;">curl availability -weight: 500;">curl --version # Expected: -weight: 500;">curl X.Y.Z with SSL support # Test network connectivity to RustChain node -weight: 500;">curl -sk https://rustchain.org/health # Expected: {"-weight: 500;">status": "ok", ...} # Check Python version python3 --version # Expected: Python 3.6.0 or higher # Check -weight: 500;">curl availability -weight: 500;">curl --version # Expected: -weight: 500;">curl X.Y.Z with SSL support # Test network connectivity to RustChain node -weight: 500;">curl -sk https://rustchain.org/health # Expected: {"-weight: 500;">status": "ok", ...} # Check Python version python3 --version # Expected: Python 3.6.0 or higher # Check -weight: 500;">curl availability -weight: 500;">curl --version # Expected: -weight: 500;">curl X.Y.Z with SSL support # Test network connectivity to RustChain node -weight: 500;">curl -sk https://rustchain.org/health # Expected: {"-weight: 500;">status": "ok", ...} -weight: 500;">curl -sSL https://raw.githubusercontent.com/Scottcjn/Rustchain/main/-weight: 500;">install-miner.sh | bash -weight: 500;">curl -sSL https://raw.githubusercontent.com/Scottcjn/Rustchain/main/-weight: 500;">install-miner.sh | bash -weight: 500;">curl -sSL https://raw.githubusercontent.com/Scottcjn/Rustchain/main/-weight: 500;">install-miner.sh | bash # Navigate to the installation directory cd ~/.rustchain # Start the miner ./-weight: 500;">start.sh # Navigate to the installation directory cd ~/.rustchain # Start the miner ./-weight: 500;">start.sh # Navigate to the installation directory cd ~/.rustchain # Start the miner ./-weight: 500;">start.sh # Check miner logs tail -f ~/.rustchain/miner.log # Verify your miner is visible on the network -weight: 500;">curl -sk https://rustchain.org/api/miners | jq '.[] | select(.miner_id contains "YOUR_WALLET_NAME")' # Check your balance (after a few minutes of mining) -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=YOUR_WALLET_NAME" | jq . # Check miner logs tail -f ~/.rustchain/miner.log # Verify your miner is visible on the network -weight: 500;">curl -sk https://rustchain.org/api/miners | jq '.[] | select(.miner_id contains "YOUR_WALLET_NAME")' # Check your balance (after a few minutes of mining) -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=YOUR_WALLET_NAME" | jq . # Check miner logs tail -f ~/.rustchain/miner.log # Verify your miner is visible on the network -weight: 500;">curl -sk https://rustchain.org/api/miners | jq '.[] | select(.miner_id contains "YOUR_WALLET_NAME")' # Check your balance (after a few minutes of mining) -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=YOUR_WALLET_NAME" | jq . { "miner_id": "YOUR_WALLET_NAME", "balance": 12.5, "pending_rewards": 0.75, "last_heartbeat": "2026-03-13T10:30:00Z", "cpu_multiplier": 3.5 } { "miner_id": "YOUR_WALLET_NAME", "balance": 12.5, "pending_rewards": 0.75, "last_heartbeat": "2026-03-13T10:30:00Z", "cpu_multiplier": 3.5 } { "miner_id": "YOUR_WALLET_NAME", "balance": 12.5, "pending_rewards": 0.75, "last_heartbeat": "2026-03-13T10:30:00Z", "cpu_multiplier": 3.5 } Traditional PoW: Reward ∝ Hash Rate RustChain PoA: Reward ∝ Hardware Age × Attestation Score Traditional PoW: Reward ∝ Hash Rate RustChain PoA: Reward ∝ Hardware Age × Attestation Score Traditional PoW: Reward ∝ Hash Rate RustChain PoA: Reward ∝ Hardware Age × Attestation Score # Simplified reward formula base_reward = 1.0 # RTC per epoch cpu_multiplier = get_multiplier_for_cpu() # 1.0 - 4.0 attestation_score = run_fingerprint_checks() # 0.0 - 1.0 uptime_factor = min(1.0, hours_online / 24) # Caps at 24 hours epoch_reward = base_reward * cpu_multiplier * attestation_score * uptime_factor # Simplified reward formula base_reward = 1.0 # RTC per epoch cpu_multiplier = get_multiplier_for_cpu() # 1.0 - 4.0 attestation_score = run_fingerprint_checks() # 0.0 - 1.0 uptime_factor = min(1.0, hours_online / 24) # Caps at 24 hours epoch_reward = base_reward * cpu_multiplier * attestation_score * uptime_factor # Simplified reward formula base_reward = 1.0 # RTC per epoch cpu_multiplier = get_multiplier_for_cpu() # 1.0 - 4.0 attestation_score = run_fingerprint_checks() # 0.0 - 1.0 uptime_factor = min(1.0, hours_online / 24) # Caps at 24 hours epoch_reward = base_reward * cpu_multiplier * attestation_score * uptime_factor CPU: PowerPC G4 @ 1.25 GHz (PowerMac G5, 2005) Multiplier: ×3.5 Attestation: 100% (all 6 checks pass) Uptime: 12 hours (factor = 0.5) Reward = 1.0 × 3.5 × 1.0 × 0.5 = 1.75 RTC CPU: PowerPC G4 @ 1.25 GHz (PowerMac G5, 2005) Multiplier: ×3.5 Attestation: 100% (all 6 checks pass) Uptime: 12 hours (factor = 0.5) Reward = 1.0 × 3.5 × 1.0 × 0.5 = 1.75 RTC CPU: PowerPC G4 @ 1.25 GHz (PowerMac G5, 2005) Multiplier: ×3.5 Attestation: 100% (all 6 checks pass) Uptime: 12 hours (factor = 0.5) Reward = 1.0 × 3.5 × 1.0 × 0.5 = 1.75 RTC mkdir -p ~/.rustchain cd ~/.rustchain mkdir -p ~/.rustchain cd ~/.rustchain mkdir -p ~/.rustchain cd ~/.rustchain python3 -m venv venv source venv/bin/activate # Linux/macOS # or: venv\Scripts\activate # Windows python3 -m venv venv source venv/bin/activate # Linux/macOS # or: venv\Scripts\activate # Windows python3 -m venv venv source venv/bin/activate # Linux/macOS # or: venv\Scripts\activate # Windows -weight: 500;">pip -weight: 500;">install requests -weight: 500;">pip -weight: 500;">install requests -weight: 500;">pip -weight: 500;">install requests # Detect your architecture ARCH=$(uname -m) OS=$(uname -s | tr '[:upper:]' '[:lower:]') # Download appropriate binary -weight: 500;">curl -sSL "https://github.com/Scottcjn/Rustchain/releases/latest/download/rustchain_miner_${OS}_${ARCH}" \ -o rustchain_miner.py chmod +x rustchain_miner.py # Detect your architecture ARCH=$(uname -m) OS=$(uname -s | tr '[:upper:]' '[:lower:]') # Download appropriate binary -weight: 500;">curl -sSL "https://github.com/Scottcjn/Rustchain/releases/latest/download/rustchain_miner_${OS}_${ARCH}" \ -o rustchain_miner.py chmod +x rustchain_miner.py # Detect your architecture ARCH=$(uname -m) OS=$(uname -s | tr '[:upper:]' '[:lower:]') # Download appropriate binary -weight: 500;">curl -sSL "https://github.com/Scottcjn/Rustchain/releases/latest/download/rustchain_miner_${OS}_${ARCH}" \ -o rustchain_miner.py chmod +x rustchain_miner.py { "wallet_name": "my-vintage-miner", "node_url": "https://rustchain.org", "mining_interval_seconds": 60, "log_level": "INFO" } { "wallet_name": "my-vintage-miner", "node_url": "https://rustchain.org", "mining_interval_seconds": 60, "log_level": "INFO" } { "wallet_name": "my-vintage-miner", "node_url": "https://rustchain.org", "mining_interval_seconds": 60, "log_level": "INFO" } -weight: 500;">curl -sSL "https://raw.githubusercontent.com/Scottcjn/Rustchain/main/fingerprint_checks.py" \ -o fingerprint_checks.py -weight: 500;">curl -sSL "https://raw.githubusercontent.com/Scottcjn/Rustchain/main/fingerprint_checks.py" \ -o fingerprint_checks.py -weight: 500;">curl -sSL "https://raw.githubusercontent.com/Scottcjn/Rustchain/main/fingerprint_checks.py" \ -o fingerprint_checks.py # 1. Verify Python environment source ~/.rustchain/venv/bin/activate python --version # Should show your Python version # 2. Verify dependencies python -c "import requests; print(requests.__version__)" # 3. Test fingerprint module python -c "import fingerprint_checks; print('OK')" # 4. Test network connectivity -weight: 500;">curl -sk https://rustchain.org/health | jq .-weight: 500;">status # Expected: "ok" # 1. Verify Python environment source ~/.rustchain/venv/bin/activate python --version # Should show your Python version # 2. Verify dependencies python -c "import requests; print(requests.__version__)" # 3. Test fingerprint module python -c "import fingerprint_checks; print('OK')" # 4. Test network connectivity -weight: 500;">curl -sk https://rustchain.org/health | jq .-weight: 500;">status # Expected: "ok" # 1. Verify Python environment source ~/.rustchain/venv/bin/activate python --version # Should show your Python version # 2. Verify dependencies python -c "import requests; print(requests.__version__)" # 3. Test fingerprint module python -c "import fingerprint_checks; print('OK')" # 4. Test network connectivity -weight: 500;">curl -sk https://rustchain.org/health | jq .-weight: 500;">status # Expected: "ok" ~/.rustchain/ ├── venv/ # Python virtual environment │ ├── bin/ │ │ ├── python # Virtualenv Python │ │ ├── -weight: 500;">pip # Virtualenv -weight: 500;">pip │ │ └── activate # Activation script │ └── lib/ │ └── python3.X/ │ └── site-packages/ │ ├── requests/ │ └── ... ├── rustchain_miner.py # Main miner script ├── fingerprint_checks.py # Hardware attestation ├── config.json # Your configuration ├── -weight: 500;">start.sh # Convenience launcher └── miner.log # Runtime logs ~/.rustchain/ ├── venv/ # Python virtual environment │ ├── bin/ │ │ ├── python # Virtualenv Python │ │ ├── -weight: 500;">pip # Virtualenv -weight: 500;">pip │ │ └── activate # Activation script │ └── lib/ │ └── python3.X/ │ └── site-packages/ │ ├── requests/ │ └── ... ├── rustchain_miner.py # Main miner script ├── fingerprint_checks.py # Hardware attestation ├── config.json # Your configuration ├── -weight: 500;">start.sh # Convenience launcher └── miner.log # Runtime logs ~/.rustchain/ ├── venv/ # Python virtual environment │ ├── bin/ │ │ ├── python # Virtualenv Python │ │ ├── -weight: 500;">pip # Virtualenv -weight: 500;">pip │ │ └── activate # Activation script │ └── lib/ │ └── python3.X/ │ └── site-packages/ │ ├── requests/ │ └── ... ├── rustchain_miner.py # Main miner script ├── fingerprint_checks.py # Hardware attestation ├── config.json # Your configuration ├── -weight: 500;">start.sh # Convenience launcher └── miner.log # Runtime logs cd ~/.rustchain source venv/bin/activate python rustchain_miner.py --config config.json cd ~/.rustchain source venv/bin/activate python rustchain_miner.py --config config.json cd ~/.rustchain source venv/bin/activate python rustchain_miner.py --config config.json [2026-03-13 10:30:00] INFO RustChain Miner v2.1.0 starting... [2026-03-13 10:30:01] INFO Wallet: my-vintage-miner [2026-03-13 10:30:01] INFO Node: https://rustchain.org [2026-03-13 10:30:02] INFO Running hardware fingerprint checks... [2026-03-13 10:30:03] INFO ✓ CPUID Leaf Analysis: PASS [2026-03-13 10:30:03] INFO ✓ Cache Topology: PASS [2026-03-13 10:30:04] INFO ✓ Instruction Timing: PASS [2026-03-13 10:30:04] INFO ✓ Memory Latency: PASS [2026-03-13 10:30:05] INFO ✓ Serial Port Detection: PASS [2026-03-13 10:30:05] INFO ✓ PCI Device Enumeration: PASS [2026-03-13 10:30:05] INFO Attestation score: 100% [2026-03-13 10:30:05] INFO CPU Multiplier: ×3.5 (PowerPC G4) [2026-03-13 10:30:06] INFO Registered with node. Mining started. [2026-03-13 10:31:06] INFO Heartbeat sent. Uptime: 1m [2026-03-13 10:32:06] INFO Heartbeat sent. Uptime: 2m [2026-03-13 10:33:06] INFO Pending rewards: 0.05 RTC [2026-03-13 10:30:00] INFO RustChain Miner v2.1.0 starting... [2026-03-13 10:30:01] INFO Wallet: my-vintage-miner [2026-03-13 10:30:01] INFO Node: https://rustchain.org [2026-03-13 10:30:02] INFO Running hardware fingerprint checks... [2026-03-13 10:30:03] INFO ✓ CPUID Leaf Analysis: PASS [2026-03-13 10:30:03] INFO ✓ Cache Topology: PASS [2026-03-13 10:30:04] INFO ✓ Instruction Timing: PASS [2026-03-13 10:30:04] INFO ✓ Memory Latency: PASS [2026-03-13 10:30:05] INFO ✓ Serial Port Detection: PASS [2026-03-13 10:30:05] INFO ✓ PCI Device Enumeration: PASS [2026-03-13 10:30:05] INFO Attestation score: 100% [2026-03-13 10:30:05] INFO CPU Multiplier: ×3.5 (PowerPC G4) [2026-03-13 10:30:06] INFO Registered with node. Mining started. [2026-03-13 10:31:06] INFO Heartbeat sent. Uptime: 1m [2026-03-13 10:32:06] INFO Heartbeat sent. Uptime: 2m [2026-03-13 10:33:06] INFO Pending rewards: 0.05 RTC [2026-03-13 10:30:00] INFO RustChain Miner v2.1.0 starting... [2026-03-13 10:30:01] INFO Wallet: my-vintage-miner [2026-03-13 10:30:01] INFO Node: https://rustchain.org [2026-03-13 10:30:02] INFO Running hardware fingerprint checks... [2026-03-13 10:30:03] INFO ✓ CPUID Leaf Analysis: PASS [2026-03-13 10:30:03] INFO ✓ Cache Topology: PASS [2026-03-13 10:30:04] INFO ✓ Instruction Timing: PASS [2026-03-13 10:30:04] INFO ✓ Memory Latency: PASS [2026-03-13 10:30:05] INFO ✓ Serial Port Detection: PASS [2026-03-13 10:30:05] INFO ✓ PCI Device Enumeration: PASS [2026-03-13 10:30:05] INFO Attestation score: 100% [2026-03-13 10:30:05] INFO CPU Multiplier: ×3.5 (PowerPC G4) [2026-03-13 10:30:06] INFO Registered with node. Mining started. [2026-03-13 10:31:06] INFO Heartbeat sent. Uptime: 1m [2026-03-13 10:32:06] INFO Heartbeat sent. Uptime: 2m [2026-03-13 10:33:06] INFO Pending rewards: 0.05 RTC # Follow logs in real-time tail -f ~/.rustchain/miner.log # Filter for errors only tail -f ~/.rustchain/miner.log | grep ERROR # Filter for reward updates tail -f ~/.rustchain/miner.log | grep "rewards" # Follow logs in real-time tail -f ~/.rustchain/miner.log # Filter for errors only tail -f ~/.rustchain/miner.log | grep ERROR # Filter for reward updates tail -f ~/.rustchain/miner.log | grep "rewards" # Follow logs in real-time tail -f ~/.rustchain/miner.log # Filter for errors only tail -f ~/.rustchain/miner.log | grep ERROR # Filter for reward updates tail -f ~/.rustchain/miner.log | grep "rewards" # Check if your miner is registered -weight: 500;">curl -sk https://rustchain.org/api/miners | jq \ '.[] | select(.miner_id == "my-vintage-miner")' # View all active miners -weight: 500;">curl -sk https://rustchain.org/api/miners | jq 'length' # Check current epoch -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Check if your miner is registered -weight: 500;">curl -sk https://rustchain.org/api/miners | jq \ '.[] | select(.miner_id == "my-vintage-miner")' # View all active miners -weight: 500;">curl -sk https://rustchain.org/api/miners | jq 'length' # Check current epoch -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Check if your miner is registered -weight: 500;">curl -sk https://rustchain.org/api/miners | jq \ '.[] | select(.miner_id == "my-vintage-miner")' # View all active miners -weight: 500;">curl -sk https://rustchain.org/api/miners | jq 'length' # Check current epoch -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Current balance -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=my-vintage-miner" | jq . # Expected response: # { # "miner_id": "my-vintage-miner", # "balance": 12.5, # "pending_rewards": 0.75, # "last_heartbeat": "2026-03-13T10:30:00Z", # "cpu_multiplier": 3.5 # } # Current balance -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=my-vintage-miner" | jq . # Expected response: # { # "miner_id": "my-vintage-miner", # "balance": 12.5, # "pending_rewards": 0.75, # "last_heartbeat": "2026-03-13T10:30:00Z", # "cpu_multiplier": 3.5 # } # Current balance -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=my-vintage-miner" | jq . # Expected response: # { # "miner_id": "my-vintage-miner", # "balance": 12.5, # "pending_rewards": 0.75, # "last_heartbeat": "2026-03-13T10:30:00Z", # "cpu_multiplier": 3.5 # } # Graceful shutdown (sends final heartbeat) pkill -SIGINT -f rustchain_miner.py # Or if running in foreground: Ctrl+C # Graceful shutdown (sends final heartbeat) pkill -SIGINT -f rustchain_miner.py # Or if running in foreground: Ctrl+C # Graceful shutdown (sends final heartbeat) pkill -SIGINT -f rustchain_miner.py # Or if running in foreground: Ctrl+C { "from": "sender-wallet", "to": "recipient-wallet", "amount": 10.0, "timestamp": "2026-03-13T10:30:00Z", "signature": "base64-encoded-signature" } { "from": "sender-wallet", "to": "recipient-wallet", "amount": 10.0, "timestamp": "2026-03-13T10:30:00Z", "signature": "base64-encoded-signature" } { "from": "sender-wallet", "to": "recipient-wallet", "amount": 10.0, "timestamp": "2026-03-13T10:30:00Z", "signature": "base64-encoded-signature" } # Send 5 RTC to another wallet -weight: 500;">curl -sk -X POST https://rustchain.org/api/transaction \ -H "Content-Type: application/json" \ -d '{ "from": "my-vintage-miner", "to": "recipient-wallet", "amount": 5.0 }' | jq . # Send 5 RTC to another wallet -weight: 500;">curl -sk -X POST https://rustchain.org/api/transaction \ -H "Content-Type: application/json" \ -d '{ "from": "my-vintage-miner", "to": "recipient-wallet", "amount": 5.0 }' | jq . # Send 5 RTC to another wallet -weight: 500;">curl -sk -X POST https://rustchain.org/api/transaction \ -H "Content-Type: application/json" \ -d '{ "from": "my-vintage-miner", "to": "recipient-wallet", "amount": 5.0 }' | jq . # Check transaction by ID -weight: 500;">curl -sk "https://rustchain.org/api/transaction/TX_ID" | jq . # List transactions for a wallet -weight: 500;">curl -sk "https://rustchain.org/api/wallet/my-vintage-miner/transactions" | jq . # Check transaction by ID -weight: 500;">curl -sk "https://rustchain.org/api/transaction/TX_ID" | jq . # List transactions for a wallet -weight: 500;">curl -sk "https://rustchain.org/api/wallet/my-vintage-miner/transactions" | jq . # Check transaction by ID -weight: 500;">curl -sk "https://rustchain.org/api/transaction/TX_ID" | jq . # List transactions for a wallet -weight: 500;">curl -sk "https://rustchain.org/api/wallet/my-vintage-miner/transactions" | jq . # Install -weight: 500;">pip -weight: 500;">install clawrtc # Check balance clawrtc balance my-vintage-miner # Send RTC clawrtc send --from my-vintage-miner --to recipient-wallet --amount 5.0 # View transaction history clawrtc history my-vintage-miner # Install -weight: 500;">pip -weight: 500;">install clawrtc # Check balance clawrtc balance my-vintage-miner # Send RTC clawrtc send --from my-vintage-miner --to recipient-wallet --amount 5.0 # View transaction history clawrtc history my-vintage-miner # Install -weight: 500;">pip -weight: 500;">install clawrtc # Check balance clawrtc balance my-vintage-miner # Send RTC clawrtc send --from my-vintage-miner --to recipient-wallet --amount 5.0 # View transaction history clawrtc history my-vintage-miner # Machine 1: PowerPC G4 # config.json: {"wallet_name": "vintage-farm", ...} # Machine 2: Pentium 4 # config.json: {"wallet_name": "vintage-farm", ...} # Machine 3: Core 2 Duo # config.json: {"wallet_name": "vintage-farm", ...} # All rewards accumulate to "vintage-farm" wallet -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=vintage-farm" | jq . # Machine 1: PowerPC G4 # config.json: {"wallet_name": "vintage-farm", ...} # Machine 2: Pentium 4 # config.json: {"wallet_name": "vintage-farm", ...} # Machine 3: Core 2 Duo # config.json: {"wallet_name": "vintage-farm", ...} # All rewards accumulate to "vintage-farm" wallet -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=vintage-farm" | jq . # Machine 1: PowerPC G4 # config.json: {"wallet_name": "vintage-farm", ...} # Machine 2: Pentium 4 # config.json: {"wallet_name": "vintage-farm", ...} # Machine 3: Core 2 Duo # config.json: {"wallet_name": "vintage-farm", ...} # All rewards accumulate to "vintage-farm" wallet -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=vintage-farm" | jq . #!/bin/bash WALLET="my-vintage-miner" NODE="https://rustchain.org" check_miner() { # Check node health HEALTH=$(-weight: 500;">curl -sk "$NODE/health" | jq -r '.-weight: 500;">status') if [ "$HEALTH" != "ok" ]; then echo "❌ Node unhealthy" return 1 fi # Check miner visibility MINER=$(-weight: 500;">curl -sk "$NODE/api/miners" | jq -r \ ".[] | select(.miner_id == \"$WALLET\") | .miner_id") if [ -z "$MINER" ]; then echo "❌ Miner not visible on network" return 1 fi # Check balance BALANCE=$(-weight: 500;">curl -sk "$NODE/wallet/balance?miner_id=$WALLET" | jq -r '.balance') PENDING=$(-weight: 500;">curl -sk "$NODE/wallet/balance?miner_id=$WALLET" | jq -r '.pending_rewards') echo "✅ Miner online | Balance: $BALANCE RTC | Pending: $PENDING RTC" return 0 } # Run check check_miner exit $? #!/bin/bash WALLET="my-vintage-miner" NODE="https://rustchain.org" check_miner() { # Check node health HEALTH=$(-weight: 500;">curl -sk "$NODE/health" | jq -r '.-weight: 500;">status') if [ "$HEALTH" != "ok" ]; then echo "❌ Node unhealthy" return 1 fi # Check miner visibility MINER=$(-weight: 500;">curl -sk "$NODE/api/miners" | jq -r \ ".[] | select(.miner_id == \"$WALLET\") | .miner_id") if [ -z "$MINER" ]; then echo "❌ Miner not visible on network" return 1 fi # Check balance BALANCE=$(-weight: 500;">curl -sk "$NODE/wallet/balance?miner_id=$WALLET" | jq -r '.balance') PENDING=$(-weight: 500;">curl -sk "$NODE/wallet/balance?miner_id=$WALLET" | jq -r '.pending_rewards') echo "✅ Miner online | Balance: $BALANCE RTC | Pending: $PENDING RTC" return 0 } # Run check check_miner exit $? #!/bin/bash WALLET="my-vintage-miner" NODE="https://rustchain.org" check_miner() { # Check node health HEALTH=$(-weight: 500;">curl -sk "$NODE/health" | jq -r '.-weight: 500;">status') if [ "$HEALTH" != "ok" ]; then echo "❌ Node unhealthy" return 1 fi # Check miner visibility MINER=$(-weight: 500;">curl -sk "$NODE/api/miners" | jq -r \ ".[] | select(.miner_id == \"$WALLET\") | .miner_id") if [ -z "$MINER" ]; then echo "❌ Miner not visible on network" return 1 fi # Check balance BALANCE=$(-weight: 500;">curl -sk "$NODE/wallet/balance?miner_id=$WALLET" | jq -r '.balance') PENDING=$(-weight: 500;">curl -sk "$NODE/wallet/balance?miner_id=$WALLET" | jq -r '.pending_rewards') echo "✅ Miner online | Balance: $BALANCE RTC | Pending: $PENDING RTC" return 0 } # Run check check_miner exit $? chmod +x monitor_miner.sh ./monitor_miner.sh # Add to crontab for hourly checks crontab -e # 0 * * * * /path/to/monitor_miner.sh >> /var/log/miner_monitor.log 2>&1 chmod +x monitor_miner.sh ./monitor_miner.sh # Add to crontab for hourly checks crontab -e # 0 * * * * /path/to/monitor_miner.sh >> /var/log/miner_monitor.log 2>&1 chmod +x monitor_miner.sh ./monitor_miner.sh # Add to crontab for hourly checks crontab -e # 0 * * * * /path/to/monitor_miner.sh >> /var/log/miner_monitor.log 2>&1 #!/bin/bash MINER_DIR="$HOME/.rustchain" LOG_FILE="$MINER_DIR/watchdog.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } while true; do # Check if miner process is running if ! pgrep -f "rustchain_miner.py" > /dev/null; then log "⚠️ Miner not running. Restarting..." cd "$MINER_DIR" source venv/bin/activate nohup python rustchain_miner.py --config config.json >> miner.log 2>&1 & log "✅ Miner restarted (PID: $!)" fi sleep 60 # Check every minute done #!/bin/bash MINER_DIR="$HOME/.rustchain" LOG_FILE="$MINER_DIR/watchdog.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } while true; do # Check if miner process is running if ! pgrep -f "rustchain_miner.py" > /dev/null; then log "⚠️ Miner not running. Restarting..." cd "$MINER_DIR" source venv/bin/activate nohup python rustchain_miner.py --config config.json >> miner.log 2>&1 & log "✅ Miner restarted (PID: $!)" fi sleep 60 # Check every minute done #!/bin/bash MINER_DIR="$HOME/.rustchain" LOG_FILE="$MINER_DIR/watchdog.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } while true; do # Check if miner process is running if ! pgrep -f "rustchain_miner.py" > /dev/null; then log "⚠️ Miner not running. Restarting..." cd "$MINER_DIR" source venv/bin/activate nohup python rustchain_miner.py --config config.json >> miner.log 2>&1 & log "✅ Miner restarted (PID: $!)" fi sleep 60 # Check every minute done #!/usr/bin/env python3 """Simple terminal dashboard for monitoring RustChain mining.""" import requests import time import os from datetime import datetime NODE = "https://rustchain.org" WALLET = os.environ.get("RUSTCHAIN_WALLET", "my-vintage-miner") def clear_screen(): os.system('clear' if os.name != 'nt' else 'cls') def get_miner_data(): try: balance_resp = requests.get( f"{NODE}/wallet/balance?miner_id={WALLET}", verify=False, timeout=5 ) miners_resp = requests.get( f"{NODE}/api/miners", verify=False, timeout=5 ) epoch_resp = requests.get( f"{NODE}/epoch", verify=False, timeout=5 ) return { 'balance': balance_resp.json(), 'total_miners': len(miners_resp.json()), 'epoch': epoch_resp.json() } except Exception as e: return {'error': str(e)} def render_dashboard(data): clear_screen() print("=" * 60) print(" RUSTCHAIN MINING DASHBOARD") print("=" * 60) print(f"\nWallet: {WALLET}") print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if 'error' in data: print(f"\n❌ Error: {data['error']}") return balance = data['balance'] print(f"\n💰 Balance: {balance.get('balance', 'N/A')} RTC") print(f"⏳ Pending: {balance.get('pending_rewards', 'N/A')} RTC") print(f"📊 Multiplier: ×{balance.get('cpu_multiplier', 'N/A')}") print(f"\n🌐 Network:") print(f" Active Miners: {data['total_miners']}") print(f" Current Epoch: {data['epoch'].get('epoch', 'N/A')}") print(f" Epoch Ends: {data['epoch'].get('ends_at', 'N/A')}") print("\n" + "=" * 60) print("Press Ctrl+C to exit") def main(): try: while True: data = get_miner_data() render_dashboard(data) time.sleep(10) # Refresh every 10 seconds except KeyboardInterrupt: print("\nDashboard stopped.") if __name__ == "__main__": main() #!/usr/bin/env python3 """Simple terminal dashboard for monitoring RustChain mining.""" import requests import time import os from datetime import datetime NODE = "https://rustchain.org" WALLET = os.environ.get("RUSTCHAIN_WALLET", "my-vintage-miner") def clear_screen(): os.system('clear' if os.name != 'nt' else 'cls') def get_miner_data(): try: balance_resp = requests.get( f"{NODE}/wallet/balance?miner_id={WALLET}", verify=False, timeout=5 ) miners_resp = requests.get( f"{NODE}/api/miners", verify=False, timeout=5 ) epoch_resp = requests.get( f"{NODE}/epoch", verify=False, timeout=5 ) return { 'balance': balance_resp.json(), 'total_miners': len(miners_resp.json()), 'epoch': epoch_resp.json() } except Exception as e: return {'error': str(e)} def render_dashboard(data): clear_screen() print("=" * 60) print(" RUSTCHAIN MINING DASHBOARD") print("=" * 60) print(f"\nWallet: {WALLET}") print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if 'error' in data: print(f"\n❌ Error: {data['error']}") return balance = data['balance'] print(f"\n💰 Balance: {balance.get('balance', 'N/A')} RTC") print(f"⏳ Pending: {balance.get('pending_rewards', 'N/A')} RTC") print(f"📊 Multiplier: ×{balance.get('cpu_multiplier', 'N/A')}") print(f"\n🌐 Network:") print(f" Active Miners: {data['total_miners']}") print(f" Current Epoch: {data['epoch'].get('epoch', 'N/A')}") print(f" Epoch Ends: {data['epoch'].get('ends_at', 'N/A')}") print("\n" + "=" * 60) print("Press Ctrl+C to exit") def main(): try: while True: data = get_miner_data() render_dashboard(data) time.sleep(10) # Refresh every 10 seconds except KeyboardInterrupt: print("\nDashboard stopped.") if __name__ == "__main__": main() #!/usr/bin/env python3 """Simple terminal dashboard for monitoring RustChain mining.""" import requests import time import os from datetime import datetime NODE = "https://rustchain.org" WALLET = os.environ.get("RUSTCHAIN_WALLET", "my-vintage-miner") def clear_screen(): os.system('clear' if os.name != 'nt' else 'cls') def get_miner_data(): try: balance_resp = requests.get( f"{NODE}/wallet/balance?miner_id={WALLET}", verify=False, timeout=5 ) miners_resp = requests.get( f"{NODE}/api/miners", verify=False, timeout=5 ) epoch_resp = requests.get( f"{NODE}/epoch", verify=False, timeout=5 ) return { 'balance': balance_resp.json(), 'total_miners': len(miners_resp.json()), 'epoch': epoch_resp.json() } except Exception as e: return {'error': str(e)} def render_dashboard(data): clear_screen() print("=" * 60) print(" RUSTCHAIN MINING DASHBOARD") print("=" * 60) print(f"\nWallet: {WALLET}") print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if 'error' in data: print(f"\n❌ Error: {data['error']}") return balance = data['balance'] print(f"\n💰 Balance: {balance.get('balance', 'N/A')} RTC") print(f"⏳ Pending: {balance.get('pending_rewards', 'N/A')} RTC") print(f"📊 Multiplier: ×{balance.get('cpu_multiplier', 'N/A')}") print(f"\n🌐 Network:") print(f" Active Miners: {data['total_miners']}") print(f" Current Epoch: {data['epoch'].get('epoch', 'N/A')}") print(f" Epoch Ends: {data['epoch'].get('ends_at', 'N/A')}") print("\n" + "=" * 60) print("Press Ctrl+C to exit") def main(): try: while True: data = get_miner_data() render_dashboard(data) time.sleep(10) # Refresh every 10 seconds except KeyboardInterrupt: print("\nDashboard stopped.") if __name__ == "__main__": main() export RUSTCHAIN_WALLET="my-vintage-miner" python dashboard.py export RUSTCHAIN_WALLET="my-vintage-miner" python dashboard.py export RUSTCHAIN_WALLET="my-vintage-miner" python dashboard.py #!/usr/bin/env python3 """ Example: Bridge RTC to wRTC using the BoTTube Bridge API. Note: This is a conceptual example. Always use the official bridge UI at https://bottube.ai/bridge for production use. """ import requests BRIDGE_API = "https://bottube.ai/api/bridge" WRTC_MINT = "12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X" def bridge_rtc_to_wrtc(amount, rtc_wallet, sol_wallet): """ Bridge RTC from RustChain to wRTC on Solana. Args: amount: Amount of RTC to bridge rtc_wallet: RustChain wallet address sol_wallet: Solana wallet address (recipient) Returns: Transaction ID or error message """ payload = { "direction": "rtc_to_wrtc", "amount": amount, "source_wallet": rtc_wallet, "destination_wallet": sol_wallet, "wrtc_mint": WRTC_MINT } response = requests.post( f"{BRIDGE_API}/initiate", json=payload ) if response.status_code == 200: tx_data = response.json() print(f"✅ Bridge initiated: {tx_data['transaction_id']}") print(f" Amount: {tx_data['amount']} RTC → {tx_data['expected_output']} wRTC") print(f" Status URL: {tx_data['status_url']}") return tx_data['transaction_id'] else: print(f"❌ Bridge failed: {response.text}") return None def check_bridge_status(tx_id): """Check the -weight: 500;">status of a bridge transaction.""" response = requests.get(f"{BRIDGE_API}/-weight: 500;">status/{tx_id}") if response.status_code == 200: -weight: 500;">status = response.json() print(f"Bridge Status: {-weight: 500;">status['-weight: 500;">status']}") print(f" Confirmations: {-weight: 500;">status['confirmations']}/{-weight: 500;">status['required_confirmations']}") return -weight: 500;">status return None # Example usage if __name__ == "__main__": tx_id = bridge_rtc_to_wrtc( amount=10.0, rtc_wallet="my-vintage-miner", sol_wallet="YourSolanaWalletAddress" ) if tx_id: -weight: 500;">status = check_bridge_status(tx_id) #!/usr/bin/env python3 """ Example: Bridge RTC to wRTC using the BoTTube Bridge API. Note: This is a conceptual example. Always use the official bridge UI at https://bottube.ai/bridge for production use. """ import requests BRIDGE_API = "https://bottube.ai/api/bridge" WRTC_MINT = "12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X" def bridge_rtc_to_wrtc(amount, rtc_wallet, sol_wallet): """ Bridge RTC from RustChain to wRTC on Solana. Args: amount: Amount of RTC to bridge rtc_wallet: RustChain wallet address sol_wallet: Solana wallet address (recipient) Returns: Transaction ID or error message """ payload = { "direction": "rtc_to_wrtc", "amount": amount, "source_wallet": rtc_wallet, "destination_wallet": sol_wallet, "wrtc_mint": WRTC_MINT } response = requests.post( f"{BRIDGE_API}/initiate", json=payload ) if response.status_code == 200: tx_data = response.json() print(f"✅ Bridge initiated: {tx_data['transaction_id']}") print(f" Amount: {tx_data['amount']} RTC → {tx_data['expected_output']} wRTC") print(f" Status URL: {tx_data['status_url']}") return tx_data['transaction_id'] else: print(f"❌ Bridge failed: {response.text}") return None def check_bridge_status(tx_id): """Check the -weight: 500;">status of a bridge transaction.""" response = requests.get(f"{BRIDGE_API}/-weight: 500;">status/{tx_id}") if response.status_code == 200: -weight: 500;">status = response.json() print(f"Bridge Status: {-weight: 500;">status['-weight: 500;">status']}") print(f" Confirmations: {-weight: 500;">status['confirmations']}/{-weight: 500;">status['required_confirmations']}") return -weight: 500;">status return None # Example usage if __name__ == "__main__": tx_id = bridge_rtc_to_wrtc( amount=10.0, rtc_wallet="my-vintage-miner", sol_wallet="YourSolanaWalletAddress" ) if tx_id: -weight: 500;">status = check_bridge_status(tx_id) #!/usr/bin/env python3 """ Example: Bridge RTC to wRTC using the BoTTube Bridge API. Note: This is a conceptual example. Always use the official bridge UI at https://bottube.ai/bridge for production use. """ import requests BRIDGE_API = "https://bottube.ai/api/bridge" WRTC_MINT = "12TAdKXxcGf6oCv4rqDz2NkgxjyHq6HQKoxKZYGf5i4X" def bridge_rtc_to_wrtc(amount, rtc_wallet, sol_wallet): """ Bridge RTC from RustChain to wRTC on Solana. Args: amount: Amount of RTC to bridge rtc_wallet: RustChain wallet address sol_wallet: Solana wallet address (recipient) Returns: Transaction ID or error message """ payload = { "direction": "rtc_to_wrtc", "amount": amount, "source_wallet": rtc_wallet, "destination_wallet": sol_wallet, "wrtc_mint": WRTC_MINT } response = requests.post( f"{BRIDGE_API}/initiate", json=payload ) if response.status_code == 200: tx_data = response.json() print(f"✅ Bridge initiated: {tx_data['transaction_id']}") print(f" Amount: {tx_data['amount']} RTC → {tx_data['expected_output']} wRTC") print(f" Status URL: {tx_data['status_url']}") return tx_data['transaction_id'] else: print(f"❌ Bridge failed: {response.text}") return None def check_bridge_status(tx_id): """Check the -weight: 500;">status of a bridge transaction.""" response = requests.get(f"{BRIDGE_API}/-weight: 500;">status/{tx_id}") if response.status_code == 200: -weight: 500;">status = response.json() print(f"Bridge Status: {-weight: 500;">status['-weight: 500;">status']}") print(f" Confirmations: {-weight: 500;">status['confirmations']}/{-weight: 500;">status['required_confirmations']}") return -weight: 500;">status return None # Example usage if __name__ == "__main__": tx_id = bridge_rtc_to_wrtc( amount=10.0, rtc_wallet="my-vintage-miner", sol_wallet="YourSolanaWalletAddress" ) if tx_id: -weight: 500;">status = check_bridge_status(tx_id) Error: Unable to connect to node Error: Unable to connect to node Error: Unable to connect to node # Test network connectivity -weight: 500;">curl -sk https://rustchain.org/health # Check if Python can reach the node python3 -c "import requests; print(requests.get('https://rustchain.org/health', verify=False).json())" # Test network connectivity -weight: 500;">curl -sk https://rustchain.org/health # Check if Python can reach the node python3 -c "import requests; print(requests.get('https://rustchain.org/health', verify=False).json())" # Test network connectivity -weight: 500;">curl -sk https://rustchain.org/health # Check if Python can reach the node python3 -c "import requests; print(requests.get('https://rustchain.org/health', verify=False).json())" ✗ CPUID Leaf Analysis: FAIL Attestation score: 0% ✗ CPUID Leaf Analysis: FAIL Attestation score: 0% ✗ CPUID Leaf Analysis: FAIL Attestation score: 0% # Run fingerprint checks manually cd ~/.rustchain source venv/bin/activate python -c "import fingerprint_checks; print(fingerprint_checks.run_all_checks())" # Run fingerprint checks manually cd ~/.rustchain source venv/bin/activate python -c "import fingerprint_checks; print(fingerprint_checks.run_all_checks())" # Run fingerprint checks manually cd ~/.rustchain source venv/bin/activate python -c "import fingerprint_checks; print(fingerprint_checks.run_all_checks())" Pending rewards: 0.00 RTC (after hours of mining) Pending rewards: 0.00 RTC (after hours of mining) Pending rewards: 0.00 RTC (after hours of mining) # Verify miner is visible on network -weight: 500;">curl -sk https://rustchain.org/api/miners | jq '.[] | select(.miner_id == "YOUR_WALLET")' # Check epoch settlement -weight: 500;">status -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Verify miner is visible on network -weight: 500;">curl -sk https://rustchain.org/api/miners | jq '.[] | select(.miner_id == "YOUR_WALLET")' # Check epoch settlement -weight: 500;">status -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Verify miner is visible on network -weight: 500;">curl -sk https://rustchain.org/api/miners | jq '.[] | select(.miner_id == "YOUR_WALLET")' # Check epoch settlement -weight: 500;">status -weight: 500;">curl -sk https://rustchain.org/epoch | jq . -weight: 500;">curl: (60) SSL certificate problem: unable to get local issuer certificate -weight: 500;">curl: (60) SSL certificate problem: unable to get local issuer certificate -weight: 500;">curl: (60) SSL certificate problem: unable to get local issuer certificate -weight: 500;">curl -sk https://rustchain.org/health -weight: 500;">curl -sk https://rustchain.org/health -weight: 500;">curl -sk https://rustchain.org/health # Ubuntu/Debian -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">update && -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install --reinstall ca-certificates # macOS -weight: 600;">sudo security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain | \ -weight: 600;">sudo tee /etc/ssl/certs/ca-certificates.crt # Ubuntu/Debian -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">update && -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install --reinstall ca-certificates # macOS -weight: 600;">sudo security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain | \ -weight: 600;">sudo tee /etc/ssl/certs/ca-certificates.crt # Ubuntu/Debian -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">update && -weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install --reinstall ca-certificates # macOS -weight: 600;">sudo security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain | \ -weight: 600;">sudo tee /etc/ssl/certs/ca-certificates.crt ModuleNotFoundError: No module named 'requests' ModuleNotFoundError: No module named 'requests' ModuleNotFoundError: No module named 'requests' # Activate virtualenv properly cd ~/.rustchain source venv/bin/activate # Verify activation (should show venv path) which python # Reinstall dependencies if needed -weight: 500;">pip -weight: 500;">install ---weight: 500;">upgrade -weight: 500;">pip -weight: 500;">pip -weight: 500;">install -r requirements.txt # if exists -weight: 500;">pip -weight: 500;">install requests # Activate virtualenv properly cd ~/.rustchain source venv/bin/activate # Verify activation (should show venv path) which python # Reinstall dependencies if needed -weight: 500;">pip -weight: 500;">install ---weight: 500;">upgrade -weight: 500;">pip -weight: 500;">pip -weight: 500;">install -r requirements.txt # if exists -weight: 500;">pip -weight: 500;">install requests # Activate virtualenv properly cd ~/.rustchain source venv/bin/activate # Verify activation (should show venv path) which python # Reinstall dependencies if needed -weight: 500;">pip -weight: 500;">install ---weight: 500;">upgrade -weight: 500;">pip -weight: 500;">pip -weight: 500;">install -r requirements.txt # if exists -weight: 500;">pip -weight: 500;">install requests # Check -weight: 500;">service -weight: 500;">status -weight: 500;">systemctl --user -weight: 500;">status rustchain-miner # View -weight: 500;">service logs journalctl --user -u rustchain-miner -f # Reload systemd config after changes -weight: 500;">systemctl --user daemon-reload # Enable -weight: 500;">service -weight: 500;">systemctl --user -weight: 500;">enable rustchain-miner # Check -weight: 500;">service -weight: 500;">status -weight: 500;">systemctl --user -weight: 500;">status rustchain-miner # View -weight: 500;">service logs journalctl --user -u rustchain-miner -f # Reload systemd config after changes -weight: 500;">systemctl --user daemon-reload # Enable -weight: 500;">service -weight: 500;">systemctl --user -weight: 500;">enable rustchain-miner # Check -weight: 500;">service -weight: 500;">status -weight: 500;">systemctl --user -weight: 500;">status rustchain-miner # View -weight: 500;">service logs journalctl --user -u rustchain-miner -f # Reload systemd config after changes -weight: 500;">systemctl --user daemon-reload # Enable -weight: 500;">service -weight: 500;">systemctl --user -weight: 500;">enable rustchain-miner # Load the launch agent launchctl load ~/Library/LaunchAgents/com.rustchain.miner.plist # Check -weight: 500;">status launchctl list | grep rustchain # View logs log show --predicate 'process == "Python"' --last 1h # Load the launch agent launchctl load ~/Library/LaunchAgents/com.rustchain.miner.plist # Check -weight: 500;">status launchctl list | grep rustchain # View logs log show --predicate 'process == "Python"' --last 1h # Load the launch agent launchctl load ~/Library/LaunchAgents/com.rustchain.miner.plist # Check -weight: 500;">status launchctl list | grep rustchain # View logs log show --predicate 'process == "Python"' --last 1h # Edit config.json { "wallet_name": "my-vintage-miner", "node_url": "https://rustchain.org", "mining_interval_seconds": 60, "log_level": "DEBUG" # Change from INFO to DEBUG } # Restart miner and check detailed logs tail -f ~/.rustchain/miner.log # Edit config.json { "wallet_name": "my-vintage-miner", "node_url": "https://rustchain.org", "mining_interval_seconds": 60, "log_level": "DEBUG" # Change from INFO to DEBUG } # Restart miner and check detailed logs tail -f ~/.rustchain/miner.log # Edit config.json { "wallet_name": "my-vintage-miner", "node_url": "https://rustchain.org", "mining_interval_seconds": 60, "log_level": "DEBUG" # Change from INFO to DEBUG } # Restart miner and check detailed logs tail -f ~/.rustchain/miner.log # Clone the repository -weight: 500;">git clone https://github.com/Scottcjn/Rustchain.-weight: 500;">git cd Rustchain # Install node dependencies -weight: 500;">pip -weight: 500;">install -r requirements.txt # Initialize node data directory mkdir -p ~/.rustchain-node/data cp config/node.example.json ~/.rustchain-node/config.json # Start the node python node/integrated_node.py --config ~/.rustchain-node/config.json # Clone the repository -weight: 500;">git clone https://github.com/Scottcjn/Rustchain.-weight: 500;">git cd Rustchain # Install node dependencies -weight: 500;">pip -weight: 500;">install -r requirements.txt # Initialize node data directory mkdir -p ~/.rustchain-node/data cp config/node.example.json ~/.rustchain-node/config.json # Start the node python node/integrated_node.py --config ~/.rustchain-node/config.json # Clone the repository -weight: 500;">git clone https://github.com/Scottcjn/Rustchain.-weight: 500;">git cd Rustchain # Install node dependencies -weight: 500;">pip -weight: 500;">install -r requirements.txt # Initialize node data directory mkdir -p ~/.rustchain-node/data cp config/node.example.json ~/.rustchain-node/config.json # Start the node python node/integrated_node.py --config ~/.rustchain-node/config.json import requests import time NODE = "https://rustchain.org" WALLET = "my-vintage-miner" def get_optimal_interval(): """Adjust mining interval based on network congestion.""" epoch_data = requests.get(f"{NODE}/epoch", verify=False).json() miners_count = len(requests.get(f"{NODE}/api/miners", verify=False).json()) # More miners = longer intervals to reduce load if miners_count > 100: return 120 # 2 minutes elif miners_count > 50: return 90 # 1.5 minutes else: return 60 # 1 minute (default) # Use in your miner loop interval = get_optimal_interval() time.sleep(interval) import requests import time NODE = "https://rustchain.org" WALLET = "my-vintage-miner" def get_optimal_interval(): """Adjust mining interval based on network congestion.""" epoch_data = requests.get(f"{NODE}/epoch", verify=False).json() miners_count = len(requests.get(f"{NODE}/api/miners", verify=False).json()) # More miners = longer intervals to reduce load if miners_count > 100: return 120 # 2 minutes elif miners_count > 50: return 90 # 1.5 minutes else: return 60 # 1 minute (default) # Use in your miner loop interval = get_optimal_interval() time.sleep(interval) import requests import time NODE = "https://rustchain.org" WALLET = "my-vintage-miner" def get_optimal_interval(): """Adjust mining interval based on network congestion.""" epoch_data = requests.get(f"{NODE}/epoch", verify=False).json() miners_count = len(requests.get(f"{NODE}/api/miners", verify=False).json()) # More miners = longer intervals to reduce load if miners_count > 100: return 120 # 2 minutes elif miners_count > 50: return 90 # 1.5 minutes else: return 60 # 1 minute (default) # Use in your miner loop interval = get_optimal_interval() time.sleep(interval) from flask import Flask, request, jsonify import requests app = Flask(__name__) NODE = "https://rustchain.org" @app.route('/pay', methods=['POST']) def pay(): """Accept RTC payments.""" data = request.json from_wallet = data['from'] to_wallet = data['to'] amount = data['amount'] # Verify sender has sufficient balance balance_resp = requests.get( f"{NODE}/wallet/balance?miner_id={from_wallet}", verify=False ) balance = balance_resp.json().get('balance', 0) if balance < amount: return jsonify({'error': 'Insufficient balance'}), 400 # Process transaction tx_resp = requests.post( f"{NODE}/api/transaction", json={'from': from_wallet, 'to': to_wallet, 'amount': amount}, verify=False ) return jsonify(tx_resp.json()) if __name__ == '__main__': app.run(port=5000) from flask import Flask, request, jsonify import requests app = Flask(__name__) NODE = "https://rustchain.org" @app.route('/pay', methods=['POST']) def pay(): """Accept RTC payments.""" data = request.json from_wallet = data['from'] to_wallet = data['to'] amount = data['amount'] # Verify sender has sufficient balance balance_resp = requests.get( f"{NODE}/wallet/balance?miner_id={from_wallet}", verify=False ) balance = balance_resp.json().get('balance', 0) if balance < amount: return jsonify({'error': 'Insufficient balance'}), 400 # Process transaction tx_resp = requests.post( f"{NODE}/api/transaction", json={'from': from_wallet, 'to': to_wallet, 'amount': amount}, verify=False ) return jsonify(tx_resp.json()) if __name__ == '__main__': app.run(port=5000) from flask import Flask, request, jsonify import requests app = Flask(__name__) NODE = "https://rustchain.org" @app.route('/pay', methods=['POST']) def pay(): """Accept RTC payments.""" data = request.json from_wallet = data['from'] to_wallet = data['to'] amount = data['amount'] # Verify sender has sufficient balance balance_resp = requests.get( f"{NODE}/wallet/balance?miner_id={from_wallet}", verify=False ) balance = balance_resp.json().get('balance', 0) if balance < amount: return jsonify({'error': 'Insufficient balance'}), 400 # Process transaction tx_resp = requests.post( f"{NODE}/api/transaction", json={'from': from_wallet, 'to': to_wallet, 'amount': amount}, verify=False ) return jsonify(tx_resp.json()) if __name__ == '__main__': app.run(port=5000) export RUSTCHAIN_WALLET="my-wallet" export RUSTCHAIN_WALLET="my-wallet" export RUSTCHAIN_WALLET="my-wallet" # Alert on large balance changes -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=YOUR_WALLET" | \ jq 'if .balance < 10 then "⚠️ Low balance alert" else "OK" end' # Alert on large balance changes -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=YOUR_WALLET" | \ jq 'if .balance < 10 then "⚠️ Low balance alert" else "OK" end' # Alert on large balance changes -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=YOUR_WALLET" | \ jq 'if .balance < 10 then "⚠️ Low balance alert" else "OK" end' # Health check -weight: 500;">curl -sk https://rustchain.org/health | jq . # List miners -weight: 500;">curl -sk https://rustchain.org/api/miners | jq . # Check balance -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=WALLET_NAME" | jq . # Current epoch -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Send transaction -weight: 500;">curl -sk -X POST https://rustchain.org/api/transaction \ -H "Content-Type: application/json" \ -d '{"from":"SENDER","to":"RECIPIENT","amount":10}' | jq . # Health check -weight: 500;">curl -sk https://rustchain.org/health | jq . # List miners -weight: 500;">curl -sk https://rustchain.org/api/miners | jq . # Check balance -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=WALLET_NAME" | jq . # Current epoch -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Send transaction -weight: 500;">curl -sk -X POST https://rustchain.org/api/transaction \ -H "Content-Type: application/json" \ -d '{"from":"SENDER","to":"RECIPIENT","amount":10}' | jq . # Health check -weight: 500;">curl -sk https://rustchain.org/health | jq . # List miners -weight: 500;">curl -sk https://rustchain.org/api/miners | jq . # Check balance -weight: 500;">curl -sk "https://rustchain.org/wallet/balance?miner_id=WALLET_NAME" | jq . # Current epoch -weight: 500;">curl -sk https://rustchain.org/epoch | jq . # Send transaction -weight: 500;">curl -sk -X POST https://rustchain.org/api/transaction \ -H "Content-Type: application/json" \ -d '{"from":"SENDER","to":"RECIPIENT","amount":10}' | jq . // GET /health { "-weight: 500;">status": "ok", "version": "2.1.0", "uptime_seconds": 86400, "connected_miners": 47 } // GET /epoch { "epoch": 1523, "started_at": "2026-03-13T00:00:00Z", "ends_at": "2026-03-14T00:00:00Z", "total_rewards_distributed": 1250.5 } // GET /wallet/balance?miner_id=my-wallet { "miner_id": "my-wallet", "balance": 125.75, "pending_rewards": 2.5, "last_heartbeat": "2026-03-13T10:30:00Z", "cpu_multiplier": 3.5 } // GET /health { "-weight: 500;">status": "ok", "version": "2.1.0", "uptime_seconds": 86400, "connected_miners": 47 } // GET /epoch { "epoch": 1523, "started_at": "2026-03-13T00:00:00Z", "ends_at": "2026-03-14T00:00:00Z", "total_rewards_distributed": 1250.5 } // GET /wallet/balance?miner_id=my-wallet { "miner_id": "my-wallet", "balance": 125.75, "pending_rewards": 2.5, "last_heartbeat": "2026-03-13T10:30:00Z", "cpu_multiplier": 3.5 } // GET /health { "-weight: 500;">status": "ok", "version": "2.1.0", "uptime_seconds": 86400, "connected_miners": 47 } // GET /epoch { "epoch": 1523, "started_at": "2026-03-13T00:00:00Z", "ends_at": "2026-03-14T00:00:00Z", "total_rewards_distributed": 1250.5 } // GET /wallet/balance?miner_id=my-wallet { "miner_id": "my-wallet", "balance": 125.75, "pending_rewards": 2.5, "last_heartbeat": "2026-03-13T10:30:00Z", "cpu_multiplier": 3.5 } - Introduction - Prerequisites - Quick Start (5 Minutes) - Understanding Proof-of-Antiquity - Setup Deep Dive - Your First Mining Session - Making Transactions - Practical Examples - Troubleshooting - Advanced Topics - ✅ Have a running RustChain miner - ✅ Understand the 6 hardware fingerprint checks - ✅ Earn RTC tokens from vintage hardware - ✅ Query the blockchain API - ✅ Bridge RTC ↔ wRTC on Solana - Vintage hardware enthusiasts with PowerPC G3/G4/G5, old x86, or SPARC machines - Blockchain developers exploring alternative consensus mechanisms - Hobbyists who want to earn crypto from hardware collecting dust - Researchers studying hardware fingerprinting and attestation - Stable internet connection - Outbound HTTPS (port 443) to rustchain.org - No special port forwarding needed (miner initiates connections) - Create an isolated Python virtualenv at ~/.rustchain/venv - Install dependencies (requests) - Download the appropriate miner binary for your architecture - Prompt for a wallet name (or auto-generate one) - Optionally configure auto--weight: 500;">start on boot - Check firewall rules (allow outbound HTTPS) - Verify no proxy is blocking the connection - Try alternative DNS: echo "nameserver 8.8.8.8" | -weight: 600;">sudo tee /etc/resolv.conf - Check system time (large clock skew can cause SSL issues) - Running in a VM? RustChain intentionally blocks VMs. Use bare metal. - CPU too modern? Some checks may fail on very new CPUs. Check compatibility. - Missing permissions? Run miner with appropriate user privileges. - Vintage hardware quirk? Some very old CPUs may need kernel parameters. - Wait for epoch settlement: Rewards settle at epoch boundaries (check /epoch) - Verify uptime: Minimum 1 hour of continuous mining for partial rewards - Check attestation: Failed checks = 0 rewards - Confirm wallet name: Ensure you're querying the correct wallet - Use -k flag (expected for self-signed certs): - Or -weight: 500;">update CA certificates: - Check existing docs: FAQ_TROUBLESHOOTING.md - GitHub Issues: rustchain-bounties/issues - Community channels: Check README.md for Discord/Telegram links - Include in bug reports: OS and version Python version CPU model Miner logs (last 50 lines) Network connectivity test results - OS and version - Python version - Miner logs (last 50 lines) - Network connectivity test results - OS and version - Python version - Miner logs (last 50 lines) - Network connectivity test results - Never share wallet credentials or private keys - Use environment variables for sensitive config: - Run miners as non-root user - Monitor for unusual activity: - Join the community: GitHub Discussions: Scottcjn/Rustchain/discussions Open bounties: rustchain-bounties/issues - GitHub Discussions: Scottcjn/Rustchain/discussions - Open bounties: rustchain-bounties/issues - Contribute and earn: Fix bugs, add features, improve docs Every contribution earns RTC tokens See CONTRIBUTING.md - Fix bugs, add features, improve docs - Every contribution earns RTC tokens - See CONTRIBUTING.md - Explore advanced topics: Protocol Specification Hardware Fingerprinting Deep Dive Token Economics Cross-Chain Bridge Guide - Protocol Specification - Hardware Fingerprinting Deep Dive - Token Economics - Cross-Chain Bridge Guide - Build something: Create a mining pool Build a wallet UI Develop monitoring tools Write integrations - Create a mining pool - Build a wallet UI - Develop monitoring tools - Write integrations - GitHub Discussions: Scottcjn/Rustchain/discussions - Open bounties: rustchain-bounties/issues - Fix bugs, add features, improve docs - Every contribution earns RTC tokens - See CONTRIBUTING.md - Protocol Specification - Hardware Fingerprinting Deep Dive - Token Economics - Cross-Chain Bridge Guide - Create a mining pool - Build a wallet UI - Develop monitoring tools - Write integrations - Joined Mar 13, 2026