diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 4830b3e4..e8e26384 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 override: true - name: Run benchmark run: cargo bench -- --output-format bencher | tee output.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c9d7a47..966cc8da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 override: true - name: Run tests uses: actions-rs/cargo@v1 @@ -30,7 +30,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 override: true # Build benchmarks to prevent bitrot - name: Build benchmarks @@ -46,7 +46,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 override: true - name: Setup mdBook uses: peaceiris/actions-mdbook@v1 @@ -89,7 +89,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 override: true - name: cargo fetch uses: actions-rs/cargo@v1 @@ -112,7 +112,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 override: true - run: rustup component add rustfmt - uses: actions-rs/cargo@v1 diff --git a/.github/workflows/lints-stable.yml b/.github/workflows/lints-stable.yml index d9d6c3e6..242041e8 100644 --- a/.github/workflows/lints-stable.yml +++ b/.github/workflows/lints-stable.yml @@ -5,19 +5,19 @@ on: pull_request jobs: clippy: - name: Clippy (1.51.0) + name: Clippy (1.56.1) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.51.0 + toolchain: 1.56.1 components: clippy override: true - name: Run Clippy uses: actions-rs/clippy-check@v1 with: - name: Clippy (1.51.0) + name: Clippy (1.56.1) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings diff --git a/CHANGELOG.md b/CHANGELOG.md index bafd9c53..03a94302 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,3 +7,6 @@ and this project adheres to Rust's notion of ## [Unreleased] Initial release! + +## [Removed] +- The `std::hash::Hash` instance for `MerkleHashOrchard` has been removed. diff --git a/Cargo.toml b/Cargo.toml index ac0265c7..b3f10ab6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,9 @@ incrementalmerkletree = "0.2" # Developer tooling dependencies plotters = { version = "0.3.0", optional = true } +[patch.crates-io] +incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree.git", rev = "23c0370b5414dc2ddd3305c6821bca5ea6fbf812" } + [dev-dependencies] criterion = "0.3" hex = "0.4" diff --git a/rust-toolchain b/rust-toolchain index ba0a7191..43c989b5 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.51.0 +1.56.1 diff --git a/src/builder.rs b/src/builder.rs index c5752ed8..c46c5481 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -672,9 +672,9 @@ pub mod testing { for note in notes.iter() { let leaf = MerkleHashOrchard::from_cmx(¬e.commitment().into()); tree.append(&leaf); - tree.witness(); + let (position, leaf) = tree.witness().unwrap(); - let path = tree.authentication_path(&leaf).unwrap().into(); + let path = MerklePath::from((position, tree.authentication_path(position, &leaf).unwrap())); notes_and_auth_paths.push((*note, path)); } diff --git a/src/lib.rs b/src/lib.rs index d0078466..b3579899 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,7 +11,7 @@ // Temporary until we have more of the crate implemented. #![allow(dead_code)] // Catch documentation errors caused by code changes. -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] #![deny(missing_debug_implementations)] #![deny(missing_docs)] #![deny(unsafe_code)] diff --git a/src/note/nullifier.rs b/src/note/nullifier.rs index a0ede6fb..800a0c74 100644 --- a/src/note/nullifier.rs +++ b/src/note/nullifier.rs @@ -11,7 +11,7 @@ use crate::{ }; /// A unique nullifier for a note. -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Nullifier(pub(crate) pallas::Base); impl Nullifier { diff --git a/src/tree.rs b/src/tree.rs index 754ccf27..73431b68 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -18,7 +18,7 @@ use serde::de::{Deserializer, Error}; use serde::ser::Serializer; use serde::{Deserialize, Serialize}; use std::iter; -use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; +use subtle::{Choice, ConditionallySelectable, CtOption}; // The uncommitted leaf is defined as pallas::Base(2). // @@ -164,7 +164,7 @@ impl MerklePath { /// can produce a bottom value which needs to be accounted for in /// the production of a Merkle root. Leaf nodes are always wrapped /// with the `Some` constructor. -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct MerkleHashOrchard(pallas::Base); impl MerkleHashOrchard { @@ -194,25 +194,6 @@ impl MerkleHashOrchard { } } -/// This instance should only be used for hash table key comparisons. -impl std::cmp::PartialEq for MerkleHashOrchard { - fn eq(&self, other: &Self) -> bool { - self.0.ct_eq(&other.0).into() - } -} - -/// This instance should only be used for hash table key comparisons. -impl std::cmp::Eq for MerkleHashOrchard {} - -/// This instance should only be used for hash table key hashing. -impl std::hash::Hash for MerkleHashOrchard { - fn hash(&self, state: &mut H) { - >::from(self.0) - .map(|b| b.to_bytes()) - .hash(state) - } -} - impl ConditionallySelectable for MerkleHashOrchard { fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { MerkleHashOrchard(pallas::Base::conditional_select(&a.0, &b.0, choice)) @@ -304,7 +285,7 @@ pub mod testing { { let cmx = MerkleHashOrchard::from_bytes(&tv.leaves[i]).unwrap(); tree.append(&cmx); - tree.witness(); + tree.witness().unwrap(); assert_eq!(tree.root().0, pallas::Base::from_bytes(&tv.root).unwrap()); @@ -314,14 +295,13 @@ pub mod testing { for j in 0..=i { let leaf = MerkleHashOrchard::from_bytes(&tv.leaves[j]).unwrap(); assert_eq!( - tree.authentication_path(&leaf), - Some(( - j.try_into().unwrap(), + tree.authentication_path(j.try_into().unwrap(), &leaf), + Some( tv.paths[j] .iter() .map(|v| MerkleHashOrchard::from_bytes(v).unwrap()) .collect() - )) + ) ); } } diff --git a/tests/builder.rs b/tests/builder.rs index 0c375da7..5c2d1f56 100644 --- a/tests/builder.rs +++ b/tests/builder.rs @@ -74,8 +74,8 @@ fn bundle_chain() { let leaf = MerkleHashOrchard::from_cmx(&cmx); let mut tree = BridgeTree::::new(0); tree.append(&leaf); - tree.witness(); - let (position, auth_path) = tree.authentication_path(&leaf).unwrap(); + let (position, leaf) = tree.witness().unwrap(); + let auth_path = tree.authentication_path(position, &leaf).unwrap(); let merkle_path = MerklePath::from_parts( u64::from(position).try_into().unwrap(), auth_path[..].try_into().unwrap(),