All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.5.3 - 2024-11-13
- specify a minimum version for
syn
as2.0.81
(#320)
1.5.2 - 2024-11-07
- ser/de for
IpAddr
type; schema forIpv4Addr
/Ipv6Addr
/IpAddr
types (#309)
serde_json::Value
bridging example/doc (#317)- remove dependency on syn_derive (#318)
- cover one more
syn::generics::TypeParamBound
as per syntax change (#316)
1.5.1 - 2024-05-30
- (schema) for
HashMap<K, V>
->HashMap<K, V, S>
, forHashSet<T>
->HashSet<T, S>
(#294)
- fixed linting warnings for Rust 1.78 stable, 1.80 nightly (#295)
1.5.0 - 2024-04-29
- implement
BorshSchema
forVecDeque
andLinkedList
(#291)
- Fix repository field of borsh-derive (#288)
1.4.0 - 2024-03-25
- impl
BorshSchema
forCow<'a, T>
(#284) BorshSerialize
/BoshDeserialize
/BorshSchema
forCell
/RefCell
(#265)
- reorg tests (#285)
- remove conflicts with
W
/R
parameters forBorshSerialize
/BorshDeserialize
derives (#283) - fix
test_exhaustive_checks
step + downgrade package for MSRV test (#280)
1.3.1 - 2024-01-10
1.3.0 - 2023-12-07
- impl
BorshSchema
forRc
andArc
; add doc forrc
feature (#268)
1.2.1 - 2023-12-06
- optimize
BorshSerialize
derive for enums with unit variants (#262) - fix
release-plz
error; exclude*.snap
fromborsh-derive
publish (#263)
1.2.0 - 2023-11-13
- add support for types from
ascii
crate (#255)
1.1.2 - 2023-11-08
- bump
proc-macro-crate
to 2.0.0 inborsh-derive
(#256)
1.1.1 - 2023-10-25
- add
test_schema_conflicts
(#254) - addressed warnings in docs generation (#252)
- simplify discriminants handling in schema derives (#241)
1.1.0 - 2023-10-13
- relax
schema_container_of
target requirement with?Sized
to allow slices (#245)
- fully qualify
#cratename::BorshSchema
in derive-generated code to void function name collisions leading to compilation errors (#244)
1.0.0 - 2023-10-03
The year is 2653 and the best yet-to-be citizens of the Terran Federation are fighting and mostly just dying in a relentless interstellar war against the Arachnids. Yet the structure of our society has changed through the course of this confrontation.
The members of the Arachnid brain caste and queens have infiltrated the circles of our most influential political and industrial leaders. Either directly, or via the Arachnid technology called "Brain Bugs". This tech alone can accomplish what the Arachnid starship paratroopers will not ever be capable to do.
Simple, straightforward and performant serialization libraries can set us in course to remedy this dangerous stalemate situation by cleaning the minds of its users from even the tiniest of Brain Bugs.
borsh-rs
1.0.0
release was first conceived and then brought into existence by minds of:
- Amirhossein Akhlaghpour @Mehrbod2002
- Benji Smith @Benjins
- dj8yf0μl @dj8yfo
- iho @iho
- Jacob Lindahl @encody
- Pavel Lazureykis @lazureykis
- Tomas Zemanovic @tzemanovic
Contributors, who imposed powerful impact on the past, present and future of this library are specially recognized:
- Michal Nazarewicz @mina86 - for revisiting
BorshSchema
feature, rethinking it, bringing up great ideas and coming up with the fairly involved algorithm ofmax_serialized_size
implementation. - Alex Kladov @matklad - for maintaining a superhuman ability of context switching in under 2 minutes and scanning through 15k lines of code in under 10 minutes, while leaving out under 1% relevant details.
- Marco Ieni @MarcoIeni - for developing release-plz automation.
- Vlad Frolov @frol - for keeping an eye on the big picture and striking just the right balance between performance and versatility, ease of use and extensibility and tons of other such hard to reconcile pairs.
This section contains links to short documents, describing problems encountered during update of borsh
version to v1.0.0
for related repositories.
-
Library's structure was made more modular and optimized with respect to visibility of its public/private constituents and ease of access to them.
-
borsh
's traits derives and their attributes had their capabilities extended and unified, both with respect to external interfaces and internal implementation. Please visit borsh_derive documentation pages if you're interested in more of the details. -
The consistency property of deserialization, declared in Borsh Specification, became an opt-in feature
de_strict_order
for hash collections. -
Support of explicit enum discriminants was added to derives of
borsh
traits. It has been added in somewhat limited form, only allowing the values ofu8
range literals.use borsh::{BorshSerialize, BorshDeserialize, BorshSchema}; <<<<<<< borsh-v0.10.3 #[derive(BorshDeserialize, BorshSerialize, BorshSchema)] pub enum CurveType { ED25519 = 0, // 0 as u8 in enum tag SECP256K1 = 2, // 1 as u8 in enum tag } ======= #[derive(BorshDeserialize, BorshSerialize, BorshSchema)] #[borsh(use_discriminant=false)] pub enum CurveType { ED25519 = 0, // 0 as u8 in enum tag SECP256K1 = 2, // 1 as u8 in enum tag } // vs #[derive(BorshDeserialize, BorshSerialize, BorshSchema)] #[borsh(use_discriminant=true)] pub enum CurveType { ED25519 = 0, // 0 as u8 in enum tag SECP256K1 = 2, // 2 as u8 in enum tag } >>>>>>> borsh-v1.0.0
-
RUSTSEC-2023-0033 has been resolved. It has been resolved by forbidding collections with dynamic runtime length to contain zero-sized types with runtime errors, happening on serialization or deserialization. Arrays with non-
Copy
and non-Clone
ZST singletons of length > 1 gracefully panic on deserialization, not causing memory faults.Using collections with dynamic runtime length (tagged sequences) for containing ZSTs was also deemed wasteful of CPU cycles and a way to perform dos attacks. Such a case is now flagged as error when using new
BorshSchemaContainer::validate
method for user-defined types or instantiations ofBorshSchema
-supporting types with inappropriate parameters, defined by the library:let schema = BorshSchemaContainer::for_type::<Vec<core::ops::RangeFull>>(); assert_eq!( Err( SchemaContainerValidateError::ZSTSequence("Vec<RangeFull>".to_string()) ), schema.validate() );
-
BorshSchema
was extended withmax_serialized_size
implementation, which now unlocks support ofborsh
by a plethora of bounded types to express statically defined size limits of serialized representation of these types. -
schema
BorshSchemaContainer
api was made future-proof. -
schema
Definition
was extended with more variants, fields and details to uncover some of the implied details of serialization format.BorshSchema
can now express a wider range of types. All types, which haveBorshSchema
defined by the library, now have aDefinition
. -
schema
Declaration
-s were renamed to follow Rust-first rule and not be a mix of Rust types naming/syntax and syntax from other languages.use borsh::schema::BorshSchema; <<<<<<< borsh-v0.10.3 assert_eq!("nil", <()>::declaration()); assert_eq!("string", <String>::declaration()); assert_eq!("Array<u64, 42>", <[u64; 42]>::declaration()); assert_eq!("Tuple<u8, bool, f32>", <(u8, bool, f32)>::declaration()); ======= assert_eq!("()", <()>::declaration()); assert_eq!("String", <String>::declaration()); assert_eq!("[u64; 42]", <[u64; 42]>::declaration()); assert_eq!("(u8, bool, f32)", <(u8, bool, f32)>::declaration()); >>>>>>> borsh-v1.0.0
borsh
's serialization format is guaranteed to NOT change throughout 1.x releases.borsh
's public APIs not gated byunstable__schema
feature are guaranteed to NOT break throughout 1.x releases.- It's perceived, that new feature requests may potentially come for
BorshSchema
from outside ofnear
ecosystem, thusborsh
's public APIs gated byunstable__schema
MAY break throughout 1.x releases.
1.0.0-alpha.6 - 2023-10-02
- add
borsh::object_length
helper (#236)
- add examples for
borsh::to_vec
,borsh::to_writer
,borsh::object_length
(#238) - [breaking] completely remove deprecated
BorshSerialize::try_to_vec
(#221)
1.0.0-alpha.5 - 2023-09-26
- [breaking] add
DiscriminantValue
toDefinition::Enum::variants
tuples (#232) - [breaking] add
length_width
toschema::Definition::Sequence
(#229) - add definition of
String
/str
(#226) - [breaking] add
Definition::Sequence::length_range
field (#220) - [breaking] add
Definition::Primitive
(#222) - max_size: various small refactoring (#223)
- check
Definition::Enum
’stag_width
when validating schema (#224) - add (de)serialisation + schema for more
core::ops::Range...
types (full, open-ended, inclusive) (#213) - add
BorshSchema
implementation forcore::num::NonZero...
integers (#214) - [breaking] introduce
borsh::io
with either items ofstd:io
or privateborsh::nostd_io
module reexported (std
orno_std
) (#212) - Introduce
borsh::max_serialized_size
function,borsh::schema::BorshSchemaContainer::for_type
method (#209)
- [breaking] rename
"Tuple<T0, T1, T2...>"
->"(T0, T1, T2...)"
(schema::Declaration
) (#234) - [breaking] rename
"nil"
->"()"
,"string"
->"String"
,"nonzero_u16"
->"NonZeroU16"
(schema::Declaration
) (#233) - [breaking] rename
"Array<T0, N>"
->"[T0; N]"
(schema::Declaration
) (#235) - [breaking] split
ValidationError
fromMaxSizeError
;validate
andmax_serialized_size
madeBorshSchemaContainer
's methods (#219) - [breaking] declare and rename schema feature to be unstable__ (may break in 1.x versions)
- Add Definition::Enum::tag_width field (#215)
1.0.0-alpha.4 - 2023-09-04
- [breaking] raise bound on keys in hashcollections
PartialOrd
->Ord
(#203) - forbid most collections from containing zst elements/keys (#202)
- add
#[borsh(crate = ...)]
item-level attribute (#210) - forbid multiple
borsh
attr occurencies (#199)
- various flaws correction (#205)
- [breaking] deprecate
try_to_vec
method fromBorshSerialize
(#206) - [breaking] make
BorshSchema::add_definition
default implementation a free-standing func (#204) - remove
#[non_exhaustive]
onborsh::schema::Definition
(#200)
1.0.0-alpha.3 - 2023-08-16
1.0.0-alpha.2 - 2023-08-10
- [breaking] borsh_init to borsh(init). (#187)
1.0.0-alpha.1 - 2023-08-07
- Unused fields warn, fields for inner structs of derived BorshSchema method (#172)
- #[borsh_skip] on field of struct enum variant (BorshSerialize) (#174)
- Filter out foreign attributes in
BorshSchema
derive for enum (#177)
- Create a brief documentation of crate's features (#159)
- Mention
schema
feature in doc.rs (#166)
- Forbid Vectors of Zero-sized types from de-/serialization to resolve the RUSTSEC-2023-0033 (#145)
- Add top-level
from_slice
andfrom_reader
helper functions to make the API nicer (#142) - [breaking] Add
#[borsh(use_discriminant = <bool>)]
attribute that changes enum discriminant de- and serialization behavior - [breaking] Remove
BinaryHeap
support (#161) - Sets/maps benches for reference point (#164)
- Enforce canonicity on
HashSet/BTreeSet/HashMap/BTreeMap
(#162) - [breaking] Support recursive structures! (#178)
BorshSerialize
,BorshDeserialize
,BorshSchema
derives may break- derives may require patching bounds with
#[borsh(bound(..))]
/#[borsh(schema(params = ...))]
- Bounds for ser/de derive and schema_params for schema derive attributes (#180)
- Derive attribute for 3rd party structs/enums as fields (#182)
- Bump proc-macro-crate versions (#149)
- Add tests job for MSRV (1.65.0) (#151)
- [breaking] Hide maybestd from public interface, despite it being technically available by new name of __maybestd (#153)
- Fix broken reference-style link in minimum supported version badge (#154)
- Remove a bunch of clippy-related TODOs (uninlined_format_args) (#156)
- Simpler bounds on Rc/Arc impls (#167)
- Invited @dj8yfo to CODEOWNERS (#169)
- [breaking] Replace ErrorKind::InvalidInput with ErrorKind::InvalidData as per original std::io meaning (#170)
- [breaking] Make
hashbrown
dependency optional,hashbrown
feature (#155) - [breaking]
BorshSchemaContainer
fields non-pub,HashMap
->BTreeMap
in schema everywhere (#165) - [breaking] Move derive under #[cfg(feature = "derive")] (#168)
- Introduce
__private
module with macro runtime (#171) - [breaking] Unsplit and removal of *-internal crates (#185)
borsh-schema-derive-internal
andborsh-derive-internal
crates won't be published anymore
- Add
insta
snapshots to borsh/tests (#157) insta
tests for prettifiedTokenStream
-s inborsh*derive-internal
(#176)
- Only release-plz after other checks pass
0.11.0 - 2023-05-31
- add BorshSchema for PhantomData, BTreeMap and BTreeSet (#93)
- Add optional bson::oid::ObjectId support (#135)
- [breaking] ser/de enum discriminant (#138)
- no-std tests did not run due to dev-dependencies re-enabling std feature (#144)
- use release-plz and specify common rust version correctly (#134)
- Upgrade plain-HTTP links to HTTPS in Cargo.toml files (#141)
- Add optional bytes/bytesmut support
- Prevent unbound allocation for vectors on deserialization
- Implemented (de)ser for
core::ops::range
- Introduce de::EnumExt trait with deserialize_variant method
- Fix no-std feature (some of the imports incorrectly used
std::
instead ofcrate::maybestd::
) - Fix borsh-schema derives with
for
bounds - Implemented BorshSchema for HashSet
- Add support for isize, usize types
- Delete schema for char
- Implement ser/de and schema for (T,)
- Add clone impls to borsh schema types
- Remove unnecessary trait bounds requirements for array
- BREAKING CHANGE:
BorshDeserialize
now works by receiving an&mut std::io::Read
instead of a&mut &[u8]
. This is a breaking change for code that provides custom implementations ofBorshDeserialize
; there is no impact on code that uses only the derive macro. - Added
BorshDeserialize::try_from_reader
andBorshDeserialize::deserialize_reader
. - Upgrade hashbrown version to be
>=0.11,<0.14
to allow wider range of versions.
0.9.3 - 2022-02-03
- Fix
no_std
compatibility. - Reduce code bloat in derived
BorshSerialize
impl for enums.
0.9.2 - 2022-01-25
- Upgrade hashbrown from
0.9
to0.11
. This can breakage in the rare case that you use borsh schema together with no-std support and rely on a specific version hashbrown ofSchemaContainer
. This is considered to be obscure enough to not warrant a semver bump.
0.9.1 - 2021-07-14
- Eliminated unsafe code from both ser and de of u8 (#26)
- Implemented ser/de for reference count types (#27)
- Added serialization helpers to improve api ergonomics (#34)
- Implemented schema for arrays and fix box bounds (#36)
- Implemented (de)ser for PhantomData (#37)
- Implemented const-generics under feature (#38)
- Added an example of direct BorshSerialize::serialize usage with vector and slice buffers (#29)
0.9.0 - 2021-03-18
- BREAKING CHANGE:
is_u8
optimization helper is now unsafe since it may cause undefined behavior if it returnstrue
for the type that is not safe to Copy (#21) - Extended the schema impls to support longer arrays to match the de/serialization impls (#22)
0.8.2 - 2021-03-04
- Avoid collisions of imports due to derive-generated code (#14)
0.8.1 - 2021-01-13
- Added support for BTreeMap, BTreeSet, BinaryHeap, LinkedList, and VecDeque
0.8.0 - 2021-01-11
- Add no_std support.
0.7.2 - 2021-01-14
- Implement
BorshSerialize
for reference fields (&T
)
- Implement
BorshSerialize
for&T
ifT
implementsBorshSerialize
.
- Extended
Box<T>
implementation for?Sized
types ([T]
,str
, ...). - Added support for
std::borrow::Cow
- Avoid silent integer casts since they can lead to hidden security issues.
- Removed
Cargo.lock
as it is advised for lib crates.