Make error a type member of FromPayload trait rather than a type variable.

Fix demo test compilation errors.
This commit is contained in:
Kris Nuttycombe 2020-05-18 20:27:19 -06:00
parent 961d251178
commit 659c34a954
3 changed files with 39 additions and 20 deletions

View File

@ -18,14 +18,15 @@
//! - `tx_b`: `[ TzeIn(tx_a, preimage_1) -> TzeOut(value, hash_2) ]` //! - `tx_b`: `[ TzeIn(tx_a, preimage_1) -> TzeOut(value, hash_2) ]`
//! - `tx_c`: `[ TzeIn(tx_b, preimage_2) -> [any output types...] ]` //! - `tx_c`: `[ TzeIn(tx_b, preimage_2) -> [any output types...] ]`
use blake2b_simd::Params;
use std::convert::TryFrom; use std::convert::TryFrom;
use std::fmt; use std::fmt;
use zcash_primitives::extensions::transparent::{ use blake2b_simd::Params;
Extension, ExtensionTxBuilder, FromPayload, ToPayload,
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 { mod open {
pub const MODE: usize = 0; pub const MODE: usize = 0;
@ -100,8 +101,10 @@ impl TryFrom<(usize, Precondition)> for Precondition {
} }
} }
impl FromPayload<Error> for Precondition { impl FromPayload for Precondition {
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Error> { type Error = Error;
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Self::Error> {
match mode { match mode {
open::MODE => { open::MODE => {
if payload.len() == 32 { if payload.len() == 32 {
@ -163,8 +166,10 @@ impl TryFrom<(usize, Witness)> for Witness {
} }
} }
impl FromPayload<Error> for Witness { impl FromPayload for Witness {
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Error> { type Error = Error;
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Self::Error> {
match mode { match mode {
open::MODE => { open::MODE => {
if payload.len() == 32 { if payload.len() == 32 {
@ -361,12 +366,14 @@ impl<'a, B: ExtensionTxBuilder<'a>> DemoBuilder<'a, B> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use blake2b_simd::Params; use blake2b_simd::Params;
use zcash_extensions_api::transparent::{self as tze, Extension, FromPayload, ToPayload};
use super::{close, open, Context, Precondition, Program, Witness}; use super::{close, open, Context, Precondition, Program, Witness};
use crate::transaction::{ use zcash_primitives::{
components::{Amount, OutPoint, TzeIn, TzeOut}, extensions::transparent::{self as tze, Extension, FromPayload, ToPayload},
Transaction, TransactionData, transaction::{
components::{Amount, OutPoint, TzeIn, TzeOut},
Transaction, TransactionData,
},
}; };
#[test] #[test]
@ -476,7 +483,7 @@ mod tests {
precondition: tze::Precondition::from(0, &Precondition::open(hash_1)), precondition: tze::Precondition::from(0, &Precondition::open(hash_1)),
}; };
println!("{:x?}", precondition.payload); // println!("{:x?}", precondition.payload);
let mut mtx_a = TransactionData::nu4(); let mut mtx_a = TransactionData::nu4();
mtx_a.tze_outputs.push(out_a); mtx_a.tze_outputs.push(out_a);

View File

@ -3,9 +3,11 @@
use crate::transaction::components::{Amount, OutPoint, TzeOut}; use crate::transaction::components::{Amount, OutPoint, TzeOut};
use std::fmt; use std::fmt;
pub trait FromPayload<E>: Sized { pub trait FromPayload: Sized {
type Error;
/// Parses an extension type from a mode and payload. /// Parses an extension type from a mode and payload.
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, E>; fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Self::Error>;
} }
pub trait ToPayload { pub trait ToPayload {
@ -30,6 +32,10 @@ impl Precondition {
payload, payload,
} }
} }
pub fn try_to<P: FromPayload>(&self) -> Result<P, P::Error> {
P::from_payload(self.mode, &self.payload)
}
} }
/// Data that satisfies the precondition for prior encumbered funds, enabling them to be /// Data that satisfies the precondition for prior encumbered funds, enabling them to be
@ -96,8 +102,8 @@ pub trait Extension<C> {
context: &C, context: &C,
) -> Result<(), Self::Error> ) -> Result<(), Self::Error>
where where
Self::P: FromPayload<Self::Error>, Self::P: FromPayload<Error = Self::Error>,
Self::W: FromPayload<Self::Error>, Self::W: FromPayload<Error = Self::Error>,
{ {
self.verify_inner( self.verify_inner(
&Self::P::from_payload(precondition.mode, &precondition.payload)?, &Self::P::from_payload(precondition.mode, &precondition.payload)?,

View File

@ -275,6 +275,10 @@ struct TzeInputs<'a, BuildCtx> {
} }
impl<'a, BuildCtx> TzeInputs<'a, BuildCtx> { impl<'a, BuildCtx> TzeInputs<'a, BuildCtx> {
fn default() -> Self {
TzeInputs { builders: vec![] }
}
fn push<WBuilder, W: ToPayload>( fn push<WBuilder, W: ToPayload>(
&mut self, &mut self,
extension_id: usize, extension_id: usize,
@ -392,7 +396,7 @@ impl<'a, P: consensus::Parameters, R: RngCore + CryptoRng> Builder<'a, P, R> {
spends: vec![], spends: vec![],
outputs: vec![], outputs: vec![],
transparent_inputs: TransparentInputs::default(), transparent_inputs: TransparentInputs::default(),
tze_inputs: TzeInputs { builders: vec![] }, tze_inputs: TzeInputs::default(),
change_address: None, change_address: None,
phantom: PhantomData, phantom: PhantomData,
} }
@ -815,7 +819,6 @@ mod tests {
use rand_core::OsRng; use rand_core::OsRng;
use std::marker::PhantomData; use std::marker::PhantomData;
use super::{Builder, Error};
use crate::{ use crate::{
consensus, consensus,
consensus::TestNetwork, consensus::TestNetwork,
@ -828,6 +831,8 @@ mod tests {
zip32::{ExtendedFullViewingKey, ExtendedSpendingKey}, zip32::{ExtendedFullViewingKey, ExtendedSpendingKey},
}; };
use super::{Builder, Error, TzeInputs};
#[test] #[test]
fn fails_on_negative_output() { fn fails_on_negative_output() {
let extsk = ExtendedSpendingKey::master(&[]); let extsk = ExtendedSpendingKey::master(&[]);
@ -854,7 +859,7 @@ mod tests {
TestNetwork::activation_height(NetworkUpgrade::Sapling).unwrap(); TestNetwork::activation_height(NetworkUpgrade::Sapling).unwrap();
// Create a builder with 0 fee, so we can construct t outputs // Create a builder with 0 fee, so we can construct t outputs
let mut builder = builder::Builder::<TestNetwork, OsRng> { let mut builder = builder::Builder::<'_, TestNetwork, OsRng> {
rng: OsRng, rng: OsRng,
height: sapling_activation_height, height: sapling_activation_height,
mtx: TransactionData::new(), mtx: TransactionData::new(),
@ -863,6 +868,7 @@ mod tests {
spends: vec![], spends: vec![],
outputs: vec![], outputs: vec![],
transparent_inputs: TransparentInputs::default(), transparent_inputs: TransparentInputs::default(),
tze_inputs: TzeInputs::default(),
change_address: None, change_address: None,
phantom: PhantomData, phantom: PhantomData,
}; };