Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- # author slush, public domain
- from twisted.internet import reactor
- from twisted.internet import defer
- from stratum import settings
- settings.LOGLEVEL = 'INFO'
- from stratum.socket_transport import SocketTransportClientFactory
- from stratum.services import GenericService, ServiceEventHandler
- from stratum.connection_registry import ConnectionRegistry
- import time
- debug = False
- reg = {}
- class BlockchainNumblocks(GenericService):
- service_type = 'blockchain.numblocks'
- service_vendor = 'custom'
- is_default = True
- def subscribe(self, blocks):
- session = ConnectionRegistry.get_session(self)
- session['blocks'] = blocks
- print session['hostname'], "Received notification for the numblocks event !!!", blocks
- '''
- class ServerPeers(GenericService):
- service_type = 'server.peers'
- service_vendor = 'custom'
- is_default = True
- @defer.inlineCallbacks
- def subscribe(self, peers):
- print "New peers", peers
- yield add_peers(peers)
- '''
- @defer.inlineCallbacks
- def connect(hostname):
- # Try to connect to remote server
- f = SocketTransportClientFactory(hostname, 50001,
- allow_trusted=True,
- allow_untrusted=False,
- debug=debug,
- signing_key=None,
- signing_id=None,
- event_handler=ServiceEventHandler)
- try:
- yield f.on_connect # Wait to on_connect event
- except:
- print "Failed to connect to", hostname
- return
- reg[hostname] = f
- r1 = f.rpc('blockchain.numblocks.subscribe', [])
- r2 = f.rpc('server.peers.subscribe', [])
- blocks = (yield r1)
- print hostname, 'numblocks', blocks
- session = ConnectionRegistry.get_session(f.client)
- session['hostname'] = hostname
- session['blocks'] = blocks
- peers = [ server[1] for server in (yield r2) ]
- yield add_peers(peers)
- @defer.inlineCallbacks
- def add_peers(peers):
- for peer in peers:
- if peer not in reg:
- print "Adding peer", peer
- yield connect(peer)
- def check_blocks():
- #print "Checking if all servers have up-to-date blockchain"
- max_blocks = 0
- for f in reg.values():
- session = ConnectionRegistry.get_session(f.client)
- max_blocks = max(max_blocks, session.get('blocks', 0))
- for f in reg.values():
- session = ConnectionRegistry.get_session(f.client)
- if session['blocks'] < max_blocks - 1:
- print '!!!', session['hostname'], '(%d) is behind other servers (%d)!' % (session['blocks'], max_blocks)
- reactor.callLater(10, check_blocks)
- if __name__ == '__main__':
- connect('california.stratum.bitcoin.cz')
- connect('ecdsa.org')
- check_blocks()
- reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement