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
# 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