Add GenesisBlock::OperatingMode to control how cluster features are activated (#6430)
This commit is contained in:
@ -13,11 +13,13 @@ log = "0.4.8"
|
||||
rand = "0.6.5"
|
||||
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.0" }
|
||||
solana-bench-tps = { path = "../bench-tps", version = "0.20.0" }
|
||||
solana-config-api = { path = "../programs/config_api", version = "0.20.0" }
|
||||
solana-core = { path = "../core", version = "0.20.0" }
|
||||
solana-client = { path = "../client", version = "0.20.0" }
|
||||
solana-drone = { path = "../drone", version = "0.20.0" }
|
||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.0" }
|
||||
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.0" }
|
||||
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.0" }
|
||||
solana-ledger = { path = "../ledger", version = "0.20.0" }
|
||||
solana-logger = { path = "../logger", version = "0.20.0" }
|
||||
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.0", optional = true }
|
||||
@ -27,6 +29,7 @@ solana-sdk = { path = "../sdk", version = "0.20.0" }
|
||||
solana-stake-api = { path = "../programs/stake_api", version = "0.20.0" }
|
||||
solana-storage-api = { path = "../programs/storage_api", version = "0.20.0" }
|
||||
solana-storage-program = { path = "../programs/storage_program", version = "0.20.0" }
|
||||
solana-vest-api = { path = "../programs/vest_api", version = "0.20.0" }
|
||||
solana-vote-api = { path = "../programs/vote_api", version = "0.20.0" }
|
||||
symlink = "0.1.0"
|
||||
tempfile = "3.1.0"
|
||||
|
@ -14,7 +14,7 @@ use solana_sdk::{
|
||||
client::SyncClient,
|
||||
clock::{DEFAULT_SLOTS_PER_EPOCH, DEFAULT_SLOTS_PER_SEGMENT, DEFAULT_TICKS_PER_SLOT},
|
||||
epoch_schedule::EpochSchedule,
|
||||
genesis_block::GenesisBlock,
|
||||
genesis_block::{GenesisBlock, OperatingMode},
|
||||
message::Message,
|
||||
poh_config::PohConfig,
|
||||
pubkey::Pubkey,
|
||||
@ -74,6 +74,7 @@ pub struct ClusterConfig {
|
||||
pub slots_per_segment: u64,
|
||||
pub stakers_slot_offset: u64,
|
||||
pub native_instruction_processors: Vec<(String, Pubkey)>,
|
||||
pub operating_mode: OperatingMode,
|
||||
pub poh_config: PohConfig,
|
||||
}
|
||||
|
||||
@ -90,6 +91,7 @@ impl Default for ClusterConfig {
|
||||
slots_per_segment: DEFAULT_SLOTS_PER_SEGMENT,
|
||||
stakers_slot_offset: DEFAULT_SLOTS_PER_EPOCH,
|
||||
native_instruction_processors: vec![],
|
||||
operating_mode: OperatingMode::Development,
|
||||
poh_config: PohConfig::default(),
|
||||
}
|
||||
}
|
||||
@ -142,7 +144,19 @@ impl LocalCluster {
|
||||
genesis_block.slots_per_segment = config.slots_per_segment;
|
||||
genesis_block.epoch_schedule =
|
||||
EpochSchedule::custom(config.slots_per_epoch, config.stakers_slot_offset, true);
|
||||
genesis_block.operating_mode = config.operating_mode;
|
||||
genesis_block.poh_config = config.poh_config.clone();
|
||||
|
||||
match genesis_block.operating_mode {
|
||||
OperatingMode::SoftLaunch => {
|
||||
genesis_block.native_instruction_processors =
|
||||
solana_genesis_programs::get(genesis_block.operating_mode, 0).unwrap()
|
||||
}
|
||||
// create_genesis_block_with_leader() assumes OperatingMode::Development so do
|
||||
// nothing...
|
||||
OperatingMode::Development => (),
|
||||
}
|
||||
|
||||
genesis_block
|
||||
.native_instruction_processors
|
||||
.extend_from_slice(&config.native_instruction_processors);
|
||||
|
@ -5,6 +5,7 @@ use crate::{
|
||||
};
|
||||
use log::*;
|
||||
use serial_test_derive::serial;
|
||||
use solana_client::thin_client::create_client;
|
||||
use solana_core::{
|
||||
broadcast_stage::BroadcastStageType, gossip_service::discover_cluster,
|
||||
validator::ValidatorConfig,
|
||||
@ -15,6 +16,7 @@ use solana_sdk::{
|
||||
client::SyncClient,
|
||||
clock,
|
||||
epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
|
||||
genesis_block::OperatingMode,
|
||||
poh_config::PohConfig,
|
||||
};
|
||||
use std::path::{Path, PathBuf};
|
||||
@ -296,6 +298,43 @@ fn test_listener_startup() {
|
||||
assert_eq!(cluster_nodes.len(), 4);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[serial]
|
||||
fn test_softlaunch_operating_mode() {
|
||||
solana_logger::setup();
|
||||
|
||||
let config = ClusterConfig {
|
||||
operating_mode: OperatingMode::SoftLaunch,
|
||||
node_stakes: vec![100; 1],
|
||||
cluster_lamports: 1_000,
|
||||
validator_configs: vec![ValidatorConfig::default(); 1],
|
||||
..ClusterConfig::default()
|
||||
};
|
||||
let cluster = LocalCluster::new(&config);
|
||||
let (cluster_nodes, _) = discover_cluster(&cluster.entry_point_info.gossip, 1).unwrap();
|
||||
assert_eq!(cluster_nodes.len(), 1);
|
||||
|
||||
let client = create_client(
|
||||
cluster.entry_point_info.client_facing_addr(),
|
||||
solana_core::cluster_info::VALIDATOR_PORT_RANGE,
|
||||
);
|
||||
|
||||
// Programs that are not available at soft launch
|
||||
for program_id in [
|
||||
&solana_config_api::id(),
|
||||
&solana_sdk::bpf_loader::id(),
|
||||
&solana_sdk::system_program::id(),
|
||||
&solana_vest_api::id(),
|
||||
]
|
||||
.iter()
|
||||
{
|
||||
assert_eq!(
|
||||
(program_id, client.get_account(program_id).unwrap()),
|
||||
(program_id, None)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused_attributes)]
|
||||
#[test]
|
||||
#[serial]
|
||||
|
Reference in New Issue
Block a user