Change extension_id and mode types to u32

This commit is contained in:
Kris Nuttycombe 2020-06-03 20:38:05 -06:00
parent 4edbd26d7f
commit 294aa86195
5 changed files with 61 additions and 48 deletions

View File

@ -13,12 +13,12 @@ pub enum ExtensionId {
Demo,
}
pub struct InvalidExtId(usize);
pub struct InvalidExtId(u32);
impl TryFrom<usize> for ExtensionId {
impl TryFrom<u32> for ExtensionId {
type Error = InvalidExtId;
fn try_from(t: usize) -> Result<Self, Self::Error> {
fn try_from(t: u32) -> Result<Self, Self::Error> {
match t {
0 => Ok(ExtensionId::Demo),
n => Err(InvalidExtId(n)),
@ -26,8 +26,8 @@ impl TryFrom<usize> for ExtensionId {
}
}
impl From<ExtensionId> for usize {
fn from(type_id: ExtensionId) -> usize {
impl From<ExtensionId> for u32 {
fn from(type_id: ExtensionId) -> u32 {
match type_id {
ExtensionId::Demo => 0,
}

View File

@ -29,7 +29,7 @@ use zcash_primitives::{
};
mod open {
pub const MODE: usize = 0;
pub const MODE: u32 = 0;
#[derive(Debug, PartialEq)]
pub struct Precondition(pub [u8; 32]);
@ -39,7 +39,7 @@ mod open {
}
mod close {
pub const MODE: usize = 1;
pub const MODE: u32 = 1;
#[derive(Debug, PartialEq)]
pub struct Precondition(pub [u8; 32]);
@ -67,7 +67,7 @@ impl Precondition {
#[derive(Debug, PartialEq)]
pub enum Error {
IllegalPayloadLength(usize),
ModeInvalid(usize),
ModeInvalid(u32),
NonTzeTxn,
HashMismatch, // include hashes?
ModeMismatch,
@ -89,10 +89,10 @@ impl fmt::Display for Error {
}
}
impl TryFrom<(usize, Precondition)> for Precondition {
impl TryFrom<(u32, Precondition)> for Precondition {
type Error = Error;
fn try_from(from: (usize, Self)) -> Result<Self, Self::Error> {
fn try_from(from: (u32, Self)) -> Result<Self, Self::Error> {
match from {
(open::MODE, Precondition::Open(p)) => Ok(Precondition::Open(p)),
(close::MODE, Precondition::Close(p)) => Ok(Precondition::Close(p)),
@ -104,7 +104,7 @@ impl TryFrom<(usize, Precondition)> for Precondition {
impl FromPayload for Precondition {
type Error = Error;
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Self::Error> {
fn from_payload(mode: u32, payload: &[u8]) -> Result<Self, Self::Error> {
match mode {
open::MODE => {
if payload.len() == 32 {
@ -130,7 +130,7 @@ impl FromPayload for Precondition {
}
impl ToPayload for Precondition {
fn to_payload(&self) -> (usize, Vec<u8>) {
fn to_payload(&self) -> (u32, Vec<u8>) {
match self {
Precondition::Open(p) => (open::MODE, p.0.to_vec()),
Precondition::Close(p) => (close::MODE, p.0.to_vec()),
@ -154,10 +154,10 @@ impl Witness {
}
}
impl TryFrom<(usize, Witness)> for Witness {
impl TryFrom<(u32, Witness)> for Witness {
type Error = Error;
fn try_from(from: (usize, Self)) -> Result<Self, Self::Error> {
fn try_from(from: (u32, Self)) -> Result<Self, Self::Error> {
match from {
(open::MODE, Witness::Open(p)) => Ok(Witness::Open(p)),
(close::MODE, Witness::Close(p)) => Ok(Witness::Close(p)),
@ -169,7 +169,7 @@ impl TryFrom<(usize, Witness)> for Witness {
impl FromPayload for Witness {
type Error = Error;
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Self::Error> {
fn from_payload(mode: u32, payload: &[u8]) -> Result<Self, Self::Error> {
match mode {
open::MODE => {
if payload.len() == 32 {
@ -195,7 +195,7 @@ impl FromPayload for Witness {
}
impl ToPayload for Witness {
fn to_payload(&self) -> (usize, Vec<u8>) {
fn to_payload(&self) -> (u32, Vec<u8>) {
match self {
Witness::Open(w) => (open::MODE, w.0.to_vec()),
Witness::Close(w) => (close::MODE, w.0.to_vec()),
@ -306,7 +306,7 @@ fn builder_hashes(preimage_1: &[u8; 32], preimage_2: &[u8; 32]) -> ([u8; 32], [u
pub struct DemoBuilder<B> {
pub txn_builder: B,
pub extension_id: usize,
pub extension_id: u32,
}
#[derive(Debug)]
@ -669,10 +669,7 @@ mod tests {
txn_builder: &mut builder_b,
extension_id: 0,
};
let prevout_a = (
OutPoint::new(tx_a.txid().0, 0),
tx_a.tze_outputs[0].clone(),
);
let prevout_a = (OutPoint::new(tx_a.txid().0, 0), tx_a.tze_outputs[0].clone());
let value_xfr = Amount::from_u64(90000).unwrap();
db_b.demo_transfer_to_close(prevout_a, value_xfr, preimage_1, preimage_2)
.map_err(|e| format!("transfer failure: {:?}", e))
@ -691,10 +688,7 @@ mod tests {
txn_builder: &mut builder_c,
extension_id: 0,
};
let prevout_b = (
OutPoint::new(tx_a.txid().0, 0),
tx_b.tze_outputs[0].clone(),
);
let prevout_b = (OutPoint::new(tx_a.txid().0, 0), tx_b.tze_outputs[0].clone());
db_c.demo_close(prevout_b, preimage_2)
.map_err(|e| format!("close failure: {:?}", e))
.unwrap();

View File

@ -7,24 +7,24 @@ pub trait FromPayload: Sized {
type Error;
/// Parses an extension type from a mode and payload.
fn from_payload(mode: usize, payload: &[u8]) -> Result<Self, Self::Error>;
fn from_payload(mode: u32, payload: &[u8]) -> Result<Self, Self::Error>;
}
pub trait ToPayload {
/// Returns a serialized payload and its corresponding mode.
fn to_payload(&self) -> (usize, Vec<u8>);
fn to_payload(&self) -> (u32, Vec<u8>);
}
/// A condition that can be used to encumber transparent funds.
#[derive(Clone, Debug)]
pub struct Precondition {
pub extension_id: usize,
pub mode: usize,
pub extension_id: u32,
pub mode: u32,
pub payload: Vec<u8>,
}
impl Precondition {
pub fn from<P: ToPayload>(extension_id: usize, value: &P) -> Precondition {
pub fn from<P: ToPayload>(extension_id: u32, value: &P) -> Precondition {
let (mode, payload) = value.to_payload();
Precondition {
extension_id,
@ -42,13 +42,13 @@ impl Precondition {
/// spent.
#[derive(Clone, Debug)]
pub struct Witness {
pub extension_id: usize,
pub mode: usize,
pub extension_id: u32,
pub mode: u32,
pub payload: Vec<u8>,
}
impl Witness {
pub fn from<P: ToPayload>(extension_id: usize, value: &P) -> Witness {
pub fn from<P: ToPayload>(extension_id: u32, value: &P) -> Witness {
let (mode, payload) = value.to_payload();
Witness {
extension_id,
@ -60,8 +60,8 @@ impl Witness {
#[derive(Debug, PartialEq)]
pub enum Error<E> {
InvalidForEpoch(u32, usize),
InvalidExtensionId(usize),
InvalidForEpoch(u32, u32),
InvalidExtensionId(u32),
ProgramError(E),
}
@ -125,7 +125,7 @@ pub trait ExtensionTxBuilder<'a> {
fn add_tze_input<WBuilder, W: ToPayload>(
&mut self,
extension_id: usize,
extension_id: u32,
prevout: (OutPoint, TzeOut),
witness_builder: WBuilder,
) -> Result<(), Self::BuildError>
@ -134,7 +134,7 @@ pub trait ExtensionTxBuilder<'a> {
fn add_tze_output<P: ToPayload>(
&mut self,
extension_id: usize,
extension_id: u32,
value: Amount,
guarded_by: &P,
) -> Result<(), Self::BuildError>;

View File

@ -281,7 +281,7 @@ impl<'a, BuildCtx> TzeInputs<'a, BuildCtx> {
fn push<WBuilder, W: ToPayload>(
&mut self,
extension_id: usize,
extension_id: u32,
prevout: (OutPoint, TzeOut),
builder: WBuilder,
) where
@ -790,7 +790,7 @@ impl<'a, P: consensus::Parameters, R: RngCore + CryptoRng> ExtensionTxBuilder<'a
fn add_tze_input<WBuilder, W: ToPayload>(
&mut self,
extension_id: usize,
extension_id: u32,
prevout: (OutPoint, TzeOut),
witness_builder: WBuilder,
) -> Result<(), Self::BuildError>
@ -803,7 +803,7 @@ impl<'a, P: consensus::Parameters, R: RngCore + CryptoRng> ExtensionTxBuilder<'a
fn add_tze_output<G: ToPayload>(
&mut self,
extension_id: usize,
extension_id: u32,
value: Amount,
guarded_by: &G,
) -> Result<(), Self::BuildError> {

View File

@ -1,8 +1,11 @@
//! Structs representing the components within Zcash transactions.
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use ff::PrimeField;
use group::GroupEncoding;
use std::convert::TryFrom;
use std::io::{self, Read, Write};
use crate::extensions::transparent as tze;
@ -124,6 +127,10 @@ pub struct TzeIn {
pub witness: tze::Witness,
}
fn to_io_error(_: std::num::TryFromIntError) -> io::Error {
io::Error::new(io::ErrorKind::InvalidData, "value out of range")
}
impl TzeIn {
pub fn read<R: Read>(mut reader: &mut R) -> io::Result<Self> {
let prevout = OutPoint::read(&mut reader)?;
@ -135,8 +142,8 @@ impl TzeIn {
Ok(TzeIn {
prevout,
witness: tze::Witness {
extension_id,
mode,
extension_id: u32::try_from(extension_id).map_err(|e| to_io_error(e))?,
mode: u32::try_from(mode).map_err(|e| to_io_error(e))?,
payload,
},
})
@ -145,8 +152,14 @@ impl TzeIn {
pub fn write<W: Write>(&self, mut writer: W) -> io::Result<()> {
self.prevout.write(&mut writer)?;
CompactSize::write(&mut writer, self.witness.extension_id)?;
CompactSize::write(&mut writer, self.witness.mode)?;
CompactSize::write(
&mut writer,
usize::try_from(self.witness.extension_id).map_err(|e| to_io_error(e))?,
)?;
CompactSize::write(
&mut writer,
usize::try_from(self.witness.mode).map_err(|e| to_io_error(e))?,
)?;
Vector::write(&mut writer, &self.witness.payload, |w, b| w.write_u8(*b))
}
}
@ -173,8 +186,8 @@ impl TzeOut {
Ok(TzeOut {
value,
precondition: tze::Precondition {
extension_id,
mode,
extension_id: u32::try_from(extension_id).map_err(|e| to_io_error(e))?,
mode: u32::try_from(mode).map_err(|e| to_io_error(e))?,
payload,
},
})
@ -183,8 +196,14 @@ impl TzeOut {
pub fn write<W: Write>(&self, mut writer: W) -> io::Result<()> {
writer.write_all(&self.value.to_i64_le_bytes())?;
CompactSize::write(&mut writer, self.precondition.extension_id)?;
CompactSize::write(&mut writer, self.precondition.mode)?;
CompactSize::write(
&mut writer,
usize::try_from(self.precondition.extension_id).map_err(|e| to_io_error(e))?,
)?;
CompactSize::write(
&mut writer,
usize::try_from(self.precondition.mode).map_err(|e| to_io_error(e))?,
)?;
Vector::write(&mut writer, &self.precondition.payload, |w, b| {
w.write_u8(*b)
})