From c34cc4918fed7201747fee437c24a9ed9b9de89f Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Sat, 5 Oct 2019 18:50:27 -0700 Subject: [PATCH] Prevent repeated accounts in genesis to avoid breaking account hashing --- local_cluster/src/local_cluster.rs | 7 ++++++- runtime/src/bank.rs | 27 +++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/local_cluster/src/local_cluster.rs b/local_cluster/src/local_cluster.rs index 44ba4be08c..2b7a4e0c6d 100644 --- a/local_cluster/src/local_cluster.rs +++ b/local_cluster/src/local_cluster.rs @@ -155,7 +155,12 @@ impl LocalCluster { storage_contract::create_validator_storage_account(leader_pubkey, 1), )); - // override staking config + // Replace staking config + genesis_block.accounts = genesis_block + .accounts + .into_iter() + .filter(|(pubkey, _)| *pubkey != stake_config::id()) + .collect(); genesis_block.accounts.push(( stake_config::id(), stake_config::create_account( diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index c5ca8c10ef..645c220f9d 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -611,11 +611,17 @@ impl Bank { self.update_fees(); for (pubkey, account) in genesis_block.accounts.iter() { + if self.get_account(&pubkey).is_some() { + panic!("{} repeated in genesis block", pubkey); + } self.store_account(pubkey, account); self.capitalization .fetch_add(account.lamports, Ordering::Relaxed); } for (pubkey, account) in genesis_block.rewards_pools.iter() { + if self.get_account(&pubkey).is_some() { + panic!("{} repeated in genesis block", pubkey); + } self.store_account(pubkey, account); } @@ -1637,7 +1643,10 @@ mod tests { #[test] fn test_bank_capitalization() { let bank = Arc::new(Bank::new(&GenesisBlock { - accounts: vec![(Pubkey::default(), Account::new(42, 0, &Pubkey::default()),); 42], + accounts: (0..42) + .into_iter() + .map(|_| (Pubkey::new_rand(), Account::new(42, 0, &Pubkey::default()))) + .collect(), ..GenesisBlock::default() })); assert_eq!(bank.capitalization(), 42 * 42); @@ -1649,13 +1658,15 @@ mod tests { fn test_bank_update_rewards() { // create a bank that ticks really slowly... let bank = Arc::new(Bank::new(&GenesisBlock { - accounts: vec![ - ( - Pubkey::default(), - Account::new(1_000_000_000, 0, &Pubkey::default()), - ); - 42 - ], + accounts: (0..42) + .into_iter() + .map(|_| { + ( + Pubkey::new_rand(), + Account::new(1_000_000_000, 0, &Pubkey::default()), + ) + }) + .collect(), // set it up so the first epoch is a full year long poh_config: PohConfig { target_tick_duration: Duration::from_secs(