use crate::Network;
use snarkvm_fields::{ConstraintFieldError, ToConstraintField};
use snarkvm_utilities::ToBytes;
use anyhow::Result;
#[derive(Clone, Debug)]
pub struct InputPublicVariables<N: Network> {
serial_number: N::SerialNumber,
input_value_commitment: N::ValueCommitment,
ledger_root: N::LedgerRoot,
local_transitions_root: N::TransactionID,
pub(super) program_id: Option<N::ProgramID>,
}
impl<N: Network> InputPublicVariables<N> {
pub(crate) fn blank() -> Self {
Self {
serial_number: Default::default(),
input_value_commitment: N::ProgramAffineCurve::default().into(),
local_transitions_root: Default::default(),
ledger_root: Default::default(),
program_id: Some(N::ProgramID::default()),
}
}
pub(crate) fn new(
serial_number: N::SerialNumber,
input_value_commitment: N::ValueCommitment,
ledger_root: N::LedgerRoot,
local_transitions_root: N::TransactionID,
program_id: Option<N::ProgramID>,
) -> Self {
Self { serial_number, input_value_commitment, ledger_root, local_transitions_root, program_id }
}
pub(crate) fn serial_number(&self) -> &N::SerialNumber {
&self.serial_number
}
pub(crate) fn input_value_commitment(&self) -> &N::ValueCommitment {
&self.input_value_commitment
}
pub(crate) fn ledger_root(&self) -> N::LedgerRoot {
self.ledger_root
}
pub(crate) fn local_transitions_root(&self) -> N::TransactionID {
self.local_transitions_root
}
}
impl<N: Network> ToConstraintField<N::InnerScalarField> for InputPublicVariables<N> {
fn to_field_elements(&self) -> Result<Vec<N::InnerScalarField>, ConstraintFieldError> {
let mut v = Vec::new();
v.extend_from_slice(&self.ledger_root.to_field_elements()?);
v.extend_from_slice(&self.local_transitions_root.to_field_elements()?);
if let Some(program_id) = &self.program_id {
v.extend_from_slice(&program_id.to_bytes_le()?.to_field_elements()?);
} else {
v.extend_from_slice(&vec![0u8; N::PROGRAM_ID_SIZE_IN_BYTES].to_field_elements()?);
}
v.extend_from_slice(&self.serial_number.to_field_elements()?);
v.extend_from_slice(&self.input_value_commitment.to_field_elements()?);
Ok(v)
}
}