address validations

This commit is contained in:
Dobromir Popov
2025-09-02 12:04:28 +03:00
parent 0c8e4989e4
commit 3dd0e55fde
2 changed files with 110 additions and 9 deletions

View File

@@ -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)

View 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"