address validations
This commit is contained in:
@@ -18,7 +18,7 @@ from requests.auth import HTTPBasicAuth
|
|||||||
class RinCoinMiningPool:
|
class RinCoinMiningPool:
|
||||||
def __init__(self, stratum_host='0.0.0.0', stratum_port=3333,
|
def __init__(self, stratum_host='0.0.0.0', stratum_port=3333,
|
||||||
rpc_host='127.0.0.1', rpc_port=9556,
|
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_address='rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q',
|
||||||
pool_fee_percent=1.0):
|
pool_fee_percent=1.0):
|
||||||
|
|
||||||
@@ -153,6 +153,18 @@ class RinCoinMiningPool:
|
|||||||
print(f"Get block template error: {e}")
|
print(f"Get block template error: {e}")
|
||||||
return None
|
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):
|
def register_miner(self, user, worker, address=None):
|
||||||
"""Register or update miner in database"""
|
"""Register or update miner in database"""
|
||||||
cursor = self.db.cursor()
|
cursor = self.db.cursor()
|
||||||
@@ -322,17 +334,27 @@ class RinCoinMiningPool:
|
|||||||
miner_address = None
|
miner_address = None
|
||||||
if user.startswith('rin'):
|
if user.startswith('rin'):
|
||||||
# User is a RinCoin address
|
# User is a RinCoin address
|
||||||
miner_address = user
|
if self.validate_rincoin_address(user):
|
||||||
user = f"miner_{miner_address[:8]}" # Create a user ID from address
|
miner_address = user
|
||||||
print(f"[{addr}] Miner using address as username: {miner_address}")
|
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'):
|
elif '.' in user and user.split('.')[0].startswith('rin'):
|
||||||
# Format: rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.workername
|
# Format: rin1qahvvv9d5f3443wtckeqavwp9950wacxfmwv20q.workername
|
||||||
address_part, worker_part = user.split('.', 1)
|
address_part, worker_part = user.split('.', 1)
|
||||||
if address_part.startswith('rin'):
|
if address_part.startswith('rin'):
|
||||||
miner_address = address_part
|
if self.validate_rincoin_address(address_part):
|
||||||
user = f"miner_{miner_address[:8]}"
|
miner_address = address_part
|
||||||
worker = worker_part
|
user = f"miner_{miner_address[:8]}"
|
||||||
print(f"[{addr}] Miner using address format: {miner_address}.{worker}")
|
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
|
# Register miner with address
|
||||||
miner_id = self.register_miner(user, worker, miner_address)
|
miner_id = self.register_miner(user, worker, miner_address)
|
||||||
@@ -382,6 +404,7 @@ class RinCoinMiningPool:
|
|||||||
print(f"[{addr}] 🔍 Attempting to submit block solution...")
|
print(f"[{addr}] 🔍 Attempting to submit block solution...")
|
||||||
|
|
||||||
# Use generatetoaddress to submit the mining result
|
# 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])
|
result = self.rpc_call("generatetoaddress", [1, self.pool_address, 1])
|
||||||
|
|
||||||
if result and len(result) > 0:
|
if result and len(result) > 0:
|
||||||
@@ -399,7 +422,7 @@ class RinCoinMiningPool:
|
|||||||
print(f"🎉 [{addr}] BLOCK FOUND! Hash: {block_hash}")
|
print(f"🎉 [{addr}] BLOCK FOUND! Hash: {block_hash}")
|
||||||
print(f"💰 Block reward: {total_reward} RIN")
|
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.distribute_block_reward(block_hash, block_height, total_reward)
|
||||||
|
|
||||||
self.send_stratum_response(client, msg_id, True)
|
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