phoenix_core/
transaction.rsextern crate alloc;
use alloc::vec::Vec;
#[cfg(feature = "rkyv-impl")]
use rkyv::{Archive, Deserialize, Serialize};
use dusk_bls12_381::BlsScalar;
use dusk_bytes::{DeserializableSlice, Error as BytesError, Serializable};
use crate::{Note, OUTPUT_NOTES};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(
feature = "rkyv-impl",
derive(Archive, Serialize, Deserialize),
archive_attr(derive(bytecheck::CheckBytes))
)]
pub struct TxSkeleton {
pub root: BlsScalar,
pub nullifiers: Vec<BlsScalar>,
pub outputs: [Note; OUTPUT_NOTES],
pub max_fee: u64,
pub deposit: u64,
}
impl TxSkeleton {
#[must_use]
pub fn to_hash_input_bytes(&self) -> Vec<u8> {
let mut bytes = Vec::new();
bytes.extend(self.root.to_bytes());
for nullifier in &self.nullifiers {
bytes.extend(nullifier.to_bytes());
}
for note in &self.outputs {
bytes.extend(note.to_bytes());
}
bytes.extend(self.max_fee.to_bytes());
bytes.extend(self.deposit.to_bytes());
bytes
}
#[allow(unused_must_use)]
pub fn to_var_bytes(&self) -> Vec<u8> {
let mut bytes = Vec::new();
bytes.extend(self.root.to_bytes());
let num_nullifiers = self.nullifiers.len() as u64;
bytes.extend(num_nullifiers.to_bytes());
self.nullifiers.iter().for_each(|nullifier| {
bytes.extend(nullifier.to_bytes());
});
self.outputs.iter().for_each(|note| {
bytes.extend(note.to_bytes());
});
bytes.extend(self.max_fee.to_bytes());
bytes.extend(self.deposit.to_bytes());
bytes
}
pub fn from_slice(buf: &[u8]) -> Result<Self, BytesError> {
let mut buffer = buf;
let root = BlsScalar::from_reader(&mut buffer)?;
let num_nullifiers = u64::from_reader(&mut buffer)?;
let mut nullifiers = Vec::with_capacity(num_nullifiers as usize);
for _ in 0..num_nullifiers {
nullifiers.push(BlsScalar::from_reader(&mut buffer)?);
}
let mut outputs = Vec::with_capacity(OUTPUT_NOTES);
for _ in 0..OUTPUT_NOTES {
outputs.push(Note::from_reader(&mut buffer)?);
}
let outputs: [Note; OUTPUT_NOTES] =
outputs.try_into().map_err(|_| BytesError::InvalidData)?;
let max_fee = u64::from_reader(&mut buffer)?;
let deposit = u64::from_reader(&mut buffer)?;
Ok(Self {
root,
nullifiers,
outputs,
max_fee,
deposit,
})
}
pub fn nullifiers(&self) -> &[BlsScalar] {
&self.nullifiers
}
pub fn outputs(&self) -> &[Note] {
&self.outputs
}
pub fn max_fee(&self) -> u64 {
self.max_fee
}
pub fn deposit(&self) -> u64 {
self.deposit
}
}