52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
|
# standard imports
|
||
|
import logging
|
||
|
|
||
|
# third-party imports
|
||
|
import web3
|
||
|
|
||
|
# local imports
|
||
|
from .mined import MinedSyncer
|
||
|
from .base import Syncer
|
||
|
|
||
|
logg = logging.getLogger()
|
||
|
|
||
|
|
||
|
class HeadSyncer(MinedSyncer):
|
||
|
"""Implements the get method in Syncer for retrieving every new mined block.
|
||
|
|
||
|
:param bc_cache: Retrieves block cache cursors for chain head and latest processed block.
|
||
|
:type bc_cache: Object implementing methods from cic_eth.sync.SyncerBackend
|
||
|
"""
|
||
|
def __init__(self, bc_cache):
|
||
|
super(HeadSyncer, self).__init__(bc_cache)
|
||
|
# TODO: filter not returning all blocks, at least with ganache. kind of defeats the point, then
|
||
|
#self.w3_filter = rpc.w3.eth.filter({
|
||
|
# 'fromBlock': block_offset,
|
||
|
# }) #'latest')
|
||
|
#self.bc_cache.set(block_offset, 0)
|
||
|
logg.debug('initialized head syncer with offset {}'.format(bc_cache.start()))
|
||
|
|
||
|
"""Implements Syncer.get
|
||
|
|
||
|
:param w3: Web3 object
|
||
|
:type w3: web3.Web3
|
||
|
:returns: Block hash of newly mined blocks. if any
|
||
|
:rtype: list of str, 0x-hex
|
||
|
"""
|
||
|
def get(self, w3):
|
||
|
# Of course, the filter doesn't return the same block dict format as getBlock() so we'll just waste some cycles getting the hashes instead.
|
||
|
#hashes = []
|
||
|
#for block in self.w3_filter.get_new_entries():
|
||
|
# hashes.append(block['blockHash'])
|
||
|
#logg.debug('blocks {}'.format(hashes))
|
||
|
#return hashes
|
||
|
(block_number, tx_number) = self.bc_cache.get()
|
||
|
block_hash = []
|
||
|
try:
|
||
|
block = w3.eth.getBlock(block_number)
|
||
|
block_hash.append(block.hash)
|
||
|
except web3.exceptions.BlockNotFound:
|
||
|
pass
|
||
|
|
||
|
return block_hash
|