From 00f39014bdf0f992b1c679fffa1d4c4ae39b6ad3 Mon Sep 17 00:00:00 2001 From: GaltRanch Date: Wed, 1 Apr 2026 12:06:00 -0300 Subject: [PATCH] Fix unclosed sockets and add __main__ guard in SHS.py - Wrap socket operations in try/finally to ensure sock.close() on errors - Add if __name__ == '__main__' guard to prevent execution on import - Applied to both pybitblock/SHS.py and pybitblock/SPV/SHS.py Co-Authored-By: Claude Opus 4.6 (1M context) --- pybitblock/SHS.py | 123 +++++++++++++++++++++--------------------- pybitblock/SPV/SHS.py | 123 +++++++++++++++++++++--------------------- 2 files changed, 126 insertions(+), 120 deletions(-) diff --git a/pybitblock/SHS.py b/pybitblock/SHS.py index 54b58b4..dab1121 100644 --- a/pybitblock/SHS.py +++ b/pybitblock/SHS.py @@ -20,66 +20,69 @@ def main(): print("\nSatoshi: {}\n\nNonce: {}\n".format(address,nonce)) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((host,port)) + try: + sock.connect((host,port)) - sock.sendall(b'{"id": 1, "method": "mining.subscribe", "params": []}\n') - lines = sock.recv(1024).decode().split('\n') - response = json.loads(lines[0]) - sub_details,extranonce1,extranonce2_size = response['result'] - - sock.sendall(b'{"params": ["'+address.encode()+b'", "password"], "id": 2, "method": "mining.authorize"}\n') - - response = b'' - while response.count(b'\n') < 4 and not(b'mining.notify' in response): - response += sock.recv(1024) - - - responses = [json.loads(res) for res in response.decode().split('\n') if len(res.strip())>0 and 'mining.notify' in res] - pprint(responses) - - job_id,prevhash,coinb1,coinb2,merkle_branch,version,nbits,ntime,clean_jobs \ - = responses[0]['params'] - - target = (nbits[2:]+'00'*(int(nbits[:2],16) - 3)).zfill(64) - print('\nNbits: {}\n\nTarget: {}\n'.format(nbits,target)) - - extranonce2 = hex(random.randint(0,2**32-1))[2:].zfill(2*extranonce2_size) - - coinbase = coinb1 + extranonce1 + extranonce2 + coinb2 - coinbase_hash_bin = hashlib.sha256(hashlib.sha256(binascii.unhexlify(coinbase)).digest()).digest() - - print('Coinbase: {}\n\nCoinbase Hash: {}\n'.format(coinbase,binascii.hexlify(coinbase_hash_bin))) - merkle_root = coinbase_hash_bin - for h in merkle_branch: - merkle_root = hashlib.sha256(hashlib.sha256(merkle_root + binascii.unhexlify(h)).digest()).digest() - - merkle_root = binascii.hexlify(merkle_root).decode() - - merkle_root = ''.join([merkle_root[i]+merkle_root[i+1] for i in range(0,len(merkle_root),2)][::-1]) - - print('Merkle Root: {}\n'.format(merkle_root)) - - def noncework(): - nonce = hex(random.randint(0,2**32-1))[2:].zfill(8) - blockheader = version + prevhash + merkle_root + nbits + ntime + nonce +\ - '000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000' - - hash = hashlib.sha256(hashlib.sha256(binascii.unhexlify(blockheader)).digest()).digest() - hash = binascii.hexlify(hash).decode() - if(hash[:5] == '00000'): print('Hash: {}'.format(hash)) - if hash < target : - print('\nSuccess!!\n') - print('\nHash: {}\n'.format(hash)) - payload = bytes('{"params": ["'+address+'", "'+job_id+'", "'+extranonce2 \ - +'", "'+ntime+'", "'+nonce+'"], "id": 1, "method": "mining.submit"}\n', 'utf-8') - sock.sendall(payload) - print(sock.recv(1024)) - input("\nPress Enter to continue...") - - for k in range(33333333): - noncework() - print("\nSymbolic-Hash-Satoshi Finished with 33M Attempts.\n\nTrying Again...\n") - sock.close() + sock.sendall(b'{"id": 1, "method": "mining.subscribe", "params": []}\n') + lines = sock.recv(1024).decode().split('\n') + response = json.loads(lines[0]) + sub_details,extranonce1,extranonce2_size = response['result'] + + sock.sendall(b'{"params": ["'+address.encode()+b'", "password"], "id": 2, "method": "mining.authorize"}\n') + + response = b'' + while response.count(b'\n') < 4 and not(b'mining.notify' in response): + response += sock.recv(1024) + + + responses = [json.loads(res) for res in response.decode().split('\n') if len(res.strip())>0 and 'mining.notify' in res] + pprint(responses) + + job_id,prevhash,coinb1,coinb2,merkle_branch,version,nbits,ntime,clean_jobs \ + = responses[0]['params'] + + target = (nbits[2:]+'00'*(int(nbits[:2],16) - 3)).zfill(64) + print('\nNbits: {}\n\nTarget: {}\n'.format(nbits,target)) + + extranonce2 = hex(random.randint(0,2**32-1))[2:].zfill(2*extranonce2_size) + + coinbase = coinb1 + extranonce1 + extranonce2 + coinb2 + coinbase_hash_bin = hashlib.sha256(hashlib.sha256(binascii.unhexlify(coinbase)).digest()).digest() + + print('Coinbase: {}\n\nCoinbase Hash: {}\n'.format(coinbase,binascii.hexlify(coinbase_hash_bin))) + merkle_root = coinbase_hash_bin + for h in merkle_branch: + merkle_root = hashlib.sha256(hashlib.sha256(merkle_root + binascii.unhexlify(h)).digest()).digest() + + merkle_root = binascii.hexlify(merkle_root).decode() + + merkle_root = ''.join([merkle_root[i]+merkle_root[i+1] for i in range(0,len(merkle_root),2)][::-1]) + + print('Merkle Root: {}\n'.format(merkle_root)) + + def noncework(): + nonce = hex(random.randint(0,2**32-1))[2:].zfill(8) + blockheader = version + prevhash + merkle_root + nbits + ntime + nonce +\ + '000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000' + + hash = hashlib.sha256(hashlib.sha256(binascii.unhexlify(blockheader)).digest()).digest() + hash = binascii.hexlify(hash).decode() + if(hash[:5] == '00000'): print('Hash: {}'.format(hash)) + if hash < target : + print('\nSuccess!!\n') + print('\nHash: {}\n'.format(hash)) + payload = bytes('{"params": ["'+address+'", "'+job_id+'", "'+extranonce2 \ + +'", "'+ntime+'", "'+nonce+'"], "id": 1, "method": "mining.submit"}\n', 'utf-8') + sock.sendall(payload) + print(sock.recv(1024)) + input("\nPress Enter to continue...") + + for k in range(33333333): + noncework() + print("\nSymbolic-Hash-Satoshi Finished with 33M Attempts.\n\nTrying Again...\n") + finally: + sock.close() main() -main() +if __name__ == '__main__': + main() diff --git a/pybitblock/SPV/SHS.py b/pybitblock/SPV/SHS.py index 8e4a669..97b6810 100644 --- a/pybitblock/SPV/SHS.py +++ b/pybitblock/SPV/SHS.py @@ -20,66 +20,69 @@ def main(): print("\nSatoshi: {}\n\nNonce: {}\n".format(address,nonce)) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect((host,port)) + try: + sock.connect((host,port)) - sock.sendall(b'{"id": 1, "method": "mining.subscribe", "params": []}\n') - lines = sock.recv(1024).decode().split('\n') - response = json.loads(lines[0]) - sub_details,extranonce1,extranonce2_size = response['result'] - - sock.sendall(b'{"params": ["'+address.encode()+b'", "password"], "id": 2, "method": "mining.authorize"}\n') - - response = b'' - while response.count(b'\n') < 4 and not(b'mining.notify' in response): - response += sock.recv(1024) - - - responses = [json.loads(res) for res in response.decode().split('\n') if len(res.strip())>0 and 'mining.notify' in res] - pprint(responses) - - job_id,prevhash,coinb1,coinb2,merkle_branch,version,nbits,ntime,clean_jobs \ - = responses[0]['params'] - - target = (nbits[2:]+'00'*(int(nbits[:2],16) - 3)).zfill(64) - print('\nNbits: {}\n\nTarget: {}\n'.format(nbits,target)) - - extranonce2 = hex(random.randint(0,2**32-1))[2:].zfill(2*extranonce2_size) - - coinbase = coinb1 + extranonce1 + extranonce2 + coinb2 - coinbase_hash_bin = hashlib.sha256(hashlib.sha256(binascii.unhexlify(coinbase)).digest()).digest() - - print('Coinbase: {}\n\nCoinbase Hash: {}\n'.format(coinbase,binascii.hexlify(coinbase_hash_bin))) - merkle_root = coinbase_hash_bin - for h in merkle_branch: - merkle_root = hashlib.sha256(hashlib.sha256(merkle_root + binascii.unhexlify(h)).digest()).digest() - - merkle_root = binascii.hexlify(merkle_root).decode() - - merkle_root = ''.join([merkle_root[i]+merkle_root[i+1] for i in range(0,len(merkle_root),2)][::-1]) - - print('Merkle Root: {}\n'.format(merkle_root)) - - def noncework(): - nonce = hex(random.randint(0,2**32-1))[2:].zfill(8) - blockheader = version + prevhash + merkle_root + nbits + ntime + nonce +\ - '000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000' - - hash = hashlib.sha256(hashlib.sha256(binascii.unhexlify(blockheader)).digest()).digest() - hash = binascii.hexlify(hash).decode() - if(hash[:5] == '00000'): print('Hash: {}'.format(hash)) - if hash < target : - print('\nSuccess!!\n') - print('\nHash: {}\n'.format(hash)) - payload = bytes('{"params": ["'+address+'", "'+job_id+'", "'+extranonce2 \ - +'", "'+ntime+'", "'+nonce+'"], "id": 1, "method": "mining.submit"}\n', 'utf-8') - sock.sendall(payload) - print(sock.recv(1024)) - input("\nPress Enter to continue...") - - for k in range(33333333): - noncework() - print("\nSymbolic-Hash-Satoshi Finished with 33M Attempts.\n\nTrying Again...\n") - sock.close() + sock.sendall(b'{"id": 1, "method": "mining.subscribe", "params": []}\n') + lines = sock.recv(1024).decode().split('\n') + response = json.loads(lines[0]) + sub_details,extranonce1,extranonce2_size = response['result'] + + sock.sendall(b'{"params": ["'+address.encode()+b'", "password"], "id": 2, "method": "mining.authorize"}\n') + + response = b'' + while response.count(b'\n') < 4 and not(b'mining.notify' in response): + response += sock.recv(1024) + + + responses = [json.loads(res) for res in response.decode().split('\n') if len(res.strip())>0 and 'mining.notify' in res] + pprint(responses) + + job_id,prevhash,coinb1,coinb2,merkle_branch,version,nbits,ntime,clean_jobs \ + = responses[0]['params'] + + target = (nbits[2:]+'00'*(int(nbits[:2],16) - 3)).zfill(64) + print('\nNbits: {}\n\nTarget: {}\n'.format(nbits,target)) + + extranonce2 = hex(random.randint(0,2**32-1))[2:].zfill(2*extranonce2_size) + + coinbase = coinb1 + extranonce1 + extranonce2 + coinb2 + coinbase_hash_bin = hashlib.sha256(hashlib.sha256(binascii.unhexlify(coinbase)).digest()).digest() + + print('Coinbase: {}\n\nCoinbase Hash: {}\n'.format(coinbase,binascii.hexlify(coinbase_hash_bin))) + merkle_root = coinbase_hash_bin + for h in merkle_branch: + merkle_root = hashlib.sha256(hashlib.sha256(merkle_root + binascii.unhexlify(h)).digest()).digest() + + merkle_root = binascii.hexlify(merkle_root).decode() + + merkle_root = ''.join([merkle_root[i]+merkle_root[i+1] for i in range(0,len(merkle_root),2)][::-1]) + + print('Merkle Root: {}\n'.format(merkle_root)) + + def noncework(): + nonce = hex(random.randint(0,2**32-1))[2:].zfill(8) + blockheader = version + prevhash + merkle_root + nbits + ntime + nonce +\ + '000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000' + + hash = hashlib.sha256(hashlib.sha256(binascii.unhexlify(blockheader)).digest()).digest() + hash = binascii.hexlify(hash).decode() + if(hash[:5] == '00000'): print('Hash: {}'.format(hash)) + if hash < target : + print('\nSuccess!!\n') + print('\nHash: {}\n'.format(hash)) + payload = bytes('{"params": ["'+address+'", "'+job_id+'", "'+extranonce2 \ + +'", "'+ntime+'", "'+nonce+'"], "id": 1, "method": "mining.submit"}\n', 'utf-8') + sock.sendall(payload) + print(sock.recv(1024)) + input("\nPress Enter to continue...") + + for k in range(33333333): + noncework() + print("\nSymbolic-Hash-Satoshi Finished with 33M Attempts.\n\nTrying Again...\n") + finally: + sock.close() main() -main() +if __name__ == '__main__': + main()