chainsyncer/chainsyncer/driver.py

89 lines
2.2 KiB
Python

# standard imports
import uuid
import logging
import time
logg = logging.getLogger()
def noop_progress(s):
logg.debug(s)
class Syncer:
running_global = True
yield_delay=0.005
def __init__(self, backend, progress_callback=noop_progress):
self.cursor = None
self.running = True
self.backend = backend
self.filter = []
self.progress_callback = progress_callback
def chain(self):
"""Returns the string representation of the chain spec for the chain the syncer is running on.
:returns: Chain spec string
:rtype: str
"""
return self.bc_cache.chain()
def add_filter(self, f):
self.filter.append(f)
class MinedSyncer(Syncer):
def __init__(self, backend, progress_callback):
super(MinedSyncer, self).__init__(backend, progress_callback)
def loop(self, interval, getter):
while self.running and Syncer.running_global:
while True:
block_hash = self.get(getter)
if block_hash == None:
break
self.process(getter, block_hash)
time.sleep(self.yield_delay)
time.sleep(interval)
class HeadSyncer(MinedSyncer):
def __init__(self, backend, progress_callback):
super(HeadSyncer, self).__init__(backend, progress_callback)
def process(self, getter, block):
logg.debug('process {}'.format(block))
i = 0
tx = None
while True:
try:
#self.filter[0].handle(getter, block, None)
tx = block.tx(i)
self.progress_callback('processing {}'.format(tx))
self.backend.set(block.number, i)
for f in self.filter:
f.handle(getter, block, tx)
self.progress_callback('applied filter {} on {}'.format(f.name(), tx))
except IndexError as e:
self.backend.set(block.number + 1, 0)
break
i += 1
def get(self, getter):
(block_number, tx_number) = self.backend.get()
block_hash = []
uu = uuid.uuid4()
res = getter.get(block_number)
logg.debug('get {}'.format(res))
return res