Skip to main content

SerializedMastForest

Struct SerializedMastForest 

Source
pub struct SerializedMastForest<'a> { /* private fields */ }
Expand description

A zero-copy structural view over serialized MAST forest bytes.

This view accepts full, stripped, and hashless payloads. It validates the header and the fixed-width structural sections needed for random access, but it does not fully materialize the forest.

Use this when callers need random access to roots or node metadata without deserializing the full forest. For strict trusted deserialization, use crate::mast::MastForest::read_from_bytes.

§Examples

use miden_core::{
    mast::{BasicBlockNodeBuilder, MastForest, MastForestContributor, SerializedMastForest},
    operations::Operation,
};

let mut forest = MastForest::new();
let block_id = BasicBlockNodeBuilder::new(vec![Operation::Add], Vec::new())
    .add_to_forest(&mut forest)
    .unwrap();
forest.make_root(block_id);

let mut bytes = Vec::new();
forest.write_stripped(&mut bytes);

let view = SerializedMastForest::new(&bytes).unwrap();
assert_eq!(view.node_count(), forest.nodes().len());
assert!(view.node_info_at(0).is_ok());

Implementations§

Source§

impl<'a> SerializedMastForest<'a>

Source

pub fn new( bytes: &'a [u8], ) -> Result<SerializedMastForest<'a>, DeserializationError>

Creates a new view from serialized bytes.

The input may be full, stripped, or hashless format. Structural parsing is delegated to the same single-pass scanner used by reader-based deserialization paths.

This constructor is layout-oriented: it validates the header and sections needed for node/roots/random-access metadata only. It does not validate or fully parse trailing AdviceMap / DebugInfo payloads.

Treat this as a trusted inspection API, not as an untrusted-validation entry point. It is appropriate for local tools that need random access over serialized structure, but callers handling adversarial bytes should use crate::mast::UntrustedMastForest instead.

In particular, this constructor does not protect callers from untrusted-input concerns that are enforced by crate::mast::UntrustedMastForest::validate. It does not:

  • verify that serialized non-external digests match the structure they describe
  • check topological ordering / forward-reference constraints
  • validate basic-block batch invariants or procedure-name-root consistency
  • fully parse or validate trailing AdviceMap / DebugInfo payloads
  • provide a bounded-work guarantee for hashless digest-backed inspection

For strict full-payload validation, use crate::mast::MastForest::read_from_bytes.

Wire flags describe serializer intent, not trust policy. This constructor accepts hashless payloads for inspection even though trusted crate::mast::MastForest deserialization rejects them.

Digest lookup follows the wire layout:

  • If the internal-hash section is present, non-external node digests are read from it.
  • If the internal-hash section is absent, the first digest-backed access rebuilds all non-external node digests from structure and caches them.
  • External node digests are always read from the external-digest section.
§Examples
use miden_core::{
    mast::{BasicBlockNodeBuilder, MastForest, MastForestContributor, SerializedMastForest},
    operations::Operation,
};

let mut forest = MastForest::new();
let block_id = BasicBlockNodeBuilder::new(vec![Operation::Add], Vec::new())
    .add_to_forest(&mut forest)
    .unwrap();
forest.make_root(block_id);

let mut bytes = Vec::new();
forest.write_stripped(&mut bytes);

let view = SerializedMastForest::new(&bytes).unwrap();
assert_eq!(view.node_count(), 1);
Source

pub fn node_count(&self) -> usize

Returns the number of nodes in the serialized forest.

Source

pub fn is_hashless(&self) -> bool

Returns true when the wire header says that the internal-hash section is omitted.

Source

pub fn is_stripped(&self) -> bool

Returns true when the wire header says that the DebugInfo section is omitted.

Source

pub fn procedure_root_count(&self) -> usize

Returns the number of procedure roots in the serialized forest.

Source

pub fn procedure_root_at( &self, index: usize, ) -> Result<MastNodeId, DeserializationError>

Returns the procedure root id at the specified index.

Returns an error if index >= self.procedure_root_count().

Source

pub fn node_info_at( &self, index: usize, ) -> Result<MastNodeInfo, DeserializationError>

Returns the MastNodeInfo at the specified index.

On hashless payloads, this may trigger the first digest-backed access and therefore the one-time rebuild of the non-external digest table described in Self::node_digest_at.

Returns an error if index >= self.node_count().

§Examples
use miden_core::{
    mast::{BasicBlockNodeBuilder, MastForest, MastForestContributor, SerializedMastForest},
    operations::Operation,
};

let mut forest = MastForest::new();
let block_id = BasicBlockNodeBuilder::new(vec![Operation::Add], Vec::new())
    .add_to_forest(&mut forest)
    .unwrap();
forest.make_root(block_id);

let mut bytes = Vec::new();
forest.write_stripped(&mut bytes);

let view = SerializedMastForest::new(&bytes).unwrap();
assert!(view.node_info_at(0).is_ok());
Source

pub fn node_entry_at( &self, index: usize, ) -> Result<MastNodeEntry, DeserializationError>

Returns the fixed-width structural node entry at the specified index.

Returns an error if index >= self.node_count().

Source

pub fn node_digest_at(&self, index: usize) -> Result<Word, DeserializationError>

Returns the digest for the node at the specified index.

This resolves digests lazily. If the internal-hash section is absent, the first digest-backed access rebuilds all non-external node digests and caches them.

This means the hashless cost model is:

  • node_count(), node_entry_at(), and procedure_root_at() stay cheap and structural
  • the first node_digest_at() / node_info_at() call does O(node_count) digest rebuild work and allocates the cached digest table
  • later digest lookups reuse that cache

Returns an error if index >= self.node_count().

Trait Implementations§

Source§

impl<'a> Debug for SerializedMastForest<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl MastForestView for SerializedMastForest<'_>

Source§

fn node_count(&self) -> usize

Returns the number of nodes in the forest.
Source§

fn node_entry_at( &self, index: usize, ) -> Result<MastNodeEntry, DeserializationError>

Returns fixed-width structural metadata for a node at the specified index. Read more
Source§

fn node_digest_at(&self, index: usize) -> Result<Word, DeserializationError>

Returns the digest of the node at the specified index. Read more
Source§

fn procedure_root_count(&self) -> usize

Returns the number of procedure roots in the forest.
Source§

fn procedure_root_at( &self, index: usize, ) -> Result<MastNodeId, DeserializationError>

Returns the procedure root id at the specified index. Read more
Source§

fn node_info_at( &self, index: usize, ) -> Result<MastNodeInfo, DeserializationError>

Returns serialized-equivalent metadata for a node at the specified index. Read more
Source§

fn is_empty(&self) -> bool

Returns true when the forest contains no nodes.
Source§

fn has_node(&self, index: usize) -> bool

Returns true when index is a valid node index.
Source§

fn all_node_infos(&self) -> Result<Vec<MastNodeInfo>, DeserializationError>

Returns all node infos in index order.
Source§

fn procedure_roots(&self) -> Result<Vec<MastNodeId>, DeserializationError>

Returns all procedure roots in index order.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more