diff --git a/crates/arpa-node/README.md b/crates/arpa-node/README.md index c4fe8601..773e5a16 100644 --- a/crates/arpa-node/README.md +++ b/crates/arpa-node/README.md @@ -281,14 +281,12 @@ Configuration items in [`conf/config.yml`](conf/config.yml) are listed here: ``` logger: - node_id: running context_logging: false log_file_path: log/running/ rolling_file_size: 10 gb ``` - - node_id: Set a node id for logging. - - context_logging: Set whether to log context of current node info and group info. Since it will increase log size, it is recommended to set it to false in production. + - context_logging: Set whether to log context of current node info and group info. Since the log size will get a significant boost with this setting enabled, it is recommended to set it to false in production. - log_file_path: Set log file path. The `node-client` will create a `node.log` as well as a `node_err.log` under `log_file_path`, then log to them with info level and error level respectively. - rolling_file_size: Log file will be deleted when it reaches this size limit. The following units are supported (case insensitive): "b", "kb", "kib", "mb", "mib", "gb", "gib", "tb", "tib". The unit defaults to bytes if not specified. diff --git a/crates/arpa-node/conf/config.yml b/crates/arpa-node/conf/config.yml index 895b669d..4f6a449f 100644 --- a/crates/arpa-node/conf/config.yml +++ b/crates/arpa-node/conf/config.yml @@ -27,7 +27,6 @@ arpa_address: "0xa4F59C4Caf15641F32f5756E37d93912E7F96203" data_path: "./data0.sqlite" logger: - node_id: 0 context_logging: false log_file_path: log/0/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/src/node_client.rs b/crates/arpa-node/src/node_client.rs index de5566fb..0fce4ef3 100644 --- a/crates/arpa-node/src/node_client.rs +++ b/crates/arpa-node/src/node_client.rs @@ -1,6 +1,7 @@ use arpa_contract_client::controller::ControllerClientBuilder; use arpa_contract_client::controller::ControllerViews; use arpa_contract_client::node_registry::{NodeRegistryClientBuilder, NodeRegistryTransactions}; +use arpa_core::address_to_string; use arpa_core::build_wallet_from_config; use arpa_core::log::encoder::JsonEncoder; use arpa_core::Config; @@ -164,10 +165,14 @@ async fn main() -> Result<(), Box> { let config = Config::load(opt.config_path); + let wallet = build_wallet_from_config(config.get_account())?; + + let id_address = wallet.address(); + let logger_descriptor = config.get_logger_descriptor(); init_logger( - logger_descriptor.get_node_id(), + &address_to_string(id_address), logger_descriptor.get_context_logging(), logger_descriptor.get_log_file_path(), logger_descriptor.get_rolling_file_size(), @@ -177,10 +182,6 @@ async fn main() -> Result<(), Box> { let data_path = PathBuf::from(config.get_data_path()); - let wallet = build_wallet_from_config(config.get_account())?; - - let id_address = wallet.address(); - let is_new_run = !data_path.exists(); let is_eigenlayer = config.is_eigenlayer(); diff --git a/crates/arpa-node/src/node_config_checker.rs b/crates/arpa-node/src/node_config_checker.rs index 78fb7525..26f3f7ae 100644 --- a/crates/arpa-node/src/node_config_checker.rs +++ b/crates/arpa-node/src/node_config_checker.rs @@ -1,8 +1,7 @@ +use arpa_core::address_to_string; use arpa_core::build_wallet_from_config; use arpa_core::Config; use ethers::signers::Signer; -use ethers::types::Address; -use ethers::utils::keccak256; use std::path::PathBuf; use structopt::StructOpt; @@ -27,33 +26,7 @@ async fn main() -> Result<(), Box> { let wallet = build_wallet_from_config(config.get_account())?; - println!("{:?}", to_checksum(&wallet.address(), None)); + println!("{:?}", address_to_string(wallet.address())); Ok(()) } - -/// Converts an Ethereum address to the checksum encoding -/// Ref: -pub fn to_checksum(addr: &Address, chain_id: Option) -> String { - let prefixed_addr = match chain_id { - Some(chain_id) => format!("{}0x{:x}", chain_id, addr), - None => format!("{:x}", addr), - }; - let hash = hex::encode(keccak256(&prefixed_addr)); - let hash = hash.as_bytes(); - - let addr_hex = hex::encode(addr.as_bytes()); - let addr_hex = addr_hex.as_bytes(); - - addr_hex - .iter() - .zip(hash) - .fold("0x".to_owned(), |mut encoded, (addr, hash)| { - encoded.push(if *hash >= 56 { - addr.to_ascii_uppercase() as char - } else { - addr.to_ascii_lowercase() as char - }); - encoded - }) -} diff --git a/crates/arpa-node/test/conf/config_test_1.yml b/crates/arpa-node/test/conf/config_test_1.yml index 1efeaab2..ef019c20 100644 --- a/crates/arpa-node/test/conf/config_test_1.yml +++ b/crates/arpa-node/test/conf/config_test_1.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data1.sqlite" logger: - node_id: 1 context_logging: false log_file_path: log/1/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_10.yml b/crates/arpa-node/test/conf/config_test_10.yml index 9451a74d..624a39b9 100644 --- a/crates/arpa-node/test/conf/config_test_10.yml +++ b/crates/arpa-node/test/conf/config_test_10.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data10.sqlite" logger: - node_id: 10 context_logging: false log_file_path: log/10/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_2.yml b/crates/arpa-node/test/conf/config_test_2.yml index 8021760d..3db95be5 100644 --- a/crates/arpa-node/test/conf/config_test_2.yml +++ b/crates/arpa-node/test/conf/config_test_2.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data2.sqlite" logger: - node_id: 2 context_logging: false log_file_path: log/2/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_3.yml b/crates/arpa-node/test/conf/config_test_3.yml index 34dc7565..f9603596 100644 --- a/crates/arpa-node/test/conf/config_test_3.yml +++ b/crates/arpa-node/test/conf/config_test_3.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data3.sqlite" logger: - node_id: 3 context_logging: false log_file_path: log/3/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_4.yml b/crates/arpa-node/test/conf/config_test_4.yml index 5c08f131..dd8527d2 100644 --- a/crates/arpa-node/test/conf/config_test_4.yml +++ b/crates/arpa-node/test/conf/config_test_4.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data4.sqlite" logger: - node_id: 4 context_logging: false log_file_path: log/4/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_5.yml b/crates/arpa-node/test/conf/config_test_5.yml index e0ea0351..a826124d 100644 --- a/crates/arpa-node/test/conf/config_test_5.yml +++ b/crates/arpa-node/test/conf/config_test_5.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data5.sqlite" logger: - node_id: 5 context_logging: false log_file_path: log/5/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_6.yml b/crates/arpa-node/test/conf/config_test_6.yml index 2b6d8627..0ee546fb 100644 --- a/crates/arpa-node/test/conf/config_test_6.yml +++ b/crates/arpa-node/test/conf/config_test_6.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data6.sqlite" logger: - node_id: 6 context_logging: false log_file_path: log/6/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_7.yml b/crates/arpa-node/test/conf/config_test_7.yml index 35bd6cf1..fe7da02c 100644 --- a/crates/arpa-node/test/conf/config_test_7.yml +++ b/crates/arpa-node/test/conf/config_test_7.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data7.sqlite" logger: - node_id: 7 context_logging: false log_file_path: log/7/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_8.yml b/crates/arpa-node/test/conf/config_test_8.yml index b547b479..5c4451f1 100644 --- a/crates/arpa-node/test/conf/config_test_8.yml +++ b/crates/arpa-node/test/conf/config_test_8.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data8.sqlite" logger: - node_id: 8 context_logging: false log_file_path: log/8/ rolling_file_size: 10 gb diff --git a/crates/arpa-node/test/conf/config_test_9.yml b/crates/arpa-node/test/conf/config_test_9.yml index 999ea410..d3416620 100644 --- a/crates/arpa-node/test/conf/config_test_9.yml +++ b/crates/arpa-node/test/conf/config_test_9.yml @@ -17,7 +17,6 @@ adapter_address: "0x4c5859f0F772848b2D91F1D83E2Fe57935348029" data_path: "./data9.sqlite" logger: - node_id: 9 context_logging: false log_file_path: log/9/ rolling_file_size: 10 gb diff --git a/crates/core/src/types/config.rs b/crates/core/src/types/config.rs index cd539680..c52c8caf 100644 --- a/crates/core/src/types/config.rs +++ b/crates/core/src/types/config.rs @@ -112,7 +112,6 @@ impl Default for ConfigHolder { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct LoggerDescriptor { - node_id: String, context_logging: bool, log_file_path: String, #[serde(deserialize_with = "deserialize_limit")] @@ -122,7 +121,6 @@ pub struct LoggerDescriptor { impl Default for LoggerDescriptor { fn default() -> Self { Self { - node_id: "running".to_string(), context_logging: false, log_file_path: "log/running".to_string(), rolling_file_size: DEFAULT_ROLLING_LOG_FILE_SIZE, @@ -131,10 +129,6 @@ impl Default for LoggerDescriptor { } impl LoggerDescriptor { - pub fn get_node_id(&self) -> &str { - &self.node_id - } - pub fn get_context_logging(&self) -> bool { self.context_logging } diff --git a/crates/core/src/utils/mod.rs b/crates/core/src/utils/mod.rs index 58de04fc..200e875c 100644 --- a/crates/core/src/utils/mod.rs +++ b/crates/core/src/utils/mod.rs @@ -1,5 +1,8 @@ use chrono::Local; -use ethers_core::types::{Address, I256, U256}; +use ethers_core::{ + types::{Address, I256, U256}, + utils::{hex, keccak256}, +}; use log::info; /// The threshold max change/difference (in %) at which we will ignore the fee history values @@ -27,7 +30,7 @@ pub fn format_now_date() -> String { } pub fn address_to_string(address: Address) -> String { - format!("{:?}", address) + to_checksum(&address, None) } pub fn u256_to_vec(x: &U256) -> Vec { @@ -50,6 +53,32 @@ pub fn pad_to_bytes32(s: &[u8]) -> Option<[u8; 32]> { Some(result) } +/// Converts an Ethereum address to the checksum encoding +/// Ref: +pub fn to_checksum(addr: &Address, chain_id: Option) -> String { + let prefixed_addr = match chain_id { + Some(chain_id) => format!("{}0x{:x}", chain_id, addr), + None => format!("{:x}", addr), + }; + let hash = hex::encode(keccak256(&prefixed_addr)); + let hash = hash.as_bytes(); + + let addr_hex = hex::encode(addr.as_bytes()); + let addr_hex = addr_hex.as_bytes(); + + addr_hex + .iter() + .zip(hash) + .fold("0x".to_owned(), |mut encoded, (addr, hash)| { + encoded.push(if *hash >= 56 { + addr.to_ascii_uppercase() as char + } else { + addr.to_ascii_lowercase() as char + }); + encoded + }) +} + /// The EIP-1559 fee estimator which is based on the work by [ethers-rs](https://github.com/gakonst/ethers-rs/blob/e0e79df7e9032e882fce4f47bcc25d87bceaec68/ethers-core/src/utils/mod.rs#L500) and [MyCrypto](https://github.com/MyCryptoHQ/MyCrypto/blob/master/src/services/ApiService/Gas/eip1559.ts) pub fn eip1559_gas_price_estimator(base: U256, tips: Vec>) -> (U256, U256) { info!("base: {:?}", base); diff --git a/docker/deployments/internet-test/arpa-node/config_1.yml b/docker/deployments/internet-test/arpa-node/config_1.yml index f7a334c6..7cee941d 100644 --- a/docker/deployments/internet-test/arpa-node/config_1.yml +++ b/docker/deployments/internet-test/arpa-node/config_1.yml @@ -67,5 +67,3 @@ time_limits: use_jitter: false context_logging: false - -node_id: 1 diff --git a/docker/deployments/internet-test/arpa-node/config_2.yml b/docker/deployments/internet-test/arpa-node/config_2.yml index 43d88f1f..16ca383c 100644 --- a/docker/deployments/internet-test/arpa-node/config_2.yml +++ b/docker/deployments/internet-test/arpa-node/config_2.yml @@ -67,5 +67,3 @@ time_limits: use_jitter: false context_logging: false - -node_id: 2 diff --git a/docker/deployments/internet-test/arpa-node/config_3.yml b/docker/deployments/internet-test/arpa-node/config_3.yml index 1d6a8131..05396b66 100644 --- a/docker/deployments/internet-test/arpa-node/config_3.yml +++ b/docker/deployments/internet-test/arpa-node/config_3.yml @@ -67,5 +67,3 @@ time_limits: use_jitter: false context_logging: false - -node_id: 3 diff --git a/docker/deployments/localnet-test/arpa-node/config_1.yml b/docker/deployments/localnet-test/arpa-node/config_1.yml index dc8a82bf..3759a7a2 100644 --- a/docker/deployments/localnet-test/arpa-node/config_1.yml +++ b/docker/deployments/localnet-test/arpa-node/config_1.yml @@ -67,5 +67,3 @@ time_limits: use_jitter: false context_logging: false - -node_id: 1 diff --git a/docker/deployments/localnet-test/arpa-node/config_2.yml b/docker/deployments/localnet-test/arpa-node/config_2.yml index 50559735..456cede1 100644 --- a/docker/deployments/localnet-test/arpa-node/config_2.yml +++ b/docker/deployments/localnet-test/arpa-node/config_2.yml @@ -67,5 +67,3 @@ time_limits: use_jitter: false context_logging: false - -node_id: 2 diff --git a/docker/deployments/localnet-test/arpa-node/config_3.yml b/docker/deployments/localnet-test/arpa-node/config_3.yml index 8c31a3e9..16759c04 100644 --- a/docker/deployments/localnet-test/arpa-node/config_3.yml +++ b/docker/deployments/localnet-test/arpa-node/config_3.yml @@ -67,5 +67,3 @@ time_limits: use_jitter: false context_logging: false - -node_id: 3 diff --git a/docker/node-client/template.yml b/docker/node-client/template.yml index de9ed2c2..b2477703 100644 --- a/docker/node-client/template.yml +++ b/docker/node-client/template.yml @@ -23,7 +23,6 @@ adapter_address: "0xf6f449C580A668073c1742b8Bd07796D20129f7A" data_path: "./db/data1.sqlite" logger: - node_id: 1 context_logging: false log_file_path: log/1/ rolling_file_size: 10 gb diff --git a/scripts/main.py b/scripts/main.py index 319a414a..8f01952c 100644 --- a/scripts/main.py +++ b/scripts/main.py @@ -656,7 +656,6 @@ def deploy_nodes(): # ! Deploy Nodes # set node_id, data_path, and log_file_path data["data_path"] = f"./db/data{i+1}.sqlite" - data["logger"]["node_id"] = i + 1 data["logger"]["log_file_path"] = f"log/{i+1}/" # L1 data["adapter_address"] = l1_addresses["Adapter"] diff --git a/tests/scenarios/src/environment/node.py b/tests/scenarios/src/environment/node.py index a97e283f..06821b0c 100644 --- a/tests/scenarios/src/environment/node.py +++ b/tests/scenarios/src/environment/node.py @@ -8,7 +8,8 @@ import sys import re import grpc -sys.path.insert(1, 'tests/scenarios/src/environment/proto') + +sys.path.insert(1, "tests/scenarios/src/environment/proto") from google.protobuf.empty_pb2 import Empty import management_pb2_grpc import management_pb2 @@ -55,7 +56,7 @@ def call_request(endpoint, request_name, **args): request = get_request(request_name, **args) function = getattr(stub, request_name) metadata = [] - metadata.append(('authorization', 'for_test')) + metadata.append(("authorization", "for_test")) response = function(request, metadata=metadata) return response @@ -74,8 +75,11 @@ def parse_chain_result_to_account_list(): """ Parse the result of the chain command to a list of Account objects. """ - with open('tests/scenarios/src/environment/node_config/accounts.txt', 'r', - encoding='utf-8') as file: + with open( + "tests/scenarios/src/environment/node_config/accounts.txt", + "r", + encoding="utf-8", + ) as file: # creating two arrays of accounts and private keys accounts = [] private_keys = [] @@ -83,14 +87,14 @@ def parse_chain_result_to_account_list(): for line in file: is_private_key = False # locating private keys - matches = re.finditer('(0x)?[A-Fa-f0-9]{64}', line) + matches = re.finditer("(0x)?[A-Fa-f0-9]{64}", line) for match in matches: private_keys.append(match.group()) is_private_key = True if is_private_key: continue # locating accounts - matches = re.finditer('(0x)?[A-Fa-f0-9]{40}', line) + matches = re.finditer("(0x)?[A-Fa-f0-9]{40}", line) for match in matches: accounts.append(match.group()) # Create a list of Account objects using the namedtuple syntax @@ -98,7 +102,9 @@ def parse_chain_result_to_account_list(): return account_list -def create_relay_list(op_endpoint=None, op_chain_id=None, base_endpoint=None, base_chain_id=None): +def create_relay_list( + op_endpoint=None, op_chain_id=None, base_endpoint=None, base_chain_id=None +): """ Create the relay list. """ @@ -152,18 +158,20 @@ def generate_relay_string(description, chain_id, endpoint): relay_chain_config = [] if op_endpoint is not None and op_chain_id is not None: - relay_chain_config.append( - generate_relay_string("OP", op_chain_id, op_endpoint)) + relay_chain_config.append(generate_relay_string("OP", op_chain_id, op_endpoint)) if base_endpoint is not None and base_chain_id is not None: - relay_chain_config.append(generate_relay_string( - "base", base_chain_id, base_endpoint)) + relay_chain_config.append( + generate_relay_string("base", base_chain_id, base_endpoint) + ) - joined_list = '\n '.join(relay_chain_config) + joined_list = "\n ".join(relay_chain_config) return joined_list -def create_node_config(controller_address, adapter_address, relayer_address, chain_id, relay_config): +def create_node_config( + controller_address, adapter_address, relayer_address, chain_id, relay_config +): """ Create the node config files. """ @@ -171,14 +179,14 @@ def create_node_config(controller_address, adapter_address, relayer_address, cha account_list = parse_chain_result_to_account_list() provider_endpoint = "ws://127.0.0.1:8545" relay_chain_config = relay_config - if chain_id == '900': + if chain_id == "900": provider_endpoint = "ws://127.0.0.1:8546" # Loop through accounts i = 0 for account in account_list: - key = account.key.replace('0x', '') + key = account.key.replace("0x", "") # Create filename - file_name = f'config{i + 1}.yml' + file_name = f"config{i + 1}.yml" # Create contents content = f"""node_committer_rpc_endpoint: \"[::1]:501{61 + i}\" @@ -249,7 +257,6 @@ def create_node_config(controller_address, adapter_address, relayer_address, cha max_attempts: 5 use_jitter: false logger: - node_id: {i + 1} context_logging: true log_file_path: log/{i + 1}/ rolling_file_size: 10 gb @@ -259,8 +266,11 @@ def create_node_config(controller_address, adapter_address, relayer_address, cha """ # Write out to file - with open('tests/scenarios/src/environment/node_config/'+file_name, 'w', - encoding='utf-8') as file: + with open( + "tests/scenarios/src/environment/node_config/" + file_name, + "w", + encoding="utf-8", + ) as file: file.write(content) i += 1 @@ -272,17 +282,19 @@ def start_node(node_idx): """ root_path = os.path.dirname(os.path.abspath(__file__)) root_path = root_path.split("/tests/")[0] - cmd = ("cd crates/arpa-node;" - "cargo run --bin node-client -- -c " - "{}/tests/scenarios/src/environment/node_config/config{}.yml" - ).format(root_path, node_idx) + cmd = ( + "cd crates/arpa-node;" + "cargo run --bin node-client -- -c " + "{}/tests/scenarios/src/environment/node_config/config{}.yml" + ).format(root_path, node_idx) log_path = f"crates/arpa-node/log/running/node{node_idx}.log" # Check if file exists, if not create an empty file if not os.path.exists(log_path): - open(log_path, 'w', encoding='UTF-8').close() - with open(log_path, 'w', encoding='utf-8') as log_file: - proc = subprocess.Popen(cmd, shell=True, stdout=log_file, - stderr=subprocess.STDOUT, cwd=root_path) + open(log_path, "w", encoding="UTF-8").close() + with open(log_path, "w", encoding="utf-8") as log_file: + proc = subprocess.Popen( + cmd, shell=True, stdout=log_file, stderr=subprocess.STDOUT, cwd=root_path + ) return proc @@ -301,10 +313,10 @@ def kill_process_by_port(port): port: port number. """ if platform.system() == "Windows": - command = f'FOR /F "tokens=5 delims= " %P IN (\'netstat -a -n -o ^| findstr :{port}\') DO TaskKill.exe /F /PID %P' + command = f"FOR /F \"tokens=5 delims= \" %P IN ('netstat -a -n -o ^| findstr :{port}') DO TaskKill.exe /F /PID %P" os.system(command) else: - command = f'lsof -ti :{port} | xargs -r kill -9' + command = f"lsof -ti :{port} | xargs -r kill -9" subprocess.call(command, shell=True) @@ -325,7 +337,7 @@ def get_node_port_from_index(node_idx): node_idx: index of the node. """ port = 50201 + int(node_idx) - 1 - return 'localhost:' + str(port) + return "localhost:" + str(port) def add_process_to_list(proc, node_list): @@ -353,11 +365,11 @@ def print_node_process(): Get the process of a node. """ # Find all processes using ports 50061-50110 - cmd = 'lsof -i :50061-50220' + cmd = "lsof -i :50061-50220" proc = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) out, _ = proc.communicate() for line in out.splitlines()[1:]: fields = line.strip().split() if fields: - if fields[0] == b'node-clie': + if fields[0] == b"node-clie": print(fields)