chainsyncer/chainsyncer/driver.py

82 lines
1.9 KiB
Python
Raw Normal View History

2021-02-03 19:40:03 +01:00
# standard imports
import uuid
import logging
2021-02-03 21:10:08 +01:00
import time
2021-02-03 19:40:03 +01:00
logg = logging.getLogger()
class Syncer:
2021-02-03 21:10:08 +01:00
running_global = True
2021-02-11 09:02:17 +01:00
def __init__(self, backend):
2021-02-03 20:55:39 +01:00
self.cursor = None
self.running = True
self.backend = backend
self.filter = []
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()
2021-02-03 19:40:03 +01:00
2021-02-11 09:02:17 +01:00
def add_filter(self, f):
self.filter.append(f)
2021-02-03 19:40:03 +01:00
class MinedSyncer(Syncer):
2021-02-11 09:02:17 +01:00
def __init__(self, backend):
super(MinedSyncer, self).__init__(backend)
2021-02-03 19:40:03 +01:00
2021-02-03 21:57:26 +01:00
def loop(self, interval, getter):
2021-02-03 20:55:39 +01:00
while self.running and Syncer.running_global:
while True:
block_hash = self.get(getter)
if block_hash == None:
break
2021-02-03 23:03:39 +01:00
self.process(getter, block_hash)
2021-02-03 21:10:08 +01:00
time.sleep(interval)
2021-02-03 20:55:39 +01:00
2021-02-03 19:40:03 +01:00
class HeadSyncer(MinedSyncer):
2021-02-11 09:02:17 +01:00
def __init__(self, backend):
super(HeadSyncer, self).__init__(backend)
2021-02-03 19:40:03 +01:00
2021-02-03 23:03:39 +01:00
def process(self, getter, block):
logg.debug('process {}'.format(block))
2021-02-11 09:02:17 +01:00
block = getter.block_by_hash(block.hash)
2021-02-03 23:03:39 +01:00
i = 0
tx = None
while True:
try:
#self.filter[0].handle(getter, block, None)
2021-02-03 23:03:39 +01:00
tx = block.tx(i)
logg.debug('tx {}'.format(tx))
self.backend.set(block.number(), i)
for f in self.filter:
2021-02-11 09:02:17 +01:00
f(getter, block, tx)
2021-02-03 23:03:39 +01:00
except IndexError as e:
self.backend.set(block.number() + 1, 0)
break
i += 1
2021-02-03 19:40:03 +01:00
def get(self, getter):
2021-02-03 20:55:39 +01:00
(block_number, tx_number) = self.backend.get()
2021-02-03 19:40:03 +01:00
block_hash = []
2021-02-03 21:57:26 +01:00
uu = uuid.uuid4()
2021-02-11 09:02:17 +01:00
res = getter.block_by_integer(block_number)
2021-02-03 23:03:39 +01:00
logg.debug('get {}'.format(res))
2021-02-03 19:40:03 +01:00
2021-02-03 23:03:39 +01:00
return res