From 009e1dd37e5bebee6d58dcb8ebe6baeeee1d3c6c Mon Sep 17 00:00:00 2001 From: Deirdre Connolly Date: Sun, 14 Mar 2021 05:39:09 -0400 Subject: [PATCH] Orchard: some Action (de)serialization fixes --- zebra-chain/src/orchard/action.rs | 4 ++-- zebra-chain/src/transaction/serialize.rs | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/zebra-chain/src/orchard/action.rs b/zebra-chain/src/orchard/action.rs index 097c6531..01df0346 100644 --- a/zebra-chain/src/orchard/action.rs +++ b/zebra-chain/src/orchard/action.rs @@ -43,9 +43,9 @@ pub struct Action { impl ZcashSerialize for Action { fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { self.cv.zcash_serialize(&mut writer)?; - writer.write_32_bytes(self.nullifier.into())?; + writer.write_all(&<[u8; 32]>::from(self.nullifier)[..])?; writer.write_all(&<[u8; 32]>::from(self.rk)[..])?; - writer.write_all(self.cm_x.to_bytes())?; + writer.write_all(&<[u8; 32]>::from(self.cm_x)[..])?; self.ephemeral_key.zcash_serialize(&mut writer)?; self.enc_ciphertext.zcash_serialize(&mut writer)?; self.out_ciphertext.zcash_serialize(&mut writer)?; diff --git a/zebra-chain/src/transaction/serialize.rs b/zebra-chain/src/transaction/serialize.rs index b60d1b22..4dad887c 100644 --- a/zebra-chain/src/transaction/serialize.rs +++ b/zebra-chain/src/transaction/serialize.rs @@ -4,7 +4,7 @@ use std::{convert::TryInto, io, sync::Arc}; use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; -use halo2::pasta::pallas; +use halo2::{arithmetic::FieldExt, pasta::pallas}; use crate::{ block::MAX_BLOCK_BYTES, @@ -49,6 +49,20 @@ impl ZcashDeserialize for pallas::Scalar { } } +impl ZcashDeserialize for pallas::Base { + fn zcash_deserialize(mut reader: R) -> Result { + let possible_field_element = pallas::Base::from_bytes(&reader.read_32_bytes()?); + + if possible_field_element.is_some().into() { + Ok(possible_field_element.unwrap()) + } else { + Err(SerializationError::Parse( + "Invalid pallas::Base, input not canonical", + )) + } + } +} + impl ZcashSerialize for JoinSplitData

{ fn zcash_serialize(&self, mut writer: W) -> Result<(), io::Error> { writer.write_compactsize(self.joinsplits().count() as u64)?;