borsh
Binary Object Representation Serializer for Hashing
1.8.0
173M downloads/mo
#558 most downloaded on crates.io
near/borsh-rs
What this package is like to depend on
Last release 1 months ago
16 Jul 2026
Release timing varies
gaps range from 4 weeks to 8 months
Most releases are documented
notes for 35 of 53 stable releases
1 version withdrawn
withdrawn after publishing
7 years old
60 releases · first in 2019
4 releases in the last 12 months
see the full history below
Release timeline
60 releases · Aug 2019 to Jul 2026Releases
latest 60-
1.8.016 Jul 2026Release notes
Open source →Added
- merge multiple
#[borsh(...)]attributes instead of rejecting them (#373)
Changed
- merge multiple
#[borsh(...)]attributes instead of rejecting them (#373)
Release notes
Open source →Added
- merge multiple
#[borsh(...)]attributes instead of rejecting them (#373)
Changed
- merge multiple
#[borsh(...)]attributes instead of rejecting them (#373)
- merge multiple
-
1.7.018 Jun 2026Release notes
Open source →Added
- impl
BorshSerializeandBorshDeserializeforUuid(#366)
Fixed
- handle PhantomData in enum schema derive (#369)
Other
Release notes
Open source →Added
- impl
BorshSerializeandBorshDeserializeforUuid(#366)
Fixed
- handle PhantomData in enum schema derive (#369)
Other
- impl
-
1.6.118 Mar 2026 -
1.6.025 Nov 2025Release notes
Open source →Added
- Use core::net instead of std::net; bumped MSRV to 1.77 (#356)
Fixed
- Avoid variant name shadowing in BorshSchema derive (#361)
Other
Release notes
Open source →Added
- Use core::net instead of std::net; bumped MSRV to 1.77 (#356)
Fixed
- Avoid variant name shadowing in BorshSchema derive (#361)
Other
-
1.5.725 Mar 2025Release notes
Open source →Other
- replace
Result::unwraperr msg withproc_macro_crate::crate_nametag (#351)
Release notes
Open source →Other
- replace
Result::unwraperr msg withproc_macro_crate::crate_nametag (#351)
- replace
-
1.5.618 Mar 2025Release notes
Open source → -
1.5.518 Jan 2025Release notes
Open source →Other
- bump hashbrown to 0.15 (#333)
- fix typo in private module name (#332)
-
1.5.413 Jan 2025Release notes
Open source →Other
- make doc examples testable in ci (#326)
- add more CODEOWNERS (#327)
-
1.5.313 Nov 2024 -
1.5.207 Nov 2024Release notes
Open source → -
1.5.131 May 2024Release notes
Open source →Added
- (schema) for
HashMap<K, V>->HashMap<K, V, S>, forHashSet<T>->HashSet<T, S>(#294)
Fixed
- fixed linting warnings for Rust 1.78 stable, 1.80 nightly (#295)
- (schema) for
-
1.5.030 Apr 2024Release notes
Open source →Added
- implement
BorshSchemaforVecDequeandLinkedList(#291)
Other
- Fix repository field of borsh-derive (#288)
- implement
-
1.4.026 Mar 2024Release notes
Open source →Added
- impl
BorshSchemaforCow<'a, T>(#284) BorshSerialize/BoshDeserialize/BorshSchemaforCell/RefCell(#265)
Other
- impl
-
1.3.110 Jan 2024Release notes
Open source → -
1.3.018 Dec 2023 -
1.2.106 Dec 2023 -
1.2.013 Nov 2023 -
1.1.208 Nov 2023 -
1.1.125 Oct 2023 -
1.1.013 Oct 2023Release notes
Open source →Added
- relax
schema_container_oftarget requirement with?Sizedto allow slices (#245)
Fixed
- fully qualify
#cratename::BorshSchemain derive-generated code to void function name collisions leading to compilation errors (#244)
- relax
-
1.0.006 Oct 2023Release notes
Open source →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.
Robert A. Heinlein, 1959 (a newspaper ad)
[Thanks]
borsh-rs1.0.0release 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
BorshSchemafeature, rethinking it, bringing up great ideas and coming up with the fairly involved algorithm ofmax_serialized_sizeimplementation. - 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.
[Migration guides]
This section contains links to short documents, describing problems encountered during update of
borshversion tov1.0.0for related repositories.[Summary of changes]
-
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_orderfor hash collections. -
Support of explicit enum discriminants was added to derives of
borshtraits. It has been added in somewhat limited form, only allowing the values ofu8range 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-
Copyand non-CloneZST 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::validatemethod 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() ); -
BorshSchemawas extended withmax_serialized_sizeimplementation, which now unlocks support ofborshby a plethora of bounded types to express statically defined size limits of serialized representation of these types. -
schema
BorshSchemaContainerapi was made future-proof. -
schema
Definitionwas extended with more variants, fields and details to uncover some of the implied details of serialization format.BorshSchemacan now express a wider range of types. All types, which haveBorshSchemadefined 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
[Stability guarantee]
borsh's serialization format is guaranteed to NOT change throughout 1.x releases.borsh's public APIs not gated byunstable__schemafeature are guaranteed to NOT break throughout 1.x releases.- It's perceived, that new feature requests may potentially come for
BorshSchemafrom outside ofnearecosystem, thusborsh's public APIs gated byunstable__schemaMAY break throughout 1.x releases.
-
1.0.0-alpha.602 Oct 2023 pre-release -
1.0.0-alpha.526 Sep 2023 pre-releaseRelease notes
Open source →Added
- [breaking] add
DiscriminantValuetoDefinition::Enum::variantstuples (#232) - [breaking] add
length_widthtoschema::Definition::Sequence(#229) - add definition of
String/str(#226) - [breaking] add
Definition::Sequence::length_rangefield (#220) - [breaking] add
Definition::Primitive(#222) - max_size: various small refactoring (#223)
- check
Definition::Enum’stag_widthwhen validating schema (#224) - add (de)serialisation + schema for more
core::ops::Range...types (full, open-ended, inclusive) (#213) - add
BorshSchemaimplementation forcore::num::NonZero...integers (#214) - [breaking] introduce
borsh::iowith either items ofstd:ioor privateborsh::nostd_iomodule reexported (stdorno_std) (#212) - Introduce
borsh::max_serialized_sizefunction,borsh::schema::BorshSchemaContainer::for_typemethod (#209)
Other
- [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
ValidationErrorfromMaxSizeError;validateandmax_serialized_sizemadeBorshSchemaContainer'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)
- [breaking] add
-
1.0.0-alpha.404 Sep 2023 pre-releaseRelease notes
Open source →Added
- [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
borshattr occurencies (#199)
Other
- [breaking] raise bound on keys in hashcollections
-
1.0.0-alpha.316 Aug 2023 pre-release -
1.0.0-alpha.211 Aug 2023 pre-release -
1.0.0-alpha.109 Aug 2023 pre-releaseRelease notes
Open source →Bug Fixes
- 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
BorshSchemaderive for enum (#177)
Documentation
- Create a brief documentation of crate's features (#159)
- Mention
schemafeature in doc.rs (#166)
Features
- Forbid Vectors of Zero-sized types from de-/serialization to resolve the RUSTSEC-2023-0033 (#145)
- Add top-level
from_sliceandfrom_readerhelper functions to make the API nicer (#142) - [breaking] Add
#[borsh(use_discriminant = <bool>)]attribute that changes enum discriminant de- and serialization behavior - [breaking] Remove
BinaryHeapsupport (#161) - Sets/maps benches for reference point (#164)
- Enforce canonicity on
HashSet/BTreeSet/HashMap/BTreeMap(#162) - [breaking] Support recursive structures! (#178)
BorshSerialize,BorshDeserialize,BorshSchemaderives 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)
Miscellaneous Tasks
- 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)
Refactor
- [breaking] Make
hashbrowndependency optional,hashbrownfeature (#155) - [breaking]
BorshSchemaContainerfields non-pub,HashMap->BTreeMapin schema everywhere (#165) - [breaking] Move derive under #[cfg(feature = "derive")] (#168)
- Introduce
__privatemodule with macro runtime (#171) - [breaking] Unsplit and removal of *-internal crates (#185)
borsh-schema-derive-internalandborsh-derive-internalcrates won't be published anymore
Testing
- Add
instasnapshots to borsh/tests (#157) instatests for prettifiedTokenStream-s inborsh*derive-internal(#176)
Ci
- Only release-plz after other checks pass
-
0.11.002 Jun 2023 withdrawnRelease notes
Open source →Added
- add BorshSchema for PhantomData, BTreeMap and BTreeSet (#93)
- Add optional bson::oid::ObjectId support (#135)
- [breaking] ser/de enum discriminant (#138)
Fixed
- no-std tests did not run due to dev-dependencies re-enabling std feature (#144)
Other
-
0.10.423 Sep 2024Nothing published for this version
-
0.10.322 Mar 2023 -
0.10.214 Feb 2023 -
0.10.108 Feb 2023Release notes
Open source →- Implemented (de)ser for
core::ops::range - Introduce de::EnumExt trait with deserialize_variant method
- Implemented (de)ser for
-
0.10.019 Jan 2023Release notes
Open source →- Fix no-std feature (some of the imports incorrectly used
std::instead ofcrate::maybestd::) - Fix borsh-schema derives with
forbounds - 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:
BorshDeserializenow works by receiving an&mut std::io::Readinstead 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_readerandBorshDeserialize::deserialize_reader. - Upgrade hashbrown version to be
>=0.11,<0.14to allow wider range of versions.
- Fix no-std feature (some of the imports incorrectly used
-
0.9.304 Feb 2022Release notes
Open source →- Fix
no_stdcompatibility. - Reduce code bloat in derived
BorshSerializeimpl for enums.
- Fix
-
0.9.226 Jan 2022Release notes
Open source →- Upgrade hashbrown from
0.9to0.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.
- Upgrade hashbrown from
-
0.9.114 Jul 2021Release notes
Open source →- 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.018 Mar 2021Release notes
Open source →- BREAKING CHANGE:
is_u8optimization helper is now unsafe since it may cause undefined behavior if it returnstruefor the type that is not safe to Copy (#21) - Extended the schema impls to support longer arrays to match the de/serialization impls (#22)
- BREAKING CHANGE:
-
0.8.204 Mar 2021 -
0.8.113 Jan 2021Release notes
Open source →- Added support for BTreeMap, BTreeSet, BinaryHeap, LinkedList, and VecDeque
-
0.8.011 Jan 2021 -
0.7.214 Jan 2021 -
0.7.124 Aug 2020 -
0.7.017 Jun 2020Release notes
Open source →- Extended
Box<T>implementation for?Sizedtypes ([T],str, ...). - Added support for
std::borrow::Cow - Avoid silent integer casts since they can lead to hidden security issues.
- Removed
Cargo.lockas it is advised for lib crates.
- Extended
-
0.6.203 Jun 2020Nothing published for this version
-
0.6.119 Mar 2020Nothing published for this version
-
0.6.013 Mar 2020Nothing published for this version
-
0.5.006 Mar 2020Nothing published for this version
-
0.4.006 Mar 2020Nothing published for this version
-
0.3.022 Feb 2020Nothing published for this version
-
0.2.1027 Nov 2019Nothing published for this version
-
0.2.925 Oct 2019Nothing published for this version
-
0.2.825 Oct 2019Nothing published for this version
-
0.2.720 Oct 2019Nothing published for this version
-
0.2.522 Sep 2019Nothing published for this version
-
0.2.413 Sep 2019Nothing published for this version
-
0.2.312 Sep 2019Nothing published for this version
-
0.2.207 Sep 2019Nothing published for this version
-
0.2.123 Aug 2019Nothing published for this version
-
0.2.020 Aug 2019Nothing published for this version
-
0.1.016 Aug 2019Nothing published for this version