join_split.rs 1.32 KiB
Newer Older
use std::io;
use hex::{ToHex, FromHex};
use hash::{H256, H512};
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
use ser::{Error, Serializable, Deserializable, Stream, Reader, FixedArray_H256_2,
	FixedArray_u8_296, FixedArray_u8_601_2};

#[derive(Debug, PartialEq, Default, Clone)]
pub struct JointSplit {
	pub descriptions: Vec<JointSplitDescription>,
	pub pubkey: H256,
	pub sig: H512,
}

#[derive(Debug, PartialEq, Default, Clone, Serializable, Deserializable)]
pub struct JointSplitDescription {
	pub value_pub_old: u64,
	pub value_pub_new: u64,
	pub anchor: H256,
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
	pub nullifiers: FixedArray_H256_2,
	pub commitments: FixedArray_H256_2,
	pub ephemeral_key: H256,
	pub random_seed: H256,
Svyatoslav Nikolsky's avatar
Svyatoslav Nikolsky committed
	pub macs: FixedArray_H256_2,
	pub zkproof: FixedArray_u8_296,
	pub ciphertexts: FixedArray_u8_601_2,
}

pub fn serialize_joint_split(stream: &mut Stream, joint_split: &Option<JointSplit>) {
	if let &Some(ref joint_split) = joint_split {
		stream.append_list(&joint_split.descriptions)
			.append(&joint_split.pubkey)
			.append(&joint_split.sig);
	}
}

pub fn deserialize_joint_split<T>(reader: &mut Reader<T>) -> Result<Option<JointSplit>, Error> where T: io::Read {
	let descriptions: Vec<JointSplitDescription> = reader.read_list()?;
	if descriptions.is_empty() {
		return Ok(None);
	}

	let pubkey = reader.read()?;
	let sig = reader.read()?;

	Ok(Some(JointSplit {
		descriptions,
		pubkey,
		sig,
	}))
}