Merge branch 'non-consensus-changes-on-branchid-c4cd541e' into merge-non-consensus-changes-2

This commit is contained in:
Jack Grigg 2022-02-28 20:46:55 +00:00
commit eb7a9668aa
13 changed files with 41 additions and 53 deletions

View File

@ -16,7 +16,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
override: true override: true
- name: Run benchmark - name: Run benchmark
run: cargo bench -- --output-format bencher | tee output.txt run: cargo bench -- --output-format bencher | tee output.txt

View File

@ -14,7 +14,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
override: true override: true
- name: Run tests - name: Run tests
uses: actions-rs/cargo@v1 uses: actions-rs/cargo@v1
@ -30,7 +30,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
override: true override: true
# Build benchmarks to prevent bitrot # Build benchmarks to prevent bitrot
- name: Build benchmarks - name: Build benchmarks
@ -46,7 +46,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
override: true override: true
- name: Setup mdBook - name: Setup mdBook
uses: peaceiris/actions-mdbook@v1 uses: peaceiris/actions-mdbook@v1
@ -89,7 +89,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
override: true override: true
- name: cargo fetch - name: cargo fetch
uses: actions-rs/cargo@v1 uses: actions-rs/cargo@v1
@ -112,7 +112,7 @@ jobs:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
override: true override: true
- run: rustup component add rustfmt - run: rustup component add rustfmt
- uses: actions-rs/cargo@v1 - uses: actions-rs/cargo@v1

View File

@ -5,19 +5,19 @@ on: pull_request
jobs: jobs:
clippy: clippy:
name: Clippy (1.54.0) name: Clippy (1.56.1)
timeout-minutes: 30 timeout-minutes: 30
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1 - uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.54.0 toolchain: 1.56.1
components: clippy components: clippy
override: true override: true
- name: Run Clippy - name: Run Clippy
uses: actions-rs/clippy-check@v1 uses: actions-rs/clippy-check@v1
with: with:
name: Clippy (1.54.0) name: Clippy (1.56.1)
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
args: --all-features --all-targets -- -D warnings args: --all-features --all-targets -- -D warnings

View File

@ -40,3 +40,6 @@ and this project adheres to Rust's notion of
## [0.1.0-beta.1] - 2021-12-17 ## [0.1.0-beta.1] - 2021-12-17
Initial release! Initial release!
## [Removed]
- The `std::hash::Hash` instance for `MerkleHashOrchard` has been removed.

View File

@ -47,6 +47,9 @@ incrementalmerkletree = "0.2"
# Developer tooling dependencies # Developer tooling dependencies
plotters = { version = "0.3.0", optional = true } plotters = { version = "0.3.0", optional = true }
[patch.crates-io]
incrementalmerkletree = { git = "https://github.com/zcash/incrementalmerkletree.git", rev = "dd57b430dee7c0b163f4035fef2280cd1935036c" }
[dev-dependencies] [dev-dependencies]
criterion = "0.3" criterion = "0.3"
halo2_gadgets = { version = "=0.1.0-beta.1", features = ["test-dependencies"] } halo2_gadgets = { version = "=0.1.0-beta.1", features = ["test-dependencies"] }

View File

@ -1 +1 @@
1.54.0 1.56.1

View File

@ -1,6 +1,7 @@
//! Logic for building Orchard components of transactions. //! Logic for building Orchard components of transactions.
use std::convert::TryFrom; use std::convert::TryFrom;
use std::fmt;
use std::iter; use std::iter;
use ff::Field; use ff::Field;
@ -363,9 +364,9 @@ impl Builder {
} }
/// Marker trait representing bundle signatures in the process of being created. /// Marker trait representing bundle signatures in the process of being created.
pub trait InProgressSignatures { pub trait InProgressSignatures: fmt::Debug {
/// The authorization type of an Orchard action in the process of being authorized. /// The authorization type of an Orchard action in the process of being authorized.
type SpendAuth; type SpendAuth: fmt::Debug;
} }
/// Marker for a bundle in the process of being built. /// Marker for a bundle in the process of being built.
@ -375,7 +376,7 @@ pub struct InProgress<P, S: InProgressSignatures> {
sigs: S, sigs: S,
} }
impl<P, S: InProgressSignatures> Authorization for InProgress<P, S> { impl<P: fmt::Debug, S: InProgressSignatures> Authorization for InProgress<P, S> {
type SpendAuth = S::SpendAuth; type SpendAuth = S::SpendAuth;
} }
@ -488,7 +489,7 @@ impl MaybeSigned {
} }
} }
impl<P, V> Bundle<InProgress<P, Unauthorized>, V> { impl<P: fmt::Debug, V> Bundle<InProgress<P, Unauthorized>, V> {
/// Loads the sighash into this bundle, preparing it for signing. /// Loads the sighash into this bundle, preparing it for signing.
/// ///
/// This API ensures that all signatures are created over the same sighash. /// This API ensures that all signatures are created over the same sighash.
@ -534,7 +535,7 @@ impl<V> Bundle<InProgress<Proof, Unauthorized>, V> {
} }
} }
impl<P, V> Bundle<InProgress<P, PartiallyAuthorized>, V> { impl<P: fmt::Debug, V> Bundle<InProgress<P, PartiallyAuthorized>, V> {
/// Signs this bundle with the given [`SpendAuthorizingKey`]. /// Signs this bundle with the given [`SpendAuthorizingKey`].
/// ///
/// This will apply signatures for all notes controlled by this spending key. /// This will apply signatures for all notes controlled by this spending key.
@ -679,9 +680,9 @@ pub mod testing {
for note in notes.iter() { for note in notes.iter() {
let leaf = MerkleHashOrchard::from_cmx(&note.commitment().into()); let leaf = MerkleHashOrchard::from_cmx(&note.commitment().into());
tree.append(&leaf); tree.append(&leaf);
tree.witness(); let (position, leaf) = tree.witness().expect("tree is not empty");
let path = tree.authentication_path(&leaf).unwrap().into(); let path = MerklePath::from((position, tree.authentication_path(position, &leaf).expect("we just witnessed the path")));
notes_and_auth_paths.push((*note, path)); notes_and_auth_paths.push((*note, path));
} }

View File

@ -3,6 +3,7 @@
pub mod commitments; pub mod commitments;
use std::convert::TryInto; use std::convert::TryInto;
use std::fmt;
use std::io; use std::io;
use blake2b_simd::Hash as Blake2bHash; use blake2b_simd::Hash as Blake2bHash;
@ -230,9 +231,9 @@ impl Flags {
} }
/// Defines the authorization type of an Orchard bundle. /// Defines the authorization type of an Orchard bundle.
pub trait Authorization { pub trait Authorization: fmt::Debug {
/// The authorization type of an Orchard action. /// The authorization type of an Orchard action.
type SpendAuth; type SpendAuth: fmt::Debug;
} }
/// A bundle of actions to be applied to the ledger. /// A bundle of actions to be applied to the ledger.

View File

@ -407,12 +407,12 @@ impl FullViewingKey {
/// Derives an internal full viewing key from a full viewing key, as specified in [ZIP32][orchardinternalfullviewingkey] /// Derives an internal full viewing key from a full viewing key, as specified in [ZIP32][orchardinternalfullviewingkey]
/// ///
/// [orchardinternalfullviewingkey]: https://zips.z.cash/zip-0032#orchard-internal-key-derivation /// [orchardinternalfullviewingkey]: https://zips.z.cash/zip-0032#orchard-internal-key-derivation
pub fn derive_internal(&self) -> Option<Self> { pub fn derive_internal(&self) -> Self {
Some(FullViewingKey { FullViewingKey {
ak: self.ak.clone(), ak: self.ak.clone(),
nk: self.nk, nk: self.nk,
rivk: self.rivk_internal(), rivk: self.rivk_internal(),
}) }
} }
} }
@ -981,7 +981,7 @@ mod tests {
let internal_rivk = fvk.rivk_internal(); let internal_rivk = fvk.rivk_internal();
assert_eq!(internal_rivk.0.to_repr(), tv.internal_rivk); assert_eq!(internal_rivk.0.to_repr(), tv.internal_rivk);
let internal_fvk = fvk.derive_internal().unwrap(); let internal_fvk = fvk.derive_internal();
assert_eq!(internal_rivk, *internal_fvk.rivk()); assert_eq!(internal_rivk, *internal_fvk.rivk());
let internal_ivk: KeyAgreementPrivateKey = (&internal_fvk).into(); let internal_ivk: KeyAgreementPrivateKey = (&internal_fvk).into();

View File

@ -11,7 +11,7 @@
// Temporary until we have more of the crate implemented. // Temporary until we have more of the crate implemented.
#![allow(dead_code)] #![allow(dead_code)]
// Catch documentation errors caused by code changes. // Catch documentation errors caused by code changes.
#![deny(broken_intra_doc_links)] #![deny(rustdoc::broken_intra_doc_links)]
#![deny(missing_debug_implementations)] #![deny(missing_debug_implementations)]
#![deny(missing_docs)] #![deny(missing_docs)]
#![deny(unsafe_code)] #![deny(unsafe_code)]

View File

@ -11,7 +11,7 @@ use crate::{
}; };
/// A unique nullifier for a note. /// 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); pub struct Nullifier(pub(crate) pallas::Base);
impl Nullifier { impl Nullifier {

View File

@ -19,7 +19,7 @@ use serde::de::{Deserializer, Error};
use serde::ser::Serializer; use serde::ser::Serializer;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::iter; use std::iter;
use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; use subtle::{Choice, ConditionallySelectable, CtOption};
// The uncommitted leaf is defined as pallas::Base(2). // The uncommitted leaf is defined as pallas::Base(2).
// <https://zips.z.cash/protocol/protocol.pdf#thmuncommittedorchard> // <https://zips.z.cash/protocol/protocol.pdf#thmuncommittedorchard>
@ -160,7 +160,7 @@ impl MerklePath {
/// A newtype wrapper for leaves and internal nodes in the Orchard /// A newtype wrapper for leaves and internal nodes in the Orchard
/// incremental note commitment tree. /// incremental note commitment tree.
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct MerkleHashOrchard(pallas::Base); pub struct MerkleHashOrchard(pallas::Base);
impl MerkleHashOrchard { impl MerkleHashOrchard {
@ -190,25 +190,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<H: std::hash::Hasher>(&self, state: &mut H) {
<Option<pallas::Base>>::from(self.0)
.map(|b| b.to_repr())
.hash(state)
}
}
impl ConditionallySelectable for MerkleHashOrchard { impl ConditionallySelectable for MerkleHashOrchard {
fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self {
MerkleHashOrchard(pallas::Base::conditional_select(&a.0, &b.0, choice)) MerkleHashOrchard(pallas::Base::conditional_select(&a.0, &b.0, choice))
@ -302,7 +283,7 @@ pub mod testing {
{ {
let cmx = MerkleHashOrchard::from_bytes(&tv.leaves[i]).unwrap(); let cmx = MerkleHashOrchard::from_bytes(&tv.leaves[i]).unwrap();
tree.append(&cmx); tree.append(&cmx);
tree.witness(); tree.witness().expect("tree is not empty");
assert_eq!(tree.root().0, pallas::Base::from_repr(tv.root).unwrap()); assert_eq!(tree.root().0, pallas::Base::from_repr(tv.root).unwrap());
@ -312,14 +293,13 @@ pub mod testing {
for j in 0..=i { for j in 0..=i {
let leaf = MerkleHashOrchard::from_bytes(&tv.leaves[j]).unwrap(); let leaf = MerkleHashOrchard::from_bytes(&tv.leaves[j]).unwrap();
assert_eq!( assert_eq!(
tree.authentication_path(&leaf), tree.authentication_path(j.try_into().unwrap(), &leaf),
Some(( Some(
j.try_into().unwrap(),
tv.paths[j] tv.paths[j]
.iter() .iter()
.map(|v| MerkleHashOrchard::from_bytes(v).unwrap()) .map(|v| MerkleHashOrchard::from_bytes(v).unwrap())
.collect() .collect()
)) )
); );
} }
} }

View File

@ -74,8 +74,8 @@ fn bundle_chain() {
let leaf = MerkleHashOrchard::from_cmx(&cmx); let leaf = MerkleHashOrchard::from_cmx(&cmx);
let mut tree = BridgeTree::<MerkleHashOrchard, 32>::new(0); let mut tree = BridgeTree::<MerkleHashOrchard, 32>::new(0);
tree.append(&leaf); tree.append(&leaf);
tree.witness(); let (position, leaf) = tree.witness().unwrap();
let (position, auth_path) = tree.authentication_path(&leaf).unwrap(); let auth_path = tree.authentication_path(position, &leaf).unwrap();
let merkle_path = MerklePath::from_parts( let merkle_path = MerklePath::from_parts(
u64::from(position).try_into().unwrap(), u64::from(position).try_into().unwrap(),
auth_path[..].try_into().unwrap(), auth_path[..].try_into().unwrap(),