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)