1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
use core::fmt;
use miden_crypto::{hash::rpo::RpoDigest, Felt};
use crate::OPCODE_DYN;
// DYN NODE
// ================================================================================================
/// A Dyn node specifies that the node to be executed next is defined dynamically via the stack.
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct DynNode;
/// Constants
impl DynNode {
/// The domain of the Dyn block (used for control block hashing).
pub const DOMAIN: Felt = Felt::new(OPCODE_DYN as u64);
}
/// Public accessors
impl DynNode {
/// Returns a commitment to a Dyn node.
///
/// The commitment is computed by hashing two empty words ([ZERO; 4]) in the domain defined
/// by [Self::DOMAIN], i.e.:
///
/// ```
/// # use miden_core::mast::DynNode;
/// # use miden_crypto::{hash::rpo::{RpoDigest as Digest, Rpo256 as Hasher}};
/// Hasher::merge_in_domain(&[Digest::default(), Digest::default()], DynNode::DOMAIN);
/// ```
pub fn digest(&self) -> RpoDigest {
RpoDigest::new([
Felt::new(8115106948140260551),
Felt::new(13491227816952616836),
Felt::new(15015806788322198710),
Felt::new(16575543461540527115),
])
}
}
// PRETTY PRINTING
// ================================================================================================
impl crate::prettier::PrettyPrint for DynNode {
fn render(&self) -> crate::prettier::Document {
use crate::prettier::*;
const_text("dyn")
}
}
impl fmt::Display for DynNode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use miden_formatting::prettier::PrettyPrint;
self.pretty_print(f)
}
}
// TESTS
// ================================================================================================
#[cfg(test)]
mod tests {
use miden_crypto::hash::rpo::Rpo256;
use super::*;
/// Ensures that the hash of `DynNode` is indeed the hash of 2 empty words, in the `DynNode`
/// domain.
#[test]
pub fn test_dyn_node_digest() {
assert_eq!(
DynNode.digest(),
Rpo256::merge_in_domain(&[RpoDigest::default(), RpoDigest::default()], DynNode::DOMAIN)
);
}
}