diff --git a/Cargo.lock b/Cargo.lock index 5b3311fdd..fac3bf1f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3041,6 +3041,7 @@ dependencies = [ name = "solana-frozen-abi" version = "3.1.0" dependencies = [ + "bincode", "bitflags 2.8.0", "boxcar", "bs58", @@ -3051,6 +3052,7 @@ dependencies = [ "log", "memmap2", "rand", + "rand_chacha", "serde", "serde_bytes", "serde_derive", diff --git a/account/src/lib.rs b/account/src/lib.rs index 279f07793..f1ee23aba 100644 --- a/account/src/lib.rs +++ b/account/src/lib.rs @@ -7,7 +7,7 @@ use qualifier_attr::qualifiers; #[cfg(feature = "serde")] use serde::ser::{Serialize, Serializer}; #[cfg(feature = "frozen-abi")] -use solana_frozen_abi_macro::{frozen_abi, AbiExample}; +use solana_frozen_abi_macro::{frozen_abi, AbiExample, StableAbi}; #[cfg(feature = "bincode")] use solana_sysvar::SysvarSerialize; use { @@ -32,8 +32,11 @@ pub mod state_traits; #[repr(C)] #[cfg_attr( feature = "frozen-abi", - derive(AbiExample), - frozen_abi(digest = "62EqVoynUFvuui7DVfqWCvZP7bxKGJGioeSBnWrdjRME") + derive(AbiExample, StableAbi), + frozen_abi( + api_digest = "62EqVoynUFvuui7DVfqWCvZP7bxKGJGioeSBnWrdjRME", + abi_digest = "Cms628BvHUgXEPDU1qV6sAXNr875LnMAMLskNohMngu" + ) )] #[cfg_attr( feature = "serde", @@ -55,6 +58,21 @@ pub struct Account { pub rent_epoch: Epoch, } +#[cfg(feature = "frozen-abi")] +impl solana_frozen_abi::rand::prelude::Distribution + for solana_frozen_abi::rand::distributions::Standard +{ + fn sample(&self, rng: &mut R) -> Account { + Account { + lamports: rng.r#gen(), + data: (0..1000).map(|_| rng.r#gen()).collect(), + owner: Pubkey::new_from_array(rng.r#gen()), + executable: rng.r#gen(), + rent_epoch: rng.r#gen(), + } + } +} + // mod because we need 'Account' below to have the name 'Account' to match expected serialization #[cfg(feature = "serde")] mod account_serialize { diff --git a/frozen-abi-macro/src/lib.rs b/frozen-abi-macro/src/lib.rs index 8e2d70009..d82830116 100644 --- a/frozen-abi-macro/src/lib.rs +++ b/frozen-abi-macro/src/lib.rs @@ -345,9 +345,9 @@ fn quote_for_test( quote! { #[test] fn test_abi_digest() { - use ::rand::{SeedableRng, RngCore}; - use ::rand_chacha::ChaCha8Rng; - use ::bincode; + use ::solana_frozen_abi::rand::{SeedableRng, RngCore}; + use ::solana_frozen_abi::rand_chacha::ChaCha8Rng; + use ::solana_frozen_abi::bincode; use ::solana_frozen_abi::stable_abi::StableAbi; let mut rng = ChaCha8Rng::seed_from_u64(20666175621446498); diff --git a/frozen-abi/Cargo.toml b/frozen-abi/Cargo.toml index d7dedcddf..7d8e851ac 100644 --- a/frozen-abi/Cargo.toml +++ b/frozen-abi/Cargo.toml @@ -35,9 +35,14 @@ solana-frozen-abi-macro = { workspace = true } thiserror = { workspace = true } [target.'cfg(not(target_os = "solana"))'.dependencies] +# This dependency is used only to back `frozen-abi` StableAbi API +bincode = "1.3.3" im = { workspace = true, features = ["rayon", "serde"] } memmap2 = { workspace = true } -rand = { workspace = true } +# These dependencies are used only to back `frozen-abi` StableAbi API, +# to avoid version skew and keep digest computation stable regardless of consumer dependencies. +rand = "0.8.5" +rand_chacha = "0.3.1" [target.'cfg(not(target_os = "solana"))'.dev-dependencies] bitflags = { workspace = true, features = ["serde"] } diff --git a/frozen-abi/src/lib.rs b/frozen-abi/src/lib.rs index 43037ac51..ecc18fd76 100644 --- a/frozen-abi/src/lib.rs +++ b/frozen-abi/src/lib.rs @@ -19,6 +19,16 @@ pub mod stable_abi; #[macro_use] extern crate solana_frozen_abi_macro; +#[cfg(feature = "frozen-abi")] +#[cfg(not(target_os = "solana"))] +pub use bincode; +#[cfg(feature = "frozen-abi")] +#[cfg(not(target_os = "solana"))] +pub use rand; +#[cfg(feature = "frozen-abi")] +#[cfg(not(target_os = "solana"))] +pub use rand_chacha; + // Not public API. Previously referenced by macro-generated code. Remove the // `log` dependency from Cargo.toml when this is cleaned up in the next major // version bump diff --git a/frozen-abi/src/stable_abi.rs b/frozen-abi/src/stable_abi.rs index e479f629a..475ae86a3 100644 --- a/frozen-abi/src/stable_abi.rs +++ b/frozen-abi/src/stable_abi.rs @@ -5,6 +5,6 @@ pub trait StableAbi: Sized { where Standard: rand::distributions::Distribution, { - rng.gen::() + rng.r#gen::() } }