From 462933d8ae4299aac04636dd3bf200de67f40ca9 Mon Sep 17 00:00:00 2001 From: Louis Holbrook Date: Thu, 1 Apr 2021 20:55:39 +0000 Subject: [PATCH] Remove custodial dependencies from sovereign import scripts --- .../cic_eth/runnable/daemons/dispatcher.py | 2 +- .../scripts/create_import_users.py | 4 - .../scripts/import_sovereign_users.py | 10 +- apps/contract-migration/scripts/verify.py | 117 +++++++++++++----- docker-compose.yml | 2 +- 5 files changed, 91 insertions(+), 44 deletions(-) diff --git a/apps/cic-eth/cic_eth/runnable/daemons/dispatcher.py b/apps/cic-eth/cic_eth/runnable/daemons/dispatcher.py index 1465b3b7..9f4ef332 100644 --- a/apps/cic-eth/cic_eth/runnable/daemons/dispatcher.py +++ b/apps/cic-eth/cic_eth/runnable/daemons/dispatcher.py @@ -88,7 +88,7 @@ run = True class DispatchSyncer: - yield_delay = 0.005 + yield_delay = 0.0005 def __init__(self, chain_spec): self.chain_spec = chain_spec diff --git a/apps/contract-migration/scripts/create_import_users.py b/apps/contract-migration/scripts/create_import_users.py index d8587ee0..e46d9e48 100644 --- a/apps/contract-migration/scripts/create_import_users.py +++ b/apps/contract-migration/scripts/create_import_users.py @@ -17,9 +17,7 @@ import random import vobject import celery from faker import Faker -import cic_eth_registry import confini -from cic_eth.api import Api from cic_types.models.person import ( Person, generate_vcard_from_contact_data, @@ -62,8 +60,6 @@ ts_then = int(dt_then.timestamp()) celery_app = celery.Celery(broker=config.get('CELERY_BROKER_URL'), backend=config.get('CELERY_RESULT_URL')) -api = Api(config.get('CIC_CHAIN_SPEC')) - gift_max = args.gift_threshold or 0 gift_factor = (10**6) diff --git a/apps/contract-migration/scripts/import_sovereign_users.py b/apps/contract-migration/scripts/import_sovereign_users.py index 39f4143a..30e3f5db 100644 --- a/apps/contract-migration/scripts/import_sovereign_users.py +++ b/apps/contract-migration/scripts/import_sovereign_users.py @@ -23,7 +23,7 @@ from chainlib.eth.gas import RPCGasOracle from chainlib.eth.nonce import RPCNonceOracle from cic_types.processor import generate_metadata_pointer from eth_accounts_index import AccountRegistry -from cic_eth_registry import CICRegistry +from contract_registry import Registry from crypto_dev_signer.keystore.dict import DictKeystore from crypto_dev_signer.eth.signer.defaultsigner import ReferenceSigner as EIP155Signer from crypto_dev_signer.keystore.keyfile import to_dict as to_keyfile_dict @@ -88,9 +88,11 @@ signer = EIP155Signer(keystore) nonce_oracle = RPCNonceOracle(signer_address, rpc) -CICRegistry.address = config.get('CIC_REGISTRY_ADDRESS') -registry = CICRegistry(chain_spec, rpc) -account_registry_address = registry.by_name('AccountRegistry') +registry = Registry() +o = registry.address_of(config.get('CIC_REGISTRY_ADDRESS'), 'AccountRegistry') +r = rpc.do(o) +account_registry_address = registry.parse_address_of(r) +logg.info('using account registry {}'.format(account_registry_address)) keyfile_dir = os.path.join(config.get('_USERDIR'), 'keystore') os.makedirs(keyfile_dir) diff --git a/apps/contract-migration/scripts/verify.py b/apps/contract-migration/scripts/verify.py index 0c7ddefa..08b791a7 100644 --- a/apps/contract-migration/scripts/verify.py +++ b/apps/contract-migration/scripts/verify.py @@ -10,6 +10,7 @@ import hashlib import csv import json import urllib +import copy # external imports import celery @@ -39,7 +40,6 @@ from chainlib.eth.gas import ( from chainlib.eth.tx import TxFactory from chainlib.eth.rpc import jsonrpc_template from chainlib.eth.error import EthException -from cic_eth.api.api_admin import AdminApi from cic_types.models.person import ( Person, generate_metadata_pointer, @@ -51,12 +51,27 @@ logg = logging.getLogger() config_dir = '/usr/local/etc/cic-syncer' +custodial_tests = [ + 'local_key', + 'gas', + 'faucet', + ] + +all_tests = custodial_tests + [ + 'accounts_index', + 'balance', + 'metadata', + ] + argparser = argparse.ArgumentParser(description='daemon that monitors transactions in new blocks') argparser.add_argument('-p', '--provider', dest='p', type=str, help='chain rpc provider address') argparser.add_argument('-c', type=str, default=config_dir, help='config root to use') argparser.add_argument('--old-chain-spec', type=str, dest='old_chain_spec', default='evm:oldchain:1', help='chain spec') argparser.add_argument('-i', '--chain-spec', type=str, dest='i', help='chain spec') argparser.add_argument('--meta-provider', type=str, dest='meta_provider', default='http://localhost:63380', help='cic-meta url') +argparser.add_argument('--skip-custodial', dest='skip_custodial', action='store_true', help='skip all custodial verifications') +argparser.add_argument('--exclude', action='append', type=str, default=[], help='skip specified verification') +argparser.add_argument('--include', action='append', type=str, help='include specified verification') argparser.add_argument('-r', '--registry-address', type=str, dest='r', help='CIC Registry address') 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('-x', '--exit-on-error', dest='x', action='store_true', help='Halt exection on error') @@ -95,14 +110,61 @@ user_dir = args.user_dir # user_out_dir from import_users.py meta_url = args.meta_provider exit_on_error = args.x +active_tests = [] +exclude = [] +include = args.include +if args.include == None: + include = all_tests +for t in args.exclude: + if t not in all_tests: + raise ValueError('Cannot exclude unknown verification "{}"'.format(t)) + exclude.append(t) +if args.skip_custodial: + logg.info('will skip all custodial verifications ({})'.format(','.join(custodial_tests))) + for t in custodial_tests: + if t not in exclude: + exclude.append(t) +for t in include: + if t not in all_tests: + raise ValueError('Cannot include unknown verification "{}"'.format(t)) + if t not in exclude: + active_tests.append(t) + logg.info('will perform verification "{}"'.format(t)) + +api = None +for t in custodial_tests: + if t in active_tests: + from cic_eth.api.api_admin import AdminApi + api = AdminApi(None) + logg.info('activating custodial module'.format(t)) + break + +cols = os.get_terminal_size().columns + + +def to_terminalwidth(s): + ss = s.ljust(int(cols)-1) + ss += "\r" + return ss + +def default_outfunc(s): + ss = to_terminalwidth(s) + sys.stdout.write(ss) +outfunc = default_outfunc +if logg.isEnabledFor(logging.DEBUG): + outfunc = logg.debug + class VerifierState: - def __init__(self, item_keys): + def __init__(self, item_keys, active_tests=None): self.items = {} for k in item_keys: - logg.info('k {}'.format(k)) self.items[k] = 0 + if active_tests == None: + self.active_tests = copy.copy(item_keys) + else: + self.active_tests = copy.copy(active_tests) def poke(self, item_key): @@ -112,7 +174,10 @@ class VerifierState: def __str__(self): r = '' for k in self.items.keys(): - r += '{}: {}\n'.format(k, self.items[k]) + if k in self.active_tests: + r += '{}: {}\n'.format(k, self.items[k]) + else: + r += '{}: skipped\n'.format(k) return r @@ -148,10 +213,10 @@ class Verifier: verifymethods = [] for k in dir(self): if len(k) > 7 and k[:7] == 'verify_': - logg.info('adding verify method {}'.format(k)) + logg.debug('verifier has verify method {}'.format(k)) verifymethods.append(k[7:]) - self.state = VerifierState(verifymethods) + self.state = VerifierState(verifymethods, active_tests=active_tests) def verify_accounts_index(self, address, balance=None): @@ -233,26 +298,14 @@ class Verifier: raise VerifierError(o_retrieved, 'metadata (person)') - def verify(self, address, balance): - logg.debug('verify {} {}'.format(address, balance)) + def verify(self, address, balance, debug_stem=None): - methods = [ - 'local_key', - 'accounts_index', - 'balance', - 'metadata', - 'gas', - 'faucet', - ] - - for k in methods: + for k in active_tests: + s = '{} {}'.format(debug_stem, k) + outfunc(s) try: m = getattr(self, 'verify_{}'.format(k)) m(address, balance) -# self.verify_local_key(address) -# self.verify_accounts_index(address) -# self.verify_balance(address, balance) -# self.verify_metadata(address) except VerifierError as e: logline = 'verification {} failed for {}: {}'.format(k, address, str(e)) if self.exit_on_error: @@ -266,10 +319,6 @@ class Verifier: return str(self.state) -class MockClient: - - w3 = None - def main(): global chain_str, block_offset, user_dir @@ -291,7 +340,6 @@ def main(): o['params'].append(txf.normalize(tx)) o['params'].append('latest') r = conn.do(o) - print('r {}'.format(r)) token_index_address = to_checksum_address(eth_abi.decode_single('address', bytes.fromhex(strip_0x(r)))) logg.info('found token index address {}'.format(token_index_address)) @@ -320,6 +368,7 @@ def main(): logg.info('found faucet {}'.format(faucet_address)) + # Get Sarafu token address tx = txf.template(ZERO_ADDRESS, token_index_address) data = add_0x(registry_addressof_method) @@ -333,7 +382,6 @@ def main(): o['params'].append(txf.normalize(tx)) o['params'].append('latest') r = conn.do(o) - print('r {}'.format(r)) sarafu_token_address = to_checksum_address(eth_abi.decode_single('address', bytes.fromhex(strip_0x(r)))) logg.info('found token address {}'.format(sarafu_token_address)) @@ -348,7 +396,7 @@ def main(): try: address = to_checksum_address(r[0]) #sys.stdout.write('loading balance {} {}'.format(i, address).ljust(200) + "\r") - logg.debug('loading balance {} {}'.format(i, address).ljust(200)) + outfunc('loading balance {} {}'.format(i, address)) #.ljust(200)) except ValueError: break balance = int(r[1].rstrip()) @@ -357,11 +405,10 @@ def main(): f.close() - api = AdminApi(MockClient()) - verifier = Verifier(conn, api, gas_oracle, chain_spec, account_index_address, sarafu_token_address, faucet_address, user_dir, exit_on_error) user_new_dir = os.path.join(user_dir, 'new') + i = 0 for x in os.walk(user_new_dir): for y in x[2]: if y[len(y)-5:] != '.json': @@ -377,7 +424,7 @@ def main(): f.close() u = Person.deserialize(o) - logg.debug('data {}'.format(u.identities['evm'])) + #logg.debug('data {}'.format(u.identities['evm'])) subchain_str = '{}:{}'.format(chain_spec.common_name(), chain_spec.network_id()) new_address = u.identities['evm'][subchain_str][0] @@ -388,9 +435,11 @@ def main(): balance = balances[old_address] except KeyError: logg.info('no old balance found for {}, assuming 0'.format(old_address)) - logg.debug('checking {} -> {} = {}'.format(old_address, new_address, balance)) - verifier.verify(new_address, balance) + s = 'checking {}: {} -> {} = {}'.format(i, old_address, new_address, balance) + + verifier.verify(new_address, balance, debug_stem=s) + i += 1 print(verifier) diff --git a/docker-compose.yml b/docker-compose.yml index 6fa6e8a1..5adf741f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -373,7 +373,7 @@ services: - -c - | if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi - ./start_retry.sh -v + ./start_retry.sh -vv # command: "/root/start_retry.sh -q cic-eth -vv"