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>
impl<'a> SerializedMastForest<'a>
Sourcepub fn new(
bytes: &'a [u8],
) -> Result<SerializedMastForest<'a>, DeserializationError>
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/DebugInfopayloads - 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);Sourcepub fn node_count(&self) -> usize
pub fn node_count(&self) -> usize
Returns the number of nodes in the serialized forest.
Sourcepub fn is_hashless(&self) -> bool
pub fn is_hashless(&self) -> bool
Returns true when the wire header says that the internal-hash section is omitted.
Sourcepub fn is_stripped(&self) -> bool
pub fn is_stripped(&self) -> bool
Returns true when the wire header says that the DebugInfo section is omitted.
Sourcepub fn procedure_root_count(&self) -> usize
pub fn procedure_root_count(&self) -> usize
Returns the number of procedure roots in the serialized forest.
Sourcepub fn procedure_root_at(
&self,
index: usize,
) -> Result<MastNodeId, DeserializationError>
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().
Sourcepub fn node_info_at(
&self,
index: usize,
) -> Result<MastNodeInfo, DeserializationError>
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());Sourcepub fn node_entry_at(
&self,
index: usize,
) -> Result<MastNodeEntry, DeserializationError>
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().
Sourcepub fn node_digest_at(&self, index: usize) -> Result<Word, DeserializationError>
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(), andprocedure_root_at()stay cheap and structural- the first
node_digest_at()/node_info_at()call doesO(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>
impl<'a> Debug for SerializedMastForest<'a>
Source§impl MastForestView for SerializedMastForest<'_>
impl MastForestView for SerializedMastForest<'_>
Source§fn node_count(&self) -> usize
fn node_count(&self) -> usize
Source§fn node_entry_at(
&self,
index: usize,
) -> Result<MastNodeEntry, DeserializationError>
fn node_entry_at( &self, index: usize, ) -> Result<MastNodeEntry, DeserializationError>
Source§fn node_digest_at(&self, index: usize) -> Result<Word, DeserializationError>
fn node_digest_at(&self, index: usize) -> Result<Word, DeserializationError>
Source§fn procedure_root_count(&self) -> usize
fn procedure_root_count(&self) -> usize
Source§fn procedure_root_at(
&self,
index: usize,
) -> Result<MastNodeId, DeserializationError>
fn procedure_root_at( &self, index: usize, ) -> Result<MastNodeId, DeserializationError>
Source§fn node_info_at(
&self,
index: usize,
) -> Result<MastNodeInfo, DeserializationError>
fn node_info_at( &self, index: usize, ) -> Result<MastNodeInfo, DeserializationError>
Source§fn all_node_infos(&self) -> Result<Vec<MastNodeInfo>, DeserializationError>
fn all_node_infos(&self) -> Result<Vec<MastNodeInfo>, DeserializationError>
Source§fn procedure_roots(&self) -> Result<Vec<MastNodeId>, DeserializationError>
fn procedure_roots(&self) -> Result<Vec<MastNodeId>, DeserializationError>
Auto Trait Implementations§
impl<'a> !Freeze for SerializedMastForest<'a>
impl<'a> RefUnwindSafe for SerializedMastForest<'a>
impl<'a> Send for SerializedMastForest<'a>
impl<'a> Sync for SerializedMastForest<'a>
impl<'a> Unpin for SerializedMastForest<'a>
impl<'a> UnsafeUnpin for SerializedMastForest<'a>
impl<'a> UnwindSafe for SerializedMastForest<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more