From 9b7b21f28c2eae90f58ffdb521670d37b9d0fee3 Mon Sep 17 00:00:00 2001 From: Jason Davis Date: Thu, 10 Jul 2025 08:23:04 -0500 Subject: [PATCH 1/4] fix: compilation fixes after Agave update-and-merge (#23) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Compilation fixes after Agave update-and-merge * Update core/Cargo.toml Co-authored-by: Petar Vujović --------- Co-authored-by: Petar Vujović --- Cargo.lock | 1 + core/Cargo.toml | 1 + core/src/banking_stage/qos_service.rs | 17 ----------------- .../src/banking_stage/read_write_account_set.rs | 1 - ledger-tool/src/main.rs | 16 ++++++++-------- ledger-tool/src/output.rs | 16 ---------------- precompiles/src/secp256k1.rs | 6 +++--- programs/bpf_loader/src/syscalls/mod.rs | 1 - runtime/src/snapshot_utils/archive_format.rs | 6 +++--- validator/src/commands/run/execute.rs | 10 +++++----- 10 files changed, 21 insertions(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 643b396dede4eb..47afcf6910ae91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7699,6 +7699,7 @@ dependencies = [ "solana-nonce", "solana-nonce-account", "solana-packet", + "solana-patches", "solana-perf", "solana-poh", "solana-poh-config", diff --git a/core/Cargo.toml b/core/Cargo.toml index 85a0b12fcee584..f645a94f7cd8bd 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -119,6 +119,7 @@ solana-net-utils = { workspace = true } solana-nonce = { workspace = true } solana-nonce-account = { workspace = true } solana-packet = { workspace = true } +solana-patches = { workspace = true } solana-perf = { workspace = true } solana-poh = { workspace = true } solana-poh-config = { workspace = true } diff --git a/core/src/banking_stage/qos_service.rs b/core/src/banking_stage/qos_service.rs index aeb037b3cb5ed7..4833e9fd34f8b7 100644 --- a/core/src/banking_stage/qos_service.rs +++ b/core/src/banking_stage/qos_service.rs @@ -193,23 +193,6 @@ impl QosService { // checked for update if let Ok(tx_cost) = tx_cost { num_included += 1; - match transaction_committed_details { - CommitTransactionDetails::Committed { - compute_units, - loaded_accounts_data_size, - } => { - cost_tracker.update_execution_cost( - tx_cost, - *compute_units, - CostModel::calculate_loaded_accounts_data_size_cost( - *loaded_accounts_data_size, - &bank.feature_set, - ), - ); - } - CommitTransactionDetails::NotCommitted => { - cost_tracker.remove(tx_cost); - } match transaction_committed_details { CommitTransactionDetails::Committed { compute_units, diff --git a/core/src/banking_stage/read_write_account_set.rs b/core/src/banking_stage/read_write_account_set.rs index 16e36cfe5f248f..bd0aec8ce6d356 100644 --- a/core/src/banking_stage/read_write_account_set.rs +++ b/core/src/banking_stage/read_write_account_set.rs @@ -171,7 +171,6 @@ mod tests { ) } - fn create_test_bank() -> (Arc, Arc>) { fn create_test_bank() -> (Arc, Arc>) { let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000); Bank::new_no_wallclock_throttle_for_tests(&genesis_config) diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index f13ea3b53600cd..2502702beb7e22 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -2005,17 +2005,17 @@ fn main() { let snapshot_archive_format = { let archive_format_str = value_t_or_exit!(arg_matches, "snapshot_archive_format", String); - let mut archive_format = ArchiveFormat::from_cli_arg(&archive_format_str) + let archive_format = ArchiveFormat::from_cli_arg(&archive_format_str) .unwrap_or_else(|| { panic!("Archive format not recognized: {archive_format_str}") }); - if let ArchiveFormat::TarZstd { config } = &mut archive_format { - config.compression_level = value_t_or_exit!( - arg_matches, - "snapshot_zstd_compression_level", - i32 - ); - } + // if let ArchiveFormat::TarZstd { config } = &mut archive_format { + // config.compression_level = value_t_or_exit!( + // arg_matches, + // "snapshot_zstd_compression_level", + // i32 + // ); + // } archive_format }; diff --git a/ledger-tool/src/output.rs b/ledger-tool/src/output.rs index 12127b79d29c22..85abfcf0d6bb8c 100644 --- a/ledger-tool/src/output.rs +++ b/ledger-tool/src/output.rs @@ -124,22 +124,6 @@ impl Display for SlotBankHash { } } -#[derive(Serialize, Debug, Default)] -#[serde(rename_all = "camelCase")] -pub struct SlotBankHash { - pub slot: Slot, - pub hash: String, -} - -impl VerboseDisplay for SlotBankHash {} -impl QuietDisplay for SlotBankHash {} - -impl Display for SlotBankHash { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - writeln!(f, "Bank hash for slot {}: {}", self.slot, self.hash) - } -} - fn writeln_entry(f: &mut dyn fmt::Write, i: usize, entry: &CliEntry, prefix: &str) -> fmt::Result { writeln!( f, diff --git a/precompiles/src/secp256k1.rs b/precompiles/src/secp256k1.rs index f6b3e89ccfd63e..113e89346f381c 100644 --- a/precompiles/src/secp256k1.rs +++ b/precompiles/src/secp256k1.rs @@ -3,7 +3,7 @@ use { digest::Digest, solana_precompile_error::PrecompileError, solana_secp256k1_program::{ - construct_eth_pubkey, SecpSignatureOffsets, HASHED_PUBKEY_SERIALIZED_SIZE, + eth_address_from_pubkey, SecpSignatureOffsets, HASHED_PUBKEY_SERIALIZED_SIZE, SIGNATURE_OFFSETS_SERIALIZED_SIZE, SIGNATURE_SERIALIZED_SIZE, }, }; @@ -97,7 +97,7 @@ pub fn verify( &recovery_id, ) .map_err(|_| PrecompileError::InvalidSignature)?; - let eth_address = construct_eth_pubkey(&pubkey); + let eth_address = eth_address_from_pubkey(&pubkey.serialize()[1..].try_into().unwrap()); if eth_address_slice != eth_address { return Err(PrecompileError::InvalidSignature); @@ -334,7 +334,7 @@ pub mod tests { let secret_key = libsecp256k1::SecretKey::random(&mut thread_rng()); let public_key = libsecp256k1::PublicKey::from_secret_key(&secret_key); - let eth_address = construct_eth_pubkey(&public_key); + let eth_address = eth_address_from_pubkey(&public_key.serialize()[1..].try_into().unwrap()); let message = b"hello"; let message_hash = { diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index 9440bde86334ab..492bb983bad38f 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -21,7 +21,6 @@ use { ALT_BN128_MULTIPLICATION_OUTPUT_LEN, ALT_BN128_PAIRING_ELEMENT_LEN, ALT_BN128_PAIRING_OUTPUT_LEN, }, - solana_clock::Epoch, solana_cpi::MAX_RETURN_DATA, solana_hash::Hash, solana_instruction::{error::InstructionError, AccountMeta, ProcessedSiblingInstruction}, diff --git a/runtime/src/snapshot_utils/archive_format.rs b/runtime/src/snapshot_utils/archive_format.rs index 9ffe3423ba8df0..d190caed45905d 100644 --- a/runtime/src/snapshot_utils/archive_format.rs +++ b/runtime/src/snapshot_utils/archive_format.rs @@ -21,10 +21,10 @@ pub const TAR_EXTENSION: &str = "tar"; /// The different archive formats used for snapshots #[derive(Copy, Clone, Debug, Eq, PartialEq, Display)] pub enum ArchiveFormat { - // TarBzip2, // Unsupproted in svm-rollup + // TarBzip2, // Unsupported in svm-rollup TarGzip, - // TarZstd { config: ZstdConfig }, // Unsupproted in svm-rollup - // TarLz4, // Unsupproted in svm-rollup + // TarZstd { config: ZstdConfig }, // Unsupported in svm-rollup + // TarLz4, // Unsupported in svm-rollup Tar, } diff --git a/validator/src/commands/run/execute.rs b/validator/src/commands/run/execute.rs index d74ccba9f2ef56..701d0d0e708277 100644 --- a/validator/src/commands/run/execute.rs +++ b/validator/src/commands/run/execute.rs @@ -914,12 +914,12 @@ pub fn execute( let archive_format = { let archive_format_str = value_t_or_exit!(matches, "snapshot_archive_format", String); - let mut archive_format = ArchiveFormat::from_cli_arg(&archive_format_str) + let archive_format = ArchiveFormat::from_cli_arg(&archive_format_str) .unwrap_or_else(|| panic!("Archive format not recognized: {archive_format_str}")); - if let ArchiveFormat::TarZstd { config } = &mut archive_format { - config.compression_level = - value_t_or_exit!(matches, "snapshot_zstd_compression_level", i32); - } + // if let ArchiveFormat::TarZstd { config } = &mut archive_format { + // config.compression_level = + // value_t_or_exit!(matches, "snapshot_zstd_compression_level", i32); + // } archive_format }; From 82e70454f96bc50bc0f4258c76fc6f7e2395ad8c Mon Sep 17 00:00:00 2001 From: jason-nitro Date: Wed, 9 Jul 2025 14:07:41 -0500 Subject: [PATCH 2/4] Update test code that maps a VmAccountInfo using raw memory --- programs/bpf_loader/src/syscalls/cpi.rs | 38 +++++++++---------------- programs/bpf_loader/src/syscalls/mod.rs | 25 ++++++++++++++-- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/programs/bpf_loader/src/syscalls/cpi.rs b/programs/bpf_loader/src/syscalls/cpi.rs index 692b34d1f00b13..360f9cbba2c381 100644 --- a/programs/bpf_loader/src/syscalls/cpi.rs +++ b/programs/bpf_loader/src/syscalls/cpi.rs @@ -2930,33 +2930,28 @@ mod tests { fn into_region(self, vm_addr: u64) -> (Vec, MemoryRegion, SerializedAccountMetadata) { let size = mem::size_of::() + mem::size_of::() * 2 - + mem::size_of::>>() - + mem::size_of::() - + mem::size_of::>>() + + mem::size_of::>() + + mem::size_of::>>() + self.data.len(); let mut data = vec![0; size]; let vm_addr = vm_addr as usize; - let key_addr = vm_addr + mem::size_of::(); + let key_addr = vm_addr + mem::size_of::(); let lamports_cell_addr = key_addr + mem::size_of::(); - let lamports_addr = lamports_cell_addr + mem::size_of::>>(); - let owner_addr = lamports_addr + mem::size_of::(); + let owner_addr = lamports_cell_addr + mem::size_of::>(); let data_cell_addr = owner_addr + mem::size_of::(); - let data_addr = data_cell_addr + mem::size_of::>>(); + let data_addr = data_cell_addr + mem::size_of::>>(); - let info = AccountInfo { - key: unsafe { (key_addr as *const Pubkey).as_ref() }.unwrap(), + let info = VmAccountInfo { + key: key_addr as u64, is_signer: self.is_signer, is_writable: self.is_writable, - lamports: unsafe { - Rc::from_raw((lamports_cell_addr + RcBox::<&mut u64>::VALUE_OFFSET) as *const _) - }, - data: unsafe { - Rc::from_raw((data_cell_addr + RcBox::<&mut [u8]>::VALUE_OFFSET) as *const _) - }, - owner: unsafe { (owner_addr as *const Pubkey).as_ref() }.unwrap(), + lamports: VmNonNull::from_addr(lamports_cell_addr as u64), + data: VmNonNull::from_addr(data_cell_addr as u64), + owner: owner_addr as u64, executable: self.executable, rent_epoch: self.rent_epoch, + phantom: PhantomData, }; unsafe { @@ -2967,11 +2962,7 @@ mod tests { ); ptr::write_unaligned( (data.as_mut_ptr() as usize + lamports_cell_addr - vm_addr) as *mut _, - RcBox::new(RefCell::new((lamports_addr as *mut u64).as_mut().unwrap())), - ); - ptr::write_unaligned( - (data.as_mut_ptr() as usize + lamports_addr - vm_addr) as *mut _, - self.lamports, + VmBoxOfRefCell::new(self.lamports), ); ptr::write_unaligned( (data.as_mut_ptr() as usize + owner_addr - vm_addr) as *mut _, @@ -2979,10 +2970,7 @@ mod tests { ); ptr::write_unaligned( (data.as_mut_ptr() as usize + data_cell_addr - vm_addr) as *mut _, - RcBox::new(RefCell::new(slice::from_raw_parts_mut( - data_addr as *mut u8, - self.data.len(), - ))), + VmBoxOfRefCell::new(VmSlice::new(data_addr as u64, self.data.len() as u64)), ); data[data_addr - vm_addr..].copy_from_slice(self.data); } diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index 492bb983bad38f..1f558aa7ba3d8f 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -292,6 +292,15 @@ pub struct VmNonNull { resource_type: PhantomData, } +impl VmNonNull { + pub fn from_addr(addr: u64) -> Self { + Self { + addr, + resource_type: PhantomData, + } + } +} + #[derive(Clone)] #[repr(C)] pub struct VmBoxOfRefCell { @@ -301,6 +310,17 @@ pub struct VmBoxOfRefCell { pub value: T, } +impl VmBoxOfRefCell { + pub fn new(value: T) -> Self { + Self { + _strong_addr: 0, + _weak_addr: 0, + _borrow_flag: 0, + value, + } + } +} + /// Account information, in the virtual address space. Note: Since the addresses are u64, /// there is no lifetime on this struct, and the borrow checker cannot properly reason /// about references to the virtual memory via these addresses. @@ -316,7 +336,7 @@ pub struct VmAccountInfo<'a> { /// Program that owns this account (in `AccountInfo`: &'a Pubkey) pub owner: u64, /// The epoch at which this account will next owe rent - pub rent_epoch: Epoch, + pub rent_epoch: u64, /// Was the transaction signed by this account's public key? pub is_signer: bool, @@ -2183,7 +2203,6 @@ declare_builtin_function!( #[allow(clippy::arithmetic_side_effects)] #[allow(clippy::indexing_slicing)] mod tests { - use solana_account_info::AccountInfo; #[allow(deprecated)] use solana_sysvar::fees::Fees; use { @@ -4469,7 +4488,7 @@ mod tests { META_OFFSET + std::mem::size_of::(); const DATA_OFFSET: usize = PROGRAM_ID_OFFSET + std::mem::size_of::(); const ACCOUNTS_OFFSET: usize = DATA_OFFSET + 0x100; - const END_OFFSET: usize = ACCOUNTS_OFFSET + std::mem::size_of::() * 4; + const END_OFFSET: usize = ACCOUNTS_OFFSET + std::mem::size_of::() * 4; let mut memory = [0u8; END_OFFSET]; let config = Config::default(); let mut memory_mapping = MemoryMapping::new( From 01bfba0beddca8cfb15e5b7677b3cfd6502dcdef Mon Sep 17 00:00:00 2001 From: Jason Davis Date: Thu, 10 Jul 2025 08:23:04 -0500 Subject: [PATCH 3/4] fix: compilation fixes after Agave update-and-merge (#23) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Compilation fixes after Agave update-and-merge * Update core/Cargo.toml Co-authored-by: Petar Vujović --------- Co-authored-by: Petar Vujović --- .github/workflows/downstream-project-spl.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/downstream-project-spl.yml b/.github/workflows/downstream-project-spl.yml index 3d4887cf817804..ac9be5859645bd 100644 --- a/.github/workflows/downstream-project-spl.yml +++ b/.github/workflows/downstream-project-spl.yml @@ -38,7 +38,7 @@ env: jobs: check: - if: github.repository == 'anza-xyz/agave' +# if: github.repository == 'anza-xyz/agave' if: false runs-on: ubuntu-latest timeout-minutes: 60 @@ -77,7 +77,7 @@ jobs: cargo check test_cli: - if: github.repository == 'anza-xyz/agave' +# if: github.repository == 'anza-xyz/agave' if: false runs-on: ubuntu-latest timeout-minutes: 60 @@ -108,7 +108,7 @@ jobs: cargo test --manifest-path clients/cli/Cargo.toml cargo-test-sbf: - if: github.repository == 'anza-xyz/agave' +# if: github.repository == 'anza-xyz/agave' if: false runs-on: ubuntu-latest timeout-minutes: 60 From 8673397ac2cab46b0a7ade2b4cf5ce928ecb0cf6 Mon Sep 17 00:00:00 2001 From: jason-nitro Date: Thu, 10 Jul 2025 14:00:11 -0500 Subject: [PATCH 4/4] Put Epoch back --- programs/bpf_loader/src/syscalls/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/programs/bpf_loader/src/syscalls/mod.rs b/programs/bpf_loader/src/syscalls/mod.rs index 1f558aa7ba3d8f..b11462d6d37b1f 100644 --- a/programs/bpf_loader/src/syscalls/mod.rs +++ b/programs/bpf_loader/src/syscalls/mod.rs @@ -21,6 +21,7 @@ use { ALT_BN128_MULTIPLICATION_OUTPUT_LEN, ALT_BN128_PAIRING_ELEMENT_LEN, ALT_BN128_PAIRING_OUTPUT_LEN, }, + solana_clock::Epoch, solana_cpi::MAX_RETURN_DATA, solana_hash::Hash, solana_instruction::{error::InstructionError, AccountMeta, ProcessedSiblingInstruction}, @@ -336,7 +337,7 @@ pub struct VmAccountInfo<'a> { /// Program that owns this account (in `AccountInfo`: &'a Pubkey) pub owner: u64, /// The epoch at which this account will next owe rent - pub rent_epoch: u64, + pub rent_epoch: Epoch, /// Was the transaction signed by this account's public key? pub is_signer: bool,