Make Genesis block handle extra tokens for the leader (#2743)
This commit is contained in:
51
src/bank.rs
51
src/bank.rs
@ -950,7 +950,6 @@ mod tests {
|
||||
use super::*;
|
||||
use crate::entry::{next_entries, next_entry, Entry};
|
||||
use crate::gen_keys::GenKeys;
|
||||
use crate::genesis_block::BOOTSTRAP_LEADER_TOKENS;
|
||||
use bincode::serialize;
|
||||
use hashbrown::HashSet;
|
||||
use solana_sdk::hash::hash;
|
||||
@ -968,16 +967,13 @@ mod tests {
|
||||
fn test_bank_new() {
|
||||
let (genesis_block, _) = GenesisBlock::new(10_000);
|
||||
let bank = Bank::new(&genesis_block);
|
||||
assert_eq!(
|
||||
bank.get_balance(&genesis_block.mint_id),
|
||||
10_000 - genesis_block.bootstrap_leader_tokens
|
||||
);
|
||||
assert_eq!(bank.get_balance(&genesis_block.mint_id), 10_000);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bank_new_with_leader() {
|
||||
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, _) =
|
||||
GenesisBlock::new_with_leader(10_000, dummy_leader_id, dummy_leader_tokens);
|
||||
assert_eq!(genesis_block.bootstrap_leader_tokens, dummy_leader_tokens);
|
||||
@ -1011,7 +1007,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 key2 = Keypair::new().pubkey();
|
||||
let bank = Bank::new(&genesis_block);
|
||||
@ -1036,7 +1032,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 key2 = Keypair::new().pubkey();
|
||||
let bank = Bank::new(&genesis_block);
|
||||
@ -1085,7 +1081,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 key2 = Keypair::new().pubkey();
|
||||
let bank = Bank::new(&genesis_block);
|
||||
@ -1108,7 +1104,7 @@ mod tests {
|
||||
// See github issue 1157 (https://github.com/solana-labs/solana/issues/1157)
|
||||
#[test]
|
||||
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 dest = Keypair::new();
|
||||
|
||||
@ -1144,7 +1140,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 keypair = Keypair::new();
|
||||
assert_eq!(
|
||||
@ -1156,7 +1152,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 pubkey = Keypair::new().pubkey();
|
||||
bank.transfer(1_000, &mint_keypair, pubkey, genesis_block.last_id())
|
||||
@ -1189,7 +1185,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 keypair = Keypair::new();
|
||||
let tx0 = SystemTransaction::new_account(
|
||||
@ -1216,7 +1212,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 keypair = Keypair::new();
|
||||
let entry = next_entry(&genesis_block.last_id(), 1, vec![]);
|
||||
@ -1323,15 +1319,7 @@ mod tests {
|
||||
tokens: u64,
|
||||
num_one_token_transfers: usize,
|
||||
) -> (GenesisBlock, Keypair, impl Iterator<Item = Entry>) {
|
||||
let mint_keypair = Keypair::new();
|
||||
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 (genesis_block, mint_keypair) = GenesisBlock::new(tokens);
|
||||
let block = create_sample_block_with_ticks(
|
||||
&genesis_block,
|
||||
&mint_keypair,
|
||||
@ -1343,8 +1331,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_process_ledger_simple() {
|
||||
let (genesis_block, mint_keypair, ledger) =
|
||||
create_sample_ledger(100 + BOOTSTRAP_LEADER_TOKENS, 3);
|
||||
let (genesis_block, mint_keypair, ledger) = create_sample_ledger(100, 3);
|
||||
let mut bank = Bank::default();
|
||||
bank.add_builtin_programs();
|
||||
bank.process_genesis_block(&genesis_block);
|
||||
@ -1363,15 +1350,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_hash_internal_state() {
|
||||
let mint_keypair = Keypair::new();
|
||||
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 (genesis_block, mint_keypair) = GenesisBlock::new(2_000);
|
||||
let seed = [0u8; 32];
|
||||
let mut rnd = GenKeys::new(seed);
|
||||
let keypairs = rnd.gen_n_keypairs(5);
|
||||
@ -1418,7 +1397,7 @@ mod tests {
|
||||
}
|
||||
#[test]
|
||||
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 alice = Keypair::new();
|
||||
let bob = Keypair::new();
|
||||
@ -1870,7 +1849,7 @@ mod tests {
|
||||
}
|
||||
#[test]
|
||||
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 bank = Bank::new(&genesis_block);
|
||||
|
||||
|
@ -278,7 +278,7 @@ mod tests {
|
||||
use crate::bank::Bank;
|
||||
use crate::banking_stage::BankingStageReturnType;
|
||||
use crate::entry::EntrySlice;
|
||||
use crate::genesis_block::{GenesisBlock, BOOTSTRAP_LEADER_TOKENS};
|
||||
use crate::genesis_block::GenesisBlock;
|
||||
use crate::packet::to_packets;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use solana_sdk::system_transaction::SystemTransaction;
|
||||
@ -286,7 +286,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 (verified_sender, verified_receiver) = channel();
|
||||
let (to_validator_sender, _) = channel();
|
||||
@ -308,7 +308,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 (_verified_sender, verified_receiver) = channel();
|
||||
let (to_validator_sender, _) = channel();
|
||||
@ -330,7 +330,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 start_hash = bank.last_id();
|
||||
let (verified_sender, verified_receiver) = channel();
|
||||
@ -359,7 +359,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
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 start_hash = bank.last_id();
|
||||
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
|
||||
// differently if either the server doesn't signal the ledger to add an
|
||||
// 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 (verified_sender, verified_receiver) = channel();
|
||||
let (to_validator_sender, _) = channel();
|
||||
@ -486,7 +486,7 @@ mod tests {
|
||||
// with reason BankingStageReturnType::LeaderRotation
|
||||
#[test]
|
||||
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 (_verified_sender_, verified_receiver) = channel();
|
||||
let (to_validator_sender, _to_validator_receiver) = channel();
|
||||
|
@ -24,7 +24,9 @@ pub struct GenesisBlock {
|
||||
impl GenesisBlock {
|
||||
#[allow(clippy::new_ret_no_self)]
|
||||
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 bootstrap_leader_keypair = Keypair::new();
|
||||
let bootstrap_leader_vote_account_keypair = Keypair::new();
|
||||
@ -84,7 +86,7 @@ mod tests {
|
||||
#[test]
|
||||
fn test_genesis_block_new() {
|
||||
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!(genesis_block.bootstrap_leader_id != Pubkey::default());
|
||||
assert!(genesis_block.bootstrap_leader_vote_account_id != Pubkey::default());
|
||||
|
@ -758,9 +758,8 @@ pub mod tests {
|
||||
fn test_rank_active_set() {
|
||||
let num_validators: usize = 101;
|
||||
// Give genesis_block sum(1..num_validators) tokens
|
||||
let (genesis_block, mint_keypair) = GenesisBlock::new(
|
||||
BOOTSTRAP_LEADER_TOKENS + (((num_validators + 1) / 2) * (num_validators + 1)) as u64,
|
||||
);
|
||||
let (genesis_block, mint_keypair) =
|
||||
GenesisBlock::new((((num_validators + 1) / 2) * (num_validators + 1)) as u64);
|
||||
let bank = Bank::new(&genesis_block);
|
||||
let mut validators = vec![];
|
||||
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
|
||||
let (genesis_block, mint_keypair) =
|
||||
GenesisBlock::new(BOOTSTRAP_LEADER_TOKENS + (num_validators + 1) as u64);
|
||||
let (genesis_block, mint_keypair) = GenesisBlock::new((num_validators + 1) as u64);
|
||||
let bank = Bank::new(&genesis_block);
|
||||
let mut tied_validators_pk = vec![];
|
||||
let last_id = genesis_block.last_id();
|
||||
@ -939,9 +937,8 @@ pub mod tests {
|
||||
|
||||
// Create the bank and validators
|
||||
let (genesis_block, mint_keypair) = GenesisBlock::new(
|
||||
BOOTSTRAP_LEADER_TOKENS
|
||||
+ ((((num_validators + 1) / 2) * (num_validators + 1))
|
||||
+ (num_vote_account_tokens * num_validators)) as u64,
|
||||
((((num_validators + 1) / 2) * (num_validators + 1))
|
||||
+ (num_vote_account_tokens * num_validators)) as u64,
|
||||
);
|
||||
let bank = Bank::new_with_leader_scheduler_config(&genesis_block, &leader_scheduler_config);
|
||||
let mut validators = vec![];
|
||||
|
@ -245,7 +245,7 @@ mod tests {
|
||||
let required_balance = num_nodes * (num_nodes + 1) / 2;
|
||||
|
||||
// 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
|
||||
let leader_info = ContactInfo::new_localhost(Keypair::new().pubkey(), 0);
|
||||
|
@ -496,8 +496,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_rpc_new() {
|
||||
let (genesis_block, alice) =
|
||||
GenesisBlock::new(10_000 + crate::genesis_block::BOOTSTRAP_LEADER_TOKENS);
|
||||
let (genesis_block, alice) = GenesisBlock::new(10_000);
|
||||
let bank = Bank::new(&genesis_block);
|
||||
let cluster_info = Arc::new(RwLock::new(ClusterInfo::new(NodeInfo::default())));
|
||||
let rpc_addr = SocketAddr::new(
|
||||
|
@ -326,8 +326,6 @@ pub mod tests {
|
||||
let (genesis_block, mint_keypair) = GenesisBlock::new(starting_balance);
|
||||
let tvu_addr = target1.info.tvu;
|
||||
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);
|
||||
|
||||
//start cluster_info1
|
||||
|
Reference in New Issue
Block a user