From e41e837214afeacec3e63971d13d42c5427e3eb1 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Thu, 16 Jan 2025 03:18:49 +0400 Subject: [PATCH 1/4] extract loader-instruction crate --- Cargo.lock | 13 ++++++++ Cargo.toml | 2 ++ programs/sbf/Cargo.lock | 13 ++++++++ sdk/loader-instruction/Cargo.toml | 31 +++++++++++++++++++ .../src/lib.rs} | 24 ++++++++------ sdk/program/Cargo.toml | 1 + sdk/program/src/lib.rs | 6 +++- svm/examples/Cargo.lock | 13 ++++++++ 8 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 sdk/loader-instruction/Cargo.toml rename sdk/{program/src/loader_instruction.rs => loader-instruction/src/lib.rs} (72%) diff --git a/Cargo.lock b/Cargo.lock index 8b5fbdd4fbb514..852609897d61c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8013,6 +8013,18 @@ dependencies = [ "trees", ] +[[package]] +name = "solana-loader-instruction" +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-instruction", "solana-loader-v3-interface", "solana-logger", "solana-message", diff --git a/Cargo.toml b/Cargo.toml index 0006575e2d027a..c27a9c8e223fb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,6 +146,7 @@ members = [ "sdk/instructions-sysvar", "sdk/keccak-hasher", "sdk/keypair", + "sdk/loader-instruction", "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-instruction = { path = "sdk/loader-instruction", 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..32582e71023097 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6241,6 +6241,18 @@ dependencies = [ "trees", ] +[[package]] +name = "solana-loader-instruction" +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-instruction", "solana-loader-v3-interface", "solana-message", "solana-msg", diff --git a/sdk/loader-instruction/Cargo.toml b/sdk/loader-instruction/Cargo.toml new file mode 100644 index 00000000000000..42bf204bf64333 --- /dev/null +++ b/sdk/loader-instruction/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "solana-loader-instruction" +description = "Solana non-upgradable BPF loader instructions." +documentation = "https://docs.rs/solana-loader-instruction" +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"] +dev-context-only-utils = ["bincode"] +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-instruction/src/lib.rs similarity index 72% rename from sdk/program/src/loader_instruction.rs rename to sdk/loader-instruction/src/lib.rs index a4c1360f94981a..b435792bdc3db8 100644 --- a/sdk/program/src/loader_instruction.rs +++ b/sdk/loader-instruction/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..d0323ebcece5ae 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-instruction = { 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..52d68a34dce6d8 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-instruction` crate instead" +)] +pub use solana_loader_instruction 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..95b3a2b7430dd6 100644 --- a/svm/examples/Cargo.lock +++ b/svm/examples/Cargo.lock @@ -6071,6 +6071,18 @@ dependencies = [ "trees", ] +[[package]] +name = "solana-loader-instruction" +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-instruction", "solana-loader-v3-interface", "solana-message", "solana-msg", From c62dc0ab6e054c9094327276ea9441d714cfba2a Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Thu, 16 Jan 2025 03:35:34 +0400 Subject: [PATCH 2/4] use loader-instruction crate in transaction-status --- Cargo.lock | 1 + programs/sbf/Cargo.lock | 1 + svm/examples/Cargo.lock | 1 + transaction-status/Cargo.toml | 1 + transaction-status/src/parse_bpf_loader.rs | 17 +++++------------ 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 852609897d61c8..4661cefbae9217 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10357,6 +10357,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", + "solana-loader-instruction", "solana-message", "solana-program", "solana-pubkey", diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 32582e71023097..efa733895798a3 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -8432,6 +8432,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", + "solana-loader-instruction", "solana-message", "solana-program", "solana-pubkey", diff --git a/svm/examples/Cargo.lock b/svm/examples/Cargo.lock index 95b3a2b7430dd6..b69282aa514bb5 100644 --- a/svm/examples/Cargo.lock +++ b/svm/examples/Cargo.lock @@ -7778,6 +7778,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", + "solana-loader-instruction", "solana-message", "solana-program", "solana-pubkey", diff --git a/transaction-status/Cargo.toml b/transaction-status/Cargo.toml index aa503324e1b270..2fc6ad2959fd9e 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-instruction = { 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..9432c08eb31350 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_instruction::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_instruction::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_instruction::finalize(&account_pubkey, &program_id); let mut message = Message::new(&[instruction], Some(&fee_payer)); assert_eq!( parse_bpf_loader( From c37163191dc7c67a2715ddba8f433286bc34e8ba Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 22 Jan 2025 14:00:39 +0400 Subject: [PATCH 3/4] rename to solana-loader-v2-interface --- Cargo.lock | 6 +++--- Cargo.toml | 4 ++-- programs/sbf/Cargo.lock | 6 +++--- sdk/{loader-instruction => loader-v2-interface}/Cargo.toml | 6 +++--- sdk/{loader-instruction => loader-v2-interface}/src/lib.rs | 0 sdk/program/Cargo.toml | 2 +- sdk/program/src/lib.rs | 4 ++-- svm/examples/Cargo.lock | 6 +++--- transaction-status/Cargo.toml | 2 +- transaction-status/src/parse_bpf_loader.rs | 6 +++--- 10 files changed, 21 insertions(+), 21 deletions(-) rename sdk/{loader-instruction => loader-v2-interface}/Cargo.toml (83%) rename sdk/{loader-instruction => loader-v2-interface}/src/lib.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 4661cefbae9217..ff52da8e707f85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8014,7 +8014,7 @@ dependencies = [ ] [[package]] -name = "solana-loader-instruction" +name = "solana-loader-v2-interface" version = "2.2.0" dependencies = [ "serde", @@ -8557,7 +8557,7 @@ dependencies = [ "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", - "solana-loader-instruction", + "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-logger", "solana-message", @@ -10357,7 +10357,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", - "solana-loader-instruction", + "solana-loader-v2-interface", "solana-message", "solana-program", "solana-pubkey", diff --git a/Cargo.toml b/Cargo.toml index c27a9c8e223fb3..e002fae63ac351 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -146,7 +146,7 @@ members = [ "sdk/instructions-sysvar", "sdk/keccak-hasher", "sdk/keypair", - "sdk/loader-instruction", + "sdk/loader-v2-interface", "sdk/loader-v3-interface", "sdk/logger", "sdk/macro", @@ -528,7 +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-instruction = { path = "sdk/loader-instruction", 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 efa733895798a3..5057233088021d 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6242,7 +6242,7 @@ dependencies = [ ] [[package]] -name = "solana-loader-instruction" +name = "solana-loader-v2-interface" version = "2.2.0" dependencies = [ "serde", @@ -6581,7 +6581,7 @@ dependencies = [ "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", - "solana-loader-instruction", + "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-message", "solana-msg", @@ -8432,7 +8432,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", - "solana-loader-instruction", + "solana-loader-v2-interface", "solana-message", "solana-program", "solana-pubkey", diff --git a/sdk/loader-instruction/Cargo.toml b/sdk/loader-v2-interface/Cargo.toml similarity index 83% rename from sdk/loader-instruction/Cargo.toml rename to sdk/loader-v2-interface/Cargo.toml index 42bf204bf64333..05038ae6379308 100644 --- a/sdk/loader-instruction/Cargo.toml +++ b/sdk/loader-v2-interface/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "solana-loader-instruction" -description = "Solana non-upgradable BPF loader instructions." -documentation = "https://docs.rs/solana-loader-instruction" +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 } diff --git a/sdk/loader-instruction/src/lib.rs b/sdk/loader-v2-interface/src/lib.rs similarity index 100% rename from sdk/loader-instruction/src/lib.rs rename to sdk/loader-v2-interface/src/lib.rs diff --git a/sdk/program/Cargo.toml b/sdk/program/Cargo.toml index d0323ebcece5ae..6d174d55c54212 100644 --- a/sdk/program/Cargo.toml +++ b/sdk/program/Cargo.toml @@ -54,7 +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-instruction = { workspace = true, features = ["bincode"] } +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 52d68a34dce6d8..5081cfae78f7f9 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -535,9 +535,9 @@ pub use solana_keccak_hasher as keccak; pub use solana_last_restart_slot as last_restart_slot; #[deprecated( since = "2.2.0", - note = "Use `solana-loader-instruction` crate instead" + note = "Use `solana-loader-v2-interface` crate instead" )] -pub use solana_loader_instruction as loader_instruction; +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 b69282aa514bb5..a13a7df15ad3ba 100644 --- a/svm/examples/Cargo.lock +++ b/svm/examples/Cargo.lock @@ -6072,7 +6072,7 @@ dependencies = [ ] [[package]] -name = "solana-loader-instruction" +name = "solana-loader-v2-interface" version = "2.2.0" dependencies = [ "serde", @@ -6411,7 +6411,7 @@ dependencies = [ "solana-instructions-sysvar", "solana-keccak-hasher", "solana-last-restart-slot", - "solana-loader-instruction", + "solana-loader-v2-interface", "solana-loader-v3-interface", "solana-message", "solana-msg", @@ -7778,7 +7778,7 @@ dependencies = [ "solana-clock", "solana-hash", "solana-instruction", - "solana-loader-instruction", + "solana-loader-v2-interface", "solana-message", "solana-program", "solana-pubkey", diff --git a/transaction-status/Cargo.toml b/transaction-status/Cargo.toml index 2fc6ad2959fd9e..1ade4045b8ff7c 100644 --- a/transaction-status/Cargo.toml +++ b/transaction-status/Cargo.toml @@ -24,7 +24,7 @@ solana-account-decoder = { workspace = true } solana-clock = { workspace = true } solana-hash = { workspace = true } solana-instruction = { workspace = true } -solana-loader-instruction = { workspace = true, features = ["bincode"] } +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 9432c08eb31350..9556c54d77f1ea 100644 --- a/transaction-status/src/parse_bpf_loader.rs +++ b/transaction-status/src/parse_bpf_loader.rs @@ -5,7 +5,7 @@ use { base64::{prelude::BASE64_STANDARD, Engine}, bincode::deserialize, serde_json::json, - solana_loader_instruction::LoaderInstruction, + solana_loader_v2_interface::LoaderInstruction, solana_message::{compiled_instruction::CompiledInstruction, AccountKeys}, solana_program::loader_upgradeable_instruction::UpgradeableLoaderInstruction, }; @@ -223,7 +223,7 @@ mod test { let missing_account_keys = vec![account_pubkey]; let instruction = - solana_loader_instruction::write(&account_pubkey, &program_id, offset, bytes.clone()); + 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( @@ -252,7 +252,7 @@ mod test { ) .is_err()); - let instruction = solana_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( From a30aec772cb1ef514730450337611eab0cc3e569 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 22 Jan 2025 14:01:59 +0400 Subject: [PATCH 4/4] remove unused feature --- sdk/loader-v2-interface/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/loader-v2-interface/Cargo.toml b/sdk/loader-v2-interface/Cargo.toml index 05038ae6379308..143789325ca64c 100644 --- a/sdk/loader-v2-interface/Cargo.toml +++ b/sdk/loader-v2-interface/Cargo.toml @@ -19,7 +19,6 @@ solana-sdk-ids = { workspace = true } [features] bincode = ["dep:solana-instruction", "serde"] -dev-context-only-utils = ["bincode"] serde = ["dep:serde", "dep:serde_bytes", "dep:serde_derive"] [package.metadata.docs.rs]