diff --git a/scripts/nodelib.py b/scripts/nodelib.py index 3d038d24cb9..35576272a6a 100755 --- a/scripts/nodelib.py +++ b/scripts/nodelib.py @@ -41,18 +41,22 @@ def get_chain_id_from_flags(flags): return chain_id_flags[0][len('--chain-id='):] return '' +"""Compile given package using cargo""" +def compile_package(package_name, is_release): + flags = ['-p', package_name] + if is_release: + flags = ['--release'] + flags + code = subprocess.call( + [os.path.expanduser('cargo'), 'build'] + flags) + if code != 0: + print("Compilation failed, aborting") + exit(code) + """Checks if there is already everything setup on this machine, otherwise sets up NEAR node.""" def check_and_setup(nodocker, is_release, image, home_dir, init_flags): if nodocker: - flags = ['-p', 'near'] - if is_release: - flags = ['--release'] + flags - code = subprocess.call( - [os.path.expanduser('cargo'), 'build'] + flags) - if code != 0: - print("Compilation failed, aborting") - exit(code) + compile_package('near', is_release) chain_id = get_chain_id_from_flags(init_flags) if os.path.exists(os.path.join(home_dir, 'config.json')): @@ -182,3 +186,87 @@ def setup_and_run(nodocker, is_release, image, home_dir, init_flags, boot_nodes, def stop_docker(): docker_stop_if_exists('watchtower') docker_stop_if_exists('nearcore') + +def generate_node_key(home, is_release, nodocker, image): + print("Generating node key...") + if nodocker: + cmd = ['./target/%s/keypair-generator' % ('release' if is_release else 'debug')] + cmd.extend(['--home', home]) + cmd.extend(['--generate-config']) + cmd.extend(['--account-id', '']) + cmd.extend(['node-key']) + try: + subprocess.call(cmd) + except KeyboardInterrupt: + print("\nStopping NEARCore.") + else: + subprocess.check_output(['docker', 'run', '-v', '%s:/srv/keypair-generator' % home, '-it', image, 'keypair-generator', '--home=/srv/keypair-generator', '--generate-config', '--account-id=''', 'node-key']) + print("Node key generated") + +def generate_validator_key(home, is_release, nodocker, image, account_id): + print("Generating validator key...") + if nodocker: + cmd = ['./target/%s/keypair-generator' % ('release' if is_release else 'debug')] + cmd.extend(['--home', home]) + cmd.extend(['--generate-config']) + cmd.extend(['--account-id', account_id]) + cmd.extend(['signer-keys']) + try: + subprocess.call(cmd) + except KeyboardInterrupt: + print("\nStopping NEARCore.") + else: + subprocess.check_output(['docker', 'run', '-v', '%s:/srv/keypair-generator' % home, '-it', image, 'keypair-generator', '--home=/srv/keypair-generator', '--generate-config', '--account-id=%s' % account_id, 'signer-keys']) + print("Validator key generated") + + +def initialize_keys(home, is_release, nodocker, image, account_id): + if nodocker: + install_cargo() + compile_package('keypair-generator', is_release) + else: + try: + subprocess.check_output(['docker', 'pull', image]) + except subprocess.CalledProcessError as exc: + print("Failed to fetch docker containers: %s" % exc) + exit(1) + generate_node_key(home, is_release, nodocker, image) + if account_id: + generate_validator_key(home, is_release, nodocker, image, account_id) + +def create_genesis(home, is_release, nodocker, image, chain_id): + if os.path.exists(os.path.join(home, 'genesis.json')): + print("Genesis already exists") + return + print("Creating genesis...") + if not os.path.exists(os.path.join(home, 'accounts.csv')): + raise Exception("Failed to generate genesis: accounts.csv does not exist") + if nodocker: + cmd = ['./target/%s/genesis-csv-to-json' % ('release' if is_release else 'debug')] + cmd.extend(['--home', home]) + cmd.extend(['--chain-id', chain_id]) + try: + subprocess.call(cmd) + except KeyboardInterrupt: + print("\nStopping NEARCore.") + else: + subprocess.check_output(['docker', 'run', '-v', '%s:/srv/genesis-csv-to-json' % home, '-it', image, 'genesis-csv-to-json', '--home=/srv/genesis-csv-to-json', '--chain-id=%s' % chain_id]) + print("Genesis created") + +def start_stakewars(home, is_release, nodocker, image, verbose): + if nodocker: + install_cargo() + compile_package('genesis-csv-to-json', is_release) + else: + try: + subprocess.check_output(['docker', 'pull', image]) + except subprocess.CalledProcessError as exc: + print("Failed to fetch docker containers: %s" % exc) + exit(1) + create_genesis(home, is_release, nodocker, image, 'stakewars') + if nodocker: + run_nodocker(home, is_release, '', verbose) + else: + run_docker(image, home, '', verbose) + + diff --git a/scripts/start_stakewars.py b/scripts/start_stakewars.py new file mode 100755 index 00000000000..43ee9488879 --- /dev/null +++ b/scripts/start_stakewars.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +import argparse +import os + +from nodelib import setup_and_run, initialize_keys, start_stakewars + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('--local', action='store_true', help='deprecated: use --nodocker') + parser.add_argument('--nodocker', action='store_true', help='If set, compiles and runs the node on the machine directly (not inside the docker).') + parser.add_argument('--debug', action='store_true', help='If set, compiles local nearcore in debug mode') + parser.add_argument('--verbose', action='store_true', help='If set, prints verbose logs') + parser.add_argument('--home', default=os.path.expanduser('~/.near/'), help='Home path for storing configs, keys and chain data (Default: ~/.near)') + parser.add_argument('--init', action='store_true', help='If set, initialize the home dir by generating validator key and node key') + parser.add_argument('--account-id', default='', help='If set, the account id will be used for running a validator') + parser.add_argument( + '--image', default='nearprotocol/nearcore:stakewars', + help='Image to run in docker (default: nearprotocol/nearcore:stakewars)') + args = parser.parse_args() + + if args.local: + print("Flag --local deprecated, please use --nodocker") + + nodocker = args.nodocker or args.local + if args.init: + initialize_keys(args.home, not args.debug, nodocker, args.image, args.account_id) + else: + print("****************************************************") + print("* Running NEAR validator node for Stake Wars *") + print("****************************************************") + start_stakewars(args.home, not args.debug, nodocker, args.image, args.verbose)