Change extension_id and mode types to u32
This commit is contained in:
parent
4edbd26d7f
commit
294aa86195
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>;
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue