def test_privtopub(): privkey = sha3(b'secret') pubkey = ( 'c283b0507c4ec6903a49fac84a5aead951f3c38b2c72b69da8a70a5bac91e9c' '705f70c7554b26e82b90d2d1bbbaf711b10c6c8b807077f4070200a8fb4c6b771') assert pubkey == privtopub(privkey).hex()
def geth_node_config(miner_pkey, p2p_port, rpc_port): address = privatekey_to_address(miner_pkey) pub = remove_0x_prefix(encode_hex(privtopub(miner_pkey))) config = { 'nodekey': miner_pkey, 'nodekeyhex': remove_0x_prefix(encode_hex(miner_pkey)), 'pub': pub, 'address': address, 'port': p2p_port, 'rpcport': rpc_port, 'enode': f'enode://{pub}@127.0.0.1:{p2p_port}', } return config
def geth_node_config(miner_pkey, p2p_port, rpc_port): address = privatekey_to_address(miner_pkey) pub = remove_0x_prefix(encode_hex(privtopub(miner_pkey))) config = { 'nodekey': miner_pkey, 'nodekeyhex': remove_0x_prefix(encode_hex(miner_pkey)), 'pub': pub, 'address': address, 'port': p2p_port, 'rpcport': rpc_port, 'enode': f'enode://{pub}@127.0.0.1:{p2p_port}', } return config
def geth_create_blockchain(deploy_key, deploy_client, private_keys, blockchain_private_keys, rpc_ports, p2p_ports, base_datadir, verbosity, random_marker, genesis_path=None, logdirectory=None): # pylint: disable=too-many-locals,too-many-statements,too-many-arguments,too-many-branches nodes_configuration = [] key_p2p_rpc = zip(blockchain_private_keys, p2p_ports, rpc_ports) for pos, (key, p2p_port, rpc_port) in enumerate(key_p2p_rpc): config = dict() address = privatekey_to_address(key) # make the first node miner if pos == 0: config['unlock'] = 0 config['nodekey'] = key config['nodekeyhex'] = encode_hex(key) config['pub'] = encode_hex(privtopub(key)) config['address'] = address config['port'] = p2p_port config['rpcport'] = rpc_port config['enode'] = 'enode://{pub}@127.0.0.1:{port}'.format( pub=config['pub'], port=config['port'], ) nodes_configuration.append(config) for config in nodes_configuration: config['bootnodes'] = ','.join(node['enode'] for node in nodes_configuration) all_keys = set(private_keys) all_keys.add(deploy_key) all_keys = sorted(all_keys) cmds = [] for i, config in enumerate(nodes_configuration): # HACK: Use only the first 8 characters to avoid golang's issue # https://github.com/golang/go/issues/6895 (IPC bind fails with path # longer than 108 characters). # BSD (and therefore macOS) socket path length limit is 104 chars nodekey_part = config['nodekeyhex'][:8] nodedir = os.path.join(base_datadir, nodekey_part) node_genesis_path = os.path.join(nodedir, 'custom_genesis.json') assert len(nodedir + '/geth.ipc') <= 104, 'geth data path is too large' os.makedirs(nodedir) if genesis_path is None: geth_bare_genesis(node_genesis_path, all_keys, random_marker) else: shutil.copy(genesis_path, node_genesis_path) geth_init_datadir(nodedir, node_genesis_path) if 'unlock' in config: geth_create_account(nodedir, all_keys[i]) commandline = geth_to_cmd(config, nodedir, verbosity) cmds.append(commandline) # save current term settings before running geth if isinstance( sys.stdin, io.IOBase): # check that the test is running on non-capture mode term_settings = termios.tcgetattr(sys.stdin) stdout = None stderr = None processes_list = [] for pos, cmd in enumerate(cmds): if logdirectory: log_path = os.path.join(logdirectory, str(pos)) logfile = open(log_path, 'w') stdout = logfile stderr = logfile if '--unlock' in cmd: cmd.append('--mine') process = subprocess.Popen( cmd, universal_newlines=True, stdin=subprocess.PIPE, stdout=stdout, stderr=stderr, ) # --password wont work, write password to unlock process.stdin.write(DEFAULT_PASSPHRASE + os.linesep) # Passphrase: process.stdin.write(DEFAULT_PASSPHRASE + os.linesep) # Repeat passphrase: else: process = subprocess.Popen( cmd, universal_newlines=True, stdout=stdout, stderr=stderr, ) processes_list.append(process) try: geth_wait_and_check(deploy_client, private_keys, random_marker) for process in processes_list: process.poll() if process.returncode is not None: raise ValueError('geth failed to start') except (ValueError, RuntimeError) as e: # If geth_wait_and_check or the above loop throw an exception make sure # we don't end up with a rogue geth process running in the background for proccess in processes_list: process.terminate() raise e finally: # reenter echo mode (disabled by geth pasphrase prompt) if isinstance(sys.stdin, io.IOBase): termios.tcsetattr(sys.stdin, termios.TCSADRAIN, term_settings) return processes_list
def pubkey(self): """The account's public key or `None` if the account is locked""" if not self.locked: return privtopub(self.privkey) return None