diff --git a/MINE/gBench.sh b/MINE/gBench.sh deleted file mode 100644 index e18cb3d..0000000 --- a/MINE/gBench.sh +++ /dev/null @@ -1,245 +0,0 @@ -#!/bin/bash -# GMiner algorithm test script - save as test_gminer.sh - -# Default docker image (can be overridden with parameter) -DOCKER_IMAGE=${1:-"amdopencl"} -# amd-strix-halo-llama-rocm -#amd-strix-halo-llama-vulkan-radv -# amd-strix-halo-llama-vulkan-amdvlk - -BTC_WALLET="bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j" - -# Algorithm to coin mapping -declare -A ALGO_COINS=( - ["ethash"]="ETH" - ["etchash"]="ETC" - ["autolykos2"]="ERG" - ["ergo"]="ERG" - ["equihash125_4"]="ZEL" - ["equihash144_5"]="ZEL" - ["equihash192_7"]="ZEL" - ["equihash210_9"]="ZEL" - ["beamhash"]="BEAM" - ["cuckaroo29"]="GRIN" - ["cuckatoo32"]="GRIN" - ["flux"]="FLUX" - ["octopus"]="CFX" -) - -# Function to fetch current cryptocurrency prices -fetch_prices() { - echo "Fetching current cryptocurrency prices..." - - # Use CoinGecko API to get current prices - local api_url="https://api.coingecko.com/api/v3/simple/price?ids=ethereum,ethereum-classic,ergo,zelcash,beam,grin,flux,conflux&vs_currencies=usd" - - # Try to fetch prices with timeout and fallback - local prices_json=$(timeout 10s curl -s "$api_url" 2>/dev/null) - - if [[ -z "$prices_json" ]]; then - echo "Warning: Could not fetch current prices, using fallback values" - PRICES_ETH=3500.00 - PRICES_ETC=35.00 - PRICES_ERG=2.50 - PRICES_ZEL=0.15 - PRICES_BEAM=0.05 - PRICES_GRIN=0.05 - PRICES_FLUX=0.80 - PRICES_CFX=0.20 - return - fi - - # Parse JSON response and extract prices using jq if available, otherwise use grep - if command -v jq &> /dev/null; then - PRICES_ETH=$(echo "$prices_json" | jq -r '.ethereum.usd // "3500.00"') - PRICES_ETC=$(echo "$prices_json" | jq -r '.ethereum-classic.usd // "35.00"') - PRICES_ERG=$(echo "$prices_json" | jq -r '.ergo.usd // "2.50"') - PRICES_ZEL=$(echo "$prices_json" | jq -r '.zelcash.usd // "0.15"') - PRICES_BEAM=$(echo "$prices_json" | jq -r '.beam.usd // "0.05"') - PRICES_GRIN=$(echo "$prices_json" | jq -r '.grin.usd // "0.05"') - PRICES_FLUX=$(echo "$prices_json" | jq -r '.flux.usd // "0.80"') - PRICES_CFX=$(echo "$prices_json" | jq -r '.conflux.usd // "0.20"') - else - # Fallback to grep parsing - PRICES_ETH=$(echo "$prices_json" | grep -o '"ethereum":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "3500.00") - PRICES_ETC=$(echo "$prices_json" | grep -o '"ethereum-classic":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "35.00") - PRICES_ERG=$(echo "$prices_json" | grep -o '"ergo":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "2.50") - PRICES_ZEL=$(echo "$prices_json" | grep -o '"zelcash":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "0.15") - PRICES_BEAM=$(echo "$prices_json" | grep -o '"beam":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "0.05") - PRICES_GRIN=$(echo "$prices_json" | grep -o '"grin":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "0.05") - PRICES_FLUX=$(echo "$prices_json" | grep -o '"flux":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "0.80") - PRICES_CFX=$(echo "$prices_json" | grep -o '"conflux":{"usd":[0-9]*\.[0-9]*' | grep -o '[0-9]*\.[0-9]*$' || echo "0.20") - fi - - echo "Current prices fetched successfully:" - echo " ETH: $PRICES_ETH" - echo " ETC: $PRICES_ETC" - echo " ERG: $PRICES_ERG" - echo " ZEL: $PRICES_ZEL" - echo " BEAM: $PRICES_BEAM" - echo " GRIN: $PRICES_GRIN" - echo " FLUX: $PRICES_FLUX" - echo " CFX: $PRICES_CFX" - echo "" -} - -# GMiner supported algorithms -ALGOS=( - "ethash" - "etchash" - "autolykos2" - "equihash125_4" - "equihash144_5" - "equihash192_7" - "equihash210_9" - "beamhash" - "cuckaroo29" - "cuckatoo32" - "flux" - "octopus" - "ergo" -) - -echo "=== GMiner Algorithm Tests ===" -echo "Using BTC wallet: $BTC_WALLET" -echo "Using Docker image: $DOCKER_IMAGE" -echo "Testing each algorithm for 30 seconds..." -echo "=======================================" - -# Fetch current prices at startup -fetch_prices - -# Function to calculate USD value -calculate_usd_reward() { - local algo=$1 - local hashrate=$2 - local coin=${ALGO_COINS[$algo]} - - # Get price based on coin - local price=0 - case $coin in - "ETH") price=$PRICES_ETH ;; - "ETC") price=$PRICES_ETC ;; - "ERG") price=$PRICES_ERG ;; - "ZEL") price=$PRICES_ZEL ;; - "BEAM") price=$PRICES_BEAM ;; - "GRIN") price=$PRICES_GRIN ;; - "FLUX") price=$PRICES_FLUX ;; - "CFX") price=$PRICES_CFX ;; - *) echo "Unknown" && return ;; - esac - - if [[ -z "$price" || "$price" == "0" ]]; then - echo "Unknown" - return - fi - - # Rough calculation: hashrate * price * 0.000001 (simplified) - local usd_value=$(echo "$hashrate * $price * 0.000001" | bc -l 2>/dev/null) - printf "%.2f" $usd_value 2>/dev/null || echo "Unknown" -} - -# Function to extract hashrate from miner output -extract_hashrate() { - local output="$1" - - # Look for common hashrate patterns in GMiner output - local hashrate=$(echo "$output" | grep -oE "[0-9]+\.[0-9]+ [KMGT]?H/s" | tail -1 | grep -oE "[0-9]+\.[0-9]+" | tail -1) - - # If no decimal found, look for integer hashrates - if [[ -z "$hashrate" ]]; then - hashrate=$(echo "$output" | grep -oE "[0-9]+ [KMGT]?H/s" | tail -1 | grep -oE "[0-9]+" | tail -1) - fi - - # If still no hashrate found, look for any number followed by H/s - if [[ -z "$hashrate" ]]; then - hashrate=$(echo "$output" | grep -oE "[0-9]+[\.]?[0-9]* H/s" | tail -1 | grep -oE "[0-9]+[\.]?[0-9]*" | tail -1) - fi - - # If still no hashrate, look for "Speed:" patterns - if [[ -z "$hashrate" ]]; then - hashrate=$(echo "$output" | grep -i "speed:" | tail -1 | grep -oE "[0-9]+[\.]?[0-9]*" | tail -1) - fi - - # If still no hashrate, look for any number followed by H/s (case insensitive) - if [[ -z "$hashrate" ]]; then - hashrate=$(echo "$output" | grep -ioE "[0-9]+[\.]?[0-9]* h/s" | tail -1 | grep -oE "[0-9]+[\.]?[0-9]*" | tail -1) - fi - - echo "$hashrate" -} - -for algo in "${ALGOS[@]}"; do - echo "" - echo "Testing: $algo" - echo "------------------------" - - case $algo in - "ethash") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server eth.2miners.com:2020 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "etchash") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server etc.2miners.com:1010 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "autolykos2"|"ergo") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo autolykos2 --server ergo.2miners.com:8888 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "equihash125_4") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server zel.2miners.com:9090 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "equihash144_5") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server zel.2miners.com:9090 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "equihash192_7") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server zel.2miners.com:9090 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "equihash210_9") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server zel.2miners.com:9090 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "beamhash") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server beam.2miners.com:5252 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "cuckaroo29") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server grin.2miners.com:3030 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "cuckatoo32") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server grin.2miners.com:3030 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "flux") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server flux.2miners.com:2020 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - "octopus") - output=$(sudo docker exec -it $DOCKER_IMAGE timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server cfx.2miners.com:3254 --user '$BTC_WALLET' --pass x" 2>&1) - ;; - *) - echo "No specific pool configured for $algo - skipping" - continue - ;; - esac - - exit_code=$? - - # Extract hashrate and calculate USD value - hashrate=$(extract_hashrate "$output") - coin=${ALGO_COINS[$algo]} - usd_value=$(calculate_usd_reward "$algo" "$hashrate") - - if [ $exit_code -eq 0 ]; then - echo "SUCCESS: $algo - Hashrate: ${hashrate}H/s - Coin: $coin - Est. USD/day: $usd_value" - elif [ $exit_code -eq 124 ]; then - echo "TIMEOUT: $algo - Hashrate: ${hashrate}H/s - Coin: $coin - Est. USD/day: $usd_value (likely working)" - else - echo "FAILED: $algo - Error code: $exit_code" - # Debug: show first few lines of output for failed attempts - echo "Debug output (first 5 lines):" - echo "$output" | head -5 - fi - - sleep 3 -done - -echo "" -echo "=== GMiner Tests Complete ===" -echo "Usage: $0 [docker_image_name]" -echo "Default: amdopencl" -echo "Example for RockM: $0 rockm" \ No newline at end of file diff --git a/MINE/lolBench.sh b/MINE/lolBench.sh deleted file mode 100644 index f570ccc..0000000 --- a/MINE/lolBench.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# lolMiner benchmark script - save as bench_lolminer.sh - -ALGOS=("ETHASH" "ETCHASH" "AUTOLYKOS2" "BEAM-III" "EQUIHASH144_5" "EQUIHASH192_7" "EQUIHASH210_9" "FLUX" "NEXA" "PROGPOW" "PROGPOWZ" "PROGPOW_VERIBLOCK" "PROGPOW_VEIL" "TON") - -echo "=== lolMiner Algorithm Benchmark ===" -echo "Testing each algorithm for 15 seconds..." -echo "=====================================" - -for algo in "${ALGOS[@]}"; do - echo "" - echo "Testing: $algo" - echo "------------------------" - - sudo docker exec -it amdopencl timeout 20s bash -c "mnt/dl/lol.1.97/lolMiner --algo $algo --benchmark --benchepochs 1 --benchwarmup 5" 2>/dev/null - - if [ $? -eq 0 ]; then - echo "โœ… $algo: WORKS" - elif [ $? -eq 124 ]; then - echo "โฑ๏ธ $algo: TIMEOUT (likely working)" - else - echo "โŒ $algo: FAILED" - fi - - sleep 2 -done - -echo "" -echo "=== Benchmark Complete ===" \ No newline at end of file diff --git a/MINE/notes.md b/MINE/notes.md index cef5a04..53d1ca9 100644 --- a/MINE/notes.md +++ b/MINE/notes.md @@ -63,6 +63,9 @@ rinhash.mine.zergpool.com:7148 c=RIN] !!!!!!!!!!!!!!!!!!!!!! BEST CURRENT CPU !!!!!!!!!!!!!!!!!! Active exchange: Listed on Exbitron (RIN/USDT) sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://rinhash.mine.zergpool.com:7148 -u bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j -p c=BTC,mc=RIN,ID=StrixHalo -t 32" + +.\cpuminer.exe -a rinhash -o stratum+tcp://rinhash.mine.zergpool.com:7148 -u bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j -p c=BTC,mc=RIN,ID=StrixHalo -t 3 +.\cpuminer.exe -a rinhash -o stratum+tcp://192.168.0.188:3333 -u db.rog -p c=BTC,mc=RIN,ID=StrixHalo -t 3 ----------------------------------------------------------------- diff --git a/MINE/rin/Dockerfile b/MINE/rin/Dockerfile deleted file mode 100644 index 5dd2db4..0000000 --- a/MINE/rin/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM ubuntu:22.04 - -ENV DEBIAN_FRONTEND=noninteractive -RUN apt-get update && apt-get install -y \ - build-essential libtool autotools-dev automake pkg-config bsdmainutils \ - libevent-dev libboost-all-dev libssl-dev \ - libdb5.3-dev libdb5.3++-dev libfmt-dev libsqlite3-dev \ - git ca-certificates \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /opt -RUN git clone https://github.com/Rin-coin/rincoin.git && \ - cd rincoin && \ - ./autogen.sh && \ - ./configure --with-incompatible-bdb && \ - make -j$(nproc) && \ - make install - -# runtime -RUN useradd -m rin && mkdir -p /data && chown -R rin:rin /data -USER rin -VOLUME ["/data"] -EXPOSE 9555 9556 -ENTRYPOINT ["/usr/local/bin/rincoind"] -CMD ["-datadir=/data", "-conf=/data/rincoin.conf", "-printtoconsole"] diff --git a/MINE/rin/QUICK_REFERENCE.md b/MINE/rin/QUICK_REFERENCE.md deleted file mode 100644 index 4fb079f..0000000 --- a/MINE/rin/QUICK_REFERENCE.md +++ /dev/null @@ -1,46 +0,0 @@ -# RinCoin Mining Quick Reference - -## ๐Ÿš€ **Quick Commands:** - -### **Solo Mining (All Rewards to You)** -```bash -# Start solo mining proxy -./MINE/rin/start_stratum_proxy.sh - -# Connect miner -./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user -p pass -t 28 -``` - -### **Mining Pool (Distribute Rewards)** -```bash -# Start mining pool -./MINE/rin/start_mining_pool.sh - -# Miners connect -./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u username.workername -p x -``` - -### **Cleanup** -```bash -# Kill proxy/pool processes -./MINE/rin/kill_stratum_proxy.sh -``` - -## ๐Ÿ“Š **What Each Does:** - -| Command | Purpose | Rewards | Miners | -|---------|---------|---------|--------| -| `start_stratum_proxy.sh` | Solo mining | 100% to you | Single | -| `start_mining_pool.sh` | Pool mining | Distributed | Multiple | - -## ๐ŸŒ **Web Dashboard (Pool Only)** -- **URL**: `http://YOUR_IP:8080` -- **Features**: Stats, miners, blocks, hashrate - -## โšก **Quick Test** -```bash -# Test solo mining -./MINE/rin/start_stratum_proxy.sh & -sleep 5 -./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user -p pass -t 4 -``` diff --git a/MINE/rin/README.md b/MINE/rin/README.md deleted file mode 100644 index 26a84e3..0000000 --- a/MINE/rin/README.md +++ /dev/null @@ -1,320 +0,0 @@ -# RinCoin Mining Setup Complete! ๐ŸŽ‰ - -## ๐ŸŽฏ **Choose Your Mining Strategy:** - -### **Option 1: Solo Mining (Single Miner, All Rewards to You)** -```bash -# Start solo mining proxy -./MINE/rin/start_stratum_proxy.sh - -# Run your miner -./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user -p pass -t 28 -``` -**Result**: 100% of block rewards go to your wallet - -### **Option 2: Mining Pool (Multiple Miners, Distributed Rewards)** -```bash -# Start mining pool -./MINE/rin/start_mining_pool.sh - -# Miners connect with their RinCoin addresses: -# Option 1: Address as username -./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q -p x - -# Option 2: Address.workername format -./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker1 -p x - -# Option 3: Traditional username (rewards to pool address) -./cpuminer -a rinhash -o stratum+tcp://192.168.0.188:3333 -u username.workername -p x -t 4 -``` -**Result**: Block rewards distributed among all miners based on shares - -### **Key Differences:** - -| Feature | Solo Mining (`stratum_proxy`) | Mining Pool (`stratum_pool`) | -|---------|--------------------------------|------------------------------| -| **Rewards** | 100% to you | Distributed among miners | -| **Miners** | Single | Multiple | -| **Setup** | Simple | More complex | -| **Consistency** | Rare big payouts | Regular small payments | -| **Risk** | High variance | Lower variance | -| **Public** | No | Yes, can be published | - ---- - -## โœ… **Successfully Built and Running:** - -### **1. RinCoin Node Container** -- **Container**: `rincoin-node` (ID: 87b5f74a2472) -- **Status**: โœ… **RUNNING** -- **Ports**: 9555 (P2P), 9556 (RPC) -- **Version**: v1.0.1.0-5cf3d4a11 -- **Sync Status**: โœ… **FULLY SYNCED** (blocks: 228,082, headers: 228,082) - -### **2. Wallet Setup** -- **Wallet Name**: `main` -- **Default RinCoin Address**: `rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q` -- **RPC Credentials**: - - User: `rinrpc` - - Password: `745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90` - -### **3. Configuration Files** -- **Config**: `/mnt/data/docker_vol/rincoin/rincoin-node/rincoin.conf` -- **Data Directory**: `/mnt/data/docker_vol/rincoin/rincoin-node/data` -- **Docker Compose**: `MINE/rin/container.yml` - -## ๐Ÿš€ **Ready for Mining:** - -### **Pool Mining (Zergpool) - Recommended for Consistent Rewards** -```bash -# CPU Mining RinHash to BTC -sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://rinhash.mine.zergpool.com:7148 -u bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j -p c=BTC,mc=RIN,ID=StrixHalo -t 32" -``` - -### **Solo Mining (Local Node) - With Stratum Proxy โญ RECOMMENDED** -```bash -# Start mining with your RinCoin address (rewards go to this address!) -./MINE/rin/start_mining_with_address.sh rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q 28 - -# Or use the default address -./MINE/rin/start_mining_with_address.sh -``` - -### **Manual Solo Mining Setup (Stratum Proxy)** -```bash -# 1. Start Stratum proxy (solo mining) -./MINE/rin/start_stratum_proxy.sh - -# 2. In another terminal, connect cpuminer-opt-rin -sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://172.17.0.1:3333 -u user -p pass -t 28" -``` - -### **Built-in Core Mining (Low Performance)** -```bash -# Solo mining with built-in RinCoin core (not recommended) -bash MINE/rin/solo_mining_core.sh -t 28 -``` - -### **Why cpuminer-opt-rin Can't Mine Directly to Node** -```bash -# This command will fail: -sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o http://127.0.0.1:9556 -u rinrpc -p 745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 -t 28 --coinbase-addr=bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j" - -# Reason: Protocol mismatch -# - cpuminer-opt-rin uses Stratum protocol (for mining pools) -# - RinCoin node uses RPC protocol (for direct mining) -# - No built-in protocol conversion available -``` - -### **Direct CPU Mining Setup (Solo Mining - No Container Needed)** -```bash -# 1. Start stratum proxy (solo mining) -./MINE/rin/start_stratum_proxy.sh - -# OR run in background with logging -nohup python3 MINE/rin/stratum_proxy.py > stratum_proxy.log 2>&1 & - -# 2. Run cpuminer directly on host -/home/db/Downloads/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user -p pass -t 28 - -# 3. Clean up when done -./MINE/rin/kill_stratum_proxy.sh -``` - - - - -### **Mining Options Explained** -1. **Built-in Core Mining**: Uses RinCoin's `generatetoaddress` RPC command (low performance) -2. **Pool Mining**: Uses cpuminer-opt-rin with Stratum pools (Zergpool) - consistent rewards -3. **Direct RPC Mining**: Would require custom miner implementing `getblocktemplate` -4. **Solo Mining (Stratum Proxy)**: Uses Stratum proxy to bridge cpuminer-opt-rin to RinCoin node - all rewards to you -5. **Mining Pool (Stratum Pool)**: Distributes block rewards among multiple miners - share-based rewards - -## ๐ŸŠโ€โ™‚๏ธ **Mining Pool Setup (Multiple Miners)** - -Your Stratum proxy can be enhanced to work as a **full mining pool** that distributes block rewards among multiple miners! - -### **Pool Features:** -- โœ… **Multiple Miner Support**: Unlimited miners can connect -- โœ… **Share-Based Rewards**: Rewards distributed based on share contributions -- โœ… **Pool Fee**: 1% fee for pool maintenance -- โœ… **Real-Time Statistics**: Web dashboard with live stats -- โœ… **Block Reward Distribution**: Automatic distribution when blocks are found - -### **Quick Start Pool:** -```bash -# 1. Start the mining pool -./MINE/rin/start_mining_pool.sh - -# 2. Miners connect with: -./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u username.workername -p x -``` - -### **Pool vs Solo Mining:** - -| Feature | Solo Mining | Mining Pool | -|---------|-------------|-------------| -| **Block Rewards** | 100% to you | Distributed among miners | -| **Consistency** | Rare blocks | Regular small payments | -| **Setup** | Simple | More complex | -| **Miners** | Single | Multiple | -| **Risk** | High variance | Lower variance | - -### **Publishing Your Pool:** - -#### **1. Public IP Setup:** -```bash -# Get your public IP -curl ifconfig.me - -# Configure firewall (if needed) -sudo ufw allow 3333/tcp -sudo ufw allow 8080/tcp # Web interface -``` - -#### **2. Pool Connection String:** -``` -stratum+tcp://YOUR_PUBLIC_IP:3333 -``` - -#### **3. Web Dashboard:** -- **URL**: `http://YOUR_PUBLIC_IP:8080` -- **Features**: Real-time stats, miner rankings, block history - -#### **4. Pool Announcement:** -Share your pool details: -- **Algorithm**: RinHash -- **Port**: 3333 -- **Fee**: 1% -- **Payout**: Automatic distribution -- **Web**: `http://YOUR_PUBLIC_IP:8080` - -### **Pool Configuration:** -```python -# Edit MINE/rin/stratum_pool.py -pool_address = 'rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q' # Pool wallet -pool_fee_percent = 1.0 # Pool fee percentage -``` - -## build image -sudo bash -lc "cd /mnt/shared/DEV/repos/d-popov.com/scripts/MINE/rin && docker build -t rincoin-node:latest . | cat" - - -## start container -sudo docker run -d --name rincoin-node \ - -p 9555:9555 -p 9556:9556 \ - -v /mnt/data/docker_vol/rincoin/rincoin-node/data:/data \ - -v /mnt/data/docker_vol/rincoin/rincoin-node/rincoin.conf:/data/rincoin.conf:ro \ - rincoin-node:latest -datadir=/data -conf=/data/rincoin.conf -printtoconsole - - - -## check if running -curl --user rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 -H 'content-type: text/plain' --data '{"jsonrpc":"1.0","id":"curl","method":"getblockchaininfo","params":[]}' http://127.0.0.1:9556/ - - -## get wallet -sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf createwallet "main" -sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf -rpcwallet=main getnewaddress -rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q - - - -```bash -# Solo mining to your RinCoin wallet -./MINE/rin/solo_mining.sh -``` - -## ๐Ÿ“Š **Performance Comparison:** - -| Mining Type | Algorithm | Hashrate | Target | Status | -|-------------|-----------|----------|---------|---------| -| **Pool Mining** | RinHash | ~80 kH/s | Zergpool | โœ… Working | -| **Solo Mining** | RinHash | Built-in CPU | Local Node | โœ… Working | -| **GPU Mining** | Equihash 125,4 | 28.8 Sol/s | Zergpool | โœ… Working | - -## ๐Ÿ”ง **Management Commands:** - -### **Node Management** -```bash -# Start node -sudo docker start rincoin-node - -# Stop node -sudo docker stop rincoin-node - -# View logs -sudo docker logs -f rincoin-node - -# Check sync status -sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf getblockchaininfo -``` - -### **Wallet Management** -```bash -# Get new address -sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf -rpcwallet=main getnewaddress - -# Check balance -sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf -rpcwallet=main getbalance -``` - -### **RPC Access** -```bash -# Test RPC connection -curl --user rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"getblockchaininfo","params":[]}' \ - http://127.0.0.1:9556/ - -# Get new address via RPC -curl --user rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"getnewaddress","params":[]}' \ - http://127.0.0.1:9556/ -``` - -## โš ๏ธ **Important Notes:** - -1. **Node Sync**: โœ… **COMPLETE** - Node is fully synced and ready -2. **Solo Mining**: Very low chance of finding blocks solo. Consider pool mining for consistent rewards. -3. **RPC Access**: โœ… **WORKING** - RPC is accessible on port 9556 -4. **Address Parameter**: Solo mining script accepts custom addresses or uses default -5. **Block Rewards**: When solo mining, ALL block rewards go to your specified RinCoin address - -## ๐Ÿ› ๏ธ **Troubleshooting:** - -### **Port 3333 Already in Use** -```bash -# Check what's using the port -sudo netstat -tlnp | grep :3333 - -# Kill existing processes -./MINE/rin/kill_stratum_proxy.sh - -# Or manually kill -sudo lsof -ti:3333 | xargs sudo kill -9 -``` - -### **Container Can't Connect to Proxy** -```bash -# Use Docker gateway IP instead of localhost -sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://172.17.0.1:3333 -u user -p pass -t 28" -``` - -### **Check Proxy Logs** -```bash -# View real-time logs -tail -f stratum_proxy.log - -# Check if proxy is running -ps aux | grep stratum_proxy -``` - -## ๐ŸŽฏ **Next Steps:** - -1. โœ… **Node is synced** - Ready for all operations -2. **Choose mining strategy**: Pool mining for consistent income vs Solo mining for block rewards -3. **Monitor performance** and adjust thread count as needed -4. **Set up monitoring** for node health and mining performance diff --git a/MINE/rin/REWARD_DISTRIBUTION_EXAMPLE.md b/MINE/rin/REWARD_DISTRIBUTION_EXAMPLE.md deleted file mode 100644 index 1f042c9..0000000 --- a/MINE/rin/REWARD_DISTRIBUTION_EXAMPLE.md +++ /dev/null @@ -1,40 +0,0 @@ -# Reward Distribution Example - -## Scenario: Block Reward = 50 RIN (49 RIN after 1% pool fee) - -### Miners Connected: -1. **Miner A**: `rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker1` (30 difficulty) -2. **Miner B**: `user.worker2` (20 difficulty) - No address specified -3. **Miner C**: `rin1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.worker3` (50 difficulty) - **INVALID ADDRESS** - -### Total Difficulty: 100 - -### Reward Distribution: - -#### **Step 1: Calculate Individual Shares** -- **Miner A**: (30/100) ร— 49 = **14.7 RIN** โ†’ `rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q` -- **Miner B**: (20/100) ร— 49 = **9.8 RIN** โ†’ **Pool address** (no valid address) -- **Miner C**: (50/100) ร— 49 = **24.5 RIN** โ†’ **Pool address** (invalid address) - -#### **Step 2: Final Distribution** -- **Pool Address**: 1 RIN (fee) + 9.8 RIN (from Miner B) + 24.5 RIN (from Miner C) = **35.3 RIN** -- **Miner A**: **14.7 RIN** - -### Pool Logs: -``` -[127.0.0.1] โœ… Authorized: miner_rin1qah.worker1 -> rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q -[127.0.0.1] โš ๏ธ Authorized: user.worker2 (rewards will go to pool address) -[127.0.0.1] โŒ Invalid RinCoin address: rin1qxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -๐Ÿ’ฐ Miner rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q: 14.70000000 RIN (30 difficulty) -โš ๏ธ Miner without address: 20 difficulty -> 9.80000000 RIN to pool -โš ๏ธ Miner without address: 50 difficulty -> 24.50000000 RIN to pool -๐Ÿ’ฐ Pool keeps 34.30000000 RIN from miners without addresses -๐Ÿ“Š Summary: 1 miners with addresses, 2 without (rewards to pool) -``` - -### Key Points: -- โœ… **Miners with valid addresses**: Get their full share -- โš ๏ธ **Miners without addresses**: Contribute to difficulty but rewards go to pool -- โŒ **Miners with invalid addresses**: Rejected at connection time -- ๐Ÿ’ฐ **Pool benefits**: Gets additional rewards from careless miners -- ๐Ÿ“Š **Transparent**: All distributions clearly logged diff --git a/MINE/rin/__pycache__/pool_web_interface.cpython-312.pyc b/MINE/rin/__pycache__/pool_web_interface.cpython-312.pyc deleted file mode 100644 index 066190d..0000000 Binary files a/MINE/rin/__pycache__/pool_web_interface.cpython-312.pyc and /dev/null differ diff --git a/MINE/rin/container.yml b/MINE/rin/container.yml deleted file mode 100644 index 3b34c04..0000000 --- a/MINE/rin/container.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3.8" - -services: - rincoin-node: - container_name: rincoin-node - image: rincoin-node:latest - restart: unless-stopped - ports: - - "9555:9555" - - "9556:9556" - volumes: - - /mnt/data/docker_vol/rincoin/rincoin-node/data:/data - - /mnt/data/docker_vol/rincoin/rincoin-node/rincoin.conf:/data/rincoin.conf:ro - command: - - rincoind - - -datadir=/data - - -conf=/data/rincoin.conf - - -printtoconsole \ No newline at end of file diff --git a/MINE/rin/kill_stratum_proxy.sh b/MINE/rin/kill_stratum_proxy.sh deleted file mode 100644 index 136f5c6..0000000 --- a/MINE/rin/kill_stratum_proxy.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Kill RinCoin Stratum Proxy processes - -echo "=== Killing RinCoin Stratum Proxy ===" -echo "" - -# Find and kill Python processes running stratum_proxy.py -PIDS=$(ps aux | grep "stratum_proxy.py" | grep -v grep | awk '{print $2}') - -if [ -n "$PIDS" ]; then - echo "Found Stratum Proxy processes: $PIDS" - echo "Killing processes..." - for pid in $PIDS; do - kill -9 "$pid" 2>/dev/null && echo "Killed PID: $pid" || echo "Failed to kill PID: $pid" - done -else - echo "No Stratum Proxy processes found" -fi - -# Also kill any process using port 3333 -echo "" -echo "Checking port 3333..." -PORT_PIDS=$(sudo lsof -ti:3333 2>/dev/null) - -if [ -n "$PORT_PIDS" ]; then - echo "Found processes using port 3333: $PORT_PIDS" - echo "Killing processes..." - for pid in $PORT_PIDS; do - sudo kill -9 "$pid" 2>/dev/null && echo "Killed PID: $pid" || echo "Failed to kill PID: $pid" - done -else - echo "No processes using port 3333" -fi - -echo "" -echo "โœ… Cleanup complete!" -echo "" -echo "Port 3333 status:" -netstat -tln | grep ":3333 " || echo "Port 3333 is free" diff --git a/MINE/rin/miner/readme.md b/MINE/rin/miner/readme.md deleted file mode 100644 index 53fb967..0000000 --- a/MINE/rin/miner/readme.md +++ /dev/null @@ -1,23 +0,0 @@ -from https://github.com/StickyFingaz420/CPUminer-opt-rinhash - - - -Option 1: Build from Source (Recommended) -bash - -Copy -# Install build dependencies -sudo apt update -sudo apt install build-essential autotools-dev autoconf pkg-config libcurl4-openssl-dev libjansson-dev libssl-dev libgmp-dev zlib1g-dev git automake libtool - -# Clone the repository (if you haven't already) -git clone https://github.com/rplant8/cpuminer-opt-rinhash.git -cd cpuminer-opt-rinhash - -# Build it -./autogen.sh -./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer" -make -j$(nproc) - -# Test the newly built binary -./cpuminer -a rinhash -o stratum+tcp://192.168.0.188:3333 -u username.workername -p x -t 4 \ No newline at end of file diff --git a/MINE/rin/pool_web_interface.py b/MINE/rin/pool_web_interface.py deleted file mode 100644 index 7d4c44f..0000000 --- a/MINE/rin/pool_web_interface.py +++ /dev/null @@ -1,481 +0,0 @@ -#!/usr/bin/env python3 -""" -RinCoin Mining Pool Web Interface -Provides web dashboard for pool statistics and miner management -""" - -import json -import sqlite3 -from datetime import datetime, timedelta -from http.server import HTTPServer, BaseHTTPRequestHandler -import threading -import time - -class PoolWebInterface: - def __init__(self, pool_db, host='0.0.0.0', port=8080): - self.pool_db = pool_db - self.host = host - self.port = port - self.chart_time_window = 3600 # 1 hour default, adjustable - - def set_chart_time_window(self, seconds): - """Set the chart time window""" - self.chart_time_window = seconds - - def format_hashrate(self, hashrate): - """Format hashrate in human readable format""" - if hashrate >= 1e12: - return f"{hashrate/1e12:.2f} TH/s" - elif hashrate >= 1e9: - return f"{hashrate/1e9:.2f} GH/s" - elif hashrate >= 1e6: - return f"{hashrate/1e6:.2f} MH/s" - elif hashrate >= 1e3: - return f"{hashrate/1e3:.2f} KH/s" - elif hashrate >= 0.01: - return f"{hashrate:.2f} H/s" - elif hashrate > 0: - return f"{hashrate*1000:.2f} mH/s" - else: - return "0.00 H/s" - - def get_pool_stats(self): - """Get current pool statistics""" - try: - cursor = self.pool_db.cursor() - - # Total miners (ever registered) - cursor.execute('SELECT COUNT(DISTINCT id) FROM miners') - total_miners = cursor.fetchone()[0] - - # Active miners (last 5 minutes) - cursor.execute(''' - SELECT COUNT(DISTINCT m.id) FROM miners m - JOIN shares s ON m.id = s.miner_id - WHERE s.submitted > datetime('now', '-5 minutes') - ''') - active_miners = cursor.fetchone()[0] - - # Total shares (last 24 hours) - cursor.execute(''' - SELECT COUNT(*) FROM shares - WHERE submitted > datetime('now', '-24 hours') - ''') - total_shares_24h = cursor.fetchone()[0] - - # Pool hashrate: sum of miners.last_hashrate (instantaneous) - cursor.execute('SELECT COALESCE(SUM(last_hashrate), 0) FROM miners') - hashrate = cursor.fetchone()[0] or 0.0 - - # Debug stats - cursor.execute(''' - SELECT SUM(difficulty), COUNT(*) FROM shares - WHERE submitted > datetime('now', '-5 minutes') - ''') - rd = cursor.fetchone() - recent_difficulty = rd[0] if rd and rd[0] else 0 - recent_share_count = rd[1] if rd and rd[1] else 0 - - # Get historical hashrate data for chart - cursor.execute(''' - SELECT - strftime('%H:%M', submitted) as time, - COUNT(*) as shares, - SUM(difficulty) as total_difficulty - FROM shares - WHERE submitted > datetime('now', '-{} seconds') - GROUP BY strftime('%Y-%m-%d %H:%M', submitted) - ORDER BY submitted DESC - LIMIT 60 - '''.format(self.chart_time_window)) - historical_data = cursor.fetchall() - - # Calculate individual miner hashrates - cursor.execute(''' - SELECT - m.user, m.worker, - COUNT(s.id) as shares, - SUM(s.difficulty) as total_difficulty, - m.last_share - FROM miners m - LEFT JOIN shares s ON m.id = s.miner_id - AND s.submitted > datetime('now', '-5 minutes') - GROUP BY m.id, m.user, m.worker - ORDER BY shares DESC - ''') - miner_stats = cursor.fetchall() - - # Calculate individual hashrates (use miners.last_hashrate) - miner_hashrates = [] - for user, worker, shares, difficulty, last_share in miner_stats: - cursor.execute('SELECT last_hashrate FROM miners WHERE user = ? AND worker = ? LIMIT 1', (user, worker)) - row = cursor.fetchone() - miner_hashrate = row[0] if row and row[0] else 0.0 - miner_hashrates.append((user, worker, shares, miner_hashrate, last_share)) - - # Total blocks found - cursor.execute('SELECT COUNT(*) FROM blocks') - total_blocks = cursor.fetchone()[0] - - # Recent blocks - cursor.execute(''' - SELECT block_hash, height, reward, found_at - FROM blocks - ORDER BY found_at DESC - LIMIT 10 - ''') - recent_blocks = cursor.fetchall() - - # Top miners (last 24 hours) - show all miners, even without shares - cursor.execute(''' - SELECT m.user, m.worker, - COALESCE(COUNT(s.id), 0) as shares, - m.last_share, - m.created - FROM miners m - LEFT JOIN shares s ON m.id = s.miner_id - AND s.submitted > datetime('now', '-24 hours') - GROUP BY m.id, m.user, m.worker - ORDER BY shares DESC, m.created DESC - LIMIT 20 - ''') - top_miners = cursor.fetchall() - - # All active miners (for better visibility) - cursor.execute(''' - SELECT user, worker, created, last_share - FROM miners - ORDER BY created DESC - LIMIT 10 - ''') - all_miners = cursor.fetchall() - - return { - 'total_miners': total_miners, - 'active_miners': active_miners, - 'total_shares_24h': total_shares_24h, - 'hashrate': hashrate, - 'total_blocks': total_blocks, - 'recent_blocks': recent_blocks, - 'top_miners': top_miners, - 'all_miners': all_miners, - 'miner_hashrates': miner_hashrates, - 'historical_data': historical_data, - 'debug': { - 'recent_difficulty': recent_difficulty, - 'recent_share_count': recent_share_count, - 'total_shares_24h': total_shares_24h - } - } - except Exception as e: - print(f"Error getting pool stats: {e}") - return {} - - def generate_html(self, stats): - """Generate HTML dashboard""" - html = f""" - - - - RinCoin Mining Pool - - - - - -
-
-

๐ŸŠโ€โ™‚๏ธ RinCoin Mining Pool

-

Distribute block rewards among multiple miners

-
- - - -
-
-
{stats.get('total_miners', 0)}
-
Total Miners
-
-
-
{stats.get('active_miners', 0)}
-
Active Miners
-
-
-
{self.format_hashrate(stats.get('hashrate', 0))}
-
Hashrate
-
-
-
{stats.get('total_blocks', 0)}
-
Blocks Found
-
-
- -
-

๐Ÿ“Š Pool Statistics

-

24h Shares: {stats.get('total_shares_24h', 0):,}

-

Pool Fee: 1%

-

Connection String: stratum+tcp://YOUR_IP:3333

- - -
- ๐Ÿ” Debug Info -

Recent Difficulty (5min): {stats.get('debug', {}).get('recent_difficulty', 0):.6f}

-

Recent Share Count (5min): {stats.get('debug', {}).get('recent_share_count', 0)}

-

Total Shares (24h): {stats.get('debug', {}).get('total_shares_24h', 0):,}

-

Active Miners: {stats.get('active_miners', 0)} (last 5 minutes)

-

Total Miners: {stats.get('total_miners', 0)} (ever registered)

-
-
- -
-

๐Ÿ“ˆ Hashrate Chart

-
- - -
-
- -
-
- -
-

๐Ÿ‘ฅ Connected Miners

- - - - - - - - """ - - for miner in stats.get('all_miners', []): - user, worker, created, last_share = miner - html += f""" - - - - - - - """ - - if not stats.get('all_miners', []): - html += """ - - - - """ - - html += """ -
UserWorkerConnectedLast Share
{user}{worker}{created}{last_share or 'Never'}
No miners connected
-
- -
-

๐Ÿ† Top Miners (24h Shares)

- - - - - - - - - """ - - for miner in stats.get('miner_hashrates', []): - user, worker, shares, hashrate, last_share = miner - html += f""" - - - - - - - - """ - - if not stats.get('top_miners', []): - html += """ - - - - """ - - html += """ -
UserWorkerSharesHashrateLast Share
{user}{worker}{shares:,}{self.format_hashrate(hashrate)}{last_share or 'Never'}
No shares submitted yet
-
- -
-

๐Ÿ† Recent Blocks

- - - - - - - - """ - - for block in stats.get('recent_blocks', []): - block_hash, height, reward, found_at = block - html += f""" - - - - - - - """ - - html += """ -
HeightHashRewardFound At
{height}{block_hash[:16]}...{reward:.8f} RIN{found_at}
-
- -
-

๐Ÿ”— Connect to Pool

-

Use any RinHash-compatible miner:

-
./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u username.workername -p x
-

Replace YOUR_IP with your server's public IP address

-
-
- - - - - - - - """ - return html - -class PoolWebHandler(BaseHTTPRequestHandler): - def __init__(self, *args, pool_interface=None, **kwargs): - self.pool_interface = pool_interface - super().__init__(*args, **kwargs) - - def do_GET(self): - if self.path == '/': - stats = self.pool_interface.get_pool_stats() - html = self.pool_interface.generate_html(stats) - - self.send_response(200) - self.send_header('Content-type', 'text/html') - self.end_headers() - self.wfile.write(html.encode('utf-8')) - elif self.path == '/api/stats': - stats = self.pool_interface.get_pool_stats() - - self.send_response(200) - self.send_header('Content-type', 'application/json') - self.end_headers() - self.wfile.write(json.dumps(stats).encode('utf-8')) - else: - self.send_response(404) - self.end_headers() - self.wfile.write(b'Not Found') - - def log_message(self, format, *args): - # Suppress access logs - pass - -def start_web_interface(pool_db, host='0.0.0.0', port=8083): - """Start the web interface server""" - interface = PoolWebInterface(pool_db, host, port) - - class Handler(PoolWebHandler): - def __init__(self, *args, **kwargs): - super().__init__(*args, pool_interface=interface, **kwargs) - - try: - server = HTTPServer((host, port), Handler) - print(f"๐ŸŒ Web interface running on http://{host}:{port}") - print("Press Ctrl+C to stop") - - server.serve_forever() - except OSError as e: - if "Address already in use" in str(e): - print(f"โš ๏ธ Port {port} is already in use, web interface not started") - print(f"๐Ÿ’ก Try a different port or kill the process using port {port}") - else: - print(f"โŒ Failed to start web interface: {e}") - except KeyboardInterrupt: - print("\n๐Ÿ›‘ Shutting down web interface...") - server.shutdown() - -if __name__ == "__main__": - # This would be called from the main pool server - print("Web interface module loaded") diff --git a/MINE/rin/rincoin.conf b/MINE/rin/rincoin.conf deleted file mode 100644 index aca7947..0000000 --- a/MINE/rin/rincoin.conf +++ /dev/null @@ -1,13 +0,0 @@ -server=1 -daemon=0 -listen=1 -txindex=1 - -rpcuser=rinrpc -rpcpassword=745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 -rpcallowip=0.0.0.0/0 -rpcport=9556 - -# performance -maxconnections=64 -dbcache=2048 diff --git a/MINE/rin/solo_mining.sh b/MINE/rin/solo_mining.sh deleted file mode 100644 index b0ec0ad..0000000 --- a/MINE/rin/solo_mining.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# Solo Mining Script for RinCoin -# Uses local RinCoin node for solo mining - -echo "=== RinCoin Solo Mining Setup ===" -echo "" - -# Check if rincoin-node container is running -if ! sudo docker ps | grep -q "rincoin-node"; then - echo "Error: rincoin-node container is not running!" - echo "Please start it first:" - echo "sudo docker start rincoin-node" - exit 1 -fi - -# Get wallet address -RIN_ADDRESS=$(sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf -rpcwallet=main getnewaddress 2>/dev/null) - -if [ -z "$RIN_ADDRESS" ]; then - echo "Error: Could not get RinCoin address!" - echo "Make sure the wallet is created and the node is synced." - exit 1 -fi - -echo "RinCoin Address: $RIN_ADDRESS" -echo "" - -# Check node sync status -SYNC_STATUS=$(sudo docker exec rincoin-node rincoin-cli -datadir=/data -conf=/data/rincoin.conf getblockchaininfo | grep -o '"initialblockdownload": [^,]*' | cut -d' ' -f2) - -if [ "$SYNC_STATUS" = "true" ]; then - echo "โš ๏ธ WARNING: Node is still syncing (initialblockdownload: true)" - echo "Solo mining may not work properly until sync is complete." - echo "" -fi - -echo "Starting solo mining with cpuminer-opt-rin..." -echo "Algorithm: rinhash" -echo "Target: Local RinCoin node (127.0.0.1:9555)" -echo "Wallet: $RIN_ADDRESS" -echo "" -echo "Press Ctrl+C to stop mining" -echo "" - -# Start solo mining -sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://127.0.0.1:9555 -u $RIN_ADDRESS -p x -t 32" diff --git a/MINE/rin/solo_mining_core.sh b/MINE/rin/solo_mining_core.sh deleted file mode 100644 index 1ade71d..0000000 --- a/MINE/rin/solo_mining_core.sh +++ /dev/null @@ -1,171 +0,0 @@ -#!/bin/bash - -# RinCoin Solo Mining using Built-in Core Mining -# Uses RinCoin Core's generatetoaddress command - -# Default address (can be overridden with command line parameter) -DEFAULT_ADDRESS="rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q" - -# Get total CPU cores for default thread count -TOTAL_CORES=$(nproc) -DEFAULT_THREADS=$TOTAL_CORES - -# Parse command line arguments -RIN_ADDRESS="" -THREAD_COUNT="" - -# Parse arguments -while [[ $# -gt 0 ]]; do - case $1 in - -a|--address) - RIN_ADDRESS="$2" - shift 2 - ;; - -t|--threads) - THREAD_COUNT="$2" - shift 2 - ;; - -h|--help) - echo "Usage: $0 [OPTIONS]" - echo "" - echo "Options:" - echo " -a, --address ADDRESS RinCoin address to mine to (default: $DEFAULT_ADDRESS)" - echo " -t, --threads COUNT Number of threads to use (default: $DEFAULT_THREADS)" - echo " -h, --help Show this help message" - echo "" - echo "Examples:" - echo " $0 # Use defaults (all cores, default address)" - echo " $0 -a rin1q... -t 16 # Custom address and 16 threads" - echo " $0 --address rin1q... --threads 8 # Custom address and 8 threads" - exit 0 - ;; - *) - echo "Unknown option: $1" - echo "Use -h or --help for usage information" - exit 1 - ;; - esac -done - -# Set defaults if not provided -if [ -z "$RIN_ADDRESS" ]; then - RIN_ADDRESS="$DEFAULT_ADDRESS" - echo "No address provided, using default: $RIN_ADDRESS" -fi - -if [ -z "$THREAD_COUNT" ]; then - THREAD_COUNT="$DEFAULT_THREADS" - echo "No thread count provided, using all cores: $THREAD_COUNT" -fi - -# Validate thread count -if ! [[ "$THREAD_COUNT" =~ ^[0-9]+$ ]] || [ "$THREAD_COUNT" -lt 1 ] || [ "$THREAD_COUNT" -gt "$TOTAL_CORES" ]; then - echo "โŒ Error: Invalid thread count: $THREAD_COUNT" - echo "Thread count must be between 1 and $TOTAL_CORES" - exit 1 -fi - -echo "=== RinCoin Solo Mining (Built-in Core Mining) ===" -echo "CPU Cores Available: $TOTAL_CORES" -echo "Threads to Use: $THREAD_COUNT" -echo "Target Address: $RIN_ADDRESS" -echo "" -echo "" - -# Configuration -RPC_HOST="127.0.0.1" -RPC_PORT="9556" -RPC_USER="rinrpc" -RPC_PASS="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" - -# Function to call RPC -call_rpc() { - local method="$1" - local params="$2" - - curl -s --user "$RPC_USER:$RPC_PASS" \ - -H 'content-type: text/plain' \ - --data "{\"jsonrpc\":\"1.0\",\"id\":\"curl\",\"method\":\"$method\",\"params\":$params}" \ - "http://$RPC_HOST:$RPC_PORT/" -} - -# Wait for node to be ready -echo "Waiting for RinCoin node to be ready..." -while true; do - response=$(call_rpc "getblockchaininfo" "[]") - if [[ $response != *"Loading block index"* ]]; then - break - fi - echo "Node still loading... waiting 10 seconds" - sleep 10 -done - -echo "โœ… Node is ready!" -echo "" - -# Load wallet if not already loaded -echo "Loading wallet..." -wallet_response=$(call_rpc "loadwallet" "[\"main\"]") -if [[ $wallet_response == *"error"* ]] && [[ $wallet_response == *"already loaded"* ]]; then - echo "โœ… Wallet already loaded" -else - echo "โœ… Wallet loaded successfully" -fi -echo "" - -# Validate the provided address (basic check) -if [[ ! "$RIN_ADDRESS" =~ ^rin1[a-zA-Z0-9]{25,}$ ]]; then - echo "โŒ Error: Invalid RinCoin address format: $RIN_ADDRESS" - echo "RinCoin addresses should start with 'rin1' and be ~30 characters long" - exit 1 -fi - -echo "โœ… Using RinCoin Address: $RIN_ADDRESS" -echo "" - -# Get blockchain info -echo "Blockchain Status:" -blockchain_info=$(call_rpc "getblockchaininfo" "[]") -blocks=$(echo "$blockchain_info" | grep -o '"blocks":[^,]*' | cut -d':' -f2) -headers=$(echo "$blockchain_info" | grep -o '"headers":[^,]*' | cut -d':' -f2) -difficulty=$(echo "$blockchain_info" | grep -o '"difficulty":[^,]*' | cut -d':' -f2) - -echo "Blocks: $blocks" -echo "Headers: $headers" -echo "Difficulty: $difficulty" -echo "" - -echo "โš ๏ธ IMPORTANT: Built-in Core Mining Limitations:" -echo "1. Uses CPU only (not GPU)" -echo "2. Very low hashpower compared to specialized miners" -echo "3. Extremely low chance of finding blocks solo" -echo "4. Best for testing, not profitable mining" -echo "5. Thread count affects mining attempts per cycle" -echo "" - -echo "๐Ÿš€ Starting Built-in Solo Mining..." -echo "Target Address: $RIN_ADDRESS" -echo "Threads: $THREAD_COUNT" -echo "Press Ctrl+C to stop mining" -echo "" - -# Start built-in mining with specified thread count -# Note: RinCoin Core's generatetoaddress doesn't directly support thread count -# but we can run multiple instances or adjust the maxtries parameter -while true; do - echo "Attempting to mine 1 block with $THREAD_COUNT threads..." - - # Adjust maxtries based on thread count for better distribution - adjusted_tries=$((1000000 * THREAD_COUNT / TOTAL_CORES)) - - mining_result=$(call_rpc "generatetoaddress" "[1, \"$RIN_ADDRESS\", $adjusted_tries]") - - if [[ $mining_result == *"result"* ]] && [[ $mining_result != *"[]"* ]]; then - echo "๐ŸŽ‰ BLOCK FOUND!" - echo "Result: $mining_result" - break - else - echo "No block found in this attempt (tries: $adjusted_tries). Retrying..." - sleep 5 - fi -done diff --git a/MINE/rin/solo_mining_remote.sh b/MINE/rin/solo_mining_remote.sh deleted file mode 100644 index 6b1ef9a..0000000 --- a/MINE/rin/solo_mining_remote.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash - -# Remote Solo Mining Script for RinCoin -# Connects to RinCoin node over network/RPC - -# Configuration -RPC_HOST="127.0.0.1" # Change to your server IP for remote access -RPC_PORT="9556" -RPC_USER="rinrpc" -RPC_PASS="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" - -echo "=== Remote RinCoin Solo Mining Setup ===" -echo "RPC Host: $RPC_HOST:$RPC_PORT" -echo "" - -# Test RPC connection -echo "Testing RPC connection..." -RPC_RESPONSE=$(curl -s --user "$RPC_USER:$RPC_PASS" \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"getblockchaininfo","params":[]}' \ - "http://$RPC_HOST:$RPC_PORT/") - -if [[ $RPC_RESPONSE == *"error"* ]]; then - echo "โŒ Error: Could not connect to RinCoin RPC!" - echo "Response: $RPC_RESPONSE" - echo "" - echo "Check:" - echo "1. RinCoin node is running" - echo "2. RPC port $RPC_PORT is accessible" - echo "3. Firewall allows connections to port $RPC_PORT" - exit 1 -fi - -echo "โœ… RPC connection successful!" -echo "" - -# Get wallet address via RPC -echo "Getting wallet address..." -WALLET_RESPONSE=$(curl -s --user "$RPC_USER:$RPC_PASS" \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"getnewaddress","params":[]}' \ - "http://$RPC_HOST:$RPC_PORT/") - -RIN_ADDRESS=$(echo "$WALLET_RESPONSE" | grep -o '"result":"[^"]*"' | cut -d'"' -f4) - -if [ -z "$RIN_ADDRESS" ]; then - echo "โŒ Error: Could not get RinCoin address!" - echo "Response: $WALLET_RESPONSE" - echo "" - echo "Make sure wallet 'main' exists:" - echo "curl --user $RPC_USER:$RPC_PASS -H 'content-type: text/plain' --data '{\"jsonrpc\":\"1.0\",\"id\":\"curl\",\"method\":\"createwallet\",\"params\":[\"main\"]}' http://$RPC_HOST:$RPC_PORT/" - exit 1 -fi - -echo "โœ… RinCoin Address: $RIN_ADDRESS" -echo "" - -# Check node sync status -SYNC_RESPONSE=$(curl -s --user "$RPC_USER:$RPC_PASS" \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"getblockchaininfo","params":[]}' \ - "http://$RPC_HOST:$RPC_PORT/") - -SYNC_STATUS=$(echo "$SYNC_RESPONSE" | grep -o '"initialblockdownload":[^,]*' | cut -d':' -f2 | tr -d ' ') - -if [ "$SYNC_STATUS" = "true" ]; then - echo "โš ๏ธ WARNING: Node is still syncing (initialblockdownload: true)" - echo "Solo mining may not work properly until sync is complete." - echo "" -fi - -echo "Starting remote solo mining with cpuminer-opt-rin..." -echo "Algorithm: rinhash" -echo "Target: RinCoin node at $RPC_HOST:9555" -echo "Wallet: $RIN_ADDRESS" -echo "" -echo "Press Ctrl+C to stop mining" -echo "" - -# Start solo mining (connect to P2P port, not RPC) -sudo docker exec -it amd-strix-halo-llama-rocm bash -c "/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://$RPC_HOST:9555 -u $RIN_ADDRESS -p x -t 32" diff --git a/MINE/rin/solo_mining_rpc.sh b/MINE/rin/solo_mining_rpc.sh deleted file mode 100644 index 7f44f5d..0000000 --- a/MINE/rin/solo_mining_rpc.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash - -# RinCoin Solo Mining via RPC -# This script uses RinCoin's RPC interface for solo mining - -echo "=== RinCoin Solo Mining via RPC ===" -echo "" - -# Configuration -RPC_HOST="127.0.0.1" -RPC_PORT="9556" -RPC_USER="rinrpc" -RPC_PASS="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" - -# Function to call RPC -call_rpc() { - local method="$1" - local params="$2" - - curl -s --user "$RPC_USER:$RPC_PASS" \ - -H 'content-type: text/plain' \ - --data "{\"jsonrpc\":\"1.0\",\"id\":\"curl\",\"method\":\"$method\",\"params\":$params}" \ - "http://$RPC_HOST:$RPC_PORT/" -} - -# Wait for node to be ready -echo "Waiting for RinCoin node to be ready..." -while true; do - response=$(call_rpc "getblockchaininfo" "[]") - if [[ $response != *"Loading block index"* ]]; then - break - fi - echo "Node still loading... waiting 10 seconds" - sleep 10 -done - -echo "โœ… Node is ready!" -echo "" - -# Get wallet address -echo "Getting wallet address..." -wallet_response=$(call_rpc "getnewaddress" "[]") -rin_address=$(echo "$wallet_response" | grep -o '"result":"[^"]*"' | cut -d'"' -f4) - -if [ -z "$rin_address" ]; then - echo "โŒ Error: Could not get RinCoin address!" - echo "Response: $wallet_response" - exit 1 -fi - -echo "โœ… RinCoin Address: $rin_address" -echo "" - -# Get blockchain info -echo "Blockchain Status:" -blockchain_info=$(call_rpc "getblockchaininfo" "[]") -blocks=$(echo "$blockchain_info" | grep -o '"blocks":[^,]*' | cut -d':' -f2) -headers=$(echo "$blockchain_info" | grep -o '"headers":[^,]*' | cut -d':' -f2) -difficulty=$(echo "$blockchain_info" | grep -o '"difficulty":[^,]*' | cut -d':' -f2) - -echo "Blocks: $blocks" -echo "Headers: $headers" -echo "Difficulty: $difficulty" -echo "" - -echo "โš ๏ธ IMPORTANT: RinCoin solo mining requires:" -echo "1. A fully synced node (currently at block $blocks of $headers)" -echo "2. Mining software that supports RinCoin's RPC mining protocol" -echo "3. Very high hashpower to find blocks solo" -echo "" -echo "For now, we recommend pool mining for consistent rewards:" -echo "" -echo "Pool Mining Command:" -echo "sudo docker exec -it amd-strix-halo-llama-rocm bash -c \"/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://rinhash.mine.zergpool.com:7148 -u bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j -p c=BTC,mc=RIN,ID=StrixHalo -t 32\"" -echo "" -echo "Your RinCoin address for solo mining: $rin_address" diff --git a/MINE/rin/start_mining_pool.sh b/MINE/rin/start_mining_pool.sh deleted file mode 100644 index 9f95eb8..0000000 --- a/MINE/rin/start_mining_pool.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash - -# RinCoin Mining Pool Server Startup Script -# Distributes block rewards among multiple miners - -echo "=== RinCoin Mining Pool Server ===" -echo "" - -# Check if RinCoin node is running -echo "Checking RinCoin node status..." -if ! curl -s -u rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"getblockchaininfo","params":[]}' \ - http://127.0.0.1:9556/ > /dev/null; then - echo "โŒ RinCoin node is not running!" - echo "Start it first with: docker start rincoin-node" - exit 1 -fi - -echo "โœ… RinCoin node is running" - -# Check Python dependencies -echo "Checking Python dependencies..." -python3 -c "import requests, sqlite3" 2>/dev/null || { - echo "Installing python3-requests..." - sudo apt-get update && sudo apt-get install -y python3-requests -} - -echo "โœ… Python dependencies ready" - -# Check if port 3333 is already in use -if netstat -tln | grep -q ":3333 "; then - echo "" - echo "โš ๏ธ Port 3333 is already in use!" - echo "" - echo "๐Ÿ” Process using port 3333:" - sudo netstat -tlnp | grep ":3333 " || echo "Could not determine process" - echo "" - echo "๐Ÿ›‘ To kill existing process:" - echo "sudo lsof -ti:3333 | xargs sudo kill -9" - echo "" - read -p "Kill existing process and continue? (y/N): " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "Killing processes using port 3333..." - sudo lsof -ti:3333 | xargs sudo kill -9 2>/dev/null || echo "No processes to kill" - sleep 2 - else - echo "Exiting..." - exit 1 - fi -fi - -echo "" -echo "๐Ÿš€ Starting Mining Pool Server..." -echo "This will distribute block rewards among multiple miners" -echo "" -echo "Pool Features:" -echo "- Multiple miner support" -echo "- Share-based reward distribution" -echo "- Pool fee: 1%" -echo "- Real-time statistics" -echo "- Web dashboard on port 8083" -echo "" - -echo "After it starts, miners can connect with:" -echo "" -echo "Option 1: Address as username" -echo "./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q -p x" -echo "" -echo "Option 2: Address.workername format" -echo "./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker1 -p x" -echo "" -echo "Option 3: Traditional username (rewards to pool address)" -echo "./cpuminer -a rinhash -o stratum+tcp://YOUR_IP:3333 -u username.workername -p x" -echo "" -echo "๐ŸŒ Web Dashboard: http://YOUR_IP:8083" -echo "๐Ÿ“Š View real-time pool statistics, miners, and blocks" -echo "" -echo "Press Ctrl+C to stop the pool" - -# Start the mining pool -python3 MINE/rin/stratum_pool.py diff --git a/MINE/rin/start_mining_with_address.sh b/MINE/rin/start_mining_with_address.sh deleted file mode 100644 index 5b135ad..0000000 --- a/MINE/rin/start_mining_with_address.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/bash - -# Start RinCoin Solo Mining with Custom Address -# Usage: ./start_mining_with_address.sh [rincoin_address] [threads] - -# Default values -DEFAULT_ADDRESS="rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q" -DEFAULT_THREADS="28" - -# Parse arguments -RINCOIN_ADDRESS="${1:-$DEFAULT_ADDRESS}" -THREADS="${2:-$DEFAULT_THREADS}" - -echo "=== RinCoin Solo Mining Setup ===" -echo "RinCoin Address: $RINCOIN_ADDRESS" -echo "Threads: $THREADS" -echo "" - -# Validate RinCoin address format -if [[ ! "$RINCOIN_ADDRESS" =~ ^rin1[a-zA-Z0-9]{25,}$ ]]; then - echo "โŒ Error: Invalid RinCoin address format: $RINCOIN_ADDRESS" - echo "RinCoin addresses should start with 'rin1' and be ~30 characters long" - exit 1 -fi - -# Check if RinCoin node is running -if ! sudo docker ps | grep -q "rincoin-node"; then - echo "โŒ Error: rincoin-node container is not running!" - echo "Please start it first: sudo docker start rincoin-node" - exit 1 -fi - -echo "โœ… RinCoin node is running" - -# Check dependencies -if ! command -v python3 &> /dev/null; then - echo "โŒ Error: python3 is not installed!" - exit 1 -fi - -python3 -c "import requests" 2>/dev/null || { - echo "Installing python3-requests..." - sudo apt-get update && sudo apt-get install -y python3-requests -} - -echo "โœ… Dependencies ready" -echo "" - -# Create temporary proxy script with custom address -TEMP_PROXY="/tmp/rincoin_proxy_${RANDOM}.py" -sed "s/target_address='[^']*'/target_address='$RINCOIN_ADDRESS'/" MINE/rin/stratum_proxy.py > "$TEMP_PROXY" - -echo "๐Ÿš€ Starting Stratum Proxy with address: $RINCOIN_ADDRESS" -echo "" - -# Start proxy in background -python3 "$TEMP_PROXY" & -PROXY_PID=$! - -# Wait for proxy to start -sleep 3 - -echo "๐Ÿ“‹ Mining Commands:" -echo "" -echo "1. For Docker container mining:" -echo "sudo docker exec -it amd-strix-halo-llama-rocm bash -c \"/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://172.17.0.1:3333 -u user -p pass -t $THREADS\"" -echo "" -echo "2. For native mining (if cpuminer is installed locally):" -echo "/home/db/Downloads/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user -p pass -t $THREADS" -echo "" -echo "๐Ÿ’ก Tips:" -echo "- Use 172.17.0.1:3333 from Docker containers" -echo "- Use 127.0.0.1:3333 from host system" -echo "- All block rewards will go to: $RINCOIN_ADDRESS" -echo "" -echo "Press Ctrl+C to stop the proxy and mining" - -# Wait for user to stop -trap "echo ''; echo 'Stopping proxy...'; kill $PROXY_PID 2>/dev/null; rm -f '$TEMP_PROXY'; exit 0" INT - -wait $PROXY_PID diff --git a/MINE/rin/start_stratum_proxy.sh b/MINE/rin/start_stratum_proxy.sh deleted file mode 100644 index 36c03d7..0000000 --- a/MINE/rin/start_stratum_proxy.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -# Start RinCoin Stratum Proxy Server -# Bridges cpuminer-opt-rin to RinCoin node - -echo "=== RinCoin Stratum Proxy Server ===" -echo "" - -# Check if RinCoin node is running -if ! sudo docker ps | grep -q "rincoin-node"; then - echo "โŒ Error: rincoin-node container is not running!" - echo "Please start it first:" - echo "sudo docker start rincoin-node" - exit 1 -fi - -echo "โœ… RinCoin node is running" - -# Check if Python3 and requests are available -if ! command -v python3 &> /dev/null; then - echo "โŒ Error: python3 is not installed!" - echo "Please install it: sudo apt-get install python3" - exit 1 -fi - -# Install requests if not available -python3 -c "import requests" 2>/dev/null || { - echo "Installing python3-requests..." - sudo apt-get update && sudo apt-get install -y python3-requests -} - -echo "โœ… Python dependencies ready" - -# Check if port 3333 is already in use -if netstat -tln | grep -q ":3333 "; then - echo "" - echo "โš ๏ธ Port 3333 is already in use!" - echo "" - echo "๐Ÿ” Process using port 3333:" - sudo netstat -tlnp | grep ":3333 " || echo "Could not determine process" - echo "" - echo "๐Ÿ›‘ To kill existing process:" - echo "sudo lsof -ti:3333 | xargs sudo kill -9" - echo "" - read -p "Kill existing process and continue? (y/N): " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - echo "Killing processes using port 3333..." - sudo lsof -ti:3333 | xargs sudo kill -9 2>/dev/null || echo "No processes to kill" - sleep 2 - else - echo "Exiting..." - exit 1 - fi -fi - -echo "" -echo "๐Ÿš€ Starting Stratum Proxy Server..." -echo "This will bridge cpuminer-opt-rin to your RinCoin node" -echo "" -echo "After it starts, connect your miner with:" -echo "sudo docker exec -it amd-strix-halo-llama-rocm bash -c \"/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user -p pass -t 28\"" -echo "" -echo "Press Ctrl+C to stop the proxy" -echo "" - -# Start the proxy -cd "$(dirname "$0")" -python3 stratum_proxy.py diff --git a/MINE/rin/stratum_pool.py b/MINE/rin/stratum_pool.py deleted file mode 100644 index be7dea6..0000000 --- a/MINE/rin/stratum_pool.py +++ /dev/null @@ -1,709 +0,0 @@ -#!/usr/bin/env python3 -""" -RinCoin Mining Pool Server -Distributes block rewards among multiple miners based on share contributions -""" - -import socket -import threading -import json -import time -import requests -import hashlib -import struct -import sqlite3 -from datetime import datetime -from requests.auth import HTTPBasicAuth - -# Import web interface -from pool_web_interface import start_web_interface - -class RinCoinMiningPool: - def __init__(self, stratum_host='0.0.0.0', stratum_port=3333, - rpc_host='127.0.0.1', rpc_port=9556, - rpc_user='rinrpc', rpc_password='745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90', - pool_address='rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q', - pool_fee_percent=1.0): - - self.stratum_host = stratum_host - self.stratum_port = stratum_port - self.rpc_host = rpc_host - self.rpc_port = rpc_port - self.rpc_user = rpc_user - self.rpc_password = rpc_password - self.pool_address = pool_address - self.pool_fee_percent = pool_fee_percent - - # Miner tracking - self.clients = {} # {addr: {'client': socket, 'worker': str, 'user': str, 'shares': 0, 'last_share': time}} - self.job_counter = 0 - self.current_job = None - self.running = True - - # Pool statistics - self.total_shares = 0 - self.total_blocks = 0 - self.pool_hashrate = 0 - - # Database for persistent storage - self.init_database() - - print(f"=== RinCoin Mining Pool Server ===") - print(f"Stratum: {stratum_host}:{stratum_port}") - print(f"RPC: {rpc_host}:{rpc_port}") - print(f"Pool Address: {pool_address}") - print(f"Pool Fee: {pool_fee_percent}%") - - def init_database(self): - """Initialize SQLite database for miner tracking""" - self.db = sqlite3.connect(':memory:', check_same_thread=False) - cursor = self.db.cursor() - - # Create tables - cursor.execute(''' - CREATE TABLE IF NOT EXISTS miners ( - id INTEGER PRIMARY KEY, - user TEXT NOT NULL, - worker TEXT NOT NULL, - address TEXT, - shares INTEGER DEFAULT 0, - last_share TIMESTAMP, - last_hashrate REAL DEFAULT 0, - created TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) - ''') - - cursor.execute(''' - CREATE TABLE IF NOT EXISTS shares ( - id INTEGER PRIMARY KEY, - miner_id INTEGER, - job_id TEXT, - difficulty REAL, - submitted TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (miner_id) REFERENCES miners (id) - ) - ''') - - cursor.execute(''' - CREATE TABLE IF NOT EXISTS blocks ( - id INTEGER PRIMARY KEY, - block_hash TEXT, - height INTEGER, - reward REAL, - pool_fee REAL, - miner_rewards TEXT, -- JSON of {address: amount} - found_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) - ''') - - # Samples for pool hashrate chart - cursor.execute(''' - CREATE TABLE IF NOT EXISTS hashrate_samples ( - id INTEGER PRIMARY KEY, - ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - hashrate REAL - ) - ''') - - self.db.commit() - - def rpc_call(self, method, params=[]): - """Make RPC call to RinCoin node""" - try: - url = f"http://{self.rpc_host}:{self.rpc_port}/" - headers = {'content-type': 'text/plain'} - auth = HTTPBasicAuth(self.rpc_user, self.rpc_password) - - payload = { - "jsonrpc": "1.0", - "id": "mining_pool", - "method": method, - "params": params - } - - response = requests.post(url, json=payload, headers=headers, auth=auth, timeout=10) - - if response.status_code == 200: - result = response.json() - if 'error' in result and result['error'] is not None: - print(f"RPC Error: {result['error']}") - return None - return result.get('result') - else: - print(f"HTTP Error: {response.status_code}") - return None - - except Exception as e: - print(f"RPC Call Error: {e}") - return None - - def get_block_template(self): - """Get new block template from RinCoin node""" - try: - template = self.rpc_call("getblocktemplate", [{"rules": ["segwit", "mweb"]}]) - if template: - self.job_counter += 1 - - job = { - "job_id": f"job_{self.job_counter}", - "template": template, - "prevhash": template.get("previousblockhash", "0" * 64), - "coinb1": "01000000" + "0" * 60, - "coinb2": "ffffffff", - "merkle_branch": [], - "version": f"{template.get('version', 1):08x}", - "nbits": template.get("bits", "1d00ffff"), - "ntime": f"{int(time.time()):08x}", - "clean_jobs": True, - "target": template.get("target", "0000ffff00000000000000000000000000000000000000000000000000000000") - } - - self.current_job = job - print(f"New job created: {job['job_id']} (coinbase value: {template.get('coinbasevalue', 0)} satoshis)") - return job - return None - except Exception as e: - print(f"Get block template error: {e}") - return None - - def validate_rincoin_address(self, address): - """Validate if an address is a valid RinCoin address""" - if not address or not address.startswith('rin'): - return False - - try: - result = self.rpc_call("validateaddress", [address]) - return result and result.get('isvalid', False) - except Exception as e: - print(f"Address validation error: {e}") - return False - - def register_miner(self, user, worker, address=None): - """Register or update miner in database""" - cursor = self.db.cursor() - - # Check if miner exists - cursor.execute('SELECT id, address FROM miners WHERE user = ? AND worker = ?', (user, worker)) - result = cursor.fetchone() - - if result: - miner_id, existing_address = result - if address and not existing_address: - cursor.execute('UPDATE miners SET address = ? WHERE id = ?', (address, miner_id)) - self.db.commit() - return miner_id - else: - # Create new miner - cursor.execute('INSERT INTO miners (user, worker, address) VALUES (?, ?, ?)', (user, worker, address)) - self.db.commit() - return cursor.lastrowid - - def record_share(self, miner_id, job_id, difficulty): - """Record a share submission""" - cursor = self.db.cursor() - - # Record share - cursor.execute('INSERT INTO shares (miner_id, job_id, difficulty) VALUES (?, ?, ?)', - (miner_id, job_id, difficulty)) - - # Update miner stats - cursor.execute('UPDATE miners SET shares = shares + 1, last_share = CURRENT_TIMESTAMP WHERE id = ?', (miner_id,)) - - self.db.commit() - self.total_shares += 1 - - def distribute_block_reward(self, block_hash, block_height, total_reward): - """Distribute block reward among miners based on their shares""" - cursor = self.db.cursor() - - # Calculate pool fee - pool_fee = total_reward * (self.pool_fee_percent / 100.0) - miner_reward = total_reward - pool_fee - - # Get shares from last 24 hours - cursor.execute(''' - SELECT m.address, COUNT(s.id) as share_count, SUM(s.difficulty) as total_difficulty - FROM miners m - JOIN shares s ON m.id = s.miner_id - WHERE s.submitted > datetime('now', '-1 day') - GROUP BY m.id, m.address - HAVING share_count > 0 - ''') - - miners = cursor.fetchall() - - if not miners: - print("No miners with shares in last 24 hours") - return - - # Calculate total difficulty - total_difficulty = sum(row[2] for row in miners) - - # Separate miners with and without addresses - miners_with_addresses = [] - miners_without_addresses = [] - total_difficulty_with_addresses = 0 - total_difficulty_without_addresses = 0 - - for address, share_count, difficulty in miners: - if address: - miners_with_addresses.append((address, share_count, difficulty)) - total_difficulty_with_addresses += difficulty - else: - miners_without_addresses.append((address, share_count, difficulty)) - total_difficulty_without_addresses += difficulty - - # Calculate total difficulty - total_difficulty = total_difficulty_with_addresses + total_difficulty_without_addresses - - if total_difficulty == 0: - print("No valid difficulty found") - return - - # Distribute rewards - miner_rewards = {} - - # First, distribute to miners with valid addresses - if miners_with_addresses: - for address, share_count, difficulty in miners_with_addresses: - reward_share = (difficulty / total_difficulty) * miner_reward - miner_rewards[address] = reward_share - print(f"๐Ÿ’ฐ Miner {address}: {reward_share:.8f} RIN ({difficulty} difficulty)") - - # Calculate undistributed rewards (from miners without addresses) - if miners_without_addresses: - undistributed_reward = 0 - for address, share_count, difficulty in miners_without_addresses: - undistributed_reward += (difficulty / total_difficulty) * miner_reward - print(f"โš ๏ธ Miner without address: {difficulty} difficulty -> {undistributed_reward:.8f} RIN to pool") - - # Keep undistributed rewards for pool (no redistribution) - print(f"๐Ÿ’ฐ Pool keeps {undistributed_reward:.8f} RIN from miners without addresses") - - # Record block - cursor.execute(''' - INSERT INTO blocks (block_hash, height, reward, pool_fee, miner_rewards) - VALUES (?, ?, ?, ?, ?) - ''', (block_hash, block_height, total_reward, pool_fee, json.dumps(miner_rewards))) - - self.db.commit() - self.total_blocks += 1 - - print(f"๐ŸŽ‰ Block {block_height} reward distributed!") - print(f"๐Ÿ’ฐ Pool fee: {pool_fee:.8f} RIN") - print(f"๐Ÿ’ฐ Total distributed: {sum(miner_rewards.values()):.8f} RIN") - - # Summary - if miners_without_addresses: - print(f"๐Ÿ“Š Summary: {len(miners_with_addresses)} miners with addresses, {len(miners_without_addresses)} without (rewards to pool)") - - def send_stratum_response(self, client, msg_id, result, error=None): - """Send Stratum response to client""" - try: - response = { - "id": msg_id, - "result": result, - "error": error - } - - message = json.dumps(response) + "\n" - client.send(message.encode('utf-8')) - except Exception as e: - print(f"Send response error: {e}") - - def send_stratum_notification(self, client, method, params): - """Send Stratum notification to client""" - try: - notification = { - "id": None, - "method": method, - "params": params - } - - message = json.dumps(notification) + "\n" - client.send(message.encode('utf-8')) - except Exception as e: - print(f"Send notification error: {e}") - - def handle_stratum_message(self, client, addr, message): - """Handle incoming Stratum message from miner""" - try: - data = json.loads(message.strip()) - method = data.get("method") - msg_id = data.get("id") - params = data.get("params", []) - - print(f"[{addr}] {method}: {params}") - - if method == "mining.subscribe": - # Subscribe response - self.send_stratum_response(client, msg_id, [ - [["mining.set_difficulty", "subscription_id"], ["mining.notify", "subscription_id"]], - "extranonce1", - 4 - ]) - - # Send difficulty (lower for CPU mining) - self.send_stratum_notification(client, "mining.set_difficulty", [0.001]) - - # Send initial job - if self.get_block_template(): - job = self.current_job - self.send_stratum_notification(client, "mining.notify", [ - job["job_id"], - job["prevhash"], - job["coinb1"], - job["coinb2"], - job["merkle_branch"], - job["version"], - job["nbits"], - job["ntime"], - job["clean_jobs"] - ]) - - elif method == "mining.extranonce.subscribe": - # Handle extranonce subscription - print(f"[{addr}] Extranonce subscription requested") - self.send_stratum_response(client, msg_id, True) - - elif method == "mining.authorize": - # Parse user.worker format - if len(params) >= 2: - user_worker = params[0] - password = params[1] if len(params) > 1 else "" - - # Extract user and worker - if '.' in user_worker: - user, worker = user_worker.split('.', 1) - else: - user = user_worker - worker = "default" - - # Check if user contains a RinCoin address (starts with 'rin') - miner_address = None - if user.startswith('rin'): - # User is a RinCoin address - if self.validate_rincoin_address(user): - miner_address = user - user = f"miner_{miner_address[:8]}" # Create a user ID from address - print(f"[{addr}] โœ… Miner using valid RinCoin address: {miner_address}") - else: - print(f"[{addr}] โŒ Invalid RinCoin address: {user}") - self.send_stratum_response(client, msg_id, False, "Invalid RinCoin address") - return - elif '.' in user and user.split('.')[0].startswith('rin'): - # Format: rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.workername - address_part, worker_part = user.split('.', 1) - if address_part.startswith('rin'): - if self.validate_rincoin_address(address_part): - miner_address = address_part - user = f"miner_{miner_address[:8]}" - worker = worker_part - print(f"[{addr}] โœ… Miner using valid RinCoin address format: {miner_address}.{worker}") - else: - print(f"[{addr}] โŒ Invalid RinCoin address: {address_part}") - self.send_stratum_response(client, msg_id, False, "Invalid RinCoin address") - return - - # Register miner with address - miner_id = self.register_miner(user, worker, miner_address) - - # Store client info - self.clients[addr] = { - 'client': client, - 'user': user, - 'worker': worker, - 'miner_id': miner_id, - 'address': miner_address, - 'shares': 0, - 'last_share': time.time() - } - - if miner_address: - print(f"[{addr}] โœ… Authorized: {user}.{worker} -> {miner_address}") - else: - print(f"[{addr}] โš ๏ธ Authorized: {user}.{worker} (rewards will go to pool address)") - self.send_stratum_response(client, msg_id, True) - else: - self.send_stratum_response(client, msg_id, False, "Invalid authorization") - - elif method == "mining.submit": - # Submit share - if addr not in self.clients: - self.send_stratum_response(client, msg_id, False, "Not authorized") - return - - miner_info = self.clients[addr] - - try: - if self.current_job and len(params) >= 5: - job_id = params[0] - extranonce2 = params[1] - ntime = params[2] - nonce = params[3] - - # Calculate actual difficulty from the share submission - # The miner reports its hashrate, so we need to calculate - # the difficulty that would match that hashrate - # For a miner reporting ~381 kH/s, we need to calculate - # the difficulty that would result in that hashrate - # H = D * 2^32 / dt - # D = H * dt / 2^32 - # If miner reports 381 kH/s and submits every ~15 seconds: - # D = 381000 * 15 / 2^32 โ‰ˆ 0.00133 - actual_difficulty = 0.00133 # Calculated to match ~381 kH/s - - # Record share with calculated difficulty - self.record_share(miner_info['miner_id'], job_id, actual_difficulty) - - # Calculate instantaneous hashrate based on time between shares - now_ts = time.time() - prev_ts = miner_info.get('last_share') or now_ts - dt = max(now_ts - prev_ts, 1e-3) # Minimum 1ms to avoid division by zero - - # H = D * 2^32 / dt - miner_hashrate = actual_difficulty * (2**32) / dt - - # If this is the first share, estimate based on reported hashrate - if miner_info['shares'] == 0: - miner_hashrate = 381000 # ~381 kH/s as reported by miner - miner_info['shares'] += 1 - miner_info['last_share'] = now_ts - - # Persist miner last_hashrate - try: - cursor = self.db.cursor() - cursor.execute('UPDATE miners SET last_share = CURRENT_TIMESTAMP, last_hashrate = ? WHERE id = ?', (miner_hashrate, miner_info['miner_id'])) - self.db.commit() - except Exception as e: - print(f"DB update last_hashrate error: {e}") - - # Update pool hashrate as sum of current miners' last rates - try: - cursor = self.db.cursor() - cursor.execute('SELECT COALESCE(SUM(last_hashrate), 0) FROM miners') - total_rate = cursor.fetchone()[0] or 0.0 - self.pool_hashrate = total_rate - except Exception as e: - print(f"Pool hashrate sum error: {e}") - - print(f"[{addr}] โœ… Share accepted from {miner_info['user']}.{miner_info['worker']} (Total: {miner_info['shares']})") - - # Send acceptance response - self.send_stratum_response(client, msg_id, True, None) - - # Try to submit block if it's a valid solution - print(f"[{addr}] ๐Ÿ” Attempting to submit block solution...") - - # Use generatetoaddress to submit the mining result - # Always use pool address for block submission (rewards will be distributed later) - result = self.rpc_call("generatetoaddress", [1, self.pool_address, 1]) - - if result and len(result) > 0: - block_hash = result[0] - - # Get block info - block_info = self.rpc_call("getblock", [block_hash]) - if block_info: - block_height = block_info.get('height', 0) - coinbase_tx = block_info.get('tx', [])[0] if block_info.get('tx') else None - - # Get coinbase value (simplified) - total_reward = 50.0 # Default block reward - - print(f"๐ŸŽ‰ [{addr}] BLOCK FOUND! Hash: {block_hash}") - print(f"๐Ÿ’ฐ Block reward: {total_reward} RIN") - - # Distribute rewards to miners with valid addresses - self.distribute_block_reward(block_hash, block_height, total_reward) - - self.send_stratum_response(client, msg_id, True) - else: - # Accept as share even if not a block - self.send_stratum_response(client, msg_id, True) - else: - print(f"[{addr}] Invalid share parameters") - self.send_stratum_response(client, msg_id, False, "Invalid parameters") - - except Exception as e: - print(f"[{addr}] Block submission error: {e}") - # Still accept the share for mining statistics - self.send_stratum_response(client, msg_id, True) - - else: - print(f"[{addr}] โš ๏ธ Unknown method: {method}") - # Send null result for unknown methods (standard Stratum behavior) - self.send_stratum_response(client, msg_id, None, None) - - except json.JSONDecodeError: - print(f"[{addr}] Invalid JSON: {message}") - except Exception as e: - print(f"[{addr}] Message handling error: {e}") - - def handle_client(self, client, addr): - """Handle individual client connection""" - print(f"[{addr}] Connected") - - try: - while self.running: - data = client.recv(4096) - if not data: - break - - # Handle multiple messages in one packet - messages = data.decode('utf-8').strip().split('\n') - for message in messages: - if message: - self.handle_stratum_message(client, addr, message) - - except Exception as e: - print(f"[{addr}] Client error: {e}") - finally: - client.close() - if addr in self.clients: - del self.clients[addr] - print(f"[{addr}] Disconnected") - - def job_updater(self): - """Periodically update mining jobs""" - last_job_time = 0 - last_block_height = 0 - - while self.running: - try: - # Check for new blocks every 10 seconds - time.sleep(10) - - # Get current blockchain info - blockchain_info = self.rpc_call("getblockchaininfo") - if blockchain_info: - current_height = blockchain_info.get('blocks', 0) - - # Create new job if: - # 1. New block detected - # 2. 30+ seconds since last job - # 3. No current job exists - should_create_job = ( - current_height != last_block_height or - time.time() - last_job_time > 30 or - not self.current_job - ) - - if should_create_job: - if self.get_block_template(): - job = self.current_job - last_job_time = time.time() - last_block_height = current_height - - print(f"๐Ÿ“ฆ New job created: {job['job_id']} (block {current_height})") - - # Send to all connected clients - for addr, miner_info in list(self.clients.items()): - try: - self.send_stratum_notification(miner_info['client'], "mining.notify", [ - job["job_id"], - job["prevhash"], - job["coinb1"], - job["coinb2"], - job["merkle_branch"], - job["version"], - job["nbits"], - job["ntime"], - job["clean_jobs"] - ]) - except Exception as e: - print(f"Failed to send job to {addr}: {e}") - - except Exception as e: - print(f"Job updater error: {e}") - - def stats_updater(self): - """Periodically update pool statistics""" - while self.running: - try: - time.sleep(60) # Update every minute - cursor = self.db.cursor() - # Pool hashrate is the sum of miners' last hashrates - cursor.execute('SELECT COALESCE(SUM(last_hashrate), 0) FROM miners') - self.pool_hashrate = cursor.fetchone()[0] or 0.0 - # Sample for chart - cursor.execute('INSERT INTO hashrate_samples (hashrate) VALUES (?)', (self.pool_hashrate,)) - self.db.commit() - print(f"๐Ÿ“Š Pool Stats: {len(self.clients)} miners, {self.total_shares} shares, {self.pool_hashrate/1000:.2f} kH/s") - - except Exception as e: - print(f"Stats updater error: {e}") - - def start(self): - """Start the mining pool server""" - try: - # Test RPC connection - blockchain_info = self.rpc_call("getblockchaininfo") - if not blockchain_info: - print("โŒ Failed to connect to RinCoin node!") - return - - print(f"โœ… Connected to RinCoin node (block {blockchain_info.get('blocks', 'unknown')})") - - # Start background threads - job_thread = threading.Thread(target=self.job_updater, daemon=True) - job_thread.start() - - stats_thread = threading.Thread(target=self.stats_updater, daemon=True) - stats_thread.start() - - # Start web interface in background - web_thread = threading.Thread(target=start_web_interface, args=(self.db, '0.0.0.0', 8083), daemon=True) - web_thread.start() - - print(f"๐ŸŒ Web dashboard started on http://0.0.0.0:8083") - - # Start Stratum server - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server_socket.bind((self.stratum_host, self.stratum_port)) - server_socket.listen(10) - - print(f"๐Ÿš€ Mining pool listening on {self.stratum_host}:{self.stratum_port}") - print("Ready for multiple miners...") - print("") - print(f"๐Ÿ’ฐ Pool address: {self.pool_address}") - print(f"๐Ÿ’ฐ Pool fee: {self.pool_fee_percent}%") - print("") - print("Connect miners with:") - print(f"./cpuminer -a rinhash -o stratum+tcp://{self.stratum_host}:{self.stratum_port} -u username.workername -p x") - print("") - - while self.running: - try: - client, addr = server_socket.accept() - client_thread = threading.Thread(target=self.handle_client, args=(client, addr), daemon=True) - client_thread.start() - except KeyboardInterrupt: - print("\n๐Ÿ›‘ Shutting down pool...") - self.running = False - break - except Exception as e: - print(f"Server error: {e}") - - except OSError as e: - if "Address already in use" in str(e): - print(f"โŒ Port {self.stratum_port} is already in use!") - print("") - print("๐Ÿ” Check what's using the port:") - print(f"sudo netstat -tlnp | grep :{self.stratum_port}") - print("") - print("๐Ÿ›‘ Kill existing process:") - print(f"sudo lsof -ti:{self.stratum_port} | xargs sudo kill -9") - print("") - print("๐Ÿ”„ Or use a different port by editing the script") - else: - print(f"Failed to start server: {e}") - except Exception as e: - print(f"Failed to start server: {e}") - finally: - print("Pool server stopped") - -if __name__ == "__main__": - pool = RinCoinMiningPool() - pool.start() diff --git a/MINE/rin/stratum_proxy.py b/MINE/rin/stratum_proxy.py deleted file mode 100644 index d780f32..0000000 --- a/MINE/rin/stratum_proxy.py +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env python3 -""" -RinCoin Stratum Proxy Server -Bridges cpuminer-opt-rin (Stratum protocol) to RinCoin node (RPC protocol) -""" - -import socket -import threading -import json -import time -import requests -import hashlib -import struct -from requests.auth import HTTPBasicAuth - -class RinCoinStratumProxy: - def __init__(self, stratum_host='0.0.0.0', stratum_port=3333, - rpc_host='127.0.0.1', rpc_port=9556, - rpc_user='rinrpc', rpc_password='745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90', - target_address='rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q'): - - self.stratum_host = stratum_host - self.stratum_port = stratum_port - self.rpc_host = rpc_host - self.rpc_port = rpc_port - self.rpc_user = rpc_user - self.rpc_password = rpc_password - self.target_address = target_address - - self.clients = {} - self.job_counter = 0 - self.current_job = None - self.running = True - - print(f"RinCoin Stratum Proxy Server") - print(f"Stratum: {stratum_host}:{stratum_port}") - print(f"RPC: {rpc_host}:{rpc_port}") - print(f"Target: {target_address}") - - def rpc_call(self, method, params=[]): - """Make RPC call to RinCoin node""" - try: - url = f"http://{self.rpc_host}:{self.rpc_port}/" - headers = {'content-type': 'text/plain'} - auth = HTTPBasicAuth(self.rpc_user, self.rpc_password) - - payload = { - "jsonrpc": "1.0", - "id": "stratum_proxy", - "method": method, - "params": params - } - - response = requests.post(url, json=payload, headers=headers, auth=auth, timeout=10) - - if response.status_code == 200: - result = response.json() - if 'error' in result and result['error'] is not None: - print(f"RPC Error: {result['error']}") - return None - return result.get('result') - else: - print(f"HTTP Error: {response.status_code}") - return None - - except Exception as e: - print(f"RPC Call Error: {e}") - return None - - def get_block_template(self): - """Get new block template from RinCoin node""" - try: - template = self.rpc_call("getblocktemplate", [{"rules": ["segwit", "mweb"]}]) - if template: - self.job_counter += 1 - - # Store the full template for later block construction - job = { - "job_id": f"job_{self.job_counter}", - "template": template, # Store full template - "prevhash": template.get("previousblockhash", "0" * 64), - "coinb1": "01000000" + "0" * 60, # Simplified coinbase (will be properly constructed on submission) - "coinb2": "ffffffff", - "merkle_branch": [], - "version": f"{template.get('version', 1):08x}", - "nbits": template.get("bits", "1d00ffff"), - "ntime": f"{int(time.time()):08x}", - "clean_jobs": True, - "target": template.get("target", "0000ffff00000000000000000000000000000000000000000000000000000000") - } - - self.current_job = job - print(f"New job created: {job['job_id']} (coinbase value: {template.get('coinbasevalue', 0)} satoshis)") - return job - return None - except Exception as e: - print(f"Get block template error: {e}") - return None - - def send_stratum_response(self, client, msg_id, result, error=None): - """Send Stratum response to client""" - try: - response = { - "id": msg_id, - "result": result, - "error": error - } - - message = json.dumps(response) + "\n" - client.send(message.encode('utf-8')) - except Exception as e: - print(f"Send response error: {e}") - - def send_stratum_notification(self, client, method, params): - """Send Stratum notification to client""" - try: - notification = { - "id": None, - "method": method, - "params": params - } - - message = json.dumps(notification) + "\n" - client.send(message.encode('utf-8')) - except Exception as e: - print(f"Send notification error: {e}") - - def handle_stratum_message(self, client, addr, message): - """Handle incoming Stratum message from miner""" - try: - data = json.loads(message.strip()) - method = data.get("method") - msg_id = data.get("id") - params = data.get("params", []) - - print(f"[{addr}] {method}: {params}") - - if method == "mining.subscribe": - # Subscribe response - self.send_stratum_response(client, msg_id, [ - [["mining.set_difficulty", "subscription_id"], ["mining.notify", "subscription_id"]], - "extranonce1", - 4 - ]) - - # Send difficulty - self.send_stratum_notification(client, "mining.set_difficulty", [1]) - - # Send initial job - if self.get_block_template(): - job = self.current_job - self.send_stratum_notification(client, "mining.notify", [ - job["job_id"], - job["prevhash"], - job["coinb1"], - job["coinb2"], - job["merkle_branch"], - job["version"], - job["nbits"], - job["ntime"], - job["clean_jobs"] - ]) - - elif method == "mining.authorize": - # Authorization - self.send_stratum_response(client, msg_id, True) - print(f"[{addr}] Authorized") - - elif method == "mining.submit": - # Submit share - print(f"[{addr}] Share submitted: {params}") - - # Try to submit block if it's a valid solution - try: - if self.current_job and len(params) >= 5: - job_id = params[0] - extranonce2 = params[1] - ntime = params[2] - nonce = params[3] - - print(f"[{addr}] Attempting to submit block solution...") - print(f" Job: {job_id}, Nonce: {nonce}, Time: {ntime}") - - # Use generatetoaddress to submit the mining result - # This is a simplified approach - the real block construction would be more complex - result = self.rpc_call("generatetoaddress", [1, self.target_address, 1]) - - if result and len(result) > 0: - block_hash = result[0] - print(f"๐ŸŽ‰ [{addr}] BLOCK FOUND! Hash: {block_hash}") - print(f"๐Ÿ’ฐ Block reward sent to: {self.target_address}") - self.send_stratum_response(client, msg_id, True) - else: - # Accept as share even if not a block - print(f"[{addr}] Share accepted (not a block)") - self.send_stratum_response(client, msg_id, True) - else: - print(f"[{addr}] Invalid share parameters") - self.send_stratum_response(client, msg_id, False, "Invalid parameters") - - except Exception as e: - print(f"[{addr}] Block submission error: {e}") - # Still accept the share for mining statistics - self.send_stratum_response(client, msg_id, True) - - else: - print(f"[{addr}] Unknown method: {method}") - self.send_stratum_response(client, msg_id, None, "Unknown method") - - except json.JSONDecodeError: - print(f"[{addr}] Invalid JSON: {message}") - except Exception as e: - print(f"[{addr}] Message handling error: {e}") - - def handle_client(self, client, addr): - """Handle individual client connection""" - print(f"[{addr}] Connected") - self.clients[addr] = client - - try: - while self.running: - data = client.recv(4096) - if not data: - break - - # Handle multiple messages in one packet - messages = data.decode('utf-8').strip().split('\n') - for message in messages: - if message: - self.handle_stratum_message(client, addr, message) - - except Exception as e: - print(f"[{addr}] Client error: {e}") - finally: - client.close() - if addr in self.clients: - del self.clients[addr] - print(f"[{addr}] Disconnected") - - def job_updater(self): - """Periodically update mining jobs""" - while self.running: - try: - # Update job every 30 seconds - time.sleep(30) - - if self.get_block_template(): - job = self.current_job - print(f"Broadcasting new job: {job['job_id']}") - - # Send to all connected clients - for addr, client in list(self.clients.items()): - try: - self.send_stratum_notification(client, "mining.notify", [ - job["job_id"], - job["prevhash"], - job["coinb1"], - job["coinb2"], - job["merkle_branch"], - job["version"], - job["nbits"], - job["ntime"], - job["clean_jobs"] - ]) - except Exception as e: - print(f"Failed to send job to {addr}: {e}") - - except Exception as e: - print(f"Job updater error: {e}") - - def start(self): - """Start the Stratum proxy server""" - try: - # Test RPC connection - blockchain_info = self.rpc_call("getblockchaininfo") - if not blockchain_info: - print("โŒ Failed to connect to RinCoin node!") - return - - print(f"โœ… Connected to RinCoin node (block {blockchain_info.get('blocks', 'unknown')})") - - # Start job updater thread - job_thread = threading.Thread(target=self.job_updater, daemon=True) - job_thread.start() - - # Start Stratum server - server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server_socket.bind((self.stratum_host, self.stratum_port)) - server_socket.listen(10) - - print(f"๐Ÿš€ Stratum proxy listening on {self.stratum_host}:{self.stratum_port}") - print("Ready for cpuminer-opt-rin connections...") - print("") - print(f"๐Ÿ’ฐ Block rewards will be sent to: {self.target_address}") - print("") - print("Connect your miner with:") - print(f"./cpuminer -a rinhash -o stratum+tcp://{self.stratum_host}:{self.stratum_port} -u user -p pass -t 28") - print("") - - while self.running: - try: - client, addr = server_socket.accept() - client_thread = threading.Thread( - target=self.handle_client, - args=(client, addr), - daemon=True - ) - client_thread.start() - except KeyboardInterrupt: - print("\nShutting down...") - self.running = False - break - except Exception as e: - print(f"Server error: {e}") - - except OSError as e: - if "Address already in use" in str(e): - print(f"โŒ Port {self.stratum_port} is already in use!") - print("") - print("๐Ÿ” Check what's using the port:") - print(f"sudo netstat -tlnp | grep :{self.stratum_port}") - print("") - print("๐Ÿ›‘ Kill existing process:") - print(f"sudo lsof -ti:{self.stratum_port} | xargs sudo kill -9") - print("") - print("๐Ÿ”„ Or use a different port by editing the script") - else: - print(f"Failed to start server: {e}") - except Exception as e: - print(f"Failed to start server: {e}") - finally: - print("Server stopped") - -if __name__ == "__main__": - proxy = RinCoinStratumProxy() - proxy.start() diff --git a/MINE/rin/stratum_proxy_explanation.sh b/MINE/rin/stratum_proxy_explanation.sh deleted file mode 100644 index 3f9ec4c..0000000 --- a/MINE/rin/stratum_proxy_explanation.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash - -# RinCoin Stratum Proxy for cpuminer-opt-rin -# Bridges cpuminer's Stratum protocol to RinCoin's RPC mining - -echo "=== RinCoin Stratum Proxy ===" -echo "This script creates a bridge between cpuminer and RinCoin node" -echo "" - -# Configuration -RPC_HOST="127.0.0.1" -RPC_PORT="9556" -RPC_USER="rinrpc" -RPC_PASS="745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90" -STRATUM_PORT="3333" -TARGET_ADDRESS="rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q" - -# Function to call RPC -call_rpc() { - local method="$1" - local params="$2" - - curl -s --user "$RPC_USER:$RPC_PASS" \ - -H 'content-type: text/plain' \ - --data "{\"jsonrpc\":\"1.0\",\"id\":\"curl\",\"method\":\"$method\",\"params\":$params}" \ - "http://$RPC_HOST:$RPC_PORT/" -} - -echo "โš ๏ธ IMPORTANT: This is a simplified proxy demonstration." -echo "For production use, you would need a full Stratum server implementation." -echo "" - -echo "Current RinCoin mining options:" -echo "1. Built-in Core Mining (Recommended for solo):" -echo " bash MINE/rin/solo_mining_core.sh -t 28" -echo "" -echo "2. Pool Mining (Recommended for consistent rewards):" -echo " sudo docker exec -it amd-strix-halo-llama-rocm bash -c \"/mnt/dl/rinhash/cpuminer-opt-rin/cpuminer -a rinhash -o stratum+tcp://rinhash.mine.zergpool.com:7148 -u bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j -p c=BTC,mc=RIN,ID=StrixHalo -t 28\"" -echo "" -echo "3. Direct RPC Mining (Advanced - requires custom miner):" -echo " Use getblocktemplate RPC calls directly" -echo "" - -echo "โŒ cpuminer-opt-rin cannot directly mine to RinCoin node because:" -echo " - cpuminer uses Stratum protocol" -echo " - RinCoin node uses RPC protocol" -echo " - No built-in protocol conversion" -echo "" - -echo "โœ… Recommended approach:" -echo " Use the built-in core mining script for solo mining" -echo " Use pool mining for consistent rewards" diff --git a/MINE/rin/test_address_validation.sh b/MINE/rin/test_address_validation.sh deleted file mode 100644 index 34ebd9c..0000000 --- a/MINE/rin/test_address_validation.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash - -# Test RinCoin Address Validation and Behavior - -echo "=== RinCoin Address Validation Test ===" -echo "" - -# Kill any existing processes -./MINE/rin/kill_stratum_proxy.sh - -echo "๐Ÿงช Testing different address types with RinCoin node:" -echo "" - -echo "1๏ธโƒฃ Valid RinCoin address:" -curl -s -u rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"validateaddress","params":["rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q"]}' \ - http://127.0.0.1:9556/ | jq '.result' - -echo "" -echo "2๏ธโƒฃ Invalid BTC address:" -curl -s -u rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"validateaddress","params":["bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j"]}' \ - http://127.0.0.1:9556/ | jq '.result' - -echo "" -echo "3๏ธโƒฃ Invalid Litecoin address:" -curl -s -u rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"validateaddress","params":["LQnYyekHhQ7nMUTGJ1ZnYz8s9QJ2mKLM9P"]}' \ - http://127.0.0.1:9556/ | jq '.result' - -echo "" -echo "4๏ธโƒฃ Test generatetoaddress with invalid address:" -curl -s -u rinrpc:745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90 \ - -H 'content-type: text/plain' \ - --data '{"jsonrpc":"1.0","id":"curl","method":"generatetoaddress","params":[1, "bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j", 1]}' \ - http://127.0.0.1:9556/ | jq '.error' - -echo "" -echo "๐Ÿš€ Starting mining pool to test address validation..." -./MINE/rin/start_mining_pool.sh & -POOL_PID=$! - -echo "" -echo "โณ Waiting for pool to start..." -sleep 5 - -echo "" -echo "๐Ÿงช Testing pool with different address types:" -echo "" - -echo "Test 1: Valid RinCoin address" -echo "Expected: โœ… Accept connection" -timeout 5s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q -p x -t 1 - -echo "" -echo "Test 2: Invalid BTC address" -echo "Expected: โŒ Reject connection" -timeout 5s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j -p x -t 1 - -echo "" -echo "Test 3: Traditional username (no address)" -echo "Expected: โš ๏ธ Accept but warn no address" -timeout 5s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user.worker -p x -t 1 - -echo "" -echo "๐Ÿงน Cleaning up..." -kill $POOL_PID 2>/dev/null -./MINE/rin/kill_stratum_proxy.sh - -echo "" -echo "๐Ÿ“‹ Summary:" -echo "โœ… Valid RinCoin addresses (rin1q...) - Accepted" -echo "โŒ Invalid addresses (bc1q..., LQnY...) - Rejected" -echo "โš ๏ธ Traditional usernames - Accepted but no rewards" -echo "๐Ÿ’ฐ Block rewards always go to pool address, then distributed" diff --git a/MINE/rin/test_pool_connections.sh b/MINE/rin/test_pool_connections.sh deleted file mode 100644 index 8d22208..0000000 --- a/MINE/rin/test_pool_connections.sh +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -# Test different mining pool connection methods - -echo "=== Testing Mining Pool Connection Methods ===" -echo "" - -# Kill any existing processes -./MINE/rin/kill_stratum_proxy.sh - -echo "๐Ÿš€ Starting mining pool..." -./MINE/rin/start_mining_pool.sh & -POOL_PID=$! - -echo "" -echo "โณ Waiting for pool to start..." -sleep 5 - -echo "" -echo "๐Ÿงช Testing different connection methods:" -echo "" - -echo "1๏ธโƒฃ Test 1: Address as username" -echo "Command: ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q -p x -t 2" -echo "Expected: Pool should recognize this as a RinCoin address" -echo "" - -echo "2๏ธโƒฃ Test 2: Address.workername format" -echo "Command: ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker1 -p x -t 2" -echo "Expected: Pool should recognize address and worker separately" -echo "" - -echo "3๏ธโƒฃ Test 3: Traditional username" -echo "Command: ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user.worker -p x -t 2" -echo "Expected: Pool should use default pool address for rewards" -echo "" - -echo "๐Ÿ“Š Pool Status:" -echo "Web Dashboard: http://127.0.0.1:8080" -echo "Pool Address: rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q" -echo "" - -echo "Press Enter to run test 1..." -read - -echo "Running Test 1..." -timeout 10s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q -p x -t 2 - -echo "" -echo "Press Enter to run test 2..." -read - -echo "Running Test 2..." -timeout 10s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker1 -p x -t 2 - -echo "" -echo "Press Enter to run test 3..." -read - -echo "Running Test 3..." -timeout 10s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user.worker -p x -t 2 - -echo "" -echo "๐Ÿงน Cleaning up..." -kill $POOL_PID 2>/dev/null -./MINE/rin/kill_stratum_proxy.sh - -echo "" -echo "โœ… Test complete! Check the pool logs above to see how each connection was handled." diff --git a/MINE/rin/test_reward_redistribution.sh b/MINE/rin/test_reward_redistribution.sh deleted file mode 100644 index e01791f..0000000 --- a/MINE/rin/test_reward_redistribution.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/bash - -# Test Reward Redistribution Logic - -echo "=== Testing Reward Redistribution Logic ===" -echo "" - -# Kill any existing processes -./MINE/rin/kill_stratum_proxy.sh - -echo "๐Ÿงช Testing reward distribution scenarios:" -echo "" - -echo "Scenario 1: All miners have valid addresses" -echo "Expected: Normal distribution" -echo "" - -echo "Scenario 2: Some miners without addresses" -echo "Expected: Redistribution of their rewards to miners with addresses" -echo "" - -echo "Scenario 3: All miners without addresses" -echo "Expected: All rewards go to pool" -echo "" - -echo "๐Ÿš€ Starting mining pool..." -./MINE/rin/start_mining_pool.sh & -POOL_PID=$! - -echo "" -echo "โณ Waiting for pool to start..." -sleep 5 - -echo "" -echo "๐Ÿงช Test 1: Miner with valid address" -echo "Expected: Gets full share of rewards" -timeout 5s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker1 -p x -t 1 - -echo "" -echo "๐Ÿงช Test 2: Miner without address" -echo "Expected: Contributes to difficulty but gets no direct rewards" -timeout 5s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u user.worker2 -p x -t 1 - -echo "" -echo "๐Ÿงช Test 3: Another miner with valid address" -echo "Expected: Gets base reward + redistribution from miner without address" -timeout 5s ./cpuminer -a rinhash -o stratum+tcp://127.0.0.1:3333 -u rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.worker3 -p x -t 1 - -echo "" -echo "๐Ÿ“Š Pool Log Analysis:" -echo "Look for these patterns in the logs above:" -echo "1. '๐Ÿ’ฐ Miner rin1q...: X.XX RIN (difficulty)' - Base rewards" -echo "2. 'โš ๏ธ Miner without address: X difficulty -> X.XX RIN to pool' - Undistributed" -echo "3. '๐Ÿ’ฐ Pool keeps X.XX RIN from miners without addresses' - Pool keeps rewards" -echo "4. '๐Ÿ“Š Summary: X miners with addresses, Y without (rewards to pool)' - Final summary" - -echo "" -echo "๐Ÿงน Cleaning up..." -kill $POOL_PID 2>/dev/null -./MINE/rin/kill_stratum_proxy.sh - -echo "" -echo "๐Ÿ“‹ Reward Distribution Logic Summary:" -echo "" -echo "โœ… Miners with valid RinCoin addresses:" -echo " - Get reward based on their difficulty" -echo " - Rewards sent directly to their addresses" -echo "" -echo "โš ๏ธ Miners without addresses:" -echo " - Contribute to total difficulty" -echo " - Their reward share goes to pool address" -echo " - No direct rewards received" -echo "" -echo "๐Ÿ’ฐ Pool fee: Always 1% of total block reward" -echo "๐Ÿ’ฐ Pool bonus: Additional rewards from miners without addresses" diff --git a/MINE/zergBench.sh b/MINE/zergBench.sh deleted file mode 100644 index 5bd8320..0000000 --- a/MINE/zergBench.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -# Test top Zergpool algorithms - save as test_zergpool.sh - -BTC_WALLET="bc1qjn4m6rmrveuxhk02a5qhe4r6kdcsvvt3vhdn9j" - -echo "=== Testing Top Zergpool Algorithms ===" -echo "Wallet: $BTC_WALLET" -echo "======================================" - -# Top algorithms by profitability -declare -A algos=( - ["rinhash"]="rinhash.mine.zergpool.com:7148 c=RIN" - ["kawpow"]="kawpow.mine.zergpool.com:3638 c=BTC" - ["evrprogpow"]="evrprogpow.mine.zergpool.com:3002 c=BTC" - ["equihash125_4"]="equihash.mine.zergpool.com:2142 c=BTC" - ["karlsenhashv2"]="karlsenhashv2.mine.zergpool.com:3200 c=BTC" -) - -for algo in "${!algos[@]}"; do - echo "" - echo "Testing: $algo" - echo "------------------------" - - # Parse config - read -r server pass <<< "${algos[$algo]}" - - echo "Server: $server" - echo "Testing for 30 seconds..." - - sudo docker exec -it amdopencl timeout 35s bash -c "/mnt/dl/gminer/miner --algo $algo --server $server --user '$BTC_WALLET' --pass '$pass'" - - result=$? - if [ $result -eq 0 ]; then - echo "โœ… $algo: SUCCESS" - elif [ $result -eq 124 ]; then - echo "โฑ๏ธ $algo: TIMEOUT (likely working)" - else - echo "โŒ $algo: FAILED - trying alternative miner..." - - # Try lolMiner for failed algorithms - sudo docker exec -it amdopencl timeout 35s bash -c "/mnt/dl/lolMiner_v1.88_Lin64/lolMiner --algo ${algo^^} --pool $server --user '$BTC_WALLET' --pass '$pass'" 2>/dev/null - - if [ $? -eq 124 ]; then - echo "โฑ๏ธ $algo: WORKS with lolMiner" - else - echo "โŒ $algo: Not supported" - fi - fi - - sleep 3 -done - -echo "" -echo "=== Zergpool Testing Complete ===" \ No newline at end of file