Add first leader to genesis (#1681)

* Add first leader to genesis entries, consume in genesis.sh

* Set bootstrap leader in the bank on startup, remove instantiation of bootstrap leader from bin/fullnode

* Remove need to initialize bootstrap leader in leader_scheduler, now can be read from genesis entries

* Add separate interface new_with_leader() in mint for creating genesis leader entries
This commit is contained in:
carllin
2018-11-02 14:32:05 -07:00
committed by GitHub
parent a8481215fa
commit 298bd6479a
20 changed files with 427 additions and 208 deletions

View File

@ -116,7 +116,8 @@ 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) = create_tmp_genesis("multi_node_ledger_window", 10_000);
let (alice, leader_ledger_path) =
create_tmp_genesis("multi_node_ledger_window", 10_000, leader_data.id, 500);
ledger_paths.push(leader_ledger_path.clone());
// make a copy at zero
@ -142,11 +143,6 @@ fn test_multi_node_ledger_window() -> result::Result<()> {
LeaderScheduler::from_bootstrap_leader(leader_pubkey),
);
// Send leader some tokens to vote
let leader_balance =
send_tx_and_retry_get_balance(&leader_data, &alice, &leader_pubkey, 500, None).unwrap();
info!("leader balance {}", leader_balance);
// start up another validator from zero, converge and then check
// balances
let keypair = Arc::new(Keypair::new());
@ -166,7 +162,7 @@ fn test_multi_node_ledger_window() -> result::Result<()> {
// Send validator some tokens to vote
let validator_balance =
send_tx_and_retry_get_balance(&leader_data, &alice, &validator_pubkey, 500, None).unwrap();
info!("leader balance {}", validator_balance);
info!("validator balance {}", validator_balance);
// contains the leader and new node
info!("converging....");
@ -215,8 +211,12 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> {
let bob_pubkey = Keypair::new().pubkey();
let mut ledger_paths = Vec::new();
let (alice, leader_ledger_path) =
create_tmp_genesis("multi_node_validator_catchup_from_zero", 10_000);
let (alice, leader_ledger_path) = create_tmp_genesis(
"multi_node_validator_catchup_from_zero",
10_000,
leader_data.id,
500,
);
ledger_paths.push(leader_ledger_path.clone());
let zero_ledger_path = tmp_copy_ledger(
@ -235,11 +235,6 @@ fn test_multi_node_validator_catchup_from_zero() -> result::Result<()> {
LeaderScheduler::from_bootstrap_leader(leader_pubkey),
);
// Send leader some tokens to vote
let leader_balance =
send_tx_and_retry_get_balance(&leader_data, &alice, &leader_pubkey, 500, None).unwrap();
info!("leader balance {}", leader_balance);
let mut nodes = vec![server];
for _ in 0..N {
let keypair = Arc::new(Keypair::new());
@ -359,7 +354,8 @@ fn test_multi_node_basic() {
let bob_pubkey = Keypair::new().pubkey();
let mut ledger_paths = Vec::new();
let (alice, leader_ledger_path) = create_tmp_genesis("multi_node_basic", 10_000);
let (alice, leader_ledger_path) =
create_tmp_genesis("multi_node_basic", 10_000, leader_data.id, 500);
ledger_paths.push(leader_ledger_path.clone());
let server = Fullnode::new(
leader,
@ -371,11 +367,6 @@ fn test_multi_node_basic() {
LeaderScheduler::from_bootstrap_leader(leader_pubkey),
);
// Send leader some tokens to vote
let leader_balance =
send_tx_and_retry_get_balance(&leader_data, &alice, &leader_pubkey, 500, None).unwrap();
info!("leader balance {}", leader_balance);
let mut nodes = vec![server];
for _ in 0..N {
let keypair = Arc::new(Keypair::new());
@ -437,7 +428,8 @@ fn test_boot_validator_from_file() -> result::Result<()> {
let leader_pubkey = leader_keypair.pubkey();
let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
let bob_pubkey = Keypair::new().pubkey();
let (alice, leader_ledger_path) = create_tmp_genesis("boot_validator_from_file", 100_000);
let (alice, leader_ledger_path) =
create_tmp_genesis("boot_validator_from_file", 100_000, leader_pubkey, 1000);
let mut ledger_paths = Vec::new();
ledger_paths.push(leader_ledger_path.clone());
@ -485,8 +477,7 @@ fn test_boot_validator_from_file() -> result::Result<()> {
Ok(())
}
fn create_leader(ledger_path: &str) -> (NodeInfo, Fullnode) {
let leader_keypair = Arc::new(Keypair::new());
fn create_leader(ledger_path: &str, leader_keypair: Arc<Keypair>) -> (NodeInfo, Fullnode) {
let leader = Node::new_localhost_with_pubkey(leader_keypair.pubkey());
let leader_data = leader.info.clone();
let leader_fullnode = Fullnode::new(
@ -509,13 +500,17 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> {
// ledger (currently up to WINDOW_SIZE entries)
logger::setup();
let leader_keypair = Arc::new(Keypair::new());
let initial_leader_balance = 500;
let (alice, ledger_path) = create_tmp_genesis(
"leader_restart_validator_start_from_old_ledger",
100_000 + 500 * solana::window_service::MAX_REPAIR_BACKOFF as i64,
leader_keypair.pubkey(),
initial_leader_balance,
);
let bob_pubkey = Keypair::new().pubkey();
let (leader_data, leader_fullnode) = create_leader(&ledger_path);
let (leader_data, leader_fullnode) = create_leader(&ledger_path, leader_keypair.clone());
// lengthen the ledger
let leader_balance =
@ -530,7 +525,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> {
// restart the leader
leader_fullnode.close()?;
let (leader_data, leader_fullnode) = create_leader(&ledger_path);
let (leader_data, leader_fullnode) = create_leader(&ledger_path, leader_keypair.clone());
// lengthen the ledger
let leader_balance =
@ -539,7 +534,7 @@ fn test_leader_restart_validator_start_from_old_ledger() -> result::Result<()> {
// restart the leader
leader_fullnode.close()?;
let (leader_data, leader_fullnode) = create_leader(&ledger_path);
let (leader_data, leader_fullnode) = create_leader(&ledger_path, leader_keypair);
// start validator from old ledger
let keypair = Arc::new(Keypair::new());
@ -603,7 +598,8 @@ 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, leader_ledger_path) = create_tmp_genesis("multi_node_dynamic_network", 10_000_000);
let (alice, leader_ledger_path) =
create_tmp_genesis("multi_node_dynamic_network", 10_000_000, leader_pubkey, 500);
let mut ledger_paths = Vec::new();
ledger_paths.push(leader_ledger_path.clone());
@ -621,16 +617,6 @@ fn test_multi_node_dynamic_network() {
LeaderScheduler::from_bootstrap_leader(leader_pubkey),
);
// Send leader some tokens to vote
let leader_balance = send_tx_and_retry_get_balance(
&leader_data,
&alice_arc.read().unwrap(),
&leader_pubkey,
500,
None,
).unwrap();
info!("leader balance {}", leader_balance);
info!("{} LEADER", leader_data.id);
let leader_balance = retry_send_tx_and_retry_get_balance(
&leader_data,
@ -804,6 +790,8 @@ fn test_leader_to_validator_transition() {
"test_leader_to_validator_transition",
10_000,
num_ending_ticks,
leader_info.id,
500,
);
let last_id = genesis_entries
@ -821,7 +809,6 @@ fn test_leader_to_validator_transition() {
// Start the leader node
let bootstrap_height = leader_rotation_interval;
let leader_scheduler_config = LeaderSchedulerConfig::new(
leader_info.id,
Some(bootstrap_height),
Some(leader_rotation_interval),
Some(leader_rotation_interval * 2),
@ -929,8 +916,13 @@ 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);
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 validator_ledger_path = tmp_copy_ledger(&leader_ledger_path, "test_leader_validator_basic");
@ -955,7 +947,6 @@ fn test_leader_validator_basic() {
let num_bootstrap_slots = 2;
let bootstrap_height = num_bootstrap_slots * leader_rotation_interval;
let leader_scheduler_config = LeaderSchedulerConfig::new(
leader_info.id,
Some(bootstrap_height),
Some(leader_rotation_interval),
Some(leader_rotation_interval * 2),
@ -1095,8 +1086,13 @@ 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, bootstrap_leader_ledger_path, genesis_entries) =
create_tmp_sample_ledger("test_dropped_handoff_recovery", 10_000, num_ending_ticks);
let (mint, bootstrap_leader_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()
@ -1137,7 +1133,6 @@ fn test_dropped_handoff_recovery() {
let seed_rotation_interval = num_slots_per_epoch * leader_rotation_interval;
let bootstrap_height = initial_tick_height + 1;
let leader_scheduler_config = LeaderSchedulerConfig::new(
bootstrap_leader_info.id,
Some(bootstrap_height),
Some(leader_rotation_interval),
Some(seed_rotation_interval),
@ -1248,6 +1243,8 @@ fn test_full_leader_validator_network() {
"test_full_leader_validator_network",
10_000,
num_ending_ticks,
bootstrap_leader_info.id,
500,
);
let last_tick_id = genesis_entries
@ -1298,7 +1295,6 @@ fn test_full_leader_validator_network() {
let seed_rotation_interval = num_slots_per_epoch * leader_rotation_interval;
let bootstrap_height = num_bootstrap_slots * leader_rotation_interval;
let leader_scheduler_config = LeaderSchedulerConfig::new(
bootstrap_leader_info.id,
Some(bootstrap_height),
Some(leader_rotation_interval),
Some(seed_rotation_interval),