use alloc::vec::Vec;
use miden_core::program::KernelDescriptor;
use crate::block::ProposedBlock;
use crate::crypto::SequentialCommit;
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-block-kernel:miden-block-kernel.masp"
));
Package::read_from_bytes(bytes)
.expect("failed to deserialize block kernel package")
.try_into_program()
.expect("block kernel package should contain a program")
});
pub struct BlockKernel;
impl BlockKernel {
pub fn main() -> Program {
KERNEL_MAIN.clone()
}
pub fn program_info() -> ProgramInfo {
ProgramInfo::new(Self::main().hash(), KernelDescriptor::default())
}
pub fn prepare_inputs(proposed_block: &ProposedBlock) -> (StackInputs, AdviceInputs) {
let prev_block_commitment = proposed_block.prev_block_header().commitment();
let batches_commitment = proposed_block.batches().to_commitment();
let stack_inputs = Self::build_input_stack(prev_block_commitment, batches_commitment);
let advice_inputs = AdviceInputs::default();
(stack_inputs, advice_inputs)
}
pub fn build_input_stack(prev_block_commitment: Word, batches_commitment: Word) -> StackInputs {
let mut inputs: Vec<Felt> = Vec::with_capacity(8);
inputs.extend_from_slice(prev_block_commitment.as_elements());
inputs.extend_from_slice(batches_commitment.as_elements());
StackInputs::new(&inputs).expect("number of stack inputs should be <= 16")
}
}