diff --git a/Cargo.lock b/Cargo.lock index 8b5fbdd4fbb514..ff52da8e707f85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8013,6 +8013,18 @@ dependencies = [ "trees", ] +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.0" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", +] + [[package]] name = "solana-loader-v3-interface" version = "2.2.0" @@ -8545,6 +8557,7 @@ dependencies = [ "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", + "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-logger", "solana-message", @@ -10344,6 +10357,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", + "solana-loader-v2-interface", "solana-message", "solana-program", "solana-pubkey", diff --git a/Cargo.toml b/Cargo.toml index 0006575e2d027a..e002fae63ac351 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,6 +146,7 @@ members = [ "sdk/instructions-sysvar", "sdk/keccak-hasher", "sdk/keypair", + "sdk/loader-v2-interface", "sdk/loader-v3-interface", "sdk/logger", "sdk/macro", @@ -527,6 +528,7 @@ solana-keypair = { path = "sdk/keypair", version = "=2.2.0" } solana-last-restart-slot = { path = "sdk/last-restart-slot", version = "=2.2.0" } solana-lattice-hash = { path = "lattice-hash", version = "=2.2.0" } solana-ledger = { path = "ledger", version = "=2.2.0" } +solana-loader-v2-interface = { path = "sdk/loader-v2-interface", version = "=2.2.0" } solana-loader-v3-interface = { path = "sdk/loader-v3-interface", version = "=2.2.0" } solana-loader-v4-program = { path = "programs/loader-v4", version = "=2.2.0" } solana-local-cluster = { path = "local-cluster", version = "=2.2.0" } diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 200d26e7120ab5..5057233088021d 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6241,6 +6241,18 @@ dependencies = [ "trees", ] +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.0" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", +] + [[package]] name = "solana-loader-v3-interface" version = "2.2.0" @@ -6569,6 +6581,7 @@ dependencies = [ "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", + "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-message", "solana-msg", @@ -8419,6 +8432,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", + "solana-loader-v2-interface", "solana-message", "solana-program", "solana-pubkey", diff --git a/sdk/loader-v2-interface/Cargo.toml b/sdk/loader-v2-interface/Cargo.toml new file mode 100644 index 00000000000000..143789325ca64c --- /dev/null +++ b/sdk/loader-v2-interface/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "solana-loader-v2-interface" +description = "Solana non-upgradable BPF loader v2 instructions." +documentation = "https://docs.rs/solana-loader-v2-interface" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } + +[dependencies] +serde = { workspace = true, optional = true } +serde_bytes = { workspace = true, optional = true } +serde_derive = { workspace = true, optional = true } +solana-instruction = { workspace = true, features = ["bincode", "std"], optional = true } +solana-pubkey = { workspace = true } +solana-sdk-ids = { workspace = true } + +[features] +bincode = ["dep:solana-instruction", "serde"] +serde = ["dep:serde", "dep:serde_bytes", "dep:serde_derive"] + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] +all-features = true +rustdoc-args = ["--cfg=docsrs"] + +[lints] +workspace = true diff --git a/sdk/program/src/loader_instruction.rs b/sdk/loader-v2-interface/src/lib.rs similarity index 72% rename from sdk/program/src/loader_instruction.rs rename to sdk/loader-v2-interface/src/lib.rs index a4c1360f94981a..b435792bdc3db8 100644 --- a/sdk/program/src/loader_instruction.rs +++ b/sdk/loader-v2-interface/src/lib.rs @@ -1,14 +1,18 @@ -//! Instructions for the [non-upgradable BPF loader][nubpfl]. -//! -//! [nubpfl]: crate::bpf_loader +//! Instructions for the non-upgradable BPF loader. +#![cfg_attr(docsrs, feature(doc_auto_cfg))] -use crate::{ - instruction::{AccountMeta, Instruction}, - pubkey::Pubkey, - sysvar::rent, +#[cfg(feature = "bincode")] +use { + solana_instruction::{AccountMeta, Instruction}, + solana_pubkey::Pubkey, + solana_sdk_ids::sysvar::rent, }; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +#[cfg_attr( + feature = "serde", + derive(serde_derive::Deserialize, serde_derive::Serialize) +)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum LoaderInstruction { /// Write program data into an account /// @@ -19,7 +23,7 @@ pub enum LoaderInstruction { offset: u32, /// Serialized program data - #[serde(with = "serde_bytes")] + #[cfg_attr(feature = "serde", serde(with = "serde_bytes"))] bytes: Vec, }, @@ -34,6 +38,7 @@ pub enum LoaderInstruction { Finalize, } +#[cfg(feature = "bincode")] pub fn write( account_pubkey: &Pubkey, program_id: &Pubkey, @@ -48,6 +53,7 @@ pub fn write( ) } +#[cfg(feature = "bincode")] pub fn finalize(account_pubkey: &Pubkey, program_id: &Pubkey) -> Instruction { let account_metas = vec![ AccountMeta::new(*account_pubkey, true), diff --git a/sdk/program/Cargo.toml b/sdk/program/Cargo.toml index 8ff4abb207af27..6d174d55c54212 100644 --- a/sdk/program/Cargo.toml +++ b/sdk/program/Cargo.toml @@ -54,6 +54,7 @@ solana-instruction = { workspace = true, default-features = false, features = [ solana-instructions-sysvar = { workspace = true } solana-keccak-hasher = { workspace = true, features = ["sha3"] } solana-last-restart-slot = { workspace = true, features = ["serde", "sysvar"] } +solana-loader-v2-interface = { workspace = true, features = ["bincode"] } solana-loader-v3-interface = { workspace = true, features = ["bincode"] } solana-message = { workspace = true, features = ["bincode", "blake3"] } solana-msg = { workspace = true } diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index 2e004a9ae91d45..5081cfae78f7f9 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -484,7 +484,6 @@ pub mod hash; pub mod incinerator; pub mod instruction; pub mod lamports; -pub mod loader_instruction; pub mod loader_upgradeable_instruction { #[deprecated( since = "2.2.0", @@ -534,6 +533,11 @@ pub use solana_fee_calculator as fee_calculator; pub use solana_keccak_hasher as keccak; #[deprecated(since = "2.1.0", note = "Use `solana-last-restart-slot` crate instead")] pub use solana_last_restart_slot as last_restart_slot; +#[deprecated( + since = "2.2.0", + note = "Use `solana-loader-v2-interface` crate instead" +)] +pub use solana_loader_v2_interface as loader_instruction; #[deprecated(since = "2.2.0", note = "Use `solana-message` crate instead")] pub use solana_message as message; #[deprecated(since = "2.1.0", note = "Use `solana-program-memory` crate instead")] diff --git a/svm/examples/Cargo.lock b/svm/examples/Cargo.lock index efcdcfa09c495a..a13a7df15ad3ba 100644 --- a/svm/examples/Cargo.lock +++ b/svm/examples/Cargo.lock @@ -6071,6 +6071,18 @@ dependencies = [ "trees", ] +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.0" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", +] + [[package]] name = "solana-loader-v3-interface" version = "2.2.0" @@ -6399,6 +6411,7 @@ dependencies = [ "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", + "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-message", "solana-msg", @@ -7765,6 +7778,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", + "solana-loader-v2-interface", "solana-message", "solana-program", "solana-pubkey", diff --git a/transaction-status/Cargo.toml b/transaction-status/Cargo.toml index aa503324e1b270..1ade4045b8ff7c 100644 --- a/transaction-status/Cargo.toml +++ b/transaction-status/Cargo.toml @@ -24,6 +24,7 @@ solana-account-decoder = { workspace = true } solana-clock = { workspace = true } solana-hash = { workspace = true } solana-instruction = { workspace = true } +solana-loader-v2-interface = { workspace = true, features = ["bincode"] } solana-message = { workspace = true } solana-program = { workspace = true } solana-pubkey = { workspace = true } diff --git a/transaction-status/src/parse_bpf_loader.rs b/transaction-status/src/parse_bpf_loader.rs index 4849fd0d94fb52..9556c54d77f1ea 100644 --- a/transaction-status/src/parse_bpf_loader.rs +++ b/transaction-status/src/parse_bpf_loader.rs @@ -5,11 +5,9 @@ use { base64::{prelude::BASE64_STANDARD, Engine}, bincode::deserialize, serde_json::json, + solana_loader_v2_interface::LoaderInstruction, solana_message::{compiled_instruction::CompiledInstruction, AccountKeys}, - solana_program::{ - loader_instruction::LoaderInstruction, - loader_upgradeable_instruction::UpgradeableLoaderInstruction, - }, + solana_program::loader_upgradeable_instruction::UpgradeableLoaderInstruction, }; pub fn parse_bpf_loader( @@ -224,12 +222,8 @@ mod test { let account_keys = vec![fee_payer, account_pubkey]; let missing_account_keys = vec![account_pubkey]; - let instruction = solana_program::loader_instruction::write( - &account_pubkey, - &program_id, - offset, - bytes.clone(), - ); + let instruction = + solana_loader_v2_interface::write(&account_pubkey, &program_id, offset, bytes.clone()); let mut message = Message::new(&[instruction], Some(&fee_payer)); assert_eq!( parse_bpf_loader( @@ -258,8 +252,7 @@ mod test { ) .is_err()); - let instruction = - solana_program::loader_instruction::finalize(&account_pubkey, &program_id); + let instruction = solana_loader_v2_interface::finalize(&account_pubkey, &program_id); let mut message = Message::new(&[instruction], Some(&fee_payer)); assert_eq!( parse_bpf_loader(