Add moving average stub to gas tracker

This commit is contained in:
lash 2022-04-07 13:29:44 +00:00
parent 26b01099eb
commit 23a1d7ccc9
Signed by: lash
GPG Key ID: 21D2E7BB88C2A746
3 changed files with 71 additions and 30 deletions

View File

@ -3,12 +3,12 @@ import sys
import os import os
import logging import logging
import argparse import argparse
import uuid
# external imports # external imports
import confini import confini
from chainsyncer.backend.memory import MemBackend from chainsyncer.store.fs import SyncFsStore
from chainsyncer.driver.head import HeadSyncer from chainsyncer.driver.chain_interface import ChainInterfaceDriver
from chainsyncer.driver.history import HistorySyncer
from chainsyncer.filter import SyncFilter from chainsyncer.filter import SyncFilter
from chainsyncer.error import NoBlockForYou from chainsyncer.error import NoBlockForYou
from chainlib.chain import ChainSpec from chainlib.chain import ChainSpec
@ -33,14 +33,20 @@ from eth_stat_syncer.store import (
logging.basicConfig(level=logging.WARNING) logging.basicConfig(level=logging.WARNING)
logg = logging.getLogger() logg = logging.getLogger()
default_config_dir = os.environ.get('CONFINI_DIR', './config') script_dir = os.path.realpath(os.path.dirname(__file__))
exec_dir = os.path.realpath(os.getcwd())
default_config_dir = os.environ.get('confini_dir', os.path.join(exec_dir, 'config'))
argparser = argparse.ArgumentParser() argparser = argparse.ArgumentParser()
argparser.add_argument('-p', '--provider', dest='p', type=str, help='rpc provider') argparser.add_argument('-p', '--provider', dest='p', type=str, help='rpc provider')
argparser.add_argument('-c', '--config', dest='c', default=default_config_dir, type=str, help='rpc provider') argparser.add_argument('-c', '--config', dest='c', default=default_config_dir, type=str, help='rpc provider')
argparser.add_argument('-i', '--chain-spec', dest='i', default='evm:ethereum:1', type=str, help='chain spec') argparser.add_argument('-i', '--chain-spec', dest='i', default='evm:ethereum:1', type=str, help='chain spec')
argparser.add_argument('--start', type=int, help='number of blocks to sample at startup') argparser.add_argument('--moving', action='append', default=[], type=int, help='add moving average')
argparser.add_argument('--offset', type=int, default=0, help='Start sync on this block')
argparser.add_argument('--env-prefix', default=os.environ.get('CONFINI_ENV_PREFIX'), dest='env_prefix', type=str, help='environment prefix for variables to overwrite configuration') argparser.add_argument('--env-prefix', default=os.environ.get('CONFINI_ENV_PREFIX'), dest='env_prefix', type=str, help='environment prefix for variables to overwrite configuration')
argparser.add_argument('--cache-dir', dest='cache_dir', type=str, help='Directory to store tx data')
argparser.add_argument('--state-dir', dest='state_dir', default=exec_dir, type=str, help='Directory to store sync state')
argparser.add_argument('--session-id', dest='session_id', type=str, help='Use state from specified session id')
argparser.add_argument('-v', action='store_true', help='be verbose') argparser.add_argument('-v', action='store_true', help='be verbose')
argparser.add_argument('-vv', action='store_true', help='be more verbose') argparser.add_argument('-vv', action='store_true', help='be more verbose')
args = argparser.parse_args() args = argparser.parse_args()
@ -58,13 +64,19 @@ args_override = {
'RPC_PROVIDER': getattr(args, 'p'), 'RPC_PROVIDER': getattr(args, 'p'),
} }
config.dict_override(args_override, 'cli flag') config.dict_override(args_override, 'cli flag')
config.add(args.start, '_START', True) config.add(args.offset, '_SYNC_OFFSET', True)
config.add(os.path.realpath(args.state_dir), '_STATE_DIR', True)
config.add(args.cache_dir, '_CACHE_DIR', True)
config.add(args.session_id, '_SESSION_ID', True)
config.add(args.moving, '_MOVING', True)
logg.debug('loaded config: {}\n'.format(config)) logg.debug('loaded config: {}\n'.format(config))
chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
conn = EthHTTPConnection(args.p) conn = EthHTTPConnection(args.p)
if config.get('_SESSION_ID') == None:
config.add(str(uuid.uuid4()), '_SESSION_ID', True)
class GasPriceFilter(SyncFilter): class GasPriceFilter(SyncFilter):
@ -73,8 +85,9 @@ class GasPriceFilter(SyncFilter):
self.gas_aggregator = gas_aggregator self.gas_aggregator = gas_aggregator
def filter(self, conn, block, tx, db_session): def filter(self, conn, block, tx, db_session=None):
self.gas_aggregator.put(tx.gas_price) self.gas_aggregator.put(tx.gas_price)
return False
class EthChainInterface(ChainInterface): class EthChainInterface(ChainInterface):
@ -88,9 +101,20 @@ class EthChainInterface(ChainInterface):
def main(): def main():
gas_store = RunStore(basedir=config.get('STORE_BASE_DIR')) gas_store = RunStore(basedir=config.get('STORE_BASE_DIR'))
gas_aggregator = GasAggregator(gas_store, 360) cap = 360
try:
v = max(config.get('_MOVING'))
if v > cap:
cap = v
except ValueError:
pass
gas_aggregator = GasAggregator(gas_store, cap, moving=config.get('_MOVING'))
gas_filter = GasPriceFilter(chain_spec, gas_aggregator) gas_filter = GasPriceFilter(chain_spec, gas_aggregator)
start_block = 0
if config.get('_SYNC_OFFSET') != None:
start_block = config.get('_SYNC_OFFSET')
else:
o = block_latest() o = block_latest()
r = conn.do(o) r = conn.do(o)
n = int(r, 16) n = int(r, 16)
@ -98,22 +122,30 @@ def main():
logg.info('block height at start {}'.format(start_block)) logg.info('block height at start {}'.format(start_block))
chain_interface = EthChainInterface() chain_interface = EthChainInterface()
if config.get('_START') != None:
offset = start_block - config.get('_START')
syncer_backend = MemBackend.custom(chain_spec, start_block)
syncer_backend.set(offset, 0)
syncer = HistorySyncer(syncer_backend, chain_interface, block_callback=gas_aggregator.block_callback)
syncer.add_filter(gas_filter)
try:
syncer.loop(0.0, conn)
except NoBlockForYou:
logg.info('history done at {}'.format(syncer.backend.get()))
syncer_backend = MemBackend(chain_spec, None) sync_store = SyncFsStore(config.get('_STATE_DIR'), session_id=config.get('_SESSION_ID'))
syncer_backend.set(start_block + 1, 0) sync_store.register(gas_filter)
syncer = HeadSyncer(syncer_backend, chain_interface, block_callback=gas_aggregator.block_callback)
syncer.add_filter(gas_filter) drv = ChainInterfaceDriver(sync_store, chain_interface, offset=start_block, target=-1, block_callback=gas_aggregator.block_callback)
syncer.loop(1.0, conn)
r = drv.run(conn)
# if config.get('_START') != None:
# offset = start_block - config.get('_START')
# syncer_backend = MemBackend.custom(chain_spec, start_block)
# syncer_backend.set(offset, 0)
# syncer = HistorySyncer(syncer_backend, chain_interface, block_callback=gas_aggregator.block_callback)
# syncer.add_filter(gas_filter)
# try:
# syncer.loop(0.0, conn)
# except NoBlockForYou:
# logg.info('history done at {}'.format(syncer.backend.get()))
# syncer_backend = MemBackend(chain_spec, None)
# syncer_backend.set(start_block + 1, 0)
# syncer = HeadSyncer(syncer_backend, chain_interface, block_callback=gas_aggregator.block_callback)
# syncer.add_filter(gas_filter)
# syncer.loop(1.0, conn)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -40,7 +40,7 @@ class RunStore:
class GasAggregator: class GasAggregator:
def __init__(self, store, capacity): def __init__(self, store, capacity, moving=[]):
self.store = store self.store = store
self.avg = 0 self.avg = 0
self.count = 0 self.count = 0
@ -57,6 +57,15 @@ class GasAggregator:
self.local_high = 0 self.local_high = 0
self.local_low = 0 self.local_low = 0
self.moving = []
for v in moving:
if v > capacity:
raise ValueError('moving average {} requested but capacity is only {}'.format(v, capacity))
self.moving.append(v)
logg.info('will calculate moving average {}'.format(v))
logg.info('buffer capacity is {}'.format(capacity))
def put(self, v): def put(self, v):
self.local_aggr += v self.local_aggr += v

View File

@ -1,3 +1,3 @@
chainsyncer~=0.2.0 chainsyncer~=0.3.0
chainlib-eth>=0.1.0b1,<=0.1.0 chainlib-eth>=0.1.0b1,<=0.1.0
jsonrpc_std~=0.1.0 jsonrpc_std~=0.1.0