Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 15 additions & 127 deletions cli/src/program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,8 @@ pub enum ProgramCliCommand {
use_lamports_unit: bool,
bypass_warning: bool,
},
ExtendProgramChecked {
ExtendProgram {
program_pubkey: Pubkey,
authority_signer_index: SignerIndex,
payer_signer_index: SignerIndex,
additional_bytes: u32,
},
Expand Down Expand Up @@ -645,16 +644,6 @@ impl ProgramSubCommands for App<'_, '_> {
data account",
),
)
.arg(
Arg::with_name("authority")
.long("authority")
.value_name("AUTHORITY_SIGNER")
.takes_value(true)
.validator(is_valid_signer)
.help(
"Upgrade authority [default: the default configured keypair]",
),
)
.arg(
Arg::with_name("payer")
.long("payer")
Expand Down Expand Up @@ -1008,25 +997,20 @@ pub fn parse_program_subcommand(
("extend", Some(matches)) => {
let program_pubkey = pubkey_of(matches, "program_id").unwrap();
let additional_bytes = value_of(matches, "additional_bytes").unwrap();

let (authority_signer, authority_pubkey) =
signer_of(matches, "authority", wallet_manager)?;
let (payer_signer, payer_pubkey) = signer_of(matches, "payer", wallet_manager)?;

let signer_info = default_signer.generate_unique_signers(
vec![
Some(default_signer.signer_from_path(matches, wallet_manager)?),
authority_signer,
payer_signer,
],
matches,
wallet_manager,
)?;

CliCommandInfo {
command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
command: CliCommand::Program(ProgramCliCommand::ExtendProgram {
program_pubkey,
authority_signer_index: signer_info.index_of(authority_pubkey).unwrap(),
payer_signer_index: signer_info.index_of(payer_pubkey).unwrap(),
additional_bytes,
}),
Expand Down Expand Up @@ -1237,17 +1221,15 @@ pub async fn process_program_subcommand(
)
.await
}
ProgramCliCommand::ExtendProgramChecked {
ProgramCliCommand::ExtendProgram {
program_pubkey,
authority_signer_index,
payer_signer_index,
additional_bytes,
} => {
process_extend_program(
&rpc_client,
config,
*program_pubkey,
*authority_signer_index,
*payer_signer_index,
*additional_bytes,
)
Expand Down Expand Up @@ -2416,12 +2398,10 @@ async fn process_extend_program(
rpc_client: &RpcClient,
config: &CliConfig<'_>,
program_pubkey: Pubkey,
authority_signer_index: SignerIndex,
payer_signer_index: SignerIndex,
additional_bytes: u32,
) -> ProcessResult {
let fee_payer_pubkey = config.signers[0].pubkey();
let authority_signer = config.signers[authority_signer_index];
let payer_signer = config.signers[payer_signer_index];
let payer_pubkey = payer_signer.pubkey();

Expand Down Expand Up @@ -2468,41 +2448,19 @@ async fn process_extend_program(
_ => Err(format!("Program {program_pubkey} is closed")),
}?;

let upgrade_authority_address = upgrade_authority_address
upgrade_authority_address
.ok_or_else(|| format!("Program {program_pubkey} is not upgradeable"))?;

if authority_signer.pubkey() != upgrade_authority_address {
return Err(format!(
"Upgrade authority {} does not match {}",
upgrade_authority_address,
authority_signer.pubkey(),
)
.into());
}

let blockhash = rpc_client.get_latest_blockhash().await?;
let feature_set = fetch_feature_set(rpc_client).await?;

let instruction = if feature_set.snapshot().enable_extend_program_checked {
loader_v3_instruction::extend_program_checked(
&program_pubkey,
&upgrade_authority_address,
Some(&payer_pubkey),
additional_bytes,
)
} else {
loader_v3_instruction::extend_program(
&program_pubkey,
Some(&payer_pubkey),
additional_bytes,
)
};
let instruction = loader_v3_instruction::extend_program(
&program_pubkey,
Some(&payer_pubkey),
additional_bytes,
);
let mut tx = Transaction::new_unsigned(Message::new(&[instruction], Some(&fee_payer_pubkey)));

tx.try_sign(
&[config.signers[0], authority_signer, payer_signer],
blockhash,
)?;
tx.try_sign(&[config.signers[0], payer_signer], blockhash)?;
let result = rpc_client
.send_and_confirm_transaction_with_spinner_and_config(
&tx,
Expand Down Expand Up @@ -2972,8 +2930,7 @@ async fn extend_program_data_if_needed(
_ => Err(format!("Program {program_id} is closed")),
}?;

let upgrade_authority_address = upgrade_authority_address
.ok_or_else(|| format!("Program {program_id} is not upgradeable"))?;
upgrade_authority_address.ok_or_else(|| format!("Program {program_id} is not upgradeable"))?;

let required_len = UpgradeableLoaderState::size_of_programdata(program_len);
let max_permitted_data_length = usize::try_from(MAX_PERMITTED_DATA_LENGTH).unwrap();
Expand All @@ -2997,17 +2954,8 @@ async fn extend_program_data_if_needed(
let additional_bytes =
u32::try_from(additional_bytes).expect("`u32` is big enough to hold an account size");

let feature_set = fetch_feature_set(rpc_client).await?;
let instruction = if feature_set.snapshot().enable_extend_program_checked {
loader_v3_instruction::extend_program_checked(
program_id,
&upgrade_authority_address,
Some(fee_payer),
additional_bytes,
)
} else {
loader_v3_instruction::extend_program(program_id, Some(fee_payer), additional_bytes)
};
let instruction =
loader_v3_instruction::extend_program(program_id, Some(fee_payer), additional_bytes);
initial_instructions.push(instruction);

Ok(())
Expand Down Expand Up @@ -4449,45 +4397,15 @@ mod tests {
assert_eq!(
parse_command(&test_command, &default_signer, &mut None).unwrap(),
CliCommandInfo {
command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
command: CliCommand::Program(ProgramCliCommand::ExtendProgram {
program_pubkey,
authority_signer_index: 0,
payer_signer_index: 0,
additional_bytes
}),
signers: vec![Box::new(read_keypair_file(&keypair_file).unwrap())],
}
);

// with authority
let authority_keypair = Keypair::new();
let authority_keypair_file = make_tmp_path("authority_keypair_file");
write_keypair_file(&authority_keypair, &authority_keypair_file).unwrap();
let test_command = test_commands.clone().get_matches_from(vec![
"test",
"program",
"extend",
&program_pubkey.to_string(),
&additional_bytes.to_string(),
"--authority",
&authority_keypair_file,
]);
assert_eq!(
parse_command(&test_command, &default_signer, &mut None).unwrap(),
CliCommandInfo {
command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
program_pubkey,
authority_signer_index: 1,
payer_signer_index: 0,
additional_bytes
}),
signers: vec![
Box::new(read_keypair_file(&keypair_file).unwrap()),
Box::new(read_keypair_file(&authority_keypair_file).unwrap()),
],
}
);

// with payer
let payer_keypair = Keypair::new();
let payer_keypair_file = make_tmp_path("payer_keypair_file");
Expand All @@ -4504,9 +4422,8 @@ mod tests {
assert_eq!(
parse_command(&test_command, &default_signer, &mut None).unwrap(),
CliCommandInfo {
command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
command: CliCommand::Program(ProgramCliCommand::ExtendProgram {
program_pubkey,
authority_signer_index: 0,
payer_signer_index: 1,
additional_bytes
}),
Expand All @@ -4516,35 +4433,6 @@ mod tests {
],
}
);

// with both authority and payer
let test_command = test_commands.clone().get_matches_from(vec![
"test",
"program",
"extend",
&program_pubkey.to_string(),
&additional_bytes.to_string(),
"--authority",
&authority_keypair_file,
"--payer",
&payer_keypair_file,
]);
assert_eq!(
parse_command(&test_command, &default_signer, &mut None).unwrap(),
CliCommandInfo {
command: CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
program_pubkey,
authority_signer_index: 1,
payer_signer_index: 2,
additional_bytes
}),
signers: vec![
Box::new(read_keypair_file(&keypair_file).unwrap()),
Box::new(read_keypair_file(&authority_keypair_file).unwrap()),
Box::new(read_keypair_file(&payer_keypair_file).unwrap()),
],
}
);
}

#[tokio::test]
Expand Down
22 changes: 10 additions & 12 deletions cli/tests/program.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#![allow(clippy::arithmetic_side_effects)]

use {
agave_feature_set::enable_alt_bn128_syscall,
agave_feature_set::{enable_alt_bn128_syscall, enable_extend_program_checked},
assert_matches::assert_matches,
serde_json::Value,
solana_account::{ReadableAccount, state_traits::StateMut},
Expand Down Expand Up @@ -59,7 +59,8 @@ fn test_validator_genesis(mint_keypair: &Keypair) -> TestValidatorGenesis {
})
.faucet_addr(Some(run_local_faucet_with_unique_port_for_tests(
mint_keypair.insecure_clone(),
)));
)))
.deactivate_features(&[enable_extend_program_checked::id()]);
genesis
}

Expand Down Expand Up @@ -1516,10 +1517,9 @@ async fn test_cli_program_extend_program() {
file.read_to_end(&mut new_program_data).unwrap();
let new_max_len = new_program_data.len();
let additional_bytes = (new_max_len - max_len) as u32;
config.signers = vec![&keypair, &upgrade_authority];
config.command = CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
config.signers = vec![&keypair];
config.command = CliCommand::Program(ProgramCliCommand::ExtendProgram {
program_pubkey: program_keypair.pubkey(),
authority_signer_index: 1,
payer_signer_index: 0,
additional_bytes: additional_bytes - 1,
});
Expand Down Expand Up @@ -1571,10 +1571,9 @@ async fn test_cli_program_extend_program() {
wait_n_slots(&rpc_client, 1).await;

// Extend 1 last byte
config.signers = vec![&keypair, &upgrade_authority];
config.command = CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
config.signers = vec![&keypair];
config.command = CliCommand::Program(ProgramCliCommand::ExtendProgram {
program_pubkey: program_keypair.pubkey(),
authority_signer_index: 1,
payer_signer_index: 0,
additional_bytes: 1,
});
Expand Down Expand Up @@ -1619,11 +1618,10 @@ async fn test_cli_program_extend_program() {
let programdata_account = rpc_client.get_account(&programdata_pubkey).await.unwrap();
let prev_len = programdata_account.data.len();

config.signers = vec![&keypair, &upgrade_authority, &rent_payer];
config.command = CliCommand::Program(ProgramCliCommand::ExtendProgramChecked {
config.signers = vec![&keypair, &rent_payer];
config.command = CliCommand::Program(ProgramCliCommand::ExtendProgram {
program_pubkey: program_keypair.pubkey(),
authority_signer_index: 1,
payer_signer_index: 2,
payer_signer_index: 1,
additional_bytes: 1024,
});
process_command(&config).await.unwrap();
Expand Down
3 changes: 0 additions & 3 deletions feature-set/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ pub struct FeatureSnapshot {
pub deplete_cu_meter_on_vm_failure: bool,
pub fix_alt_bn128_multiplication_input_length: bool,
pub relax_intrabatch_account_locks: bool,
pub enable_extend_program_checked: bool,
pub formalize_loaded_transaction_data_size: bool,
pub alpenglow: bool,
pub disable_zk_elgamal_proof_program: bool,
Expand Down Expand Up @@ -153,7 +152,6 @@ impl From<&AHashMap<Pubkey, u64>> for FeatureSnapshot {
&fix_alt_bn128_multiplication_input_length::ID,
),
relax_intrabatch_account_locks: is_active(&relax_intrabatch_account_locks::ID),
enable_extend_program_checked: is_active(&enable_extend_program_checked::ID),
formalize_loaded_transaction_data_size: is_active(
&formalize_loaded_transaction_data_size::ID,
),
Expand Down Expand Up @@ -339,7 +337,6 @@ impl FeatureSet {
fix_alt_bn128_multiplication_input_length: snapshot
.fix_alt_bn128_multiplication_input_length,
increase_tx_account_lock_limit: snapshot.increase_tx_account_lock_limit,
enable_extend_program_checked: snapshot.enable_extend_program_checked,
formalize_loaded_transaction_data_size: snapshot.formalize_loaded_transaction_data_size,
disable_zk_elgamal_proof_program: snapshot.disable_zk_elgamal_proof_program,
reenable_zk_elgamal_proof_program: snapshot.reenable_zk_elgamal_proof_program,
Expand Down
6 changes: 0 additions & 6 deletions program-runtime/src/cpi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,12 +188,6 @@ fn check_authorized_program(
&& bpf_loader_upgradeable::is_set_authority_checked_instruction(
instruction_data,
))
|| (invoke_context
.get_feature_set()
.enable_extend_program_checked
&& bpf_loader_upgradeable::is_extend_program_checked_instruction(
instruction_data,
))
|| bpf_loader_upgradeable::is_close_instruction(instruction_data)))
|| invoke_context.is_precompile(program_id)
{
Expand Down
Loading
Loading