Skip to content

Commit 3482e9c

Browse files
snawazDodecahedr0x
authored andcommitted
feat: use SetLoadedAccountsDataSizeLimit for tx containing DLP ix (#800)
1 parent b9dbae4 commit 3482e9c

13 files changed

Lines changed: 170 additions & 64 deletions

File tree

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ magicblock-committor-program = { path = "./magicblock-committor-program", featur
106106
magicblock-committor-service = { path = "./magicblock-committor-service" }
107107
magicblock-config = { path = "./magicblock-config" }
108108
magicblock-core = { path = "./magicblock-core" }
109-
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "3edb41022", features = [
109+
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "1874b4f5f5f55cb9ab54b64de2cc0d41107d1435", features = [
110110
"no-entrypoint",
111111
] }
112112
magicblock-ledger = { path = "./magicblock-ledger" }

magicblock-committor-service/src/intent_executor/error.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,10 @@ impl TransactionStrategyExecutionError {
179179
signature: Option<Signature>,
180180
tasks: &[Box<dyn BaseTask>],
181181
) -> Result<Self, TransactionError> {
182-
// There's always 2 budget instructions in front
183-
const OFFSET: u8 = 2;
182+
// There's always 3 budget instructions in front
183+
// TODO (snawaz): this is offset-sensitive, if we add or remove any instruction from the
184+
// front, that leads to incorrect error reporting. so if possible, make it offset-insensitive.
185+
const OFFSET: u8 = 3;
184186
const NONCE_OUT_OF_ORDER: u32 =
185187
dlp::error::DlpError::NonceOutOfOrder as u32;
186188

magicblock-committor-service/src/tasks/args_task.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ use compressed_delegation_client::types::{CommitArgs, FinalizeArgs};
22
use dlp::{
33
args::{CallHandlerArgs, CommitDiffArgs, CommitStateArgs},
44
compute_diff,
5+
instruction_builder::{
6+
call_handler_size_budget, commit_diff_size_budget, commit_size_budget,
7+
finalize_size_budget, undelegate_size_budget,
8+
},
9+
AccountSizeClass,
510
};
611
use magicblock_metrics::metrics::LabelValue;
712
use solana_account::ReadableAccount;
@@ -251,6 +256,38 @@ impl BaseTask for ArgsTask {
251256
}
252257
}
253258

259+
fn accounts_size_budget(&self) -> u32 {
260+
match &self.task_type {
261+
ArgsTaskType::Commit(task) => {
262+
commit_size_budget(AccountSizeClass::Dynamic(
263+
task.committed_account.account.data.len() as u32,
264+
))
265+
}
266+
ArgsTaskType::CommitDiff(task) => {
267+
commit_diff_size_budget(AccountSizeClass::Dynamic(
268+
task.committed_account.account.data.len() as u32,
269+
))
270+
}
271+
ArgsTaskType::BaseAction(task) => {
272+
// assume all other accounts are Small accounts.
273+
let other_accounts_budget =
274+
task.action.account_metas_per_program.len() as u32
275+
* AccountSizeClass::Small.size_budget();
276+
277+
call_handler_size_budget(
278+
AccountSizeClass::Medium,
279+
other_accounts_budget,
280+
)
281+
}
282+
ArgsTaskType::Undelegate(_) => {
283+
undelegate_size_budget(AccountSizeClass::Huge)
284+
}
285+
ArgsTaskType::Finalize(_) => {
286+
finalize_size_budget(AccountSizeClass::Huge)
287+
}
288+
}
289+
}
290+
254291
#[cfg(test)]
255292
fn strategy(&self) -> TaskStrategy {
256293
TaskStrategy::Args

magicblock-committor-service/src/tasks/buffer_task.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use dlp::args::CommitStateFromBufferArgs;
1+
use dlp::{
2+
args::CommitStateFromBufferArgs, instruction_builder::commit_size_budget,
3+
AccountSizeClass,
4+
};
25
use magicblock_committor_program::Chunks;
36
use magicblock_metrics::metrics::LabelValue;
47
use solana_instruction::Instruction;
@@ -131,6 +134,14 @@ impl BaseTask for BufferTask {
131134
}
132135
}
133136

137+
fn accounts_size_budget(&self) -> u32 {
138+
match self.task_type {
139+
BufferTaskType::Commit(_) => {
140+
commit_size_budget(AccountSizeClass::Huge)
141+
}
142+
}
143+
}
144+
134145
#[cfg(test)]
135146
fn strategy(&self) -> TaskStrategy {
136147
TaskStrategy::Buffer

magicblock-committor-service/src/tasks/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ pub trait BaseTask: Send + Sync + DynClone + LabelValue {
8989
/// Returns [`Task`] budget
9090
fn compute_units(&self) -> u32;
9191

92+
/// Returns the max accounts-data-size that can be used with SetLoadedAccountsDataSizeLimit
93+
fn accounts_size_budget(&self) -> u32;
94+
9295
/// Returns current [`TaskStrategy`]
9396
#[cfg(test)]
9497
fn strategy(&self) -> TaskStrategy;

magicblock-committor-service/src/tasks/task_strategist.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,12 @@ impl TaskStrategist {
255255
let placeholder = Keypair::new();
256256
// Gather all involved keys in tx
257257
let budgets = TransactionUtils::tasks_compute_units(tasks);
258-
let budget_instructions =
259-
TransactionUtils::budget_instructions(budgets, u64::default());
258+
let size_budgets = TransactionUtils::tasks_accounts_size_budget(tasks);
259+
let budget_instructions = TransactionUtils::budget_instructions(
260+
budgets,
261+
u64::default(),
262+
size_budgets,
263+
);
260264
let unique_involved_pubkeys = TransactionUtils::unique_involved_pubkeys(
261265
tasks,
262266
&placeholder.pubkey(),
@@ -289,8 +293,12 @@ impl TaskStrategist {
289293
tasks: &[Box<dyn BaseTask>],
290294
) -> Vec<Pubkey> {
291295
let budgets = TransactionUtils::tasks_compute_units(tasks);
292-
let budget_instructions =
293-
TransactionUtils::budget_instructions(budgets, u64::default());
296+
let size_budgets = TransactionUtils::tasks_accounts_size_budget(tasks);
297+
let budget_instructions = TransactionUtils::budget_instructions(
298+
budgets,
299+
u64::default(),
300+
size_budgets,
301+
);
294302

295303
TransactionUtils::unique_involved_pubkeys(
296304
tasks,

magicblock-committor-service/src/tasks/utils.rs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::collections::HashSet;
22

3+
use dlp::DLP_PROGRAM_DATA_SIZE_CLASS;
34
use solana_compute_budget_interface::ComputeBudgetInstruction;
45
use solana_hash::Hash;
56
use solana_instruction::Instruction;
@@ -66,6 +67,7 @@ impl TransactionUtils {
6667
let budget_instructions = Self::budget_instructions(
6768
Self::tasks_compute_units(tasks),
6869
compute_unit_price,
70+
Self::tasks_accounts_size_budget(tasks),
6971
);
7072
let ixs = Self::tasks_instructions(&authority.pubkey(), tasks);
7173
Self::assemble_tx_raw(
@@ -127,16 +129,38 @@ impl TransactionUtils {
127129
tasks.iter().map(|task| task.as_ref().compute_units()).sum()
128130
}
129131

132+
pub fn tasks_accounts_size_budget(
133+
tasks: &[impl AsRef<dyn BaseTask>],
134+
) -> u32 {
135+
if tasks.is_empty() {
136+
return 0;
137+
}
138+
139+
let total_budget: u32 = tasks
140+
.iter()
141+
.map(|task| task.as_ref().accounts_size_budget())
142+
.sum();
143+
144+
// DLP_PROGRAM_DATA_SIZE_CLASS has been added N times, once for each task.
145+
// We need to add it once only, so minus (N-1) times.
146+
total_budget
147+
- (tasks.len() as u32 - 1)
148+
* DLP_PROGRAM_DATA_SIZE_CLASS.size_budget()
149+
}
150+
130151
pub fn budget_instructions(
131152
compute_units: u32,
132153
compute_unit_price: u64,
133-
) -> [Instruction; 2] {
134-
let compute_budget_ix =
135-
ComputeBudgetInstruction::set_compute_unit_limit(compute_units);
136-
let compute_unit_price_ix =
154+
accounts_size_budget: u32,
155+
) -> [Instruction; 3] {
156+
[
157+
ComputeBudgetInstruction::set_compute_unit_limit(compute_units),
137158
ComputeBudgetInstruction::set_compute_unit_price(
138159
compute_unit_price,
139-
);
140-
[compute_budget_ix, compute_unit_price_ix]
160+
),
161+
ComputeBudgetInstruction::set_loaded_accounts_data_size_limit(
162+
accounts_size_budget,
163+
),
164+
]
141165
}
142166
}

test-integration/Cargo.lock

Lines changed: 13 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test-integration/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain-
6868
"modular-sdk",
6969
] }
7070
magicblock_magic_program_api = { package = "magicblock-magic-program-api", path = "../magicblock-magic-program-api" }
71-
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "3edb41022", features = [
71+
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "1874b4f5f5f55cb9ab54b64de2cc0d41107d1435", features = [
7272
"no-entrypoint",
7373
] }
7474
magicblock-program = { path = "../programs/magicblock" }

0 commit comments

Comments
 (0)