miden_lib/transaction/procedures/
mod.rs

1use alloc::vec::Vec;
2
3use kernel_v0::KERNEL0_PROCEDURES;
4use miden_objects::{Felt, Hasher, Word};
5
6use super::TransactionKernel;
7
8// Include kernel v0 procedure roots generated in build.rs
9#[rustfmt::skip]
10mod kernel_v0;
11
12// TRANSACTION KERNEL
13// ================================================================================================
14
15impl TransactionKernel {
16    // CONSTANTS
17    // --------------------------------------------------------------------------------------------
18
19    /// Number of currently used kernel versions.
20    pub const NUM_VERSIONS: usize = 1;
21
22    /// Array of all available kernels.
23    pub const PROCEDURES: [&'static [Word]; Self::NUM_VERSIONS] = [&KERNEL0_PROCEDURES];
24
25    // PUBLIC ACCESSORS
26    // --------------------------------------------------------------------------------------------
27
28    /// Returns procedures of the kernel specified by the `kernel_version` as vector of Felts.
29    pub fn procedures_as_elements(kernel_version: u8) -> Vec<Felt> {
30        Word::words_as_elements(
31            Self::PROCEDURES
32                .get(kernel_version as usize)
33                .expect("provided kernel index is out of bounds"),
34        )
35        .to_vec()
36    }
37
38    /// Computes the accumulative hash of all procedures of the kernel specified by the
39    /// `kernel_version`.
40    pub fn commitment(kernel_version: u8) -> Word {
41        Hasher::hash_elements(&Self::procedures_as_elements(kernel_version))
42    }
43
44    /// Computes a hash from all kernel commitments.
45    pub fn kernel_commitment() -> Word {
46        Hasher::hash_elements(&[Self::commitment(0).as_elements()].concat())
47    }
48}