# This file is part of the Monero P2Pool # Copyright (c) 2021-2024 SChernykh # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import socket import time import sys import json import ssl f = open('stratum_dummy' + sys.argv[1] + '.log', 'wb') f.write(b'Connecting') f.flush() context = ssl.create_default_context() context.check_hostname = False context.verify_mode = ssl.CERT_NONE while True: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(1) sock.setblocking(True) if (sys.argv[1] == '1'): sock = context.wrap_socket(sock); if sock.connect_ex(('127.0.0.1', 3333)) == 0: break; sock.close() f.write(b'.') f.flush() print('.') time.sleep(1) f.write(b'\n') f.flush() diff = '' if (sys.argv[1] == '2'): diff = '+1000' if (sys.argv[1] == '3'): diff = '+10000000' msg_id = 1 request = '{"id":' + str(msg_id) + ',"method":"login","params":{"login":"x' + diff + '"}}\n' msg_id += 1 s = '-> ' + request print(s, end='') sock.sendall(request.encode('utf-8')) f.write(s.encode('utf-8')) f.flush() rpc_id = '' while True: data = sock.recv(1024) if len(data) == 0: break s = '<- ' + data.decode('utf-8') print(s, end='') f.write(s.encode('utf-8')) f.flush() obj = json.loads(data) job_id = '' if ('method' in obj) and ('params' in obj) and (obj['method'] == 'job'): job_id = obj['params']['job_id'] target = obj['params']['target'] elif ('result' in obj) and ('job' in obj['result']): if ('id' in obj['result']): rpc_id = obj['result']['id'] job_id = obj['result']['job']['job_id'] target = obj['result']['job']['target'] if (job_id != ''): if (msg_id < 4): result = ('f' if (msg_id == 2) else '0') * 64 request = '{"id":' + str(msg_id) + ',"method":"submit","params":{"id":"' + rpc_id + '","job_id":"' + job_id + '","nonce":"ffffffff","result":"' + result + '"}}\n' elif (msg_id == 4): request = '{"id":' + str(msg_id) + ',"method":"keepalived"}\n' else: t = bytearray.fromhex(target) for i in range(len(t)): if (t[i] > 0): t[i] -= 1 break else: t[i] = 255 result = ('f' * (64 - len(target))) + t.hex() request = '{"id":' + str(msg_id) + ',"method":"submit","params":{"id":"' + rpc_id + '","job_id":"' + job_id + '","nonce":"ffffffff","result":"' + result + '"}}\n' msg_id += 1 s = '-> ' + request print(s, end='') sock.sendall(request.encode('utf-8')) f.write(s.encode('utf-8')) f.flush() sock.close() f.close()