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
75 changes: 75 additions & 0 deletions src/account_size_class.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
const KB: u32 = 1024;
const MB: u32 = 1024 * KB;

//
// PERFORMANCE TIP: if a single transaction contains N dlp-instructions, add
// DLP_PROGRAM_DATA_SIZE_CLASS once, not N times. So consider doing something like this:
//
// let size_budget = commit_diff_size_budget(blah)
// + finalize_size_budget(blah)
// + undelegate_size_budget(blah)
// - 2 * DLP_PROGRAM_DATA_SIZE_CLASS.size_budget();
//
// That is because each *_size_budget() function includes this constant, so callers must subtract (N-1) instances
// when combining multiple instructions.
//
pub const DLP_PROGRAM_DATA_SIZE_CLASS: AccountSizeClass = AccountSizeClass::Dynamic(350 * KB);

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum AccountSizeClass {
// account size <= 256 B
//
// - sysvars (rent, clock, epoch schedule)
// - SPL token account and ATA
// - SPL token mint
// - delegation_metadata_pda
// - delegation_record_pda
// - commit_record_pda
// - program_config_pda
// - validator
// - fees_vault_pda
Tiny,

// account size <= 1 KB
//
// - sysvars (recent blockhash)
Small,

// account size <= 8 KB
//
// - sysvars (instructions)
Medium,

// account size <= 64 KB
//
// - sysvars (state history)
Large,

// account size <= 256 KB
//
ExtraLarge,

// account size <= 1 MB
Huge,

// any legal value
Dynamic(u32),
}

impl AccountSizeClass {
pub const fn size_budget(self) -> u32 {
match self {
Self::Tiny => 256,
Self::Small => KB,
Self::Medium => 8 * KB,
Self::Large => 64 * KB,
Self::ExtraLarge => 256 * KB,
Self::Huge => MB,
Self::Dynamic(n) => n,
}
}
}

pub fn total_size_budget(classes: &[AccountSizeClass]) -> u32 {
classes.iter().map(|f| f.size_budget()).sum()
}
17 changes: 17 additions & 0 deletions src/instruction_builder/call_handler.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::args::CallHandlerArgs;
use crate::discriminator::DlpDiscriminator;
use crate::pda::{ephemeral_balance_pda_from_payer, validator_fees_vault_pda_from_validator};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};
use borsh::to_vec;
use solana_program::instruction::Instruction;
use solana_program::{instruction::AccountMeta, pubkey::Pubkey};
Expand Down Expand Up @@ -38,3 +39,19 @@ pub fn call_handler(
.concat(),
}
}

///
/// Returns accounts-data-size budget for call_handler instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn call_handler_size_budget(destination_program: AccountSizeClass, other_accounts: u32) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
AccountSizeClass::Tiny, // validator_fees_vault_pda
destination_program,
AccountSizeClass::Tiny, // escrow_authority
AccountSizeClass::Tiny, // escrow_account
]) + other_accounts
}
21 changes: 21 additions & 0 deletions src/instruction_builder/commit_diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::pda::{
delegation_metadata_pda_from_delegated_account, delegation_record_pda_from_delegated_account,
program_config_from_program_id, validator_fees_vault_pda_from_validator,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds a commit state instruction.
/// See [crate::processor::fast::process_commit_diff] for docs.
Expand Down Expand Up @@ -43,3 +44,23 @@ pub fn commit_diff(
data: [DlpDiscriminator::CommitDiff.to_vec(), commit_args].concat(),
}
}

///
/// Returns accounts-data-size budget for commit_diff instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn commit_diff_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
delegated_account, // delegated_account
delegated_account, // commit_state_pda
AccountSizeClass::Tiny, // commit_record_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
AccountSizeClass::Tiny, // validator_fees_vault_pda
AccountSizeClass::Tiny, // program_config_pda
AccountSizeClass::Tiny, // system_program
])
}
22 changes: 22 additions & 0 deletions src/instruction_builder/commit_diff_from_buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::pda::{
delegation_metadata_pda_from_delegated_account, delegation_record_pda_from_delegated_account,
program_config_from_program_id, validator_fees_vault_pda_from_validator,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds a commit state from buffer instruction.
/// See [crate::processor::process_commit_diff_from_buffer] for docs.
Expand Down Expand Up @@ -45,3 +46,24 @@ pub fn commit_diff_from_buffer(
data: [DlpDiscriminator::CommitDiffFromBuffer.to_vec(), commit_args].concat(),
}
}

///
/// Returns accounts-data-size budget for commit_diff_from_buffer instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn commit_diff_from_buffer_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
delegated_account, // delegated_account
delegated_account, // commit_state_pda
AccountSizeClass::Tiny, // commit_record_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
delegated_account, // commit_state_buffer
AccountSizeClass::Tiny, // validator_fees_vault_pda
AccountSizeClass::Tiny, // program_config_pda
AccountSizeClass::Tiny, // system_program
])
}
21 changes: 21 additions & 0 deletions src/instruction_builder/commit_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::pda::{
delegation_metadata_pda_from_delegated_account, delegation_record_pda_from_delegated_account,
program_config_from_program_id, validator_fees_vault_pda_from_validator,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds a commit state instruction.
/// See [crate::processor::process_commit_state] for docs.
Expand Down Expand Up @@ -43,3 +44,23 @@ pub fn commit_state(
data: [DlpDiscriminator::CommitState.to_vec(), commit_args].concat(),
}
}

///
/// Returns accounts-data-size budget for commit_state instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn commit_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
delegated_account, // delegated_account
delegated_account, // commit_state_pda
AccountSizeClass::Tiny, // commit_record_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
AccountSizeClass::Tiny, // validator_fees_vault_pda
AccountSizeClass::Tiny, // program_config_pda
AccountSizeClass::Tiny, // system_program
])
}
22 changes: 22 additions & 0 deletions src/instruction_builder/commit_state_from_buffer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::pda::{
delegation_metadata_pda_from_delegated_account, delegation_record_pda_from_delegated_account,
program_config_from_program_id, validator_fees_vault_pda_from_validator,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds a commit state from buffer instruction.
/// See [crate::processor::process_commit_state_from_buffer] for docs.
Expand Down Expand Up @@ -49,3 +50,24 @@ pub fn commit_state_from_buffer(
.concat(),
}
}

///
/// Returns accounts-data-size budget for commit_state_from_buffer instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn commit_state_from_buffer_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
delegated_account, // delegated_account
delegated_account, // commit_state_pda
AccountSizeClass::Tiny, // commit_record_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
delegated_account, // commit_state_buffer
AccountSizeClass::Tiny, // validator_fees_vault_pda
AccountSizeClass::Tiny, // program_config_pda
AccountSizeClass::Tiny, // system_program
])
}
19 changes: 19 additions & 0 deletions src/instruction_builder/delegate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::pda::{
delegate_buffer_pda_from_delegated_account_and_owner_program,
delegation_metadata_pda_from_delegated_account, delegation_record_pda_from_delegated_account,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds a delegate instruction
/// See [crate::processor::process_delegate] for docs.
Expand Down Expand Up @@ -41,3 +42,21 @@ pub fn delegate(
data,
}
}

///
/// Returns accounts-data-size budget for delegate instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn delegate_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // payer
delegated_account, // delegated_account
AccountSizeClass::Tiny, // owner
delegated_account, // delegate_buffer_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
AccountSizeClass::Tiny, // system_program
])
}
20 changes: 20 additions & 0 deletions src/instruction_builder/finalize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use crate::pda::{
delegation_metadata_pda_from_delegated_account, delegation_record_pda_from_delegated_account,
validator_fees_vault_pda_from_validator,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds a finalize state instruction.
/// See [crate::processor::process_finalize] for docs.
Expand All @@ -33,3 +34,22 @@ pub fn finalize(validator: Pubkey, delegated_account: Pubkey) -> Instruction {
data: DlpDiscriminator::Finalize.to_vec(),
}
}

///
/// Returns accounts-data-size budget for finalize instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn finalize_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
delegated_account, // delegated_account
delegated_account, // commit_state_pda
AccountSizeClass::Tiny, // commit_record_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
AccountSizeClass::Tiny, // validator_fees_vault_pda
AccountSizeClass::Tiny, // system_program
])
}
24 changes: 24 additions & 0 deletions src/instruction_builder/undelegate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use crate::pda::{
fees_vault_pda, undelegate_buffer_pda_from_delegated_account,
validator_fees_vault_pda_from_validator,
};
use crate::{total_size_budget, AccountSizeClass, DLP_PROGRAM_DATA_SIZE_CLASS};

/// Builds an undelegate instruction.
/// See [crate::processor::process_undelegate] for docs.
Expand Down Expand Up @@ -46,3 +47,26 @@ pub fn undelegate(
data: DlpDiscriminator::Undelegate.to_vec(),
}
}

///
/// Returns accounts-data-size budget for undelegate instruction.
///
/// This value can be used with ComputeBudgetInstruction::SetLoadedAccountsDataSizeLimit
///
pub fn undelegate_size_budget(delegated_account: AccountSizeClass) -> u32 {
total_size_budget(&[
DLP_PROGRAM_DATA_SIZE_CLASS,
AccountSizeClass::Tiny, // validator
delegated_account, // delegated_account
AccountSizeClass::Tiny, // owner_program
delegated_account, // undelegate_buffer_pda
delegated_account, // commit_state_pda
AccountSizeClass::Tiny, // commit_record_pda
AccountSizeClass::Tiny, // delegation_record_pda
AccountSizeClass::Tiny, // delegation_metadata_pda
AccountSizeClass::Tiny, // rent_reimbursement
AccountSizeClass::Tiny, // fees_vault_pda
AccountSizeClass::Tiny, // validator_fees_vault_pda
AccountSizeClass::Tiny, // system_program
])
}
4 changes: 4 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ pub mod instruction_builder;
pub mod pda;
pub mod state;

mod account_size_class;

pub use account_size_class::*;

#[cfg(not(feature = "sdk"))]
mod diff;
#[cfg(not(feature = "sdk"))]
Expand Down