address validations
This commit is contained in:
@@ -18,7 +18,7 @@ from requests.auth import HTTPBasicAuth
|
||||
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='745ce784d5d5d537fc06105a1b935b7657903cfc71a5fb3b90',
|
||||
rpc_user='rinrpc', rpc_password='745ce784d5d537fc06105a1b935b7657903cfc71a5fb3b90',
|
||||
pool_address='rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q',
|
||||
pool_fee_percent=1.0):
|
||||
|
||||
@@ -153,6 +153,18 @@ class RinCoinMiningPool:
|
||||
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()
|
||||
@@ -322,17 +334,27 @@ class RinCoinMiningPool:
|
||||
miner_address = None
|
||||
if user.startswith('rin'):
|
||||
# User is a RinCoin address
|
||||
miner_address = user
|
||||
user = f"miner_{miner_address[:8]}" # Create a user ID from address
|
||||
print(f"[{addr}] Miner using address as username: {miner_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'):
|
||||
miner_address = address_part
|
||||
user = f"miner_{miner_address[:8]}"
|
||||
worker = worker_part
|
||||
print(f"[{addr}] Miner using address format: {miner_address}.{worker}")
|
||||
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)
|
||||
@@ -382,6 +404,7 @@ class RinCoinMiningPool:
|
||||
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:
|
||||
@@ -399,7 +422,7 @@ class RinCoinMiningPool:
|
||||
print(f"🎉 [{addr}] BLOCK FOUND! Hash: {block_hash}")
|
||||
print(f"💰 Block reward: {total_reward} RIN")
|
||||
|
||||
# Distribute rewards
|
||||
# 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)
|
||||
|
78
MINE/rin/test_address_validation.sh
Normal file
78
MINE/rin/test_address_validation.sh
Normal file
@@ -0,0 +1,78 @@
|
||||
#!/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"
|
Reference in New Issue
Block a user