diff --git a/Cargo.lock b/Cargo.lock index 42f766213..e35f1380c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -203,7 +203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -229,7 +229,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -304,7 +304,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -541,7 +541,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -619,7 +619,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -669,7 +669,7 @@ checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -927,7 +927,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -961,7 +961,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -975,7 +975,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -986,7 +986,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -997,7 +997,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1049,7 +1049,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1072,7 +1072,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1135,7 +1135,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1195,7 +1195,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -1724,7 +1724,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2008,7 +2008,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2057,7 +2057,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2110,7 +2110,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2173,6 +2173,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b867cad97c0791bbd3aaa6472142568c6c9e8f71937e98379f584cfb0cf35bec" + [[package]] name = "pbkdf2" version = "0.11.0" @@ -2280,9 +2286,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -2323,7 +2329,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2334,9 +2340,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.42" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -2743,7 +2749,7 @@ checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2799,7 +2805,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -2824,7 +2830,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3066,7 +3072,7 @@ dependencies = [ "solana-signer", "subtle", "tempfile", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3084,7 +3090,7 @@ dependencies = [ "serde_derive", "serde_json", "solana-define-syscall", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3183,7 +3189,7 @@ dependencies = [ "curve25519-dalek", "solana-define-syscall", "subtle", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3278,7 +3284,7 @@ dependencies = [ "solana-pubkey", "solana-sdk-ids", "solana-system-interface", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3356,7 +3362,7 @@ dependencies = [ "serde_with", "sha2", "solana-frozen-abi-macro", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3365,7 +3371,7 @@ version = "3.2.1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3682,7 +3688,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "toml", ] @@ -3724,7 +3730,7 @@ dependencies = [ "light-poseidon 0.2.0", "light-poseidon 0.4.0", "solana-define-syscall", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3827,7 +3833,7 @@ version = "1.0.0" dependencies = [ "quote", "regex", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -3921,7 +3927,7 @@ dependencies = [ "solana-time-utils", "solana-transaction", "solana-transaction-error", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -3938,7 +3944,7 @@ dependencies = [ "bs58", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4015,7 +4021,7 @@ dependencies = [ "solana-keccak-hasher", "solana-program-error", "solana-pubkey", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -4161,7 +4167,7 @@ dependencies = [ "num-derive", "num-traits", "rand 0.9.2", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -4451,9 +4457,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.111" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -4474,7 +4480,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4535,7 +4541,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4546,7 +4552,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "test-case-core", ] @@ -4561,11 +4567,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -4576,18 +4582,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -4910,7 +4916,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "wasm-bindgen-shared", ] @@ -4945,7 +4951,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4996,27 +5002,28 @@ dependencies = [ [[package]] name = "wincode" -version = "0.2.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5cec722a3274e47d1524cbe2cea762f2c19d615bd9d73ada21db9066349d57e" +checksum = "cd358c35ea3fbf8590e8b9d9e7fe6450701c520c8b58c320aea0b8b75f8d9866" dependencies = [ + "pastey", "proc-macro2", "quote", "solana-short-vec 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 2.0.17", + "thiserror 2.0.18", "wincode-derive", ] [[package]] name = "wincode-derive" -version = "0.2.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8961eb04054a1b2e026b5628e24da7e001350249a787e1a85aa961f33dc5f286" +checksum = "6505f603ab2302ff300837c3c96e5b1c6e4b65a66b756e3eb07376c935ff1907" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -5233,7 +5240,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure", ] @@ -5255,7 +5262,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -5275,7 +5282,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", "synstructure", ] @@ -5296,7 +5303,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] [[package]] @@ -5318,5 +5325,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.111", + "syn 2.0.114", ] diff --git a/Cargo.toml b/Cargo.toml index 7914b658a..5abc846f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -197,11 +197,11 @@ openssl = "0.10.72" pairing = "0.23.0" parking_lot = "0.12" pbkdf2 = { version = "0.11.0", default-features = false } -proc-macro2 = "1.0.101" +proc-macro2 = "1.0.106" proptest = "1.9" qstring = "0.7.2" qualifier_attr = { version = "0.2.2", default-features = false } -quote = "1.0.41" +quote = "1.0.44" rand = "0.9.2" rand_chacha = "0.9.0" rayon = "1.10.0" @@ -327,15 +327,15 @@ static_assertions = "1.1.0" strum = "0.24" strum_macros = "0.24" subtle = "2.6.1" -syn = "2.0.106" +syn = "2.0.114" tempfile = "3.20.0" test-case = "3.3.1" -thiserror = { version = "2.0.16", default-features = false } +thiserror = { version = "2.0.18", default-features = false } tiny-bip39 = "2.0.0" toml = "0.8.23" uriparse = "0.6.4" wasm-bindgen = "0.2.100" -wincode = { version = "0.2.5", features = ["derive"], default-features = false } +wincode = { version = "0.4.1", features = ["derive"], default-features = false } [profile.release] split-debuginfo = "unpacked" diff --git a/message/src/compiled_instruction.rs b/message/src/compiled_instruction.rs index 479574b5c..16b3f70ea 100644 --- a/message/src/compiled_instruction.rs +++ b/message/src/compiled_instruction.rs @@ -3,7 +3,7 @@ use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::AbiExample; #[cfg(feature = "wincode")] -use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; +use wincode::{containers, len::ShortU16, SchemaRead, SchemaWrite}; use {solana_address::Address, solana_sanitize::Sanitize}; /// A compact encoding of an instruction. @@ -26,11 +26,11 @@ pub struct CompiledInstruction { pub program_id_index: u8, /// Ordered indices into the transaction keys array indicating which accounts to pass to the program. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub accounts: Vec, /// The program input data. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub data: Vec, } @@ -38,7 +38,7 @@ impl Sanitize for CompiledInstruction {} impl CompiledInstruction { #[cfg(feature = "wincode")] - pub fn new>( + pub fn new>( program_ids_index: u8, data: &T, accounts: Vec, diff --git a/message/src/legacy.rs b/message/src/legacy.rs index e1225360e..74e360bcb 100644 --- a/message/src/legacy.rs +++ b/message/src/legacy.rs @@ -16,7 +16,7 @@ use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::{frozen_abi, AbiExample}; #[cfg(feature = "wincode")] -use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; +use wincode::{containers, len::ShortU16, SchemaRead, SchemaWrite}; use { crate::{ compiled_instruction::CompiledInstruction, compiled_keys::CompiledKeys, @@ -88,7 +88,7 @@ pub struct Message { /// All the account keys used by this transaction. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub account_keys: Vec
, /// The id of a recent ledger entry. @@ -97,7 +97,7 @@ pub struct Message { /// Programs that will be executed in sequence and committed in one atomic transaction if all /// succeed. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub instructions: Vec, } diff --git a/message/src/versions/mod.rs b/message/src/versions/mod.rs index 917c599a5..79f57c9d2 100644 --- a/message/src/versions/mod.rs +++ b/message/src/versions/mod.rs @@ -19,6 +19,7 @@ use { }, core::mem::MaybeUninit, wincode::{ + config::Config, io::{Reader, Writer}, ReadResult, SchemaRead, SchemaWrite, WriteResult, }, @@ -368,7 +369,7 @@ impl<'de> serde::Deserialize<'de> for VersionedMessage { } #[cfg(feature = "wincode")] -impl SchemaWrite for VersionedMessage { +unsafe impl SchemaWrite for VersionedMessage { type Src = Self; // V0 and V1 add +1 for message version prefix @@ -376,8 +377,12 @@ impl SchemaWrite for VersionedMessage { #[inline(always)] fn size_of(src: &Self::Src) -> WriteResult { match src { - VersionedMessage::Legacy(message) => LegacyMessage::size_of(message), - VersionedMessage::V0(message) => Ok(1 + v0::Message::size_of(message)?), + VersionedMessage::Legacy(message) => { + >::size_of(message) + } + VersionedMessage::V0(message) => { + Ok(1 + >::size_of(message)?) + } VersionedMessage::V1(message) => Ok(1 + message.size()), } } @@ -385,12 +390,14 @@ impl SchemaWrite for VersionedMessage { // V0 and V1 add +1 for message version prefix #[allow(clippy::arithmetic_side_effects)] #[inline(always)] - fn write(writer: &mut impl Writer, src: &Self::Src) -> WriteResult<()> { + fn write(mut writer: impl Writer, src: &Self::Src) -> WriteResult<()> { match src { - VersionedMessage::Legacy(message) => LegacyMessage::write(writer, message), + VersionedMessage::Legacy(message) => { + >::write(writer, message) + } VersionedMessage::V0(message) => { - u8::write(writer, &MESSAGE_VERSION_PREFIX)?; - v0::Message::write(writer, message) + >::write(&mut writer, &MESSAGE_VERSION_PREFIX)?; + >::write(writer, message) } VersionedMessage::V1(message) => { let total = message.size(); @@ -412,15 +419,15 @@ impl SchemaWrite for VersionedMessage { } #[cfg(feature = "wincode")] -impl<'de> SchemaRead<'de> for VersionedMessage { +unsafe impl<'de, C: Config> SchemaRead<'de, C> for VersionedMessage { type Dst = Self; - fn read(reader: &mut impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { + fn read(mut reader: impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { // If the first bit is set, the remaining 7 bits will be used to determine // which message version is serialized starting from version `0`. If the first // is bit is not set, all bytes are used to encode the legacy `Message` // format. - let variant = u8::get(reader)?; + let variant = >::get(&mut reader)?; if variant & MESSAGE_VERSION_PREFIX != 0 { use wincode::error::invalid_tag_encoding; @@ -428,7 +435,7 @@ impl<'de> SchemaRead<'de> for VersionedMessage { let version = variant & !MESSAGE_VERSION_PREFIX; return match version { 0 => { - let msg = v0::Message::get(reader)?; + let msg = >::get(reader)?; dst.write(VersionedMessage::V0(msg)); Ok(()) } @@ -450,21 +457,21 @@ impl<'de> SchemaRead<'de> for VersionedMessage { } let mut msg = MaybeUninit::::uninit(); - let mut msg_builder = LegacyMessageUninitBuilder::from_maybe_uninit_mut(&mut msg); + let mut msg_builder = LegacyMessageUninitBuilder::::from_maybe_uninit_mut(&mut msg); // We've already read the variant byte which, in the legacy case, represents // the `num_required_signatures` field. // As such, we need to write the remaining fields into the message manually, // as calling `LegacyMessage::read` will miss the first field. let mut header_builder = - MessageHeaderUninitBuilder::from_maybe_uninit_mut(msg_builder.uninit_header_mut()); + MessageHeaderUninitBuilder::::from_maybe_uninit_mut(msg_builder.uninit_header_mut()); header_builder.write_num_required_signatures(variant); - header_builder.read_num_readonly_signed_accounts(reader)?; - header_builder.read_num_readonly_unsigned_accounts(reader)?; + header_builder.read_num_readonly_signed_accounts(&mut reader)?; + header_builder.read_num_readonly_unsigned_accounts(&mut reader)?; header_builder.finish(); unsafe { msg_builder.assume_init_header() }; - msg_builder.read_account_keys(reader)?; - msg_builder.read_recent_blockhash(reader)?; + msg_builder.read_account_keys(&mut reader)?; + msg_builder.read_recent_blockhash(&mut reader)?; msg_builder.read_instructions(reader)?; msg_builder.finish(); diff --git a/message/src/versions/v0/mod.rs b/message/src/versions/v0/mod.rs index 2e7815241..db6bef8da 100644 --- a/message/src/versions/v0/mod.rs +++ b/message/src/versions/v0/mod.rs @@ -15,7 +15,7 @@ use serde_derive::{Deserialize, Serialize}; #[cfg(feature = "frozen-abi")] use solana_frozen_abi_macro::AbiExample; #[cfg(feature = "wincode")] -use wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}; +use wincode::{containers, len::ShortU16, SchemaRead, SchemaWrite}; use { crate::{ compiled_instruction::CompiledInstruction, @@ -47,11 +47,11 @@ pub struct MessageAddressTableLookup { pub account_key: Address, /// List of indexes used to load writable account addresses #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub writable_indexes: Vec, /// List of indexes used to load readonly account addresses #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub readonly_indexes: Vec, } @@ -78,7 +78,7 @@ pub struct Message { /// List of accounts loaded by this transaction. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub account_keys: Vec
, /// The blockhash of a recent block. @@ -98,13 +98,13 @@ pub struct Message { /// 2) ordered list of keys loaded from `writable` lookup table indexes /// 3) ordered list of keys loaded from `readable` lookup table indexes #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub instructions: Vec, /// List of address table lookups used to load additional accounts /// for this transaction. #[cfg_attr(feature = "serde", serde(with = "solana_short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub address_table_lookups: Vec, } diff --git a/message/src/versions/v1/message.rs b/message/src/versions/v1/message.rs index 05c3a990a..d8e5bde30 100644 --- a/message/src/versions/v1/message.rs +++ b/message/src/versions/v1/message.rs @@ -43,6 +43,7 @@ use solana_frozen_abi_macro::AbiExample; use { crate::v1::MAX_TRANSACTION_SIZE, wincode::{ + config::ConfigCore, error::invalid_tag_encoding, io::{Reader, Writer}, ReadResult, SchemaRead, SchemaWrite, WriteResult, @@ -511,7 +512,7 @@ impl Sanitize for Message { } #[cfg(feature = "wincode")] -impl SchemaWrite for Message { +unsafe impl SchemaWrite for Message { type Src = Self; #[allow(clippy::arithmetic_side_effects)] @@ -522,7 +523,7 @@ impl SchemaWrite for Message { // V0 and V1 add +1 for message version prefix #[inline(always)] - fn write(writer: &mut impl Writer, src: &Self::Src) -> WriteResult<()> { + fn write(mut writer: impl Writer, src: &Self::Src) -> WriteResult<()> { // SAFETY: Serializing a slice of `[u8]`. unsafe { writer @@ -533,10 +534,10 @@ impl SchemaWrite for Message { } #[cfg(feature = "wincode")] -impl<'de> SchemaRead<'de> for Message { +unsafe impl<'de, C: ConfigCore> SchemaRead<'de, C> for Message { type Dst = Self; - fn read(reader: &mut impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { + fn read(mut reader: impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { let bytes = reader.fill_buf(MAX_TRANSACTION_SIZE)?; let (message, consumed) = deserialize(bytes).map_err(|_| invalid_tag_encoding(1))?; diff --git a/nonce/src/state.rs b/nonce/src/state.rs index 54bc92801..ebdbeac38 100644 --- a/nonce/src/state.rs +++ b/nonce/src/state.rs @@ -117,12 +117,10 @@ mod test { #[test] #[cfg(feature = "wincode")] fn test_nonce_state_size_wincode() { - use wincode::SchemaWrite; - let data = Versions::new(State::Initialized(Data::default())); assert_eq!( - ::size_of(&data).unwrap(), - State::size() + State::size() as u64, + wincode::serialized_size(&data).unwrap(), ); } } diff --git a/transaction/src/lib.rs b/transaction/src/lib.rs index 0d3486047..afeb5c71d 100644 --- a/transaction/src/lib.rs +++ b/transaction/src/lib.rs @@ -127,7 +127,7 @@ pub use { pub use { solana_hash::Hash, solana_signer::{signers::Signers, SignerError}, - wincode::{containers, len::ShortU16Len, SchemaRead, SchemaWrite}, + wincode::{containers, len::ShortU16, SchemaRead, SchemaWrite}, }; use { solana_message::inline_nonce::is_advance_nonce_instruction_data, @@ -194,7 +194,7 @@ pub struct Transaction { /// [`num_required_signatures`]: https://docs.rs/solana-message/latest/solana_message/struct.MessageHeader.html#structfield.num_required_signatures // NOTE: Serialization-related changes must be paired with the direct read at sigverify. #[cfg_attr(feature = "serde", serde(with = "short_vec"))] - #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16Len>"))] + #[cfg_attr(feature = "wincode", wincode(with = "containers::Vec<_, ShortU16>"))] pub signatures: Vec, /// The message to sign. diff --git a/transaction/src/versioned/mod.rs b/transaction/src/versioned/mod.rs index f1bb2cfd1..f5ec820e9 100644 --- a/transaction/src/versioned/mod.rs +++ b/transaction/src/versioned/mod.rs @@ -18,9 +18,10 @@ use { solana_message::MESSAGE_VERSION_PREFIX, solana_signer::{signers::Signers, SignerError}, wincode::{ + config::Config, containers, io::{Reader, Writer}, - len::ShortU16Len, + len::ShortU16, ReadError, ReadResult, SchemaRead, SchemaWrite, WriteResult, }, }; @@ -236,7 +237,7 @@ impl VersionedTransaction { } #[cfg(feature = "wincode")] -impl SchemaWrite for VersionedTransaction { +unsafe impl SchemaWrite for VersionedTransaction { type Src = Self; #[allow(clippy::arithmetic_side_effects)] @@ -245,32 +246,33 @@ impl SchemaWrite for VersionedTransaction { match src.message { VersionedMessage::Legacy(_) | VersionedMessage::V0(_) => { Ok( - as SchemaWrite>::size_of( + as SchemaWrite>::size_of( &src.signatures, - )? + ::size_of(&src.message)?, + )? + >::size_of(&src.message)?, ) } VersionedMessage::V1(_) => Ok( // V1 transasction signatures are written as a fixed length array // without a length prefix. - VersionedMessage::size_of(&src.message)? + src.signatures.len() * SIGNATURE_SIZE, + >::size_of(&src.message)? + + src.signatures.len() * SIGNATURE_SIZE, ), } } #[inline] - fn write(writer: &mut impl Writer, src: &Self::Src) -> WriteResult<()> { + fn write(mut writer: impl Writer, src: &Self::Src) -> WriteResult<()> { match src.message { VersionedMessage::Legacy(_) | VersionedMessage::V0(_) => { // `signatures` are written with `ShortU16Len` length prefix. - as SchemaWrite>::write( - writer, + as SchemaWrite>::write( + &mut writer, &src.signatures, )?; - ::write(writer, &src.message) + >::write(writer, &src.message) } VersionedMessage::V1(_) => { - VersionedMessage::write(writer, &src.message)?; + >::write(&mut writer, &src.message)?; unsafe { writer .write_slice_t(&src.signatures) @@ -282,11 +284,11 @@ impl SchemaWrite for VersionedTransaction { } #[cfg(feature = "wincode")] -impl<'de> SchemaRead<'de> for VersionedTransaction { +unsafe impl<'de, C: Config> SchemaRead<'de, C> for VersionedTransaction { type Dst = Self; #[inline] - fn read(reader: &mut impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { + fn read(mut reader: impl Reader<'de>, dst: &mut MaybeUninit) -> ReadResult<()> { // Peek the discriminator to decide how to read the transaction data. // // - For `Legacy` and `V0` messages, the first byte is part of the `short_vec` length @@ -304,17 +306,21 @@ impl<'de> SchemaRead<'de> for VersionedTransaction { let dst_ptr = dst.as_mut_ptr(); - as SchemaRead<'de>>::read(reader, unsafe { - &mut *(addr_of_mut!((*dst_ptr).signatures)).cast::>>() - })?; + as SchemaRead<'de, C>>::read( + &mut reader, + unsafe { + &mut *(addr_of_mut!((*dst_ptr).signatures)) + .cast::>>() + }, + )?; - >::read(reader, unsafe { + >::read(reader, unsafe { &mut *(addr_of_mut!((*dst_ptr).message)).cast::>() })?; } else if *discriminator == V1_PREFIX { // V1 transaction - let message = VersionedMessage::get(reader)?; + let message = >::get(&mut reader)?; let expected_signatures_len = message.header().num_required_signatures as usize;