Genesis block is now a json file

This commit is contained in:
Michael Vines
2019-01-24 12:04:04 -08:00
parent 06e3cd3d2a
commit 4bb6549895
30 changed files with 924 additions and 1052 deletions

View File

@@ -10,7 +10,6 @@ use solana::entry::{reconstruct_entries_from_blobs, Entry};
use solana::fullnode::{Fullnode, FullnodeReturnType};
use solana::gossip_service::GossipService;
use solana::leader_scheduler::{make_active_set_entries, LeaderScheduler, LeaderSchedulerConfig};
use solana::mint::Mint;
use solana::packet::SharedBlob;
use solana::poh_service::NUM_TICKS_PER_SECOND;
use solana::result;
@@ -135,7 +134,7 @@ fn test_multi_node_ledger_window() -> result::Result<()> {
let bob_pubkey = Keypair::new().pubkey();
let mut ledger_paths = Vec::new();
let (alice, leader_ledger_path) =
let (genesis_block, alice, leader_ledger_path) =
create_tmp_genesis("multi_node_ledger_window", 10_000, leader_data.id, 500);
ledger_paths.push(leader_ledger_path.clone());
@@ -146,14 +145,10 @@ fn test_multi_node_ledger_window() -> result::Result<()> {
// write a bunch more ledger into leader's ledger, this should populate the leader's window
// and force it to respond to repair from the ledger window
{
let entries = make_tiny_test_entries(alice.last_id(), 100);
let entries = make_tiny_test_entries(genesis_block.last_id(), 100);
let db_ledger = DbLedger::open(&leader_ledger_path).unwrap();
db_ledger
.write_entries(
DEFAULT_SLOT_HEIGHT,
solana::mint::NUM_GENESIS_ENTRIES as u64,
&entries,
)
.write_entries(DEFAULT_SLOT_HEIGHT, 0, &entries)
.unwrap();
}
@@ -238,7 +233,7 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> {
let bob_pubkey = Keypair::new().pubkey();
let mut ledger_paths = Vec::new();
let (alice, genesis_ledger_path) = create_tmp_genesis(
let (_genesis_block, alice, genesis_ledger_path) = create_tmp_genesis(
"multi_node_validator_catchup_from_zero",
10_000,
leader_data.id,
@@ -431,7 +426,7 @@ fn test_multi_node_basic() {
let bob_pubkey = Keypair::new().pubkey();
let mut ledger_paths = Vec::new();
let (alice, genesis_ledger_path) =
let (_genesis_block, alice, genesis_ledger_path) =
create_tmp_genesis("multi_node_basic", 10_000, leader_data.id, 500);
ledger_paths.push(genesis_ledger_path.clone());
@@ -536,7 +531,7 @@ fn test_boot_validator_from_file() -> result::Result<()> {
let bob_pubkey = Keypair::new().pubkey();
let mut ledger_paths = Vec::new();
let (alice, genesis_ledger_path) =
let (_genesis_block, alice, genesis_ledger_path) =
create_tmp_genesis("boot_validator_from_file", 100_000, leader_pubkey, 1000);
ledger_paths.push(genesis_ledger_path.clone());
@@ -621,7 +616,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> {
let leader_keypair = Arc::new(Keypair::new());
let initial_leader_balance = 500;
let (alice, ledger_path) = create_tmp_genesis(
let (_genesis_block, alice, ledger_path) = create_tmp_genesis(
"leader_restart_validator_start_from_old_ledger",
100_000 + 500 * solana::window_service::MAX_REPAIR_BACKOFF as u64,
leader_keypair.pubkey(),
@@ -732,7 +727,7 @@ fn test_multi_node_dynamic_network() {
let leader_pubkey = leader_keypair.pubkey().clone();
let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
let bob_pubkey = Keypair::new().pubkey();
let (alice, genesis_ledger_path) =
let (_genesis_block, alice, genesis_ledger_path) =
create_tmp_genesis("multi_node_dynamic_network", 10_000_000, leader_pubkey, 500);
let mut ledger_paths = Vec::new();
@@ -857,12 +852,7 @@ fn test_multi_node_dynamic_network() {
debug!("last_id: {}", last_id);
trace!("Executing leader transfer of 100");
let sig = client
.transfer(
100,
&alice_arc.read().unwrap().keypair(),
bob_pubkey,
&last_id,
)
.transfer(100, &alice_arc.read().unwrap(), bob_pubkey, &last_id)
.unwrap();
expected_balance += 100;
@@ -962,13 +952,14 @@ fn test_leader_to_validator_transition() {
// Initialize the leader ledger. Make a mint and a genesis entry
// in the leader ledger
let num_ending_ticks = 1;
let (mint, leader_ledger_path, genesis_entries) = create_tmp_sample_ledger(
"test_leader_to_validator_transition",
10_000,
num_ending_ticks,
leader_info.id,
500,
);
let (_genesis_block, mint_keypair, leader_ledger_path, genesis_entries) =
create_tmp_sample_ledger(
"test_leader_to_validator_transition",
10_000,
num_ending_ticks,
leader_info.id,
500,
);
let last_id = genesis_entries
.last()
@@ -978,7 +969,7 @@ fn test_leader_to_validator_transition() {
// Write the bootstrap entries to the ledger that will cause leader rotation
// after the bootstrap height
let (bootstrap_entries, _) =
make_active_set_entries(&validator_keypair, &mint.keypair(), &last_id, &last_id, 0);
make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 0);
{
let db_ledger = DbLedger::open(&leader_ledger_path).unwrap();
db_ledger
@@ -1040,8 +1031,13 @@ fn test_leader_to_validator_transition() {
// Poll to see that the bank state is updated after every transaction
// to ensure that each transaction is packaged as a single entry,
// so that we can be sure leader rotation is triggered
let result =
send_tx_and_retry_get_balance(&leader_info, &mint, &bob_pubkey, 1, Some(i as u64));
let result = send_tx_and_retry_get_balance(
&leader_info,
&mint_keypair,
&bob_pubkey,
1,
Some(i as u64),
);
// If the transaction wasn't reflected in the node, then we assume
// the node has transitioned already
@@ -1102,13 +1098,14 @@ fn test_leader_validator_basic() {
// Make a common mint and a genesis entry for both leader + validator ledgers
let num_ending_ticks = 1;
let (mint, leader_ledger_path, genesis_entries) = create_tmp_sample_ledger(
"test_leader_validator_basic",
10_000,
num_ending_ticks,
leader_info.id,
500,
);
let (_genesis_block, mint_keypair, leader_ledger_path, genesis_entries) =
create_tmp_sample_ledger(
"test_leader_validator_basic",
10_000,
num_ending_ticks,
leader_info.id,
500,
);
let validator_ledger_path = tmp_copy_ledger(&leader_ledger_path, "test_leader_validator_basic");
@@ -1125,7 +1122,7 @@ fn test_leader_validator_basic() {
// Write the bootstrap entries to the ledger that will cause leader rotation
// after the bootstrap height
let (active_set_entries, _vote_account_keypair) =
make_active_set_entries(&validator_keypair, &mint.keypair(), &last_id, &last_id, 0);
make_active_set_entries(&validator_keypair, &mint_keypair, &last_id, &last_id, 0);
{
let db_ledger = DbLedger::open(&leader_ledger_path).unwrap();
db_ledger
@@ -1184,7 +1181,8 @@ fn test_leader_validator_basic() {
// Poll to see that the bank state is updated after every transaction
// to ensure that each transaction is packaged as a single entry,
// so that we can be sure leader rotation is triggered
let result = send_tx_and_retry_get_balance(&leader_info, &mint, &bob_pubkey, 1, None);
let result =
send_tx_and_retry_get_balance(&leader_info, &mint_keypair, &bob_pubkey, 1, None);
// If the transaction wasn't reflected in the node, then we assume
// the node has transitioned already
@@ -1284,13 +1282,14 @@ fn test_dropped_handoff_recovery() {
// Make a common mint and a genesis entry for both leader + validator's ledgers
let num_ending_ticks = 1;
let (mint, genesis_ledger_path, genesis_entries) = create_tmp_sample_ledger(
"test_dropped_handoff_recovery",
10_000,
num_ending_ticks,
bootstrap_leader_info.id,
500,
);
let (_genesis_block, mint_keypair, genesis_ledger_path, genesis_entries) =
create_tmp_sample_ledger(
"test_dropped_handoff_recovery",
10_000,
num_ending_ticks,
bootstrap_leader_info.id,
500,
);
let last_id = genesis_entries
.last()
@@ -1309,7 +1308,7 @@ fn test_dropped_handoff_recovery() {
// Make the entries to give the next_leader validator some stake so that they will be in
// leader election active set
let (active_set_entries, _vote_account_keypair) =
make_active_set_entries(&next_leader_keypair, &mint.keypair(), &last_id, &last_id, 0);
make_active_set_entries(&next_leader_keypair, &mint_keypair, &last_id, &last_id, 0);
// Write the entries
{
@@ -1458,13 +1457,14 @@ fn test_full_leader_validator_network() {
// Make a common mint and a genesis entry for both leader + validator's ledgers
let num_ending_ticks = 1;
let (mint, bootstrap_leader_ledger_path, genesis_entries) = create_tmp_sample_ledger(
"test_full_leader_validator_network",
10_000,
num_ending_ticks,
bootstrap_leader_info.id,
500,
);
let (_genesis_block, mint_keypair, bootstrap_leader_ledger_path, genesis_entries) =
create_tmp_sample_ledger(
"test_full_leader_validator_network",
10_000,
num_ending_ticks,
bootstrap_leader_info.id,
500,
);
let last_tick_id = genesis_entries
.last()
@@ -1491,7 +1491,7 @@ fn test_full_leader_validator_network() {
// leader election active set
let (bootstrap_entries, vote_account_keypair) = make_active_set_entries(
node_keypair,
&mint.keypair(),
&mint_keypair,
&last_entry_id,
&last_tick_id,
0,
@@ -1711,20 +1711,22 @@ fn test_broadcast_last_tick() {
let bootstrap_leader_info = bootstrap_leader_node.info.clone();
// Create leader ledger
let (_, bootstrap_leader_ledger_path, genesis_entries) = create_tmp_sample_ledger(
"test_broadcast_last_tick",
10_000,
0,
bootstrap_leader_info.id,
500,
);
let (_genesis_block, _mint_keypair, bootstrap_leader_ledger_path, genesis_entries) =
create_tmp_sample_ledger(
"test_broadcast_last_tick",
10_000,
1,
bootstrap_leader_info.id,
500,
);
let num_ending_ticks = genesis_entries
.iter()
.skip(2)
.fold(0, |tick_count, entry| tick_count + entry.is_tick() as u64);
let genesis_ledger_len = genesis_entries.len() as u64 - num_ending_ticks;
debug!("num_ending_ticks: {}", num_ending_ticks);
debug!("genesis_ledger_len: {}", genesis_ledger_len);
let blob_receiver_exit = Arc::new(AtomicBool::new(false));
// Create the listeners
@@ -1786,21 +1788,25 @@ fn test_broadcast_last_tick() {
let last_tick_entry_height = genesis_ledger_len as u64 + bootstrap_height;
let entries = read_ledger(&bootstrap_leader_ledger_path);
assert!(entries.len() >= last_tick_entry_height as usize);
let expected_last_tick = &entries[last_tick_entry_height as usize - 1];
let expected_last_tick = &entries[last_tick_entry_height as usize - 2];
debug!("last_tick_entry_height: {:?}", last_tick_entry_height);
debug!("expected_last_tick: {:?}", expected_last_tick);
info!("Check that the nodes got the last broadcasted blob");
for (_, receiver) in blob_fetch_stages.iter() {
info!("Checking a node...");
let mut last_tick_blob: SharedBlob = SharedBlob::default();
while let Ok(new_blobs) = receiver.try_recv() {
let last_blob = new_blobs.into_iter().find(|b| {
b.read().unwrap().index().expect("Expected index in blob")
== last_tick_entry_height - 1
== last_tick_entry_height - 2
});
if let Some(last_blob) = last_blob {
last_tick_blob = last_blob;
break;
}
}
debug!("last_tick_blob: {:?}", last_tick_blob);
let actual_last_tick =
&reconstruct_entries_from_blobs(vec![&*last_tick_blob.read().unwrap()])
.expect("Expected to be able to reconstruct entries from blob")
@@ -1831,7 +1837,7 @@ fn mk_client(leader: &NodeInfo) -> ThinClient {
fn send_tx_and_retry_get_balance(
leader: &NodeInfo,
alice: &Mint,
alice: &Keypair,
bob_pubkey: &Pubkey,
transfer_amount: u64,
expected: Option<u64>,
@@ -1839,20 +1845,20 @@ fn send_tx_and_retry_get_balance(
let mut client = mk_client(leader);
trace!("getting leader last_id");
let last_id = client.get_last_id();
let mut tx = Transaction::system_new(&alice.keypair(), *bob_pubkey, transfer_amount, last_id);
let mut tx = Transaction::system_new(&alice, *bob_pubkey, transfer_amount, last_id);
info!(
"executing transfer of {} from {} to {}",
transfer_amount,
alice.keypair().pubkey(),
alice.pubkey(),
*bob_pubkey
);
let _res = client.retry_transfer(&alice.keypair(), &mut tx, 30);
let _res = client.retry_transfer(&alice, &mut tx, 30);
retry_get_balance(&mut client, bob_pubkey, expected)
}
fn retry_send_tx_and_retry_get_balance(
leader: &NodeInfo,
alice: &Mint,
alice: &Keypair,
bob_pubkey: &Pubkey,
expected: Option<u64>,
) -> Option<u64> {
@@ -1862,9 +1868,7 @@ fn retry_send_tx_and_retry_get_balance(
info!("executing leader transfer");
const LAST: usize = 30;
for run in 0..(LAST + 1) {
let _sig = client
.transfer(500, &alice.keypair(), *bob_pubkey, &last_id)
.unwrap();
let _sig = client.transfer(500, &alice, *bob_pubkey, &last_id).unwrap();
let out = client.poll_get_balance(bob_pubkey);
if expected.is_none() || run == LAST {
return out.ok().clone();

View File

@@ -2,7 +2,7 @@ use solana;
use solana_native_loader;
use solana::bank::Bank;
use solana::mint::Mint;
use solana::genesis_block::GenesisBlock;
use solana::status_deque::Status;
#[cfg(feature = "bpf_c")]
use solana_sdk::bpf_loader;
@@ -46,23 +46,24 @@ fn check_tx_results(bank: &Bank, tx: &Transaction, result: Vec<solana::bank::Res
}
struct Loader {
mint: Mint,
genesis_block: GenesisBlock,
mint_keypair: Keypair,
bank: Bank,
loader: Pubkey,
}
impl Loader {
pub fn new_dynamic(loader_name: &str) -> Self {
let mint = Mint::new(50);
let bank = Bank::new(&mint);
let (genesis_block, mint_keypair) = GenesisBlock::new(50);
let bank = Bank::new(&genesis_block);
let loader = Keypair::new();
// allocate, populate, finalize, and spawn loader
let tx = Transaction::system_create(
&mint.keypair(),
&mint_keypair,
loader.pubkey(),
mint.last_id(),
genesis_block.last_id(),
1,
56, // TODO
solana_native_loader::id(),
@@ -76,40 +77,55 @@ impl Loader {
solana_native_loader::id(),
0,
name.as_bytes().to_vec(),
mint.last_id(),
genesis_block.last_id(),
0,
);
check_tx_results(&bank, &tx, bank.process_transactions(&vec![tx.clone()]));
let tx =
Transaction::loader_finalize(&loader, solana_native_loader::id(), mint.last_id(), 0);
let tx = Transaction::loader_finalize(
&loader,
solana_native_loader::id(),
genesis_block.last_id(),
0,
);
check_tx_results(&bank, &tx, bank.process_transactions(&vec![tx.clone()]));
let tx = Transaction::system_spawn(&loader, mint.last_id(), 0);
let tx = Transaction::system_spawn(&loader, genesis_block.last_id(), 0);
check_tx_results(&bank, &tx, bank.process_transactions(&vec![tx.clone()]));
Loader {
mint,
genesis_block,
mint_keypair,
bank,
loader: loader.pubkey(),
}
}
pub fn new_native() -> Self {
let mint = Mint::new(50);
let bank = Bank::new(&mint);
let (genesis_block, mint_keypair) = GenesisBlock::new(50);
let bank = Bank::new(&genesis_block);
let loader = solana_native_loader::id();
Loader { mint, bank, loader }
Loader {
genesis_block,
mint_keypair,
bank,
loader,
}
}
#[cfg(feature = "bpf_c")]
pub fn new_bpf() -> Self {
let mint = Mint::new(50);
let bank = Bank::new(&mint);
let (genesis_block, mint_keypair) = GenesisBlock::new(50);
let bank = Bank::new(&genesis_block);
let loader = bpf_loader::id();
Loader { mint, bank, loader }
Loader {
genesis_block,
mint_keypair,
bank,
loader,
}
}
}
@@ -124,9 +140,9 @@ impl Program {
// allocate, populate, finalize and spawn program
let tx = Transaction::system_create(
&loader.mint.keypair(),
&loader.mint_keypair,
program.pubkey(),
loader.mint.last_id(),
loader.genesis_block.last_id(),
1,
userdata.len() as u64,
loader.loader,
@@ -146,7 +162,7 @@ impl Program {
loader.loader,
offset,
chunk.to_vec(),
loader.mint.last_id(),
loader.genesis_block.last_id(),
0,
);
check_tx_results(
@@ -157,14 +173,19 @@ impl Program {
offset += chunk_size as u32;
}
let tx = Transaction::loader_finalize(&program, loader.loader, loader.mint.last_id(), 0);
let tx = Transaction::loader_finalize(
&program,
loader.loader,
loader.genesis_block.last_id(),
0,
);
check_tx_results(
&loader.bank,
&tx,
loader.bank.process_transactions(&vec![tx.clone()]),
);
let tx = Transaction::system_spawn(&program, loader.mint.last_id(), 0);
let tx = Transaction::system_spawn(&program, loader.genesis_block.last_id(), 0);
check_tx_results(
&loader.bank,
&tx,
@@ -186,11 +207,11 @@ fn test_program_native_noop() {
// Call user program
let tx = Transaction::new(
&loader.mint.keypair(),
&loader.mint_keypair,
&[],
program.program.pubkey(),
&1u8,
loader.mint.last_id(),
loader.genesis_block.last_id(),
0,
);
check_tx_results(
@@ -220,9 +241,9 @@ fn test_program_lua_move_funds() {
// Call user program with two accounts
let tx = Transaction::system_create(
&loader.mint.keypair(),
&loader.mint_keypair,
from.pubkey(),
loader.mint.last_id(),
loader.genesis_block.last_id(),
10,
0,
program.program.pubkey(),
@@ -235,9 +256,9 @@ fn test_program_lua_move_funds() {
);
let tx = Transaction::system_create(
&loader.mint.keypair(),
&loader.mint_keypair,
to,
loader.mint.last_id(),
loader.genesis_block.last_id(),
1,
0,
program.program.pubkey(),
@@ -254,7 +275,7 @@ fn test_program_lua_move_funds() {
&[to],
program.program.pubkey(),
&10,
loader.mint.last_id(),
loader.genesis_block.last_id(),
0,
);
check_tx_results(
@@ -280,11 +301,11 @@ fn test_program_builtin_bpf_noop() {
// Call user program
let tx = Transaction::new(
&loader.mint.keypair(),
&loader.mint_keypair,
&[],
program.program.pubkey(),
&vec![1u8],
loader.mint.last_id(),
loader.genesis_block.last_id(),
0,
);
check_tx_results(
@@ -319,11 +340,11 @@ fn test_program_bpf_c() {
// Call user program
let tx = Transaction::new(
&loader.mint.keypair(),
&loader.mint_keypair,
&[],
program.program.pubkey(),
&vec![1u8],
loader.mint.last_id(),
loader.genesis_block.last_id(),
0,
);
check_tx_results(
@@ -355,11 +376,11 @@ fn test_program_bpf_rust() {
// Call user program
let tx = Transaction::new(
&loader.mint.keypair(),
&loader.mint_keypair,
&[],
program.program.pubkey(),
&vec![1u8],
loader.mint.last_id(),
loader.genesis_block.last_id(),
0,
);
check_tx_results(

View File

@@ -41,7 +41,7 @@ fn test_replicator_startup() {
let leader_info = leader_node.info.clone();
let leader_ledger_path = "replicator_test_leader_ledger";
let (mint, leader_ledger_path) =
let (_genesis_block, mint_keypair, leader_ledger_path) =
create_tmp_genesis(leader_ledger_path, 1_000_000_000, leader_info.id, 1);
let validator_ledger_path =
@@ -73,7 +73,7 @@ fn test_replicator_startup() {
let mut leader_client = mk_client(&leader_info);
leader_client
.transfer(10, &mint.keypair(), validator_keypair.pubkey(), &last_id)
.transfer(10, &mint_keypair, validator_keypair.pubkey(), &last_id)
.unwrap();
let validator_node = Node::new_localhost_with_pubkey(validator_keypair.pubkey());
@@ -99,7 +99,7 @@ fn test_replicator_startup() {
for _ in 0..64 {
let last_id = leader_client.get_last_id();
leader_client
.transfer(1, &mint.keypair(), bob.pubkey(), &last_id)
.transfer(1, &mint_keypair, bob.pubkey(), &last_id)
.unwrap();
sleep(Duration::from_millis(200));
}
@@ -111,14 +111,10 @@ fn test_replicator_startup() {
let last_id = leader_client.get_last_id();
// Give the replicator some tokens
let amount = 1;
let mut tx = Transaction::system_new(
&mint.keypair(),
replicator_keypair.pubkey(),
amount,
last_id,
);
let mut tx =
Transaction::system_new(&mint_keypair, replicator_keypair.pubkey(), amount, last_id);
leader_client
.retry_transfer(&mint.keypair(), &mut tx, 5)
.retry_transfer(&mint_keypair, &mut tx, 5)
.unwrap();
info!("starting replicator node");
@@ -270,7 +266,8 @@ fn test_replicator_startup_ledger_hang() {
let leader_info = leader_node.info.clone();
let leader_ledger_path = "replicator_test_leader_ledger";
let (_, leader_ledger_path) = create_tmp_genesis(leader_ledger_path, 100, leader_info.id, 1);
let (_genesis_block, _mint_keypair, leader_ledger_path) =
create_tmp_genesis(leader_ledger_path, 100, leader_info.id, 1);
let validator_ledger_path =
tmp_copy_ledger(&leader_ledger_path, "replicator_test_validator_ledger");

View File

@@ -4,10 +4,10 @@ use reqwest::header::CONTENT_TYPE;
use serde_json::{json, Value};
use solana::bank::Bank;
use solana::cluster_info::Node;
use solana::db_ledger::create_tmp_ledger_with_mint;
use solana::db_ledger::create_tmp_ledger;
use solana::fullnode::Fullnode;
use solana::genesis_block::GenesisBlock;
use solana::leader_scheduler::LeaderScheduler;
use solana::mint::Mint;
use solana::rpc_request::get_rpc_request_str;
use solana::storage_stage::STORAGE_ROTATE_TEST_COUNT;
use solana::vote_signer_proxy::VoteSignerProxy;
@@ -26,14 +26,14 @@ fn test_rpc_send_tx() {
let leader_keypair = Arc::new(Keypair::new());
let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
let alice = Mint::new(10_000_000);
let mut bank = Bank::new(&alice);
let (genesis_block, alice) = GenesisBlock::new(10_000_000);
let mut bank = Bank::new(&genesis_block);
let bob_pubkey = Keypair::new().pubkey();
let leader_data = leader.info.clone();
let ledger_path = create_tmp_ledger_with_mint("rpc_send_tx", &alice);
let ledger_path = create_tmp_ledger("rpc_send_tx", &genesis_block);
let last_id = bank.last_id();
let tx = Transaction::system_move(&alice.keypair(), bob_pubkey, 20, last_id, 0);
let tx = Transaction::system_move(&alice, bob_pubkey, 20, last_id, 0);
let serial_tx = serialize(&tx).unwrap();
let leader_scheduler = Arc::new(RwLock::new(LeaderScheduler::from_bootstrap_leader(
@@ -44,17 +44,16 @@ fn test_rpc_send_tx() {
let vote_account_keypair = Arc::new(Keypair::new());
let vote_signer =
VoteSignerProxy::new(&vote_account_keypair, Box::new(LocalVoteSigner::default()));
let entry_height = alice.create_entries().len() as u64;
let entry_height = 0;
let server = Fullnode::new_with_bank(
leader_keypair,
Some(Arc::new(vote_signer)),
bank,
None,
&ledger_path,
entry_height,
&last_id,
leader,
None,
&ledger_path,
false,
None,
STORAGE_ROTATE_TEST_COUNT,