diff --git a/Cargo.lock b/Cargo.lock index 66ff2fb3d6..cec7a432e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2620,11 +2620,14 @@ dependencies = [ "bytes", "envy", "ethereum-types", + "ethrex-common", "ethrex-rpc", + "ethrex-sdk", "hex", "jsonwebtoken", "keccak-hash", "reqwest", + "secp256k1", "serde", "serde_json", "sha2 0.10.8", diff --git a/cmd/ethrex/Cargo.toml b/cmd/ethrex/Cargo.toml index 9d33b04904..e5a6025a33 100644 --- a/cmd/ethrex/Cargo.toml +++ b/cmd/ethrex/Cargo.toml @@ -48,4 +48,4 @@ metrics = ["ethrex-blockchain/metrics", "ethrex-l2/metrics"] libmdbx = ["ethrex-storage/libmdbx"] redb = ["dep:redb", "ethrex-storage/redb"] blst = ["ethrex-vm/blst"] -l2 = ["dep:ethrex-l2", "ethrex-vm/l2"] +l2 = ["dep:ethrex-l2", "ethrex-vm/l2", "dep:ethrex-dev"] diff --git a/cmd/ethrex/ethrex.rs b/cmd/ethrex/ethrex.rs index 62631a2680..ea73d6ac97 100644 --- a/cmd/ethrex/ethrex.rs +++ b/cmd/ethrex/ethrex.rs @@ -292,6 +292,9 @@ async fn main() { error!("Cannot run with DEV_MODE if the `l2` feature is enabled."); panic!("Run without the --dev argument."); } + use ethrex_dev; + let l2_pks = include_str!("../../test_data/private_keys.txt"); + ethrex_dev::utils::show_rich_accounts(&genesis, l2_pks); let l2_proposer = ethrex_l2::start_proposer(store).into_future(); tracker.spawn(l2_proposer); } else if #[cfg(feature = "dev")] { @@ -299,6 +302,8 @@ async fn main() { // Start the block_producer module if devmode was set if dev_mode { info!("Runnning in DEV_MODE"); + let l1_pks = include_str!("../../test_data/private_keys_l1.txt"); + ethrex_dev::utils::show_rich_accounts(&genesis, l1_pks); let authrpc_jwtsecret = std::fs::read(authrpc_jwtsecret).expect("Failed to read JWT secret"); let head_block_hash = { diff --git a/cmd/ethrex_l2/src/commands/wallet.rs b/cmd/ethrex_l2/src/commands/wallet.rs index bfd2430d1c..4dc187ad58 100644 --- a/cmd/ethrex_l2/src/commands/wallet.rs +++ b/cmd/ethrex_l2/src/commands/wallet.rs @@ -2,7 +2,6 @@ use crate::config::EthrexL2Config; use bytes::Bytes; use clap::Subcommand; use ethereum_types::{Address, H256, U256}; -use ethrex_common::types::Transaction; use ethrex_l2_sdk::calldata::{encode_calldata, Value}; use ethrex_l2_sdk::merkle_tree::merkle_proof; use ethrex_l2_sdk::{get_withdrawal_hash, COMMON_BRIDGE_L2_ADDRESS, L2_WITHDRAW_SIGNATURE}; diff --git a/crates/blockchain/dev/Cargo.toml b/crates/blockchain/dev/Cargo.toml index 85450b30c5..22c3677759 100644 --- a/crates/blockchain/dev/Cargo.toml +++ b/crates/blockchain/dev/Cargo.toml @@ -7,6 +7,8 @@ edition = "2021" [dependencies] ethrex-rpc.workspace = true +ethrex-common.workspace = true +ethrex-sdk.workspace = true tokio.workspace = true tracing.workspace = true @@ -21,6 +23,7 @@ reqwest = { version = "0.12.7", features = ["json"] } envy = "0.4.2" keccak-hash.workspace = true sha2 = "0.10.8" +secp256k1.workspace = true [lib] path = "./dev.rs" diff --git a/crates/blockchain/dev/dev.rs b/crates/blockchain/dev/dev.rs index fe770290b2..0ce0c5892a 100644 --- a/crates/blockchain/dev/dev.rs +++ b/crates/blockchain/dev/dev.rs @@ -1 +1,2 @@ pub mod block_producer; +pub mod utils; diff --git a/crates/blockchain/dev/utils.rs b/crates/blockchain/dev/utils.rs new file mode 100644 index 0000000000..507991f23d --- /dev/null +++ b/crates/blockchain/dev/utils.rs @@ -0,0 +1,57 @@ +use std::collections::HashMap; + +use ethereum_types::{H160, U256}; +use ethrex_common::types::Genesis; +use ethrex_l2_sdk::get_address_from_secret_key; +use keccak_hash::H256; +use secp256k1::SecretKey; + +pub const NUMBER_OF_TOP_ACCOUNTS: usize = 10; + +pub fn show_rich_accounts(genesis: &Genesis, contents: &str) { + let private_keys: Vec = contents + .lines() + .filter(|line| !line.trim().is_empty()) + .map(|line| line.trim().to_string()) + .collect(); + + let mut address_to_pk = HashMap::new(); + for pk in private_keys.iter() { + let pk_str = pk.strip_prefix("0x").unwrap_or(pk); + let Ok(pk_h256) = pk_str.parse::() else { + return; + }; + let pk_bytes = pk_h256.as_bytes(); + let Ok(secret_key) = SecretKey::from_slice(pk_bytes) else { + return; + }; + let Ok(address) = get_address_from_secret_key(&secret_key) else { + return; + }; + address_to_pk.insert(address, pk); + } + + let mut top_accounts: Vec<(&H160, U256)> = genesis + .alloc + .iter() + .map(|(address, account)| (address, account.balance)) + .collect(); + top_accounts.sort_by(|a, b| b.1.cmp(&a.1)); // sort by greater balance + top_accounts.truncate(NUMBER_OF_TOP_ACCOUNTS); + + println!("Showing first {} accounts", NUMBER_OF_TOP_ACCOUNTS); + println!("-------------------------------------------------------------------------------"); + for (address, balance) in top_accounts { + let Some(pk) = address_to_pk.get(address) else { + continue; + }; + println!("Private Key: {}", pk); + println!("Address: {:?} (Ξ {})", address, wei_to_eth(balance)); + println!("-------------------------------------------------------------------------------"); + } +} + +pub fn wei_to_eth(wei: U256) -> U256 { + wei.checked_div(U256::from_dec_str("1000000000000000000").unwrap()) + .unwrap_or(U256::zero()) +} diff --git a/test_data/private_keys_l1.txt b/test_data/private_keys_l1.txt new file mode 100644 index 0000000000..9a1763ac8c --- /dev/null +++ b/test_data/private_keys_l1.txt @@ -0,0 +1,21 @@ +0xbcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31 +0x39725efee3fb28614de3bacaffe4cc4bd8c436257e2c8bb887c4b5c4be45e76d +0x53321db7c1e331d93a11a41d16f004d7ff63972ec8ec7c25db329728ceeb1710 +0xab63b23eb7941c1251757e24b3d2350d2bc05c3c388d06f8fe6feafefb1e8c70 +0x5d2344259f42259f82d2c140aa66102ba89b57b4883ee441a8b312622bd42491 +0x27515f805127bebad2fb9b183508bdacb8c763da16f54e0678b16e8f28ef3fff +0x7ff1a4c1d57e5e784d327c4c7651e952350bc271f156afb3d00d20f5ef924856 +0x3a91003acaf4c21b3953d94fa4a6db694fa69e5242b2e37be05dd82761058899 +0xbb1d0f125b4fb2bb173c318cdead45468474ca71474e2247776b2b4c0fa2d3f5 +0x850643a0224065ecce3882673c21f56bcf6eef86274cc21cadff15930b59fc8c +0x94eb3102993b41ec55c241060f47daa0f6372e2e3ad7e91612ae36c364042e44 +0xdaf15504c22a352648a71ef2926334fe040ac1d5005019e09f6c979808024dc7 +0xeaba42282ad33c8ef2524f07277c03a776d98ae19f581990ce75becb7cfa1c23 +0x3fd98b5187bf6526734efaa644ffbb4e3670d66f5d0268ce0323ec09124bff61 +0x5288e2f440c7f0cb61a9be8afdeb4295f786383f96f5e35eb0c94ef103996b64 +0xf296c7802555da2a5a662be70e078cbd38b44f96f8615ae529da41122ce8db05 +0xbf3beef3bd999ba9f2451e06936f0423cd62b815c9233dd3bc90f7e02a1e8673 +0x6ecadc396415970e91293726c3f5775225440ea0844ae5616135fd10d66b5954 +0xa492823c3e193d6c595f37a18e3c06650cf4c74558cc818b16130b293716106f +0xc5114526e042343c6d1899cad05e1c00ba588314de9b96929914ee0df18d46b2 +0x04b9f63ecf84210c5366c66d68fa1f5da1fa4f634fad6dfc86178e4d79ff9e59