From 3897b66270ef5e979979d68d8bfdd128ca644942 Mon Sep 17 00:00:00 2001 From: Greg Fitzgerald Date: Tue, 26 Feb 2019 06:43:43 -0700 Subject: [PATCH] Let the bank creator decide where to send transaction fees --- runtime/src/bank.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 927130cd39..195a07776c 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -107,8 +107,11 @@ pub struct Bank { /// The number of slots in each epoch. slots_per_epoch: u64, - // A number of slots before slot_index 0. Used to calculate finalized staked nodes. + /// A number of slots before slot_index 0. Used to calculate finalized staked nodes. stakers_slot_offset: u64, + + /// The pubkey to send transactions fees to. + collector_id: Pubkey, } impl Bank { @@ -120,7 +123,7 @@ impl Bank { } /// Create a new bank that points to an immutable checkpoint of another bank. - pub fn new_from_parent_and_id(parent: &Arc, id: u64) -> Self { + pub fn new_from_parent_and_id(parent: &Arc, collector_id: Pubkey, id: u64) -> Self { parent.freeze(); let mut bank = Self::default(); @@ -132,6 +135,7 @@ impl Bank { bank.id = id; bank.parent = RwLock::new(Some(parent.clone())); bank.parent_hash = parent.hash(); + bank.collector_id = collector_id; bank } @@ -139,7 +143,8 @@ impl Bank { /// Create a new bank that points to an immutable checkpoint of another bank. /// TODO: remove me in favor of _and_id(), id should not be an assumed value pub fn new_from_parent(parent: &Arc) -> Self { - Self::new_from_parent_and_id(parent, parent.id() + 1) + let collector_id = parent.collector_id; + Self::new_from_parent_and_id(parent, collector_id, parent.id() + 1) } pub fn id(&self) -> u64 { @@ -197,6 +202,9 @@ impl Bank { assert!(genesis_block.tokens >= genesis_block.bootstrap_leader_tokens); assert!(genesis_block.bootstrap_leader_tokens >= 2); + // Bootstrap leader collects fees until `new_from_parent_and_id` is called. + self.collector_id = genesis_block.bootstrap_leader_id; + let mint_tokens = genesis_block.tokens - genesis_block.bootstrap_leader_tokens; self.deposit(&genesis_block.mint_id, mint_tokens); @@ -511,7 +519,7 @@ impl Bank { _ => res.clone(), }) .collect(); - self.deposit(&self.slot_leader(), fees); + self.deposit(&self.collector_id, fees); results } @@ -1470,8 +1478,9 @@ mod tests { #[test] fn test_bank_hash_internal_state_squash() { + let collector_id = Pubkey::default(); let bank0 = Arc::new(Bank::new(&GenesisBlock::new(10).0)); - let bank1 = Bank::new_from_parent_and_id(&bank0, 1); + let bank1 = Bank::new_from_parent_and_id(&bank0, collector_id, 1); // no delta in bank1, hashes match assert_eq!(bank0.hash_internal_state(), bank1.hash_internal_state());