use alloc::vec::Vec;
use miden_core::program::Kernel;
use crate::batch::{BatchId, ProposedBatch};
use crate::utils::serde::Deserializable;
use crate::utils::sync::LazyLock;
use crate::vm::{AdviceInputs, Package, Program, ProgramInfo, StackInputs};
use crate::{Felt, Word};
static KERNEL_MAIN: LazyLock<Program> = LazyLock::new(|| {
let bytes = include_bytes!(concat!(
env!("OUT_DIR"),
"/assets/kernels/miden-batch-kernel:miden-batch-kernel.masp"
));
Package::read_from_bytes(bytes)
.expect("failed to deserialize batch kernel package")
.try_into_program()
.expect("batch kernel package should contain a program")
});
pub struct BatchKernel;
impl BatchKernel {
pub fn main() -> Program {
KERNEL_MAIN.clone()
}
pub fn program_info() -> ProgramInfo {
ProgramInfo::new(Self::main().hash(), Kernel::default())
}
pub fn prepare_inputs(proposed_batch: &ProposedBatch) -> (StackInputs, AdviceInputs) {
let block_commitment = proposed_batch.reference_block_header().commitment();
let batch_id = proposed_batch.id();
let stack_inputs = Self::build_input_stack(block_commitment, batch_id);
let advice_inputs = Self::build_advice_inputs(proposed_batch);
(stack_inputs, advice_inputs)
}
pub fn build_input_stack(block_commitment: Word, batch_id: BatchId) -> StackInputs {
let mut inputs: Vec<Felt> = Vec::with_capacity(8);
inputs.extend_from_slice(block_commitment.as_elements());
inputs.extend_from_slice(batch_id.as_word().as_elements());
StackInputs::new(&inputs).expect("number of stack inputs should be <= 16")
}
fn build_advice_inputs(_proposed_batch: &ProposedBatch) -> AdviceInputs {
AdviceInputs::default()
}
}