Skip to content

Commit 835f2b3

Browse files
authored
feat: use SetLoadedAccountsDataSizeLimit for tx containing DLP ix (#800)
1 parent 0cafea5 commit 835f2b3

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
@@ -98,7 +98,7 @@ magicblock-committor-program = { path = "./magicblock-committor-program", featur
9898
magicblock-committor-service = { path = "./magicblock-committor-service" }
9999
magicblock-config = { path = "./magicblock-config" }
100100
magicblock-core = { path = "./magicblock-core" }
101-
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "3edb41022", features = [
101+
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "1874b4f5f5f55cb9ab54b64de2cc0d41107d1435", features = [
102102
"no-entrypoint",
103103
] }
104104
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
@@ -176,8 +176,10 @@ impl TransactionStrategyExecutionError {
176176
signature: Option<Signature>,
177177
tasks: &[Box<dyn BaseTask>],
178178
) -> Result<Self, TransactionError> {
179-
// There's always 2 budget instructions in front
180-
const OFFSET: u8 = 2;
179+
// There's always 3 budget instructions in front
180+
// TODO (snawaz): this is offset-sensitive, if we add or remove any instruction from the
181+
// front, that leads to incorrect error reporting. so if possible, make it offset-insensitive.
182+
const OFFSET: u8 = 3;
181183
const NONCE_OUT_OF_ORDER: u32 =
182184
dlp::error::DlpError::NonceOutOfOrder as u32;
183185

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
use dlp::{
22
args::{CallHandlerArgs, CommitDiffArgs, CommitStateArgs},
33
compute_diff,
4+
instruction_builder::{
5+
call_handler_size_budget, commit_diff_size_budget, commit_size_budget,
6+
finalize_size_budget, undelegate_size_budget,
7+
},
8+
AccountSizeClass,
49
};
510
use magicblock_metrics::metrics::LabelValue;
611
use solana_account::ReadableAccount;
@@ -177,6 +182,38 @@ impl BaseTask for ArgsTask {
177182
}
178183
}
179184

185+
fn accounts_size_budget(&self) -> u32 {
186+
match &self.task_type {
187+
ArgsTaskType::Commit(task) => {
188+
commit_size_budget(AccountSizeClass::Dynamic(
189+
task.committed_account.account.data.len() as u32,
190+
))
191+
}
192+
ArgsTaskType::CommitDiff(task) => {
193+
commit_diff_size_budget(AccountSizeClass::Dynamic(
194+
task.committed_account.account.data.len() as u32,
195+
))
196+
}
197+
ArgsTaskType::BaseAction(task) => {
198+
// assume all other accounts are Small accounts.
199+
let other_accounts_budget =
200+
task.action.account_metas_per_program.len() as u32
201+
* AccountSizeClass::Small.size_budget();
202+
203+
call_handler_size_budget(
204+
AccountSizeClass::Medium,
205+
other_accounts_budget,
206+
)
207+
}
208+
ArgsTaskType::Undelegate(_) => {
209+
undelegate_size_budget(AccountSizeClass::Huge)
210+
}
211+
ArgsTaskType::Finalize(_) => {
212+
finalize_size_budget(AccountSizeClass::Huge)
213+
}
214+
}
215+
}
216+
180217
#[cfg(test)]
181218
fn strategy(&self) -> TaskStrategy {
182219
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;
@@ -128,6 +131,14 @@ impl BaseTask for BufferTask {
128131
}
129132
}
130133

134+
fn accounts_size_budget(&self) -> u32 {
135+
match self.task_type {
136+
BufferTaskType::Commit(_) => {
137+
commit_size_budget(AccountSizeClass::Huge)
138+
}
139+
}
140+
}
141+
131142
#[cfg(test)]
132143
fn strategy(&self) -> TaskStrategy {
133144
TaskStrategy::Buffer

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

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

88+
/// Returns the max accounts-data-size that can be used with SetLoadedAccountsDataSizeLimit
89+
fn accounts_size_budget(&self) -> u32;
90+
8891
/// Returns current [`TaskStrategy`]
8992
#[cfg(test)]
9093
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
@@ -224,8 +224,12 @@ impl TaskStrategist {
224224
let placeholder = Keypair::new();
225225
// Gather all involved keys in tx
226226
let budgets = TransactionUtils::tasks_compute_units(tasks);
227-
let budget_instructions =
228-
TransactionUtils::budget_instructions(budgets, u64::default());
227+
let size_budgets = TransactionUtils::tasks_accounts_size_budget(tasks);
228+
let budget_instructions = TransactionUtils::budget_instructions(
229+
budgets,
230+
u64::default(),
231+
size_budgets,
232+
);
229233
let unique_involved_pubkeys = TransactionUtils::unique_involved_pubkeys(
230234
tasks,
231235
&placeholder.pubkey(),
@@ -258,8 +262,12 @@ impl TaskStrategist {
258262
tasks: &[Box<dyn BaseTask>],
259263
) -> Vec<Pubkey> {
260264
let budgets = TransactionUtils::tasks_compute_units(tasks);
261-
let budget_instructions =
262-
TransactionUtils::budget_instructions(budgets, u64::default());
265+
let size_budgets = TransactionUtils::tasks_accounts_size_budget(tasks);
266+
let budget_instructions = TransactionUtils::budget_instructions(
267+
budgets,
268+
u64::default(),
269+
size_budgets,
270+
);
263271

264272
TransactionUtils::unique_involved_pubkeys(
265273
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
@@ -61,7 +61,7 @@ magic-domain-program = { git = "https://github.com/magicblock-labs/magic-domain-
6161
"modular-sdk",
6262
] }
6363
magicblock_magic_program_api = { package = "magicblock-magic-program-api", path = "../magicblock-magic-program-api" }
64-
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "3edb41022", features = [
64+
magicblock-delegation-program = { git = "https://github.com/magicblock-labs/delegation-program.git", rev = "1874b4f5f5f55cb9ab54b64de2cc0d41107d1435", features = [
6565
"no-entrypoint",
6666
] }
6767
magicblock-program = { path = "../programs/magicblock" }

0 commit comments

Comments
 (0)