use alloc::collections::BTreeMap;
use crate::account::AccountId;
use crate::block::BlockHeader;
use crate::block::account_tree::AccountWitness;
use crate::block::nullifier_tree::NullifierWitness;
use crate::note::{NoteId, NoteInclusionProof, Nullifier};
use crate::transaction::PartialBlockchain;
use crate::utils::serde::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
Serializable,
};
#[derive(Clone, Debug)]
pub struct BlockInputs {
prev_block_header: BlockHeader,
partial_blockchain: PartialBlockchain,
account_witnesses: BTreeMap<AccountId, AccountWitness>,
nullifier_witnesses: BTreeMap<Nullifier, NullifierWitness>,
unauthenticated_note_proofs: BTreeMap<NoteId, NoteInclusionProof>,
}
impl BlockInputs {
pub fn new(
prev_block_header: BlockHeader,
partial_blockchain: PartialBlockchain,
account_witnesses: BTreeMap<AccountId, AccountWitness>,
nullifier_witnesses: BTreeMap<Nullifier, NullifierWitness>,
unauthenticated_note_proofs: BTreeMap<NoteId, NoteInclusionProof>,
) -> Self {
Self {
prev_block_header,
partial_blockchain,
account_witnesses,
nullifier_witnesses,
unauthenticated_note_proofs,
}
}
pub fn prev_block_header(&self) -> &BlockHeader {
&self.prev_block_header
}
pub fn partial_blockchain(&self) -> &PartialBlockchain {
&self.partial_blockchain
}
pub fn account_witnesses(&self) -> &BTreeMap<AccountId, AccountWitness> {
&self.account_witnesses
}
pub fn nullifier_witnesses(&self) -> &BTreeMap<Nullifier, NullifierWitness> {
&self.nullifier_witnesses
}
pub fn unauthenticated_note_proofs(&self) -> &BTreeMap<NoteId, NoteInclusionProof> {
&self.unauthenticated_note_proofs
}
#[allow(clippy::type_complexity)]
pub fn into_parts(
self,
) -> (
BlockHeader,
PartialBlockchain,
BTreeMap<AccountId, AccountWitness>,
BTreeMap<Nullifier, NullifierWitness>,
BTreeMap<NoteId, NoteInclusionProof>,
) {
(
self.prev_block_header,
self.partial_blockchain,
self.account_witnesses,
self.nullifier_witnesses,
self.unauthenticated_note_proofs,
)
}
#[cfg(any(feature = "testing", test))]
pub fn partial_blockchain_mut(&mut self) -> &mut PartialBlockchain {
&mut self.partial_blockchain
}
#[cfg(any(feature = "testing", test))]
pub fn unauthenticated_note_proofs_mut(&mut self) -> &mut BTreeMap<NoteId, NoteInclusionProof> {
&mut self.unauthenticated_note_proofs
}
#[cfg(any(feature = "testing", test))]
pub fn nullifier_witnesses_mut(&mut self) -> &mut BTreeMap<Nullifier, NullifierWitness> {
&mut self.nullifier_witnesses
}
#[cfg(any(feature = "testing", test))]
pub fn account_witnesses_mut(&mut self) -> &mut BTreeMap<AccountId, AccountWitness> {
&mut self.account_witnesses
}
}
impl Serializable for BlockInputs {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
self.prev_block_header.write_into(target);
self.partial_blockchain.write_into(target);
self.account_witnesses.write_into(target);
self.nullifier_witnesses.write_into(target);
self.unauthenticated_note_proofs.write_into(target);
}
}
impl Deserializable for BlockInputs {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let prev_block_header = BlockHeader::read_from(source)?;
let partial_blockchain = PartialBlockchain::read_from(source)?;
let account_witnesses = BTreeMap::<AccountId, AccountWitness>::read_from(source)?;
let nullifier_witnesses = BTreeMap::<Nullifier, NullifierWitness>::read_from(source)?;
let unauthenticated_note_proofs =
BTreeMap::<NoteId, NoteInclusionProof>::read_from(source)?;
Ok(Self::new(
prev_block_header,
partial_blockchain,
account_witnesses,
nullifier_witnesses,
unauthenticated_note_proofs,
))
}
}