Skip to content

Commit fab7c1f

Browse files
authored
Separate key deduplication logic into standalone crate (#36)
1 parent 6810892 commit fab7c1f

File tree

14 files changed

+493
-171
lines changed

14 files changed

+493
-171
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
[workspace]
22
members = [
33
"bencher",
4+
"error",
45
"fuzz/*",
56
"harness",
7+
"keys",
68
"test-programs/*",
79
]
810
resolver = "2"
@@ -20,7 +22,9 @@ bincode = "1.3.3"
2022
bs58 = "0.5.1"
2123
mollusk-svm = { path = "harness", version = "0.0.6" }
2224
mollusk-svm-bencher = { path = "bencher", version = "0.0.6" }
25+
mollusk-svm-error = { path = "error", version = "0.0.6" }
2326
mollusk-svm-fuzz-fixture = { path = "fuzz/fixture", version = "0.0.6" }
27+
mollusk-svm-keys = { path = "keys", version = "0.0.6" }
2428
num-format = "0.4.4"
2529
prost = "0.10"
2630
prost-build = "0.10"

error/Cargo.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "mollusk-svm-error"
3+
description = "Errors thrown by the Mollusk SVM harness."
4+
documentation = "https://docs.rs/mollusk-svm-error"
5+
authors = { workspace = true }
6+
repository = { workspace = true }
7+
readme = { workspace = true }
8+
license = { workspace = true }
9+
edition = { workspace = true }
10+
version = { workspace = true }
11+
12+
[dependencies]
13+
solana-sdk = { workspace = true }
14+
thiserror = { workspace = true }
File renamed without changes.

error/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
//! Errors thrown by the Mollusk SVM harness.
2+
3+
pub mod error;

harness/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ fuzz = ["dep:mollusk-svm-fuzz-fixture"]
1414

1515
[dependencies]
1616
bincode = { workspace = true }
17+
mollusk-svm-error = { workspace = true }
1718
mollusk-svm-fuzz-fixture = { workspace = true, optional = true }
19+
mollusk-svm-keys = { workspace = true }
1820
solana-bpf-loader-program = { workspace = true }
1921
solana-compute-budget = { workspace = true }
2022
solana-program-runtime = { workspace = true }
2123
solana-system-program = { workspace = true }
2224
solana-sdk = { workspace = true }
2325
solana-logger = { workspace = true }
24-
thiserror = { workspace = true }
2526

2627
[dev-dependencies]
2728
criterion = "0.5.1"

harness/src/accounts.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//! Instruction <-> Transaction account compilation, with key deduplication,
2+
//! privilege handling, and program account stubbing.
3+
4+
use {
5+
mollusk_svm_keys::{
6+
accounts::{
7+
compile_instruction_accounts, compile_instruction_without_data,
8+
compile_transaction_accounts_for_instruction,
9+
},
10+
keys::KeyMap,
11+
},
12+
solana_sdk::{
13+
account::{AccountSharedData, WritableAccount},
14+
instruction::Instruction,
15+
pubkey::Pubkey,
16+
transaction_context::{InstructionAccount, TransactionAccount},
17+
},
18+
};
19+
20+
pub struct CompiledAccounts {
21+
pub program_id_index: u16,
22+
pub instruction_accounts: Vec<InstructionAccount>,
23+
pub transaction_accounts: Vec<TransactionAccount>,
24+
}
25+
26+
pub fn compile_accounts(
27+
instruction: &Instruction,
28+
accounts: &[(Pubkey, AccountSharedData)],
29+
loader_key: Pubkey,
30+
) -> CompiledAccounts {
31+
let stub_out_program_account = move || {
32+
let mut program_account = AccountSharedData::default();
33+
program_account.set_owner(loader_key);
34+
program_account.set_executable(true);
35+
program_account
36+
};
37+
38+
let key_map = KeyMap::compile_from_instruction(instruction);
39+
let compiled_instruction = compile_instruction_without_data(&key_map, instruction);
40+
let instruction_accounts = compile_instruction_accounts(&key_map, &compiled_instruction);
41+
let transaction_accounts = compile_transaction_accounts_for_instruction(
42+
&key_map,
43+
instruction,
44+
accounts,
45+
Some(Box::new(stub_out_program_account)),
46+
);
47+
48+
CompiledAccounts {
49+
program_id_index: compiled_instruction.program_id_index as u16,
50+
instruction_accounts,
51+
transaction_accounts,
52+
}
53+
}

harness/src/file.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
//! error reading the file.
2020
2121
use {
22-
crate::error::{MolluskError, MolluskPanic},
22+
mollusk_svm_error::error::{MolluskError, MolluskPanic},
2323
std::{
2424
fs::File,
2525
io::Read,

harness/src/keys.rs

Lines changed: 0 additions & 163 deletions
This file was deleted.

harness/src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,22 @@
2727
//! * `process_and_validate_instruction`: Process an instruction and perform a
2828
//! series of checks on the result, panicking if any checks fail.
2929
30-
mod error;
30+
mod accounts;
3131
pub mod file;
3232
#[cfg(feature = "fuzz")]
3333
pub mod fuzz;
34-
mod keys;
3534
pub mod program;
3635
pub mod result;
3736
pub mod sysvar;
3837

3938
use {
4039
crate::{
41-
error::{MolluskError, MolluskPanic},
4240
program::ProgramCache,
4341
result::{Check, InstructionResult},
4442
sysvar::Sysvars,
4543
},
46-
keys::CompiledAccounts,
44+
accounts::CompiledAccounts,
45+
mollusk_svm_error::error::{MolluskError, MolluskPanic},
4746
solana_compute_budget::compute_budget::ComputeBudget,
4847
solana_program_runtime::{
4948
invoke_context::{EnvironmentConfig, InvokeContext},
@@ -154,7 +153,7 @@ impl Mollusk {
154153
program_id_index,
155154
instruction_accounts,
156155
transaction_accounts,
157-
} = crate::keys::compile_accounts(instruction, accounts, loader_key);
156+
} = crate::accounts::compile_accounts(instruction, accounts, loader_key);
158157

159158
let mut transaction_context = TransactionContext::new(
160159
transaction_accounts,

0 commit comments

Comments
 (0)