85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
import stratum.logger
|
|
log = stratum.logger.get_logger('Getwork Proxy')
|
|
|
|
from stratum import settings
|
|
from stratum.socket_transport import SocketTransportClientFactory
|
|
|
|
from twisted.internet import reactor, defer
|
|
from twisted.web import server
|
|
|
|
from mining_libs import getwork_listener
|
|
from mining_libs import client_service
|
|
from mining_libs import jobs
|
|
from mining_libs import worker_registry
|
|
from mining_libs import version
|
|
|
|
class Site(server.Site):
|
|
def log(self, request):
|
|
pass
|
|
|
|
def on_shutdown(f):
|
|
log.info("Shutting down proxy...")
|
|
f.is_reconnecting = False # Don't let stratum factory to reconnect again
|
|
|
|
@defer.inlineCallbacks
|
|
def on_connect(f, workers, job_registry):
|
|
log.info("Connected to Stratum pool at %s:%d" % f.main_host)
|
|
|
|
# Hook to on_connect again
|
|
f.on_connect.addCallback(on_connect, workers, job_registry)
|
|
|
|
# Every worker have to re-autorize
|
|
workers.clear_authorizations()
|
|
|
|
# Subscribe for receiving jobs
|
|
log.info("Subscribing for mining jobs")
|
|
(_, extranonce1, extranonce2_size) = (yield f.rpc('mining.subscribe', []))
|
|
job_registry.set_extranonce(extranonce1, extranonce2_size)
|
|
|
|
defer.returnValue(f)
|
|
|
|
def on_disconnect(f, workers, job_registry):
|
|
log.info("Disconnected from Stratum pool at %s:%d" % f.main_host)
|
|
f.on_disconnect.addCallback(on_disconnect, workers, job_registry)
|
|
|
|
# Reject miners because we don't give a *job :-)
|
|
workers.clear_authorizations()
|
|
return f
|
|
|
|
@defer.inlineCallbacks
|
|
def GetworkProxy_main(cb):
|
|
log.info("Stratum proxy version %s Connecting to Pool..." % version.VERSION)
|
|
|
|
# Connect to Stratum pool
|
|
f = SocketTransportClientFactory(settings.HOSTNAME, settings.LISTEN_SOCKET_TRANSPORT,
|
|
debug=False, proxy=None, event_handler=client_service.ClientMiningService)
|
|
|
|
job_registry = jobs.JobRegistry(f, cmd='', no_midstate=settings.GW_DISABLE_MIDSTATE, real_target=settings.GW_SEND_REAL_TARGET)
|
|
client_service.ClientMiningService.job_registry = job_registry
|
|
client_service.ClientMiningService.reset_timeout()
|
|
|
|
workers = worker_registry.WorkerRegistry(f)
|
|
f.on_connect.addCallback(on_connect, workers, job_registry)
|
|
f.on_disconnect.addCallback(on_disconnect, workers, job_registry)
|
|
|
|
# Cleanup properly on shutdown
|
|
reactor.addSystemEventTrigger('before', 'shutdown', on_shutdown, f)
|
|
|
|
# Block until proxy connects to the pool
|
|
yield f.on_connect
|
|
|
|
# Setup getwork listener
|
|
gw_site = Site(getwork_listener.Root(job_registry, workers,
|
|
stratum_host=settings.HOSTNAME, stratum_port=settings.LISTEN_SOCKET_TRANSPORT,
|
|
custom_lp=False, custom_stratum=False,
|
|
custom_user=False, custom_password=False
|
|
))
|
|
gw_site.noisy = False
|
|
reactor.listenTCP(settings.GW_PORT, gw_site, interface='0.0.0.0')
|
|
|
|
log.info("Getwork Proxy is online, Port: %d" % (settings.GW_PORT))
|
|
|
|
def GetworkProxy(start_event):
|
|
start_event.addCallback(GetworkProxy_main)
|
|
|