Implement chainlib cli for traffic script

This commit is contained in:
Louis Holbrook 2021-08-25 09:33:23 +00:00
parent f0b4c42c68
commit 3bf92e7a8a
9 changed files with 57 additions and 45 deletions

View File

@ -101,14 +101,14 @@ class DispatchSyncer:
LockEnum.QUEUE, LockEnum.QUEUE,
tx['from'], tx['from'],
], ],
queue=queue, queue=config.get('CELERY_QUEUE'),
) )
s_send = celery.signature( s_send = celery.signature(
'cic_eth.eth.tx.send', 'cic_eth.eth.tx.send',
[ [
self.chain_spec.asdict(), self.chain_spec.asdict(),
], ],
queue=queue, queue=config.get('CELERY_QUEUE'),
) )
s_check.link(s_send) s_check.link(s_send)
t = s_check.apply_async() t = s_check.apply_async()

View File

@ -140,8 +140,11 @@ class TrafficRouter:
for k in keys: for k in keys:
if len(k) > 8 and k[:8] == 'TRAFFIC_': if len(k) > 8 and k[:8] == 'TRAFFIC_':
v = int(dct.get(k)) v = int(dct.get(k))
self.add(k[8:].lower(), v) if v == 0:
logg.debug('skipping traffic item {} with weight {}'.format(k, v))
else:
logg.debug('found traffic item {} weight {}'.format(k, v)) logg.debug('found traffic item {} weight {}'.format(k, v))
self.add(k[8:].lower(), v)
# TODO: This will not work well with big networks. The provisioner should use lazy loading and LRU instead. # TODO: This will not work well with big networks. The provisioner should use lazy loading and LRU instead.

View File

@ -0,0 +1,3 @@
[celery]
broker_url = redis://localhost:63379
result_url = redis://localhost:63379

View File

@ -0,0 +1,3 @@
[redis]
host = localhost
port = 63379

View File

@ -0,0 +1,2 @@
[rpc]
http_provider = http://localhost:63545

View File

@ -0,0 +1,4 @@
[traffic]
#local.noop_traffic = 1
local.account = 2
local.transfer = 2

View File

@ -17,14 +17,10 @@ from chainlib.eth.gas import RPCGasOracle
from chainlib.eth.nonce import RPCNonceOracle from chainlib.eth.nonce import RPCNonceOracle
from chainlib.eth.block import block_latest from chainlib.eth.block import block_latest
from hexathon import strip_0x from hexathon import strip_0x
from cic_base import ( import chainlib.eth.cli
argparse, import cic_eth.cli
config, from cic_eth.cli.chain import chain_interface
log, from chainlib.eth.constant import ZERO_ADDRESS
rpc,
signer as signer_funcs,
)
from cic_base.eth.syncer import chain_interface
# local imports # local imports
#import common #import common
@ -42,42 +38,45 @@ from cmd.cache import (
# common basics # common basics
script_dir = os.path.realpath(os.path.dirname(__file__)) script_dir = os.path.dirname(os.path.realpath(__file__))
logg = log.create() traffic_schema_dir = os.path.join(script_dir, 'data', 'config')
argparser = argparse.create(script_dir, argparse.full_template) logging.basicConfig(level=logging.WARNING)
argparser = argparse.add(argparser, add_traffic_args, 'traffic') logg = logging.getLogger()
args = argparse.parse(argparser, logg)
config = config.create(args.c, args, args.env_prefix)
# map custom args to local config entries arg_flags = cic_eth.cli.argflag_std_read | cic_eth.cli.Flag.WALLET
batchsize = args.batch_size local_arg_flags = cic_eth.cli.argflag_local_taskcallback | cic_eth.cli.argflag_local_chain
if batchsize < 1: argparser = cic_eth.cli.ArgumentParser(arg_flags)
batchsize = 1 argparser.add_argument('--batch-size', default=10, type=int, help='number of events to process simultaneously')
logg.info('batch size {}'.format(batchsize)) argparser.process_local_flags(local_arg_flags)
config.add(batchsize, '_BATCH_SIZE', True) args = argparser.parse_args()
config.add(args.redis_host_callback, '_REDIS_HOST_CALLBACK', True) extra_args = {
config.add(args.redis_port_callback, '_REDIS_PORT_CALLBACK', True) 'batch_size': None,
}
config = cic_eth.cli.Config.from_args(args, arg_flags, local_arg_flags, base_config_dir=traffic_schema_dir, extra_args=extra_args)
config.add(args.y, '_KEYSTORE_FILE', True) wallet = chainlib.eth.cli.Wallet()
wallet.from_config(config)
config.add(args.q, '_CELERY_QUEUE', True) rpc = chainlib.eth.cli.Rpc(wallet=wallet)
conn = rpc.connect_by_config(config)
logg.debug(config) chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
class NetworkError(Exception):
pass
chain_spec = ChainSpec.from_chain_str(config.get('CIC_CHAIN_SPEC'))
def main(): def main():
# create signer (not currently in use, but needs to be accessible for custom traffic item generators) # create signer (not currently in use, but needs to be accessible for custom traffic item generators)
(signer_address, signer) = signer_funcs.from_keystore(config.get('_KEYSTORE_FILE')) signer = rpc.get_signer()
signer_address = rpc.get_sender_address()
# connect to celery # connect to celery
celery.Celery(broker=config.get('CELERY_BROKER_URL'), backend=config.get('CELERY_RESULT_URL')) celery.Celery(broker=config.get('CELERY_BROKER_URL'), backend=config.get('CELERY_RESULT_URL'))
# set up registry # set up registry
rpc.setup(config.get('CIC_CHAIN_SPEC'), config.get('ETH_PROVIDER')) # replace with HTTPConnection when registry has been so refactored
conn = EthHTTPConnection(config.get('ETH_PROVIDER'))
#registry = registry.init_legacy(config, w3)
CICRegistry.address = config.get('CIC_REGISTRY_ADDRESS') CICRegistry.address = config.get('CIC_REGISTRY_ADDRESS')
registry = CICRegistry(chain_spec, conn) registry = CICRegistry(chain_spec, conn)
@ -91,7 +90,7 @@ def main():
handler = TrafficSyncHandler(config, traffic_router, conn) handler = TrafficSyncHandler(config, traffic_router, conn)
# Set up syncer # Set up syncer
syncer_backend = MemBackend(config.get('CIC_CHAIN_SPEC'), 0) syncer_backend = MemBackend(config.get('CHAIN_SPEC'), 0)
o = block_latest() o = block_latest()
r = conn.do(o) r = conn.do(o)
block_offset = int(strip_0x(r), 16) + 1 block_offset = int(strip_0x(r), 16) + 1
@ -99,26 +98,28 @@ def main():
# get relevant registry entries # get relevant registry entries
token_registry = registry.lookup('TokenRegistry') token_registry = registry.lookup('TokenRegistry')
if token_registry == ZERO_ADDRESS:
raise NetworkError('TokenRegistry value missing from contract registry {}'.format(config.get('CIC_REGISTRY_ADDRESS')))
logg.info('using token registry {}'.format(token_registry)) logg.info('using token registry {}'.format(token_registry))
token_cache = TokenRegistryCache(chain_spec, token_registry) token_cache = TokenRegistryCache(chain_spec, token_registry)
account_registry = registry.lookup('AccountRegistry') account_registry = registry.lookup('AccountRegistry')
if account_registry == ZERO_ADDRESS:
raise NetworkError('AccountRegistry value missing from contract registry {}'.format(config.get('CIC_REGISTRY_ADDRESS')))
logg.info('using account registry {}'.format(account_registry)) logg.info('using account registry {}'.format(account_registry))
account_cache = AccountRegistryCache(chain_spec, account_registry) account_cache = AccountRegistryCache(chain_spec, account_registry)
# Set up provisioner for common task input data # Set up provisioner for common task input data
#TrafficProvisioner.oracles['token']= common.registry.TokenOracle(w3, config.get('CIC_CHAIN_SPEC'), registry)
#TrafficProvisioner.oracles['account'] = common.registry.AccountsOracle(w3, config.get('CIC_CHAIN_SPEC'), registry)
TrafficProvisioner.oracles['token'] = token_cache TrafficProvisioner.oracles['token'] = token_cache
TrafficProvisioner.oracles['account'] = account_cache TrafficProvisioner.oracles['account'] = account_cache
TrafficProvisioner.default_aux = { TrafficProvisioner.default_aux = {
'chain_spec': config.get('CIC_CHAIN_SPEC'), 'chain_spec': config.get('CHAIN_SPEC'),
'registry': registry, 'registry': registry,
'redis_host_callback': config.get('_REDIS_HOST_CALLBACK'), 'redis_host_callback': config.get('_REDIS_HOST_CALLBACK'),
'redis_port_callback': config.get('_REDIS_PORT_CALLBACK'), 'redis_port_callback': config.get('_REDIS_PORT_CALLBACK'),
'redis_db': config.get('REDIS_DB'), 'redis_db': config.get('REDIS_DB'),
'api_queue': config.get('_CELERY_QUEUE'), 'api_queue': config.get('CELERY_QUEUE'),
} }
syncer = HeadSyncer(syncer_backend, chain_interface, block_callback=handler.refresh) syncer = HeadSyncer(syncer_backend, chain_interface, block_callback=handler.refresh)

View File

@ -1,4 +0,0 @@
[traffic]
#local.noop_traffic = 2
#local.account = 2
local.transfer = 2

View File

@ -4,10 +4,10 @@ cic-types~=0.1.0a14
crypto-dev-signer>=0.4.15a1,<=0.4.15 crypto-dev-signer>=0.4.15a1,<=0.4.15
faker==4.17.1 faker==4.17.1
chainsyncer~=0.0.6a1 chainsyncer~=0.0.6a1
chainlib-eth~=0.0.9a3 chainlib-eth~=0.0.9a4
eth-address-index~=0.2.3a4 eth-address-index~=0.2.3a4
eth-contract-registry~=0.6.3a3 eth-contract-registry~=0.6.3a3
eth-accounts-index~=0.1.2a2 eth-accounts-index~=0.1.2a3
eth-erc20~=0.1.2a2 eth-erc20~=0.1.2a2
erc20-faucet~=0.3.2a2 erc20-faucet~=0.3.2a2
psycopg2==2.8.6 psycopg2==2.8.6