Allow `no_std` use of `incrementalmerkletree`
This commit is contained in:
parent
d663a8f64f
commit
0eecd6dae7
|
@ -64,9 +64,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.9.0"
|
version = "1.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
|
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "errno"
|
name = "errno"
|
||||||
|
|
|
@ -7,6 +7,9 @@ and this project adheres to Rust's notion of
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- `no-std` support, via a default-enabled `std` feature flag.
|
||||||
|
|
||||||
## [0.7.0] - 2024-09-25
|
## [0.7.0] - 2024-09-25
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
|
@ -18,7 +18,7 @@ all-features = true
|
||||||
rustdoc-args = ["--cfg", "docsrs"]
|
rustdoc-args = ["--cfg", "docsrs"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
either = "1.8"
|
either = { version = "1.8", default-features = false }
|
||||||
proptest = { workspace = true, optional = true }
|
proptest = { workspace = true, optional = true }
|
||||||
rand = { version = "0.8", optional = true }
|
rand = { version = "0.8", optional = true }
|
||||||
rand_core = { version = "0.6", optional = true }
|
rand_core = { version = "0.6", optional = true }
|
||||||
|
@ -30,10 +30,12 @@ rand_core = "0.6"
|
||||||
rand_chacha = "0.3"
|
rand_chacha = "0.3"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
default = ["std"]
|
||||||
|
std = []
|
||||||
# The legacy-api feature guards types and functions that were previously
|
# The legacy-api feature guards types and functions that were previously
|
||||||
# part of the `zcash_primitives` crate. Those types were removed in the
|
# part of the `zcash_primitives` crate. Those types were removed in the
|
||||||
# `zcash_primitives` 0.12 release and are now maintained here.
|
# `zcash_primitives` 0.12 release and are now maintained here.
|
||||||
legacy-api = []
|
legacy-api = []
|
||||||
# The test-dependencies feature guards types and functions that are
|
# The test-dependencies feature guards types and functions that are
|
||||||
# useful for testing incremental Merkle trees and Merkle tree frontiers.
|
# useful for testing incremental Merkle trees and Merkle tree frontiers.
|
||||||
test-dependencies = ["dep:proptest", "dep:rand", "dep:rand_core"]
|
test-dependencies = ["dep:proptest", "dep:rand", "dep:rand_core", "std"]
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
use std::mem::size_of;
|
use alloc::vec::Vec;
|
||||||
|
use core::mem::size_of;
|
||||||
|
|
||||||
use crate::{Address, Hashable, Level, MerklePath, Position, Source};
|
use crate::{Address, Hashable, Level, MerklePath, Position, Source};
|
||||||
|
|
||||||
#[cfg(feature = "legacy-api")]
|
#[cfg(feature = "legacy-api")]
|
||||||
use {std::collections::VecDeque, std::iter::repeat};
|
use {alloc::boxed::Box, alloc::collections::VecDeque, core::iter::repeat};
|
||||||
|
|
||||||
#[cfg(any(test, feature = "test-dependencies"))]
|
#[cfg(any(test, feature = "test-dependencies"))]
|
||||||
use {
|
use {
|
||||||
|
core::num::{NonZeroU64, NonZeroU8},
|
||||||
rand::{
|
rand::{
|
||||||
distributions::{Distribution, Standard},
|
distributions::{Distribution, Standard},
|
||||||
Rng, RngCore,
|
Rng, RngCore,
|
||||||
},
|
},
|
||||||
std::num::{NonZeroU64, NonZeroU8},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Validation errors that can occur during reconstruction of a Merkle frontier from
|
/// Validation errors that can occur during reconstruction of a Merkle frontier from
|
||||||
|
@ -195,7 +196,7 @@ where
|
||||||
NonEmptyFrontier::from_parts(
|
NonEmptyFrontier::from_parts(
|
||||||
position,
|
position,
|
||||||
rng.gen(),
|
rng.gen(),
|
||||||
std::iter::repeat_with(|| rng.gen())
|
core::iter::repeat_with(|| rng.gen())
|
||||||
.take(position.past_ommer_count().into())
|
.take(position.past_ommer_count().into())
|
||||||
.collect(),
|
.collect(),
|
||||||
)
|
)
|
||||||
|
@ -209,7 +210,7 @@ where
|
||||||
) -> (Vec<H>, Self) {
|
) -> (Vec<H>, Self) {
|
||||||
let prior_subtree_count: u64 = u64::from(tree_size) >> u8::from(subtree_depth);
|
let prior_subtree_count: u64 = u64::from(tree_size) >> u8::from(subtree_depth);
|
||||||
if prior_subtree_count > 0 {
|
if prior_subtree_count > 0 {
|
||||||
let prior_roots: Vec<H> = std::iter::repeat_with(|| rng.gen())
|
let prior_roots: Vec<H> = core::iter::repeat_with(|| rng.gen())
|
||||||
.take(prior_subtree_count as usize)
|
.take(prior_subtree_count as usize)
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
@ -673,12 +674,13 @@ impl<H: Hashable + Clone, const DEPTH: u8> CommitmentTree<H, DEPTH> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(test, feature = "test-dependencies"))]
|
#[cfg(any(all(test, feature = "std"), feature = "test-dependencies"))]
|
||||||
pub mod testing {
|
pub mod testing {
|
||||||
use core::fmt::Debug;
|
use core::fmt::Debug;
|
||||||
use proptest::collection::vec;
|
use proptest::collection::vec;
|
||||||
use proptest::prelude::*;
|
use proptest::prelude::*;
|
||||||
use rand::{distributions::Standard, prelude::Distribution};
|
use rand::{distributions::Standard, prelude::Distribution};
|
||||||
|
|
||||||
use std::collections::hash_map::DefaultHasher;
|
use std::collections::hash_map::DefaultHasher;
|
||||||
use std::hash::Hasher;
|
use std::hash::Hasher;
|
||||||
|
|
||||||
|
@ -762,9 +764,9 @@ pub mod testing {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(all(test, feature = "std"))]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use alloc::string::{String, ToString};
|
||||||
use rand::SeedableRng;
|
use rand::SeedableRng;
|
||||||
use rand_chacha::ChaChaRng;
|
use rand_chacha::ChaChaRng;
|
||||||
|
|
||||||
|
|
|
@ -44,13 +44,21 @@
|
||||||
//! context `ommers` refers to the node's ommer, plus each ancestor's ommer.
|
//! context `ommers` refers to the node's ommer, plus each ancestor's ommer.
|
||||||
|
|
||||||
#![cfg_attr(docsrs, feature(doc_cfg))]
|
#![cfg_attr(docsrs, feature(doc_cfg))]
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
extern crate std;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate alloc;
|
||||||
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
|
use core::cmp::Ordering;
|
||||||
|
use core::convert::{TryFrom, TryInto};
|
||||||
|
use core::fmt;
|
||||||
|
use core::num::TryFromIntError;
|
||||||
|
use core::ops::{Add, AddAssign, Range, Sub};
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use std::cmp::Ordering;
|
|
||||||
use std::convert::{TryFrom, TryInto};
|
|
||||||
use std::fmt;
|
|
||||||
use std::num::TryFromIntError;
|
|
||||||
use std::ops::{Add, AddAssign, Range, Sub};
|
|
||||||
|
|
||||||
pub mod frontier;
|
pub mod frontier;
|
||||||
|
|
||||||
|
@ -445,7 +453,7 @@ impl Address {
|
||||||
let level_delta = (u64::BITS - index_delta.leading_zeros()) as u8;
|
let level_delta = (u64::BITS - index_delta.leading_zeros()) as u8;
|
||||||
Address {
|
Address {
|
||||||
level: higher.level + level_delta,
|
level: higher.level + level_delta,
|
||||||
index: std::cmp::max(higher.index, lower_ancestor_idx) >> level_delta,
|
index: core::cmp::max(higher.index, lower_ancestor_idx) >> level_delta,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -672,12 +680,14 @@ pub trait Hashable: fmt::Debug {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub(crate) mod tests {
|
pub(crate) mod tests {
|
||||||
use crate::MerklePath;
|
use alloc::string::{String, ToString};
|
||||||
|
use alloc::vec::Vec;
|
||||||
use super::{Address, Level, Position, Source};
|
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
use either::Either;
|
use either::Either;
|
||||||
|
|
||||||
|
use super::{Address, Level, Position, Source};
|
||||||
|
use crate::MerklePath;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn position_is_complete_subtree() {
|
fn position_is_complete_subtree() {
|
||||||
assert!(Position(0).is_complete_subtree(Level(0)));
|
assert!(Position(0).is_complete_subtree(Level(0)));
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::{Hashable, Level};
|
use crate::{Hashable, Level};
|
||||||
|
use alloc::string::{String, ToString};
|
||||||
|
|
||||||
/// A possibly-empty incremental Merkle frontier.
|
/// A possibly-empty incremental Merkle frontier.
|
||||||
pub trait Frontier<H> {
|
pub trait Frontier<H> {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::convert::TryInto;
|
use alloc::vec::Vec;
|
||||||
use std::iter::repeat;
|
use core::convert::TryInto;
|
||||||
|
use core::iter::repeat;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
frontier::{CommitmentTree, PathFiller},
|
frontier::{CommitmentTree, PathFiller},
|
||||||
|
@ -241,7 +242,10 @@ impl<H: Hashable + Clone, const DEPTH: u8> IncrementalWitness<H, DEPTH> {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use alloc::string::{String, ToString};
|
||||||
|
|
||||||
use crate::{frontier::CommitmentTree, witness::IncrementalWitness, Position};
|
use crate::{frontier::CommitmentTree, witness::IncrementalWitness, Position};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn witness_tip_position() {
|
fn witness_tip_position() {
|
||||||
let mut base_tree = CommitmentTree::<String, 6>::empty();
|
let mut base_tree = CommitmentTree::<String, 6>::empty();
|
||||||
|
|
Loading…
Reference in New Issue