From 66b3cea22d4ba25b2eec460fb8f65fd1fcefdf6e Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 5 Oct 2024 14:52:12 +0400 Subject: [PATCH 1/7] extract solana-nonce crate --- Cargo.lock | 15 ++++++++ Cargo.toml | 2 ++ programs/sbf/Cargo.lock | 11 ++++++ sdk/nonce/Cargo.toml | 35 +++++++++++++++++++ .../src/nonce/mod.rs => nonce/src/lib.rs} | 0 .../src/nonce => nonce/src}/state/current.rs | 21 +++++------ .../src/nonce => nonce/src}/state/mod.rs | 15 ++++---- sdk/program/Cargo.toml | 1 + sdk/program/src/lib.rs | 2 ++ 9 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 sdk/nonce/Cargo.toml rename sdk/{program/src/nonce/mod.rs => nonce/src/lib.rs} (100%) rename sdk/{program/src/nonce => nonce/src}/state/current.rs (82%) rename sdk/{program/src/nonce => nonce/src}/state/mod.rs (96%) diff --git a/Cargo.lock b/Cargo.lock index 2501d6130bd5b6..1e9002b9089718 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7248,6 +7248,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" +[[package]] +name = "solana-nonce" +version = "2.2.0" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-fee-calculator", + "solana-hash", + "solana-nonce", + "solana-pubkey", + "solana-sha256-hasher", +] + [[package]] name = "solana-notifier" version = "2.2.0" @@ -7439,6 +7453,7 @@ dependencies = [ "solana-logger", "solana-msg", "solana-native-token", + "solana-nonce", "solana-program-entrypoint", "solana-program-error", "solana-program-memory", diff --git a/Cargo.toml b/Cargo.toml index ce605a1dc6c5dc..022256a4937c78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -122,6 +122,7 @@ members = [ "sdk/macro", "sdk/msg", "sdk/native-token", + "sdk/nonce", "sdk/package-metadata", "sdk/package-metadata-macro", "sdk/packet", @@ -452,6 +453,7 @@ solana-msg = { path = "sdk/msg", version = "=2.2.0" } solana-native-token = { path = "sdk/native-token", version = "=2.2.0" } solana-net-utils = { path = "net-utils", version = "=2.2.0" } solana-nohash-hasher = "0.2.1" +solana-nonce = { path = "sdk/nonce", version = "=2.2.0" } solana-notifier = { path = "notifier", version = "=2.2.0" } solana-package-metadata = { path = "sdk/package-metadata", version = "=2.2.0" } solana-package-metadata-macro = { path = "sdk/package-metadata-macro", version = "=2.2.0" } diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 40107c372d5edf..24ff1d4d079822 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5687,6 +5687,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" +[[package]] +name = "solana-nonce" +version = "2.2.0" +dependencies = [ + "solana-fee-calculator", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", +] + [[package]] name = "solana-packet" version = "2.2.0" @@ -5806,6 +5816,7 @@ dependencies = [ "solana-last-restart-slot", "solana-msg", "solana-native-token", + "solana-nonce", "solana-program-entrypoint", "solana-program-error", "solana-program-memory", diff --git a/sdk/nonce/Cargo.toml b/sdk/nonce/Cargo.toml new file mode 100644 index 00000000000000..269a5938a111e3 --- /dev/null +++ b/sdk/nonce/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "solana-nonce" +description = "Solana durable transaction nonces." +documentation = "https://docs.rs/solana-nonce" +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_derive = { workspace = true, optional = true } +solana-fee-calculator = { workspace = true } +solana-hash = { workspace = true, default-features = false } +solana-pubkey = { workspace = true, default-features = false } +solana-sha256-hasher = { workspace = true } + +[dev-dependencies] +bincode = { workspace = true } +solana-nonce = { path = ".", features = ["dev-context-only-utils"] } + +[features] +dev-context-only-utils = ["serde"] +serde = [ + "dep:serde", + "dep:serde_derive", + "solana-fee-calculator/serde", + "solana-hash/serde", + "solana-pubkey/serde", +] + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] diff --git a/sdk/program/src/nonce/mod.rs b/sdk/nonce/src/lib.rs similarity index 100% rename from sdk/program/src/nonce/mod.rs rename to sdk/nonce/src/lib.rs diff --git a/sdk/program/src/nonce/state/current.rs b/sdk/nonce/src/state/current.rs similarity index 82% rename from sdk/program/src/nonce/state/current.rs rename to sdk/nonce/src/state/current.rs index 447cdff97f50bf..f825c0d9be132f 100644 --- a/sdk/program/src/nonce/state/current.rs +++ b/sdk/nonce/src/state/current.rs @@ -1,21 +1,21 @@ +#[cfg(feature = "serde")] +use serde_derive::{Deserialize, Serialize}; use { - crate::{ - fee_calculator::FeeCalculator, - hash::{hashv, Hash}, - pubkey::Pubkey, - }, - serde_derive::{Deserialize, Serialize}, + solana_fee_calculator::FeeCalculator, solana_hash::Hash, solana_pubkey::Pubkey, + solana_sha256_hasher::hashv, }; const DURABLE_NONCE_HASH_PREFIX: &[u8] = "DURABLE_NONCE".as_bytes(); -#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] pub struct DurableNonce(Hash); /// Initialized data of a durable transaction nonce account. /// /// This is stored within [`State`] for initialized nonce accounts. -#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[derive(Debug, Default, PartialEq, Eq, Clone)] pub struct Data { /// Address of the account that signs transactions using the nonce account. pub authority: Pubkey, @@ -67,7 +67,8 @@ impl DurableNonce { /// /// When created in memory with [`State::default`] or when deserialized from an /// uninitialized account, a nonce account will be [`State::Uninitialized`]. -#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] +#[derive(Debug, Default, PartialEq, Eq, Clone)] pub enum State { #[default] Uninitialized, @@ -92,7 +93,7 @@ impl State { #[cfg(test)] mod test { - use {super::*, crate::nonce::state::Versions}; + use {super::*, crate::state::Versions}; #[test] fn default_is_uninitialized() { diff --git a/sdk/program/src/nonce/state/mod.rs b/sdk/nonce/src/state/mod.rs similarity index 96% rename from sdk/program/src/nonce/state/mod.rs rename to sdk/nonce/src/state/mod.rs index d55bc9063afcff..91c632fdc6fcc8 100644 --- a/sdk/program/src/nonce/state/mod.rs +++ b/sdk/nonce/src/state/mod.rs @@ -2,13 +2,13 @@ mod current; pub use current::{Data, DurableNonce, State}; -use { - crate::{hash::Hash, pubkey::Pubkey}, - serde_derive::{Deserialize, Serialize}, - std::collections::HashSet, -}; +use {solana_hash::Hash, solana_pubkey::Pubkey, std::collections::HashSet}; -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)] +#[cfg_attr( + feature = "serde", + derive(serde_derive::Deserialize, serde_derive::Serialize) +)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum Versions { Legacy(Box), /// Current variants have durable nonce and blockhash domains separated. @@ -114,8 +114,7 @@ impl From for State { #[cfg(test)] mod tests { use { - super::*, - crate::{fee_calculator::FeeCalculator, pubkey::Pubkey}, + super::*, solana_fee_calculator::FeeCalculator, solana_pubkey::Pubkey, std::iter::repeat_with, }; diff --git a/sdk/program/Cargo.toml b/sdk/program/Cargo.toml index db2cb37a08367c..715dbd1295036a 100644 --- a/sdk/program/Cargo.toml +++ b/sdk/program/Cargo.toml @@ -56,6 +56,7 @@ solana-instruction = { workspace = true, default-features = false, features = [ solana-last-restart-slot = { workspace = true, features = ["serde"] } solana-msg = { workspace = true } solana-native-token = { workspace = true } +solana-nonce = { workspace = true } solana-program-entrypoint = { workspace = true } solana-program-error = { workspace = true, features = ["serde"] } solana-program-memory = { workspace = true } diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index 26df24aeeae252..d5cec51557a650 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -493,6 +493,7 @@ pub mod loader_v4; pub mod loader_v4_instruction; pub mod log; pub mod message; +pub mod native_token; pub mod nonce; pub mod program; pub mod program_error; @@ -546,6 +547,7 @@ pub use { solana_clock as clock, solana_msg::msg, solana_native_token as native_token, + solana_nonce as nonce, solana_program_entrypoint::{ self as entrypoint, custom_heap_default, custom_panic_default, entrypoint, entrypoint_no_alloc, From a6e5cba3b041d87d05d44e4db6dee186d339d6cc Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 5 Oct 2024 14:54:04 +0400 Subject: [PATCH 2/7] activate solana-nonce/serde in solana-program --- sdk/program/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/program/Cargo.toml b/sdk/program/Cargo.toml index 715dbd1295036a..7429e7d9ca265a 100644 --- a/sdk/program/Cargo.toml +++ b/sdk/program/Cargo.toml @@ -56,7 +56,7 @@ solana-instruction = { workspace = true, default-features = false, features = [ solana-last-restart-slot = { workspace = true, features = ["serde"] } solana-msg = { workspace = true } solana-native-token = { workspace = true } -solana-nonce = { workspace = true } +solana-nonce = { workspace = true, features = ["serde"] } solana-program-entrypoint = { workspace = true } solana-program-error = { workspace = true, features = ["serde"] } solana-program-memory = { workspace = true } From 7001e6ddda0534d40e09545be66c35004e493336 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 5 Oct 2024 14:54:15 +0400 Subject: [PATCH 3/7] update lock file --- programs/sbf/Cargo.lock | 2 ++ 1 file changed, 2 insertions(+) diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 24ff1d4d079822..9f41752604dac1 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5691,6 +5691,8 @@ checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" name = "solana-nonce" version = "2.2.0" dependencies = [ + "serde", + "serde_derive", "solana-fee-calculator", "solana-hash", "solana-pubkey", From ace38c768917386260ad9222bdcbfcb9416e4383 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Tue, 15 Oct 2024 20:05:00 +0400 Subject: [PATCH 4/7] post-rebase fixes --- sdk/program/src/lib.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index d5cec51557a650..d70062811fc669 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -493,8 +493,6 @@ pub mod loader_v4; pub mod loader_v4_instruction; pub mod log; pub mod message; -pub mod native_token; -pub mod nonce; pub mod program; pub mod program_error; pub mod program_stubs; @@ -546,8 +544,7 @@ pub use { solana_account_info::{self as account_info, debug_account_data}, solana_clock as clock, solana_msg::msg, - solana_native_token as native_token, - solana_nonce as nonce, + solana_native_token as native_token, solana_nonce as nonce, solana_program_entrypoint::{ self as entrypoint, custom_heap_default, custom_panic_default, entrypoint, entrypoint_no_alloc, From 0862bc78c4965515be63f6c228330e825f2ff75f Mon Sep 17 00:00:00 2001 From: Kevin Heavey Date: Tue, 29 Oct 2024 12:41:43 +0400 Subject: [PATCH 5/7] add docsrs metadata Co-authored-by: Jon C --- sdk/nonce/Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/nonce/Cargo.toml b/sdk/nonce/Cargo.toml index 269a5938a111e3..9b884176266037 100644 --- a/sdk/nonce/Cargo.toml +++ b/sdk/nonce/Cargo.toml @@ -33,3 +33,5 @@ serde = [ [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] +all-features = true +rustdoc-args = ["--cfg=docsrs"] From 3a017b95cdf197cb12ec0d6fb94932ec209bd945 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Tue, 29 Oct 2024 12:44:03 +0400 Subject: [PATCH 6/7] add doc_auto_cfg --- sdk/nonce/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/nonce/src/lib.rs b/sdk/nonce/src/lib.rs index 61bbefa5a9edb6..20979b7650dbb6 100644 --- a/sdk/nonce/src/lib.rs +++ b/sdk/nonce/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(docsrs, feature(doc_auto_cfg))] //! Durable transaction nonces. pub mod state; From c921891ea880d90f92404e97ae5672014e1bed7a Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Tue, 29 Oct 2024 13:00:05 +0400 Subject: [PATCH 7/7] reorganise modules --- sdk/nonce/src/lib.rs | 2 +- sdk/nonce/src/{state/current.rs => state.rs} | 2 +- sdk/nonce/src/{state/mod.rs => versions.rs} | 9 ++++++--- sdk/program/src/lib.rs | 3 ++- sdk/program/src/nonce.rs | 7 +++++++ 5 files changed, 17 insertions(+), 6 deletions(-) rename sdk/nonce/src/{state/current.rs => state.rs} (98%) rename sdk/nonce/src/{state/mod.rs => versions.rs} (98%) create mode 100644 sdk/program/src/nonce.rs diff --git a/sdk/nonce/src/lib.rs b/sdk/nonce/src/lib.rs index 20979b7650dbb6..024b0b717b1e3c 100644 --- a/sdk/nonce/src/lib.rs +++ b/sdk/nonce/src/lib.rs @@ -2,6 +2,6 @@ //! Durable transaction nonces. pub mod state; -pub use state::State; +pub mod versions; pub const NONCED_TX_MARKER_IX_INDEX: u8 = 0; diff --git a/sdk/nonce/src/state/current.rs b/sdk/nonce/src/state.rs similarity index 98% rename from sdk/nonce/src/state/current.rs rename to sdk/nonce/src/state.rs index f825c0d9be132f..32450a39025eb0 100644 --- a/sdk/nonce/src/state/current.rs +++ b/sdk/nonce/src/state.rs @@ -93,7 +93,7 @@ impl State { #[cfg(test)] mod test { - use {super::*, crate::state::Versions}; + use {super::*, crate::versions::Versions}; #[test] fn default_is_uninitialized() { diff --git a/sdk/nonce/src/state/mod.rs b/sdk/nonce/src/versions.rs similarity index 98% rename from sdk/nonce/src/state/mod.rs rename to sdk/nonce/src/versions.rs index 91c632fdc6fcc8..6b6dfa78cc7aea 100644 --- a/sdk/nonce/src/state/mod.rs +++ b/sdk/nonce/src/versions.rs @@ -1,8 +1,11 @@ //! State for durable transaction nonces. -mod current; -pub use current::{Data, DurableNonce, State}; -use {solana_hash::Hash, solana_pubkey::Pubkey, std::collections::HashSet}; +use { + crate::state::{Data, DurableNonce, State}, + solana_hash::Hash, + solana_pubkey::Pubkey, + std::collections::HashSet, +}; #[cfg_attr( feature = "serde", diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index d70062811fc669..26df24aeeae252 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -493,6 +493,7 @@ pub mod loader_v4; pub mod loader_v4_instruction; pub mod log; pub mod message; +pub mod nonce; pub mod program; pub mod program_error; pub mod program_stubs; @@ -544,7 +545,7 @@ pub use { solana_account_info::{self as account_info, debug_account_data}, solana_clock as clock, solana_msg::msg, - solana_native_token as native_token, solana_nonce as nonce, + solana_native_token as native_token, solana_program_entrypoint::{ self as entrypoint, custom_heap_default, custom_panic_default, entrypoint, entrypoint_no_alloc, diff --git a/sdk/program/src/nonce.rs b/sdk/program/src/nonce.rs new file mode 100644 index 00000000000000..5dc9f571f1468a --- /dev/null +++ b/sdk/program/src/nonce.rs @@ -0,0 +1,7 @@ +pub use solana_nonce::{state::State, NONCED_TX_MARKER_IX_INDEX}; +pub mod state { + pub use solana_nonce::{ + state::{Data, DurableNonce, State}, + versions::{AuthorizeNonceError, Versions}, + }; +}