2 releases

0.8.1-serum.1 Jan 31, 2021
0.8.0-serum.1 Jan 15, 2021
0.7.2+serum.2 Jan 15, 2021

#1581 in Encoding

Download history 90/week @ 2024-01-02 136/week @ 2024-01-09 128/week @ 2024-01-16 89/week @ 2024-01-23 71/week @ 2024-01-30 169/week @ 2024-02-06 130/week @ 2024-02-13 206/week @ 2024-02-20 233/week @ 2024-02-27 213/week @ 2024-03-05 467/week @ 2024-03-12 263/week @ 2024-03-19 244/week @ 2024-03-26 331/week @ 2024-04-02 129/week @ 2024-04-09 226/week @ 2024-04-16

997 downloads per month
Used in 3 crates (2 directly)


1.5K SLoC

Borsh in Rust   Build Status Latest Version borsh: rustc 1.40+ License Apache-2.0 badge License MIT badge

borsh-rs is Rust implementation of the Borsh binary serialization format.

Borsh stands for Binary Object Representation Serializer for Hashing. It is meant to be used in security-critical projects as it prioritizes consistency, safety, speed, and comes with a strict specification.


use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug)]
struct A {
    x: u64,
    y: String,

fn test_simple_struct() {
    let a = A {
        x: 3301,
        y: "liber primus".to_string(),
    let encoded_a = a.try_to_vec().unwrap();
    let decoded_a = A::try_from_slice(&encoded_a).unwrap();
    assert_eq!(a, decoded_a);


Opting out from Serde allows borsh to have some features that currently are not available for serde-compatible serializers. Currently we support two features: borsh_init and borsh_skip (the former one not available in Serde).

borsh_init allows to automatically run an initialization function right after deserialization. This adds a lot of convenience for objects that are architectured to be used as strictly immutable. Usage example:

#[derive(BorshSerialize, BorshDeserialize)]
struct Message {
    message: String,
    timestamp: u64,
    public_key: CryptoKey,
    signature: CryptoSignature
    hash: CryptoHash

impl Message {
    pub fn init(&mut self) {
        self.hash = CryptoHash::new().write_string(self.message).write_u64(self.timestamp);
        self.signature.verify(self.hash, self.public_key);

borsh_skip allows to skip serializing/deserializing fields, assuming they implement Default trait, similary to #[serde(skip)].

#[derive(BorshSerialize, BorshDeserialize)]
struct A {
    x: u64,
    y: f32,


After you merged your change into the master branch and bumped the versions of all three crates it is time to officially release the new version.

Make sure borsh, borsh-derive, borsh-derive-internal, and borsh-schema-derive-internal all have the new crate versions. Then run the publish.sh script:

sh publish.sh

Make sure you are on the master branch, then tag the code and push the tag:

git tag -a v9.9.9 -m "My superawesome change."
git push origin v9.9.9


This repository is distributed under the terms of both the MIT license and the Apache License (Version 2.0). See LICENSE-MIT and LICENSE-APACHE for details.


~416K SLoC