cli: skip no-op program buffer writes (#277)

cli: skip no-op program deploy write txs
This commit is contained in:
Justin Starry 2024-03-19 07:28:53 +08:00 committed by GHA: Update Upstream From Fork
parent fee4d82a56
commit 21eff36754
1 changed files with 49 additions and 30 deletions

View File

@ -2213,11 +2213,12 @@ fn do_process_program_write_and_deploy(
let blockhash = rpc_client.get_latest_blockhash()?;
// Initialize buffer account or complete if already partially initialized
let (initial_instructions, balance_needed) = if let Some(account) = rpc_client
let (initial_instructions, balance_needed, buffer_program_data) = if let Some(mut account) =
rpc_client
.get_account_with_commitment(buffer_pubkey, config.commitment)?
.value
{
complete_partial_program_init(
let (ixs, balance_needed) = complete_partial_program_init(
loader_id,
&fee_payer_signer.pubkey(),
buffer_pubkey,
@ -2229,7 +2230,11 @@ fn do_process_program_write_and_deploy(
},
min_rent_exempt_program_data_balance,
allow_excessive_balance,
)?
)?;
let buffer_program_data = account
.data
.split_off(UpgradeableLoaderState::size_of_buffer_metadata());
(ixs, balance_needed, buffer_program_data)
} else if loader_id == &bpf_loader_upgradeable::id() {
(
bpf_loader_upgradeable::create_buffer(
@ -2240,6 +2245,7 @@ fn do_process_program_write_and_deploy(
program_len,
)?,
min_rent_exempt_program_data_balance,
vec![0; program_len],
)
} else {
(
@ -2251,6 +2257,7 @@ fn do_process_program_write_and_deploy(
loader_id,
)],
min_rent_exempt_program_data_balance,
vec![0; program_len],
)
};
let initial_message = if !initial_instructions.is_empty() {
@ -2281,7 +2288,10 @@ fn do_process_program_write_and_deploy(
let mut write_messages = vec![];
let chunk_size = calculate_max_chunk_size(&create_msg);
for (chunk, i) in program_data.chunks(chunk_size).zip(0..) {
write_messages.push(create_msg((i * chunk_size) as u32, chunk.to_vec()));
let offset = i * chunk_size;
if chunk != &buffer_program_data[offset..offset + chunk.len()] {
write_messages.push(create_msg(offset as u32, chunk.to_vec()));
}
}
// Create and add final message
@ -2370,11 +2380,12 @@ fn do_process_program_upgrade(
let (initial_message, write_messages, balance_needed) =
if let Some(buffer_signer) = buffer_signer {
// Check Buffer account to see if partial initialization has occurred
let (initial_instructions, balance_needed) = if let Some(account) = rpc_client
let (initial_instructions, balance_needed, buffer_program_data) =
if let Some(mut account) = rpc_client
.get_account_with_commitment(&buffer_signer.pubkey(), config.commitment)?
.value
{
complete_partial_program_init(
let (ixs, balance_needed) = complete_partial_program_init(
&bpf_loader_upgradeable::id(),
&fee_payer_signer.pubkey(),
&buffer_signer.pubkey(),
@ -2382,7 +2393,11 @@ fn do_process_program_upgrade(
UpgradeableLoaderState::size_of_buffer(program_len),
min_rent_exempt_program_data_balance,
true,
)?
)?;
let buffer_program_data = account
.data
.split_off(UpgradeableLoaderState::size_of_buffer_metadata());
(ixs, balance_needed, buffer_program_data)
} else {
(
bpf_loader_upgradeable::create_buffer(
@ -2393,6 +2408,7 @@ fn do_process_program_upgrade(
program_len,
)?,
min_rent_exempt_program_data_balance,
vec![0; program_len],
)
};
@ -2426,7 +2442,10 @@ fn do_process_program_upgrade(
let mut write_messages = vec![];
let chunk_size = calculate_max_chunk_size(&create_msg);
for (chunk, i) in program_data.chunks(chunk_size).zip(0..) {
write_messages.push(create_msg((i * chunk_size) as u32, chunk.to_vec()));
let offset = i * chunk_size;
if chunk != &buffer_program_data[offset..offset + chunk.len()] {
write_messages.push(create_msg(offset as u32, chunk.to_vec()));
}
}
(initial_message, write_messages, balance_needed)