From 3dd0e55fde11e942674dc21252c0dd4bd1585007 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Tue, 2 Sep 2025 12:04:28 +0300 Subject: [PATCH] address validations --- MINE/rin/stratum_pool.py | 41 +++++++++++---- MINE/rin/test_address_validation.sh | 78 +++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 MINE/rin/test_address_validation.sh diff --git a/MINE/rin/stratum_pool.py b/MINE/rin/stratum_pool.py index 466a321..77ad465 100644 --- a/MINE/rin/stratum_pool.py +++ b/MINE/rin/stratum_pool.py @@ -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) diff --git a/MINE/rin/test_address_validation.sh b/MINE/rin/test_address_validation.sh new file mode 100644 index 0000000..34ebd9c --- /dev/null +++ b/MINE/rin/test_address_validation.sh @@ -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"