* featurize_policy_update (#18492)
(cherry picked from commit ccdf93e2b8
)
# Conflicts:
# runtime/benches/message_processor.rs
# runtime/src/message_processor.rs
* fix conflicts
* nudge
Co-authored-by: Jack May <jack@solana.com>
This commit is contained in:
@@ -24,7 +24,8 @@ fn bench_verify_account_changes_data(bencher: &mut Bencher) {
|
|||||||
false,
|
false,
|
||||||
&Rent::default(),
|
&Rent::default(),
|
||||||
&post,
|
&post,
|
||||||
&mut ExecuteDetailsTimings::default()
|
&mut ExecuteDetailsTimings::default(),
|
||||||
|
true
|
||||||
),
|
),
|
||||||
Ok(())
|
Ok(())
|
||||||
);
|
);
|
||||||
@@ -37,6 +38,7 @@ fn bench_verify_account_changes_data(bencher: &mut Bencher) {
|
|||||||
&Rent::default(),
|
&Rent::default(),
|
||||||
&post,
|
&post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
});
|
});
|
||||||
@@ -60,6 +62,7 @@ fn bench_verify_account_changes_data(bencher: &mut Bencher) {
|
|||||||
&Rent::default(),
|
&Rent::default(),
|
||||||
&post,
|
&post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
});
|
});
|
||||||
|
@@ -10,7 +10,7 @@ use solana_sdk::{
|
|||||||
bpf_loader_upgradeable::{self, UpgradeableLoaderState},
|
bpf_loader_upgradeable::{self, UpgradeableLoaderState},
|
||||||
feature_set::{
|
feature_set::{
|
||||||
cpi_share_ro_and_exec_accounts, demote_sysvar_write_locks, instructions_sysvar_enabled,
|
cpi_share_ro_and_exec_accounts, demote_sysvar_write_locks, instructions_sysvar_enabled,
|
||||||
FeatureSet,
|
updated_verify_policy, FeatureSet,
|
||||||
},
|
},
|
||||||
ic_msg,
|
ic_msg,
|
||||||
instruction::{CompiledInstruction, Instruction, InstructionError},
|
instruction::{CompiledInstruction, Instruction, InstructionError},
|
||||||
@@ -105,6 +105,7 @@ impl PreAccount {
|
|||||||
rent: &Rent,
|
rent: &Rent,
|
||||||
post: &AccountSharedData,
|
post: &AccountSharedData,
|
||||||
timings: &mut ExecuteDetailsTimings,
|
timings: &mut ExecuteDetailsTimings,
|
||||||
|
updated_verify_policy: bool,
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
let pre = self.account.borrow();
|
let pre = self.account.borrow();
|
||||||
|
|
||||||
@@ -173,9 +174,14 @@ impl PreAccount {
|
|||||||
if !rent.is_exempt(post.lamports, post.data().len()) {
|
if !rent.is_exempt(post.lamports, post.data().len()) {
|
||||||
return Err(InstructionError::ExecutableAccountNotRentExempt);
|
return Err(InstructionError::ExecutableAccountNotRentExempt);
|
||||||
}
|
}
|
||||||
|
let owner = if updated_verify_policy {
|
||||||
|
post.owner()
|
||||||
|
} else {
|
||||||
|
pre.owner()
|
||||||
|
};
|
||||||
if !is_writable // line coverage used to get branch coverage
|
if !is_writable // line coverage used to get branch coverage
|
||||||
|| pre.executable
|
|| pre.executable
|
||||||
|| *program_id != post.owner
|
|| program_id != owner
|
||||||
{
|
{
|
||||||
return Err(InstructionError::ExecutableModified);
|
return Err(InstructionError::ExecutableModified);
|
||||||
}
|
}
|
||||||
@@ -354,6 +360,7 @@ impl<'a> InvokeContext for ThisInvokeContext<'a> {
|
|||||||
caller_write_privileges,
|
caller_write_privileges,
|
||||||
&mut self.timings,
|
&mut self.timings,
|
||||||
self.feature_set.is_active(&demote_sysvar_write_locks::id()),
|
self.feature_set.is_active(&demote_sysvar_write_locks::id()),
|
||||||
|
self.feature_set.is_active(&updated_verify_policy::id()),
|
||||||
),
|
),
|
||||||
None => Err(InstructionError::GenericError), // Should never happen
|
None => Err(InstructionError::GenericError), // Should never happen
|
||||||
}
|
}
|
||||||
@@ -963,6 +970,7 @@ impl MessageProcessor {
|
|||||||
rent: &Rent,
|
rent: &Rent,
|
||||||
timings: &mut ExecuteDetailsTimings,
|
timings: &mut ExecuteDetailsTimings,
|
||||||
demote_sysvar_write_locks: bool,
|
demote_sysvar_write_locks: bool,
|
||||||
|
updated_verify_policy: bool,
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
// Verify all executable accounts have zero outstanding refs
|
// Verify all executable accounts have zero outstanding refs
|
||||||
Self::verify_account_references(executable_accounts)?;
|
Self::verify_account_references(executable_accounts)?;
|
||||||
@@ -985,6 +993,7 @@ impl MessageProcessor {
|
|||||||
rent,
|
rent,
|
||||||
&account,
|
&account,
|
||||||
timings,
|
timings,
|
||||||
|
updated_verify_policy,
|
||||||
)?;
|
)?;
|
||||||
pre_sum += u128::from(pre_accounts[unique_index].lamports());
|
pre_sum += u128::from(pre_accounts[unique_index].lamports());
|
||||||
post_sum += u128::from(account.lamports);
|
post_sum += u128::from(account.lamports);
|
||||||
@@ -1001,6 +1010,7 @@ impl MessageProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Verify the results of a cross-program instruction
|
/// Verify the results of a cross-program instruction
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn verify_and_update(
|
fn verify_and_update(
|
||||||
message: &Message,
|
message: &Message,
|
||||||
instruction: &CompiledInstruction,
|
instruction: &CompiledInstruction,
|
||||||
@@ -1011,6 +1021,7 @@ impl MessageProcessor {
|
|||||||
caller_write_privileges: Option<&[bool]>,
|
caller_write_privileges: Option<&[bool]>,
|
||||||
timings: &mut ExecuteDetailsTimings,
|
timings: &mut ExecuteDetailsTimings,
|
||||||
demote_sysvar_write_locks: bool,
|
demote_sysvar_write_locks: bool,
|
||||||
|
updated_verify_policy: bool,
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
// Verify the per-account instruction results
|
// Verify the per-account instruction results
|
||||||
let (mut pre_sum, mut post_sum) = (0_u128, 0_u128);
|
let (mut pre_sum, mut post_sum) = (0_u128, 0_u128);
|
||||||
@@ -1033,7 +1044,14 @@ impl MessageProcessor {
|
|||||||
.map_err(|_| InstructionError::AccountBorrowOutstanding)?;
|
.map_err(|_| InstructionError::AccountBorrowOutstanding)?;
|
||||||
}
|
}
|
||||||
let account = account.borrow();
|
let account = account.borrow();
|
||||||
pre_account.verify(&program_id, is_writable, &rent, &account, timings)?;
|
pre_account.verify(
|
||||||
|
&program_id,
|
||||||
|
is_writable,
|
||||||
|
&rent,
|
||||||
|
&account,
|
||||||
|
timings,
|
||||||
|
updated_verify_policy,
|
||||||
|
)?;
|
||||||
pre_sum += u128::from(pre_account.lamports());
|
pre_sum += u128::from(pre_account.lamports());
|
||||||
post_sum += u128::from(account.lamports);
|
post_sum += u128::from(account.lamports);
|
||||||
if is_writable && !pre_account.executable() {
|
if is_writable && !pre_account.executable() {
|
||||||
@@ -1133,6 +1151,7 @@ impl MessageProcessor {
|
|||||||
&rent_collector.rent,
|
&rent_collector.rent,
|
||||||
timings,
|
timings,
|
||||||
demote_sysvar_write_locks,
|
demote_sysvar_write_locks,
|
||||||
|
invoke_context.is_feature_active(&updated_verify_policy::id()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
timings.accumulate(&invoke_context.timings);
|
timings.accumulate(&invoke_context.timings);
|
||||||
@@ -1414,6 +1433,7 @@ mod tests {
|
|||||||
&self.rent,
|
&self.rent,
|
||||||
&self.post,
|
&self.post,
|
||||||
&mut ExecuteDetailsTimings::default(),
|
&mut ExecuteDetailsTimings::default(),
|
||||||
|
true,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -158,6 +158,10 @@ pub mod vote_stake_checked_instructions {
|
|||||||
solana_sdk::declare_id!("BcWknVcgvonN8sL4HE4XFuEVgfcee5MwxWPAgP6ZV89X");
|
solana_sdk::declare_id!("BcWknVcgvonN8sL4HE4XFuEVgfcee5MwxWPAgP6ZV89X");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod updated_verify_policy {
|
||||||
|
solana_sdk::declare_id!("k15tVxtkgsmo7dy6iJ56N5hBCxuQAtqRgYwoTDuwbia");
|
||||||
|
}
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
/// Map of feature identifiers to user-visible description
|
/// Map of feature identifiers to user-visible description
|
||||||
pub static ref FEATURE_NAMES: HashMap<Pubkey, &'static str> = [
|
pub static ref FEATURE_NAMES: HashMap<Pubkey, &'static str> = [
|
||||||
@@ -196,6 +200,7 @@ lazy_static! {
|
|||||||
(memory_ops_syscalls::id(), "add syscalls for memory operations"),
|
(memory_ops_syscalls::id(), "add syscalls for memory operations"),
|
||||||
(dedupe_config_program_signers::id(), "dedupe config program signers"),
|
(dedupe_config_program_signers::id(), "dedupe config program signers"),
|
||||||
(vote_stake_checked_instructions::id(), "vote/state program checked instructions #18345"),
|
(vote_stake_checked_instructions::id(), "vote/state program checked instructions #18345"),
|
||||||
|
(updated_verify_policy::id(), "Update verify policy"),
|
||||||
/*************** ADD NEW FEATURES HERE ***************/
|
/*************** ADD NEW FEATURES HERE ***************/
|
||||||
]
|
]
|
||||||
.iter()
|
.iter()
|
||||||
|
Reference in New Issue
Block a user