From 659c34a9540d829185397c980a23f89fb6187199 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Mon, 18 May 2020 20:27:19 -0600 Subject: [PATCH] Make error a type member of FromPayload trait rather than a type variable. Fix demo test compilation errors. --- zcash_extensions/src/transparent/demo.rs | 33 +++++++++++-------- .../src/extensions/transparent.rs | 14 +++++--- zcash_primitives/src/transaction/builder.rs | 12 +++++-- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/zcash_extensions/src/transparent/demo.rs b/zcash_extensions/src/transparent/demo.rs index 95b64c735..bff606ecf 100644 --- a/zcash_extensions/src/transparent/demo.rs +++ b/zcash_extensions/src/transparent/demo.rs @@ -18,14 +18,15 @@ //! - `tx_b`: `[ TzeIn(tx_a, preimage_1) -> TzeOut(value, hash_2) ]` //! - `tx_c`: `[ TzeIn(tx_b, preimage_2) -> [any output types...] ]` -use blake2b_simd::Params; use std::convert::TryFrom; use std::fmt; -use zcash_primitives::extensions::transparent::{ - Extension, ExtensionTxBuilder, FromPayload, ToPayload, +use blake2b_simd::Params; + +use zcash_primitives::{ + extensions::transparent::{Extension, ExtensionTxBuilder, FromPayload, ToPayload}, + transaction::components::{amount::Amount, OutPoint, TzeOut}, }; -use zcash_primitives::transaction::components::{amount::Amount, OutPoint, TzeOut}; mod open { pub const MODE: usize = 0; @@ -100,8 +101,10 @@ impl TryFrom<(usize, Precondition)> for Precondition { } } -impl FromPayload for Precondition { - fn from_payload(mode: usize, payload: &[u8]) -> Result { +impl FromPayload for Precondition { + type Error = Error; + + fn from_payload(mode: usize, payload: &[u8]) -> Result { match mode { open::MODE => { if payload.len() == 32 { @@ -163,8 +166,10 @@ impl TryFrom<(usize, Witness)> for Witness { } } -impl FromPayload for Witness { - fn from_payload(mode: usize, payload: &[u8]) -> Result { +impl FromPayload for Witness { + type Error = Error; + + fn from_payload(mode: usize, payload: &[u8]) -> Result { match mode { open::MODE => { if payload.len() == 32 { @@ -361,12 +366,14 @@ impl<'a, B: ExtensionTxBuilder<'a>> DemoBuilder<'a, B> { #[cfg(test)] mod tests { use blake2b_simd::Params; - use zcash_extensions_api::transparent::{self as tze, Extension, FromPayload, ToPayload}; use super::{close, open, Context, Precondition, Program, Witness}; - use crate::transaction::{ - components::{Amount, OutPoint, TzeIn, TzeOut}, - Transaction, TransactionData, + use zcash_primitives::{ + extensions::transparent::{self as tze, Extension, FromPayload, ToPayload}, + transaction::{ + components::{Amount, OutPoint, TzeIn, TzeOut}, + Transaction, TransactionData, + }, }; #[test] @@ -476,7 +483,7 @@ mod tests { precondition: tze::Precondition::from(0, &Precondition::open(hash_1)), }; - println!("{:x?}", precondition.payload); + // println!("{:x?}", precondition.payload); let mut mtx_a = TransactionData::nu4(); mtx_a.tze_outputs.push(out_a); diff --git a/zcash_primitives/src/extensions/transparent.rs b/zcash_primitives/src/extensions/transparent.rs index b2683518f..ee4b75d30 100644 --- a/zcash_primitives/src/extensions/transparent.rs +++ b/zcash_primitives/src/extensions/transparent.rs @@ -3,9 +3,11 @@ use crate::transaction::components::{Amount, OutPoint, TzeOut}; use std::fmt; -pub trait FromPayload: Sized { +pub trait FromPayload: Sized { + type Error; + /// Parses an extension type from a mode and payload. - fn from_payload(mode: usize, payload: &[u8]) -> Result; + fn from_payload(mode: usize, payload: &[u8]) -> Result; } pub trait ToPayload { @@ -30,6 +32,10 @@ impl Precondition { payload, } } + + pub fn try_to(&self) -> Result { + P::from_payload(self.mode, &self.payload) + } } /// Data that satisfies the precondition for prior encumbered funds, enabling them to be @@ -96,8 +102,8 @@ pub trait Extension { context: &C, ) -> Result<(), Self::Error> where - Self::P: FromPayload, - Self::W: FromPayload, + Self::P: FromPayload, + Self::W: FromPayload, { self.verify_inner( &Self::P::from_payload(precondition.mode, &precondition.payload)?, diff --git a/zcash_primitives/src/transaction/builder.rs b/zcash_primitives/src/transaction/builder.rs index eceac392c..1247d6ad5 100644 --- a/zcash_primitives/src/transaction/builder.rs +++ b/zcash_primitives/src/transaction/builder.rs @@ -275,6 +275,10 @@ struct TzeInputs<'a, BuildCtx> { } impl<'a, BuildCtx> TzeInputs<'a, BuildCtx> { + fn default() -> Self { + TzeInputs { builders: vec![] } + } + fn push( &mut self, extension_id: usize, @@ -392,7 +396,7 @@ impl<'a, P: consensus::Parameters, R: RngCore + CryptoRng> Builder<'a, P, R> { spends: vec![], outputs: vec![], transparent_inputs: TransparentInputs::default(), - tze_inputs: TzeInputs { builders: vec![] }, + tze_inputs: TzeInputs::default(), change_address: None, phantom: PhantomData, } @@ -815,7 +819,6 @@ mod tests { use rand_core::OsRng; use std::marker::PhantomData; - use super::{Builder, Error}; use crate::{ consensus, consensus::TestNetwork, @@ -828,6 +831,8 @@ mod tests { zip32::{ExtendedFullViewingKey, ExtendedSpendingKey}, }; + use super::{Builder, Error, TzeInputs}; + #[test] fn fails_on_negative_output() { let extsk = ExtendedSpendingKey::master(&[]); @@ -854,7 +859,7 @@ mod tests { TestNetwork::activation_height(NetworkUpgrade::Sapling).unwrap(); // Create a builder with 0 fee, so we can construct t outputs - let mut builder = builder::Builder:: { + let mut builder = builder::Builder::<'_, TestNetwork, OsRng> { rng: OsRng, height: sapling_activation_height, mtx: TransactionData::new(), @@ -863,6 +868,7 @@ mod tests { spends: vec![], outputs: vec![], transparent_inputs: TransparentInputs::default(), + tze_inputs: TzeInputs::default(), change_address: None, phantom: PhantomData, };