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,
}
#[test]
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)]
#[borsh_init(init)]
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,
#[borsh_skip]
y: f32,
}
Before you release, make sure CHANGELOG.md is up to date.
Use cargo-workspaces
to save time.
cargo workspaces version --force 'borsh*' --exact --no-individual-tags patch
This will bump all the versions to the next "patch" release (see cargo workspaces version --help
for more options), create a new commit, push v0.x.x
tag, push to the master.
To publish on crates.io the version that is currently in git:
cargo workspaces publish --from-git --skip-published
Alternatively, you may want to combine the version bumping with publishing:
cargo workspaces publish --force 'borsh*' --exact --no-individual-tags patch
- Navigate to the New Release page
- Enter the tag name, e.g.
v0.8.0
- Write down the release log (basically, copy-paste from the CHANGELOG)
- Publish the release
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.