Refactor - Moves bpf_loader registration into the runtime (#31345)

* Moves the registration of bpf_loader built-ins from the ledger into the runtime.

* Removes bpf_loader built-ins registration in tests and benchmarks.

* Removes declare_builtin!() of bpf_loader built-ins.

* Removes built-ins from the SDK.

* Adjusts tests.
This commit is contained in:
Alexander Meißner 2023-04-26 14:44:19 +02:00 committed by GitHub
parent 2dcdfff5f4
commit c05d1d5c51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 59 additions and 287 deletions

View File

@ -213,7 +213,7 @@ fn bank_forks_from_snapshot(
genesis_config,
&process_options.runtime_config,
process_options.debug_keys.clone(),
Some(&crate::builtins::get()),
None,
process_options.account_indexes.clone(),
process_options.limit_load_slot_count_from_snapshot,
process_options.shrink_ratio,

View File

@ -713,7 +713,7 @@ pub(crate) fn process_blockstore_for_bank_0(
Arc::new(opts.runtime_config.clone()),
account_paths,
opts.debug_keys.clone(),
Some(&crate::builtins::get()),
None,
opts.account_indexes.clone(),
opts.shrink_ratio,
false,

View File

@ -1,38 +0,0 @@
use {
solana_program_runtime::builtin_program::BuiltinProgram,
solana_runtime::builtins::{BuiltinFeatureTransition, Builtins},
solana_sdk::{bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable},
};
/// Builtin programs that are always available
fn genesis_builtins() -> Vec<BuiltinProgram> {
vec![
BuiltinProgram {
name: "solana_bpf_loader_deprecated_program".to_string(),
program_id: bpf_loader_deprecated::id(),
process_instruction: solana_bpf_loader_program::process_instruction,
},
BuiltinProgram {
name: "solana_bpf_loader_program".to_string(),
program_id: bpf_loader::id(),
process_instruction: solana_bpf_loader_program::process_instruction,
},
BuiltinProgram {
name: "solana_bpf_loader_upgradeable_program".to_string(),
program_id: bpf_loader_upgradeable::id(),
process_instruction: solana_bpf_loader_program::process_instruction,
},
]
}
/// Dynamic feature transitions for builtin programs
fn builtin_feature_transitions() -> Vec<BuiltinFeatureTransition> {
vec![]
}
pub(crate) fn get() -> Builtins {
Builtins {
genesis_builtins: genesis_builtins(),
feature_transitions: builtin_feature_transitions(),
}
}

View File

@ -14,7 +14,6 @@ pub mod blockstore_meta;
pub mod blockstore_metrics;
pub mod blockstore_options;
pub mod blockstore_processor;
pub mod builtins;
pub mod genesis_utils;
pub mod leader_schedule;
pub mod leader_schedule_cache;

View File

@ -72,9 +72,6 @@ pub use {
pub mod programs;
#[macro_use]
extern crate solana_bpf_loader_program;
/// Errors from the program test environment
#[derive(Error, Debug, PartialEq, Eq)]
pub enum ProgramTestError {
@ -787,16 +784,6 @@ impl ProgramTest {
}),
);
// Add loaders
macro_rules! add_builtin {
($b:expr) => {
bank.add_builtin(&$b.0, &$b.1, $b.2)
};
}
add_builtin!(solana_bpf_loader_deprecated_program!());
add_builtin!(solana_bpf_loader_program!());
add_builtin!(solana_bpf_loader_upgradeable_program!());
// Add commonly-used SPL programs as a convenience to the user
for (program_id, account) in programs::spl_programs(&Rent::default()).iter() {
bank.store_account(program_id, account);

View File

@ -1,12 +1,12 @@
#![allow(dead_code)]
use {
solana_bpf_loader_program::{process_instruction, upgradeable::id},
solana_bpf_loader_program::process_instruction,
solana_program_test::*,
solana_sdk::{
account::AccountSharedData,
account_utils::StateMut,
bpf_loader_upgradeable::UpgradeableLoaderState,
bpf_loader_upgradeable::{id, UpgradeableLoaderState},
instruction::{Instruction, InstructionError},
pubkey::Pubkey,
signature::{Keypair, Signer},

View File

@ -1,6 +0,0 @@
solana_sdk::declare_builtin!(
solana_sdk::bpf_loader_deprecated::ID,
solana_bpf_loader_deprecated_program,
solana_bpf_loader_program::process_instruction,
deprecated::id
);

View File

@ -1,10 +1,8 @@
#![deny(clippy::integer_arithmetic)]
#![deny(clippy::indexing_slicing)]
pub mod deprecated;
pub mod serialization;
pub mod syscalls;
pub mod upgradeable;
use {
solana_measure::measure::Measure,
@ -61,12 +59,6 @@ use {
},
};
solana_sdk::declare_builtin!(
solana_sdk::bpf_loader::ID,
solana_bpf_loader_program,
solana_bpf_loader_program::process_instruction
);
#[allow(clippy::too_many_arguments)]
pub fn load_program_from_bytes(
feature_set: &FeatureSet,

View File

@ -1,6 +0,0 @@
solana_sdk::declare_builtin!(
solana_sdk::bpf_loader_upgradeable::ID,
solana_bpf_loader_upgradeable_program,
solana_bpf_loader_program::process_instruction,
upgradeable::id
);

View File

@ -6,8 +6,6 @@
use {solana_rbpf::memory_region::MemoryState, std::slice};
extern crate test;
#[macro_use]
extern crate solana_bpf_loader_program;
use {
byteorder::{ByteOrder, LittleEndian, WriteBytesExt},
@ -193,9 +191,7 @@ fn bench_program_execute_noop(bencher: &mut Bencher) {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_benches(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_benches(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);

View File

@ -9,9 +9,6 @@
#![allow(clippy::unnecessary_cast)]
#![allow(clippy::uninlined_format_args)]
#[macro_use]
extern crate solana_bpf_loader_program;
#[cfg(feature = "sbf_rust")]
use {
itertools::izip,
@ -313,9 +310,7 @@ fn test_program_sbf_sanity() {
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
// Call user program
@ -361,9 +356,7 @@ fn test_program_sbf_loader_deprecated() {
.accounts
.remove(&solana_sdk::feature_set::disable_deploy_of_alloc_free_syscall::id())
.unwrap();
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_deprecated_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let program_id = create_program(&bank, &bpf_loader_deprecated::id(), program);
let bank_client = BankClient::new(bank);
@ -389,9 +382,6 @@ fn test_sol_alloc_free_no_longer_deployable() {
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
// Populate loader account with elf that depends on _sol_alloc_free syscall
let elf = load_program_from_file("solana_sbf_rust_deprecated_loader");
let mut program_account = AccountSharedData::new(1, elf.len(), &bpf_loader::id());
@ -481,9 +471,7 @@ fn test_program_sbf_duplicate_accounts() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
let program_id = load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program);
@ -582,9 +570,7 @@ fn test_program_sbf_error_handling() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let program_id = load_program(&bank_client, &bpf_loader::id(), &mint_keypair, program);
let account_metas = vec![AccountMeta::new(mint_keypair.pubkey(), true)];
@ -684,9 +670,7 @@ fn test_return_data_and_log_data_syscall() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -749,9 +733,7 @@ fn test_program_sbf_invoke_sanity() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1144,9 +1126,7 @@ fn test_program_sbf_program_id_spoofing() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1197,9 +1177,7 @@ fn test_program_sbf_caller_has_access_to_cpi_program() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1237,9 +1215,7 @@ fn test_program_sbf_ro_modify() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1294,9 +1270,7 @@ fn test_program_sbf_call_depth() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let program_id = load_program(
&bank_client,
@ -1329,9 +1303,7 @@ fn test_program_sbf_compute_budget() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let program_id = load_program(
&bank_client,
@ -1457,10 +1429,7 @@ fn test_program_sbf_instruction_introspection() {
mint_keypair,
..
} = create_genesis_config(50_000);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1518,9 +1487,7 @@ fn test_program_sbf_test_use_latest_executor() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let panic_id = load_program(
&bank_client,
@ -1587,9 +1554,7 @@ fn test_program_sbf_upgrade() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
// Deploy upgrade program
@ -1718,9 +1683,7 @@ fn test_program_sbf_invoke_stable_genesis_and_bank() {
mint_keypair,
..
} = get_stable_genesis_config();
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1894,9 +1857,7 @@ fn test_program_sbf_invoke_in_same_tx_as_deployment() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -1990,9 +1951,7 @@ fn test_program_sbf_invoke_in_same_tx_as_redeployment() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -2094,9 +2053,7 @@ fn test_program_sbf_invoke_in_same_tx_as_undeployment() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -2183,11 +2140,7 @@ fn test_program_sbf_invoke_upgradeable_via_cpi() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let invoke_and_return = load_program(
&bank_client,
@ -2308,8 +2261,6 @@ fn test_program_sbf_disguised_as_sbf_loader() {
let mut feature_set = FeatureSet::all_enabled();
feature_set.deactivate(&solana_sdk::feature_set::native_programs_consume_cu::id());
bank.feature_set = Arc::new(feature_set);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
bank.deactivate_feature(
&solana_sdk::feature_set::remove_bpf_loader_incorrect_program_id::id(),
);
@ -2336,9 +2287,7 @@ fn test_program_reads_from_program_account() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let program_id = load_program(
@ -2364,9 +2313,7 @@ fn test_program_sbf_c_dup() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let account_address = Pubkey::new_unique();
let account = AccountSharedData::new_data(42, &[1_u8, 2, 3], &system_program::id()).unwrap();
@ -2395,11 +2342,7 @@ fn test_program_sbf_upgrade_via_cpi() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let invoke_and_return = load_program(
&bank_client,
@ -2502,11 +2445,7 @@ fn test_program_sbf_set_upgrade_authority_via_cpi() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
// Deploy CPI invoker program
@ -2595,9 +2534,7 @@ fn test_program_upgradeable_locks() {
mint_keypair,
..
} = create_genesis_config(2_000_000_000);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_upgradeable_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -2716,9 +2653,7 @@ fn test_program_sbf_finalize() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -2762,9 +2697,7 @@ fn test_program_sbf_ro_account_modify() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -2829,9 +2762,7 @@ fn test_program_sbf_realloc() {
let mint_pubkey = mint_keypair.pubkey();
let signer = &[&mint_keypair];
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -3126,9 +3057,7 @@ fn test_program_sbf_realloc_invoke() {
let mint_pubkey = mint_keypair.pubkey();
let signer = &[&mint_keypair];
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -3644,9 +3573,7 @@ fn test_program_sbf_processed_inner_instruction() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -3728,9 +3655,6 @@ fn test_program_fees() {
FeeStructure::new(0.000005, 0.0, vec![(200, 0.0000005), (1400000, 0.000005)]);
bank.fee_structure = fee_structure.clone();
bank.feature_set = Arc::new(FeatureSet::all_enabled());
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank_client = BankClient::new(bank);
let program_id = load_program(
@ -3803,9 +3727,6 @@ fn test_get_minimum_delegation() {
} = create_genesis_config(100_123_456_789);
let mut bank = Bank::new_for_tests(&genesis_config);
bank.feature_set = Arc::new(FeatureSet::all_enabled());
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -3832,11 +3753,7 @@ fn test_program_sbf_inner_instruction_alignment_checks() {
mint_keypair,
..
} = create_genesis_config(50);
let mut bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let (name, id, entrypoint) = solana_bpf_loader_deprecated_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Bank::new_for_tests(&genesis_config);
let noop = create_program(&bank, &bpf_loader_deprecated::id(), "solana_sbf_rust_noop");
let inner_instruction_alignment_check = create_program(
&bank,

View File

@ -30,7 +30,6 @@ use {
rand::Rng,
rayon::ThreadPoolBuilder,
serde::{Deserialize, Serialize},
solana_bpf_loader_program::solana_bpf_loader_program,
solana_logger,
solana_program_runtime::{
compute_budget::{self, ComputeBudget, MAX_COMPUTE_UNIT_LIMIT},
@ -6922,25 +6921,25 @@ fn test_bank_hash_consistency() {
if bank.slot == 0 {
assert_eq!(
bank.hash().to_string(),
"5gY6TCgB9NymbbxgFgAjvYLpXjyXiVyyruS1aEwbWKLK"
"FVZwMQ5YJiivwGctYDvPcoQrTECbUaNcmTnJeFDdb1a3"
);
}
if bank.slot == 32 {
assert_eq!(
bank.hash().to_string(),
"6uJ5C4QDXWCN39EjJ5Frcz73nnS2jMJ55KgkQff12Fqp"
"5AMuFif3LzgsBV8JXGVwdJpHbpZpYKRtcvyrfZjhMGvx"
);
}
if bank.slot == 64 {
assert_eq!(
bank.hash().to_string(),
"Ddk6ouAvSSA1U3Cw6BoKdM5v5LdRc9ShruGDzci9fKbY"
"GDmYzhnPdXoFLvbr88vPoVF5EYyUbCZJLMWBG9JJv8DQ"
);
}
if bank.slot == 128 {
assert_eq!(
bank.hash().to_string(),
"ANodC5vnedLWqeAyhcoErzR3ptNansb5YX6UTQ9cfP7S"
"J6Q2ng27mQMyDF2g7CbKSQDwZAeeaNnkUUZifax3FR9Y"
);
break;
}
@ -7164,7 +7163,7 @@ fn test_shrink_candidate_slots_cached() {
// No more slots should be shrunk
assert_eq!(bank2.shrink_candidate_slots(), 0);
// alive_counts represents the count of alive accounts in the three slots 0,1,2
assert_eq!(alive_counts, vec![11, 1, 7]);
assert_eq!(alive_counts, vec![14, 1, 7]);
}
#[test]
@ -7828,11 +7827,6 @@ fn test_bpf_loader_upgradeable_deploy_with_max_len() {
let (genesis_config, mint_keypair) = create_genesis_config(1_000_000_000);
let mut bank = Bank::new_for_tests(&genesis_config);
bank.feature_set = Arc::new(FeatureSet::all_enabled());
bank.add_builtin(
"solana_bpf_loader_upgradeable_program",
&bpf_loader_upgradeable::id(),
solana_bpf_loader_program::process_instruction,
);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);
@ -12752,8 +12746,6 @@ fn test_runtime_feature_enable_with_executor_cache() {
.accounts
.remove(&feature_set::reject_callx_r10::id());
let mut root_bank = Bank::new_for_tests(&genesis_config);
let (name, id, entrypoint) = solana_bpf_loader_program!();
root_bank.add_builtin(&name, &id, entrypoint);
// Test a basic transfer
let amount = genesis_config.rent.minimum_balance(0);

View File

@ -1,6 +1,8 @@
use {
solana_program_runtime::builtin_program::BuiltinProgram,
solana_sdk::{feature_set, pubkey::Pubkey},
solana_sdk::{
bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, feature_set, pubkey::Pubkey,
},
};
#[derive(Clone, Debug)]
@ -94,6 +96,21 @@ fn genesis_builtins() -> Vec<BuiltinProgram> {
program_id: solana_config_program::id(),
process_instruction: solana_config_program::config_processor::process_instruction,
},
BuiltinProgram {
name: "solana_bpf_loader_deprecated_program".to_string(),
program_id: bpf_loader_deprecated::id(),
process_instruction: solana_bpf_loader_program::process_instruction,
},
BuiltinProgram {
name: "solana_bpf_loader_program".to_string(),
program_id: bpf_loader::id(),
process_instruction: solana_bpf_loader_program::process_instruction,
},
BuiltinProgram {
name: "solana_bpf_loader_upgradeable_program".to_string(),
program_id: bpf_loader_upgradeable::id(),
process_instruction: solana_bpf_loader_program::process_instruction,
},
]
}

View File

@ -26,7 +26,7 @@ pub fn bootstrap_validator_stake_lamports() -> u64 {
// Number of lamports automatically used for genesis accounts
pub const fn genesis_sysvar_and_builtin_program_lamports() -> u64 {
const NUM_BUILTIN_PROGRAMS: u64 = 4;
const NUM_BUILTIN_PROGRAMS: u64 = 7;
const NUM_PRECOMPILES: u64 = 2;
const FEES_SYSVAR_MIN_BALANCE: u64 = 946_560;
const STAKE_HISTORY_MIN_BALANCE: u64 = 114_979_200;

View File

@ -1,77 +0,0 @@
//! Solana helper macros for declaring built-in programs.
#[rustversion::since(1.46.0)]
#[macro_export]
macro_rules! declare_builtin_name {
($name:ident, $id:path, $entrypoint:expr) => {
#[macro_export]
macro_rules! $name {
() => {
// Subtle:
// The outer `declare_builtin_name!` macro may be expanded in another
// crate, causing the macro `$name!` to be defined in that
// crate. We want to emit a call to `$crate::id()`, and have
// `$crate` be resolved in the crate where `$name!` gets defined,
// *not* in this crate (where `declare_builtin_name! is defined).
//
// When a macro_rules! macro gets expanded, any $crate tokens
// in its output will be 'marked' with the crate they were expanded
// from. This includes nested macros like our macro `$name` - even
// though it looks like a separate macro, Rust considers it to be
// just another part of the output of `declare_program!`.
//
// We pass `$name` as the second argument to tell `respan!` to
// apply use the `Span` of `$name` when resolving `$crate::id`.
// This causes `$crate` to behave as though it was written
// at the same location as the `$name` value passed
// to `declare_builtin_name!` (e.g. the 'foo' in
// `declare_builtin_name(foo)`
//
// See the `respan!` macro for more details.
// This should use `crate::respan!` once
// https://github.com/rust-lang/rust/pull/72121 is merged:
// see https://github.com/solana-labs/solana/issues/10933.
// For now, we need to use `::solana_sdk`
//
// `respan!` respans the path `$crate::id`, which we then call (hence the extra
// parens)
(
stringify!($name).to_string(),
::solana_sdk::respan!($crate::$id, $name)(),
$entrypoint,
)
};
}
};
}
#[rustversion::not(since(1.46.0))]
#[macro_export]
macro_rules! declare_builtin_name {
($name:ident, $id:path, $entrypoint:expr) => {
#[macro_export]
macro_rules! $name {
() => {
(stringify!($name).to_string(), $crate::$id(), $entrypoint)
};
}
};
}
/// Convenience macro to declare a built-in program.
///
/// bs58_string: bs58 string representation the program's id
/// name: Name of the program
/// entrypoint: Program's entrypoint, must be of `type Entrypoint`
/// id: Path to the program id access function, used if this macro is not
/// called in `src/lib`
#[macro_export]
macro_rules! declare_builtin {
($bs58_string:expr, $name:ident, $entrypoint:expr) => {
$crate::declare_builtin!($bs58_string, $name, $entrypoint, id);
};
($bs58_string:expr, $name:ident, $entrypoint:expr, $id:path) => {
$crate::declare_id!($bs58_string);
$crate::declare_builtin_name!($name, $id, $entrypoint);
};
}

View File

@ -57,7 +57,6 @@ pub use solana_program::{
pub mod account;
pub mod account_utils;
pub mod builtins;
pub mod client;
pub mod commitment_config;
pub mod compute_budget;