zkevm_circuits 0.153.11

ZKsync Era circuits for EraVM
use super::*;

use crate::base_structures::vm_state::*;
use boojum::gadgets::queue::*;
use boojum::serde_utils::BigArraySerde;

#[derive(
    Derivative,
    CSAllocatable,
    CSSelectable,
    CSVarLengthEncodable,
    WitnessHookable,
    WitVarLengthEncodable,
)]
#[derivative(Clone, Debug)]
pub struct VmInputData<F: SmallField> {
    pub rollback_queue_tail_for_block: [Num<F>; QUEUE_STATE_WIDTH],
    pub memory_queue_initial_state: QueueTailState<F, FULL_SPONGE_QUEUE_STATE_WIDTH>,
    pub decommitment_queue_initial_state: QueueTailState<F, FULL_SPONGE_QUEUE_STATE_WIDTH>,
    pub per_block_context: GlobalContext<F>,
}

impl<F: SmallField> CSPlaceholder<F> for VmInputData<F> {
    fn placeholder<CS: ConstraintSystem<F>>(cs: &mut CS) -> Self {
        let zero_num = Num::zero(cs);
        let empty_tail = QueueTailState::placeholder(cs);
        let placeholder_ctx = GlobalContext::<F>::placeholder(cs);
        Self {
            rollback_queue_tail_for_block: [zero_num; QUEUE_STATE_WIDTH],
            memory_queue_initial_state: empty_tail,
            decommitment_queue_initial_state: empty_tail,
            per_block_context: placeholder_ctx,
        }
    }
}

#[derive(
    Derivative,
    CSAllocatable,
    CSSelectable,
    CSVarLengthEncodable,
    WitnessHookable,
    WitVarLengthEncodable,
)]
#[derivative(Clone, Debug)]
#[DerivePrettyComparison("true")]
pub struct VmOutputData<F: SmallField> {
    pub log_queue_final_state: QueueState<F, QUEUE_STATE_WIDTH>,
    pub memory_queue_final_state: QueueState<F, FULL_SPONGE_QUEUE_STATE_WIDTH>,
    pub decommitment_queue_final_state: QueueState<F, FULL_SPONGE_QUEUE_STATE_WIDTH>,
}

impl<F: SmallField> CSPlaceholder<F> for VmOutputData<F> {
    fn placeholder<CS: ConstraintSystem<F>>(cs: &mut CS) -> Self {
        let empty_small = QueueState::placeholder(cs);
        let empty_large = QueueState::placeholder(cs);
        Self {
            log_queue_final_state: empty_small,
            memory_queue_final_state: empty_large,
            decommitment_queue_final_state: empty_large,
        }
    }
}

use crate::base_structures::vm_state::VmLocalState;

pub type VmCircuitInputOutput<F> =
    crate::fsm_input_output::ClosedFormInput<F, VmLocalState<F>, VmInputData<F>, VmOutputData<F>>;
pub type VmCircuitInputOutputWitness<F> = crate::fsm_input_output::ClosedFormInputWitness<
    F,
    VmLocalState<F>,
    VmInputData<F>,
    VmOutputData<F>,
>;

use crate::main_vm::witness_oracle::WitnessOracle;

#[derive(Derivative, serde::Serialize, serde::Deserialize)]
#[derivative(Clone, Debug(bound = ""), Default)]
#[serde(bound = "")]
pub struct VmCircuitWitness<F: SmallField, W: WitnessOracle<F>> {
    pub closed_form_input: VmCircuitInputOutputWitness<F>,
    #[derivative(Debug = "ignore")]
    pub witness_oracle: W,
}