Make Genesis block handle extra tokens for the leader (#2743)

This commit is contained in:
Sagar Dhawan
2019-02-12 15:49:23 -08:00
committed by GitHub
parent b33becabca
commit e26cd2eb26
7 changed files with 33 additions and 58 deletions

View File

@ -950,7 +950,6 @@ mod tests {
use super::*; use super::*;
use crate::entry::{next_entries, next_entry, Entry}; use crate::entry::{next_entries, next_entry, Entry};
use crate::gen_keys::GenKeys; use crate::gen_keys::GenKeys;
use crate::genesis_block::BOOTSTRAP_LEADER_TOKENS;
use bincode::serialize; use bincode::serialize;
use hashbrown::HashSet; use hashbrown::HashSet;
use solana_sdk::hash::hash; use solana_sdk::hash::hash;
@ -968,16 +967,13 @@ mod tests {
fn test_bank_new() { fn test_bank_new() {
let (genesis_block, _) = GenesisBlock::new(10_000); let (genesis_block, _) = GenesisBlock::new(10_000);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
assert_eq!( assert_eq!(bank.get_balance(&genesis_block.mint_id), 10_000);
bank.get_balance(&genesis_block.mint_id),
10_000 - genesis_block.bootstrap_leader_tokens
);
} }
#[test] #[test]
fn test_bank_new_with_leader() { fn test_bank_new_with_leader() {
let dummy_leader_id = Keypair::new().pubkey(); let dummy_leader_id = Keypair::new().pubkey();
let dummy_leader_tokens = BOOTSTRAP_LEADER_TOKENS; let dummy_leader_tokens = crate::genesis_block::BOOTSTRAP_LEADER_TOKENS;
let (genesis_block, _) = let (genesis_block, _) =
GenesisBlock::new_with_leader(10_000, dummy_leader_id, dummy_leader_tokens); GenesisBlock::new_with_leader(10_000, dummy_leader_id, dummy_leader_tokens);
assert_eq!(genesis_block.bootstrap_leader_tokens, dummy_leader_tokens); assert_eq!(genesis_block.bootstrap_leader_tokens, dummy_leader_tokens);
@ -1011,7 +1007,7 @@ mod tests {
#[test] #[test]
fn test_one_source_two_tx_one_batch() { fn test_one_source_two_tx_one_batch() {
let (genesis_block, mint_keypair) = GenesisBlock::new(1 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(1);
let key1 = Keypair::new().pubkey(); let key1 = Keypair::new().pubkey();
let key2 = Keypair::new().pubkey(); let key2 = Keypair::new().pubkey();
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
@ -1036,7 +1032,7 @@ mod tests {
#[test] #[test]
fn test_one_tx_two_out_atomic_fail() { fn test_one_tx_two_out_atomic_fail() {
let (genesis_block, mint_keypair) = GenesisBlock::new(1 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(1);
let key1 = Keypair::new().pubkey(); let key1 = Keypair::new().pubkey();
let key2 = Keypair::new().pubkey(); let key2 = Keypair::new().pubkey();
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
@ -1085,7 +1081,7 @@ mod tests {
#[test] #[test]
fn test_one_tx_two_out_atomic_pass() { fn test_one_tx_two_out_atomic_pass() {
let (genesis_block, mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(2);
let key1 = Keypair::new().pubkey(); let key1 = Keypair::new().pubkey();
let key2 = Keypair::new().pubkey(); let key2 = Keypair::new().pubkey();
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
@ -1108,7 +1104,7 @@ mod tests {
// See github issue 1157 (https://github.com/solana-labs/solana/issues/1157) // See github issue 1157 (https://github.com/solana-labs/solana/issues/1157)
#[test] #[test]
fn test_detect_failed_duplicate_transactions_issue_1157() { fn test_detect_failed_duplicate_transactions_issue_1157() {
let (genesis_block, mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(2);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let dest = Keypair::new(); let dest = Keypair::new();
@ -1144,7 +1140,7 @@ mod tests {
#[test] #[test]
fn test_account_not_found() { fn test_account_not_found() {
let (genesis_block, mint_keypair) = GenesisBlock::new(BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(0);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let keypair = Keypair::new(); let keypair = Keypair::new();
assert_eq!( assert_eq!(
@ -1156,7 +1152,7 @@ mod tests {
#[test] #[test]
fn test_insufficient_funds() { fn test_insufficient_funds() {
let (genesis_block, mint_keypair) = GenesisBlock::new(11_000 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(11_000);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let pubkey = Keypair::new().pubkey(); let pubkey = Keypair::new().pubkey();
bank.transfer(1_000, &mint_keypair, pubkey, genesis_block.last_id()) bank.transfer(1_000, &mint_keypair, pubkey, genesis_block.last_id())
@ -1189,7 +1185,7 @@ mod tests {
#[test] #[test]
fn test_debits_before_credits() { fn test_debits_before_credits() {
let (genesis_block, mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(2);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let keypair = Keypair::new(); let keypair = Keypair::new();
let tx0 = SystemTransaction::new_account( let tx0 = SystemTransaction::new_account(
@ -1216,7 +1212,7 @@ mod tests {
#[test] #[test]
fn test_process_empty_entry_is_registered() { fn test_process_empty_entry_is_registered() {
let (genesis_block, mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(2);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let keypair = Keypair::new(); let keypair = Keypair::new();
let entry = next_entry(&genesis_block.last_id(), 1, vec![]); let entry = next_entry(&genesis_block.last_id(), 1, vec![]);
@ -1323,15 +1319,7 @@ mod tests {
tokens: u64, tokens: u64,
num_one_token_transfers: usize, num_one_token_transfers: usize,
) -> (GenesisBlock, Keypair, impl Iterator<Item = Entry>) { ) -> (GenesisBlock, Keypair, impl Iterator<Item = Entry>) {
let mint_keypair = Keypair::new(); let (genesis_block, mint_keypair) = GenesisBlock::new(tokens);
let bootstrap_leader_vote_account_keypair = Keypair::new();
let genesis_block = GenesisBlock {
bootstrap_leader_id: Keypair::new().pubkey(),
bootstrap_leader_tokens: BOOTSTRAP_LEADER_TOKENS,
bootstrap_leader_vote_account_id: bootstrap_leader_vote_account_keypair.pubkey(),
mint_id: mint_keypair.pubkey(),
tokens,
};
let block = create_sample_block_with_ticks( let block = create_sample_block_with_ticks(
&genesis_block, &genesis_block,
&mint_keypair, &mint_keypair,
@ -1343,8 +1331,7 @@ mod tests {
#[test] #[test]
fn test_process_ledger_simple() { fn test_process_ledger_simple() {
let (genesis_block, mint_keypair, ledger) = let (genesis_block, mint_keypair, ledger) = create_sample_ledger(100, 3);
create_sample_ledger(100 + BOOTSTRAP_LEADER_TOKENS, 3);
let mut bank = Bank::default(); let mut bank = Bank::default();
bank.add_builtin_programs(); bank.add_builtin_programs();
bank.process_genesis_block(&genesis_block); bank.process_genesis_block(&genesis_block);
@ -1363,15 +1350,7 @@ mod tests {
#[test] #[test]
fn test_hash_internal_state() { fn test_hash_internal_state() {
let mint_keypair = Keypair::new(); let (genesis_block, mint_keypair) = GenesisBlock::new(2_000);
let bootstrap_leader_vote_account_keypair = Keypair::new();
let genesis_block = GenesisBlock {
bootstrap_leader_id: Keypair::new().pubkey(),
bootstrap_leader_tokens: BOOTSTRAP_LEADER_TOKENS,
bootstrap_leader_vote_account_id: bootstrap_leader_vote_account_keypair.pubkey(),
mint_id: mint_keypair.pubkey(),
tokens: 2_000,
};
let seed = [0u8; 32]; let seed = [0u8; 32];
let mut rnd = GenKeys::new(seed); let mut rnd = GenKeys::new(seed);
let keypairs = rnd.gen_n_keypairs(5); let keypairs = rnd.gen_n_keypairs(5);
@ -1418,7 +1397,7 @@ mod tests {
} }
#[test] #[test]
fn test_interleaving_locks() { fn test_interleaving_locks() {
let (genesis_block, mint_keypair) = GenesisBlock::new(3 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(3);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let alice = Keypair::new(); let alice = Keypair::new();
let bob = Keypair::new(); let bob = Keypair::new();
@ -1870,7 +1849,7 @@ mod tests {
} }
#[test] #[test]
fn test_bank_pay_to_self() { fn test_bank_pay_to_self() {
let (genesis_block, mint_keypair) = GenesisBlock::new(1 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(1);
let key1 = Keypair::new(); let key1 = Keypair::new();
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);

View File

@ -278,7 +278,7 @@ mod tests {
use crate::bank::Bank; use crate::bank::Bank;
use crate::banking_stage::BankingStageReturnType; use crate::banking_stage::BankingStageReturnType;
use crate::entry::EntrySlice; use crate::entry::EntrySlice;
use crate::genesis_block::{GenesisBlock, BOOTSTRAP_LEADER_TOKENS}; use crate::genesis_block::GenesisBlock;
use crate::packet::to_packets; use crate::packet::to_packets;
use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::signature::{Keypair, KeypairUtil};
use solana_sdk::system_transaction::SystemTransaction; use solana_sdk::system_transaction::SystemTransaction;
@ -286,7 +286,7 @@ mod tests {
#[test] #[test]
fn test_banking_stage_shutdown1() { fn test_banking_stage_shutdown1() {
let (genesis_block, _mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, _mint_keypair) = GenesisBlock::new(2);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let (verified_sender, verified_receiver) = channel(); let (verified_sender, verified_receiver) = channel();
let (to_validator_sender, _) = channel(); let (to_validator_sender, _) = channel();
@ -308,7 +308,7 @@ mod tests {
#[test] #[test]
fn test_banking_stage_shutdown2() { fn test_banking_stage_shutdown2() {
let (genesis_block, _mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, _mint_keypair) = GenesisBlock::new(2);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let (_verified_sender, verified_receiver) = channel(); let (_verified_sender, verified_receiver) = channel();
let (to_validator_sender, _) = channel(); let (to_validator_sender, _) = channel();
@ -330,7 +330,7 @@ mod tests {
#[test] #[test]
fn test_banking_stage_tick() { fn test_banking_stage_tick() {
let (genesis_block, _mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, _mint_keypair) = GenesisBlock::new(2);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let start_hash = bank.last_id(); let start_hash = bank.last_id();
let (verified_sender, verified_receiver) = channel(); let (verified_sender, verified_receiver) = channel();
@ -359,7 +359,7 @@ mod tests {
#[test] #[test]
fn test_banking_stage_entries_only() { fn test_banking_stage_entries_only() {
let (genesis_block, mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(2);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let start_hash = bank.last_id(); let start_hash = bank.last_id();
let (verified_sender, verified_receiver) = channel(); let (verified_sender, verified_receiver) = channel();
@ -418,7 +418,7 @@ mod tests {
// In this attack we'll demonstrate that a verifier can interpret the ledger // In this attack we'll demonstrate that a verifier can interpret the ledger
// differently if either the server doesn't signal the ledger to add an // differently if either the server doesn't signal the ledger to add an
// Entry OR if the verifier tries to parallelize across multiple Entries. // Entry OR if the verifier tries to parallelize across multiple Entries.
let (genesis_block, mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, mint_keypair) = GenesisBlock::new(2);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let (verified_sender, verified_receiver) = channel(); let (verified_sender, verified_receiver) = channel();
let (to_validator_sender, _) = channel(); let (to_validator_sender, _) = channel();
@ -486,7 +486,7 @@ mod tests {
// with reason BankingStageReturnType::LeaderRotation // with reason BankingStageReturnType::LeaderRotation
#[test] #[test]
fn test_max_tick_height_shutdown() { fn test_max_tick_height_shutdown() {
let (genesis_block, _mint_keypair) = GenesisBlock::new(2 + BOOTSTRAP_LEADER_TOKENS); let (genesis_block, _mint_keypair) = GenesisBlock::new(2);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let (_verified_sender_, verified_receiver) = channel(); let (_verified_sender_, verified_receiver) = channel();
let (to_validator_sender, _to_validator_receiver) = channel(); let (to_validator_sender, _to_validator_receiver) = channel();

View File

@ -24,7 +24,9 @@ pub struct GenesisBlock {
impl GenesisBlock { impl GenesisBlock {
#[allow(clippy::new_ret_no_self)] #[allow(clippy::new_ret_no_self)]
pub fn new(tokens: u64) -> (Self, Keypair) { pub fn new(tokens: u64) -> (Self, Keypair) {
assert!(tokens >= 2); let tokens = tokens
.checked_add(BOOTSTRAP_LEADER_TOKENS)
.unwrap_or(tokens);
let mint_keypair = Keypair::new(); let mint_keypair = Keypair::new();
let bootstrap_leader_keypair = Keypair::new(); let bootstrap_leader_keypair = Keypair::new();
let bootstrap_leader_vote_account_keypair = Keypair::new(); let bootstrap_leader_vote_account_keypair = Keypair::new();
@ -84,7 +86,7 @@ mod tests {
#[test] #[test]
fn test_genesis_block_new() { fn test_genesis_block_new() {
let (genesis_block, mint) = GenesisBlock::new(10_000); let (genesis_block, mint) = GenesisBlock::new(10_000);
assert_eq!(genesis_block.tokens, 10_000); assert_eq!(genesis_block.tokens, 10_000 + BOOTSTRAP_LEADER_TOKENS);
assert_eq!(genesis_block.mint_id, mint.pubkey()); assert_eq!(genesis_block.mint_id, mint.pubkey());
assert!(genesis_block.bootstrap_leader_id != Pubkey::default()); assert!(genesis_block.bootstrap_leader_id != Pubkey::default());
assert!(genesis_block.bootstrap_leader_vote_account_id != Pubkey::default()); assert!(genesis_block.bootstrap_leader_vote_account_id != Pubkey::default());

View File

@ -758,9 +758,8 @@ pub mod tests {
fn test_rank_active_set() { fn test_rank_active_set() {
let num_validators: usize = 101; let num_validators: usize = 101;
// Give genesis_block sum(1..num_validators) tokens // Give genesis_block sum(1..num_validators) tokens
let (genesis_block, mint_keypair) = GenesisBlock::new( let (genesis_block, mint_keypair) =
BOOTSTRAP_LEADER_TOKENS + (((num_validators + 1) / 2) * (num_validators + 1)) as u64, GenesisBlock::new((((num_validators + 1) / 2) * (num_validators + 1)) as u64);
);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let mut validators = vec![]; let mut validators = vec![];
let last_id = genesis_block.last_id(); let last_id = genesis_block.last_id();
@ -818,8 +817,7 @@ pub mod tests {
} }
// Break ties between validators with the same balances using public key // Break ties between validators with the same balances using public key
let (genesis_block, mint_keypair) = let (genesis_block, mint_keypair) = GenesisBlock::new((num_validators + 1) as u64);
GenesisBlock::new(BOOTSTRAP_LEADER_TOKENS + (num_validators + 1) as u64);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let mut tied_validators_pk = vec![]; let mut tied_validators_pk = vec![];
let last_id = genesis_block.last_id(); let last_id = genesis_block.last_id();
@ -939,9 +937,8 @@ pub mod tests {
// Create the bank and validators // Create the bank and validators
let (genesis_block, mint_keypair) = GenesisBlock::new( let (genesis_block, mint_keypair) = GenesisBlock::new(
BOOTSTRAP_LEADER_TOKENS ((((num_validators + 1) / 2) * (num_validators + 1))
+ ((((num_validators + 1) / 2) * (num_validators + 1)) + (num_vote_account_tokens * num_validators)) as u64,
+ (num_vote_account_tokens * num_validators)) as u64,
); );
let bank = Bank::new_with_leader_scheduler_config(&genesis_block, &leader_scheduler_config); let bank = Bank::new_with_leader_scheduler_config(&genesis_block, &leader_scheduler_config);
let mut validators = vec![]; let mut validators = vec![];

View File

@ -245,7 +245,7 @@ mod tests {
let required_balance = num_nodes * (num_nodes + 1) / 2; let required_balance = num_nodes * (num_nodes + 1) / 2;
// create a genesis block // create a genesis block
let (genesis_block, mint_keypair) = GenesisBlock::new(required_balance + 2); let (genesis_block, mint_keypair) = GenesisBlock::new(required_balance);
// describe the leader // describe the leader
let leader_info = ContactInfo::new_localhost(Keypair::new().pubkey(), 0); let leader_info = ContactInfo::new_localhost(Keypair::new().pubkey(), 0);

View File

@ -496,8 +496,7 @@ mod tests {
#[test] #[test]
fn test_rpc_new() { fn test_rpc_new() {
let (genesis_block, alice) = let (genesis_block, alice) = GenesisBlock::new(10_000);
GenesisBlock::new(10_000 + crate::genesis_block::BOOTSTRAP_LEADER_TOKENS);
let bank = Bank::new(&genesis_block); let bank = Bank::new(&genesis_block);
let cluster_info = Arc::new(RwLock::new(ClusterInfo::new(NodeInfo::default()))); let cluster_info = Arc::new(RwLock::new(ClusterInfo::new(NodeInfo::default())));
let rpc_addr = SocketAddr::new( let rpc_addr = SocketAddr::new(

View File

@ -326,8 +326,6 @@ pub mod tests {
let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance); let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance);
let tvu_addr = target1.info.tvu; let tvu_addr = target1.info.tvu;
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
// 2 tokens are consumed by the genesis
let starting_balance = starting_balance - 2;
assert_eq!(bank.get_balance(&mint_keypair.pubkey()), starting_balance); assert_eq!(bank.get_balance(&mint_keypair.pubkey()), starting_balance);
//start cluster_info1 //start cluster_info1