pub struct AdviceProvider { /* private fields */ }
Expand description
An advice provider is a component through which the host can interact with the advice provider. The host can request nondeterministic inputs from the advice provider (i.e., result of a computation performed outside of the VM), as well as insert new data into the advice provider.
An advice provider consists of the following components:
- Advice stack, which is a LIFO data structure. The processor can move the elements from the advice stack onto the operand stack, as well as push new elements onto the advice stack.
- Advice map, which is a key-value map where keys are words (4 field elements) and values are vectors of field elements. The processor can push the values from the map onto the advice stack, as well as insert new values into the map.
- Merkle store, which contains structured data reducible to Merkle paths. The VM can request Merkle paths from the store, as well as mutate it by updating or merging nodes contained in the store.
Advice data is store in-memory using BTreeMaps as its backing storage.
Implementations§
Source§impl AdviceProvider
impl AdviceProvider
Sourcepub fn apply_mutations(
&mut self,
mutations: impl IntoIterator<Item = AdviceMutation>,
) -> Result<(), AdviceError>
pub fn apply_mutations( &mut self, mutations: impl IntoIterator<Item = AdviceMutation>, ) -> Result<(), AdviceError>
Apply the mutations given in order to the AdviceProvider
.
Sourcepub fn pop_stack(&mut self) -> Result<Felt, AdviceError>
pub fn pop_stack(&mut self) -> Result<Felt, AdviceError>
Pops an element from the advice stack and returns it.
§Errors
Returns an error if the advice stack is empty.
Sourcepub fn pop_stack_word(&mut self) -> Result<Word, AdviceError>
pub fn pop_stack_word(&mut self) -> Result<Word, AdviceError>
Pops a word (4 elements) from the advice stack and returns it.
Note: a word is popped off the stack element-by-element. For example, a [d, c, b, a, ...]
stack (i.e., d
is at the top of the stack) will yield [d, c, b, a]
.
§Errors
Returns an error if the advice stack does not contain a full word.
Sourcepub fn pop_stack_dword(&mut self) -> Result<[Word; 2], AdviceError>
pub fn pop_stack_dword(&mut self) -> Result<[Word; 2], AdviceError>
Pops a double word (8 elements) from the advice stack and returns them.
Note: words are popped off the stack element-by-element. For example, a
[h, g, f, e, d, c, b, a, ...]
stack (i.e., h
is at the top of the stack) will yield
two words: [h, g, f,e ], [d, c, b, a]
.
§Errors
Returns an error if the advice stack does not contain two words.
Sourcepub fn push_stack(&mut self, value: Felt)
pub fn push_stack(&mut self, value: Felt)
Pushes a single value onto the advice stack.
Sourcepub fn push_stack_word(&mut self, word: &Word)
pub fn push_stack_word(&mut self, word: &Word)
Pushes a word (4 elements) onto the stack.
Sourcepub fn push_from_map(
&mut self,
key: Word,
include_len: bool,
) -> Result<(), AdviceError>
pub fn push_from_map( &mut self, key: Word, include_len: bool, ) -> Result<(), AdviceError>
Fetches a list of elements under the specified key from the advice map and pushes them onto the advice stack.
If include_len
is set to true, this also pushes the number of elements onto the advice
stack.
Note: this operation doesn’t consume the map element so it can be called multiple times for the same key.
§Example
Given an advice stack [a, b, c, ...]
, and a map x |-> [d, e, f]
:
A call push_stack(AdviceSource::Map { key: x, include_len: false })
will result in
advice stack: [d, e, f, a, b, c, ...]
.
A call push_stack(AdviceSource::Map { key: x, include_len: true })
will result in
advice stack: [3, d, e, f, a, b, c, ...]
.
§Errors
Returns an error if the key was not found in the key-value map.
Sourcepub fn extend_stack<I>(&mut self, iter: I)where
I: IntoIterator<Item = Felt>,
pub fn extend_stack<I>(&mut self, iter: I)where
I: IntoIterator<Item = Felt>,
Extends the stack with the given elements.
Elements are added to the top of the stack i.e. last element of this iterator is the first element popped.
Sourcepub fn contains_map_key(&self, key: &Word) -> bool
pub fn contains_map_key(&self, key: &Word) -> bool
Returns true if the key has a corresponding value in the map.
Sourcepub fn get_mapped_values(&self, key: &Word) -> Option<&[Felt]>
pub fn get_mapped_values(&self, key: &Word) -> Option<&[Felt]>
Returns a reference to the value(s) associated with the specified key in the advice map.
Sourcepub fn insert_into_map(
&mut self,
key: Word,
values: Vec<Felt>,
) -> Result<(), AdviceError>
pub fn insert_into_map( &mut self, key: Word, values: Vec<Felt>, ) -> Result<(), AdviceError>
Inserts the provided value into the advice map under the specified key.
The values in the advice map can be moved onto the advice stack by invoking the AdviceProvider::push_from_map() method.
Returns an error if the specified key is already present in the advice map.
Sourcepub fn extend_map(&mut self, other: &AdviceMap) -> Result<(), AdviceError>
pub fn extend_map(&mut self, other: &AdviceMap) -> Result<(), AdviceError>
Merges all entries from the given AdviceMap
into the current advice map.
Returns an error if any new entry already exists with the same key but a different value than the one currently stored. The current map remains unchanged.
Sourcepub fn get_tree_node(
&self,
root: Word,
depth: &Felt,
index: &Felt,
) -> Result<Word, AdviceError>
pub fn get_tree_node( &self, root: Word, depth: &Felt, index: &Felt, ) -> Result<Word, AdviceError>
Returns a node at the specified depth and index in a Merkle tree with the given root.
§Errors
Returns an error if:
- A Merkle tree for the specified root cannot be found in this advice provider.
- The specified depth is either zero or greater than the depth of the Merkle tree identified by the specified root.
- Value of the node at the specified depth and index is not known to this advice provider.
Sourcepub fn get_merkle_path(
&self,
root: Word,
depth: &Felt,
index: &Felt,
) -> Result<MerklePath, AdviceError>
pub fn get_merkle_path( &self, root: Word, depth: &Felt, index: &Felt, ) -> Result<MerklePath, AdviceError>
Returns a path to a node at the specified depth and index in a Merkle tree with the specified root.
§Errors
Returns an error if:
- A Merkle tree for the specified root cannot be found in this advice provider.
- The specified depth is either zero or greater than the depth of the Merkle tree identified by the specified root.
- Path to the node at the specified depth and index is not known to this advice provider.
Sourcepub fn update_merkle_node(
&mut self,
root: Word,
depth: &Felt,
index: &Felt,
value: Word,
) -> Result<(MerklePath, Word), AdviceError>
pub fn update_merkle_node( &mut self, root: Word, depth: &Felt, index: &Felt, value: Word, ) -> Result<(MerklePath, Word), AdviceError>
Updates a node at the specified depth and index in a Merkle tree with the specified root; returns the Merkle path from the updated node to the new root, together with the new root.
The tree is cloned prior to the update. Thus, the advice provider retains the original and the updated tree.
§Errors
Returns an error if:
- A Merkle tree for the specified root cannot be found in this advice provider.
- The specified depth is either zero or greater than the depth of the Merkle tree identified by the specified root.
- Path to the leaf at the specified index in the specified Merkle tree is not known to this advice provider.
Sourcepub fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result<Word, AdviceError>
pub fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result<Word, AdviceError>
Creates a new Merkle tree in the advice provider by combining Merkle trees with the
specified roots. The root of the new tree is defined as hash(left_root, right_root)
.
After the operation, both the original trees and the new tree remains in the advice provider (i.e., the input trees are not removed).
It is not checked whether a Merkle tree for either of the specified roots can be found in this advice provider.
Sourcepub fn has_merkle_root(&self, root: Word) -> bool
pub fn has_merkle_root(&self, root: Word) -> bool
Returns true if the Merkle root exists for the advice provider Merkle store.
Sourcepub fn extend_merkle_store<I>(&mut self, iter: I)where
I: IntoIterator<Item = InnerNodeInfo>,
pub fn extend_merkle_store<I>(&mut self, iter: I)where
I: IntoIterator<Item = InnerNodeInfo>,
Extends the MerkleStore with the given nodes.
Sourcepub fn extend_from_inputs(
&mut self,
inputs: &AdviceInputs,
) -> Result<(), AdviceError>
pub fn extend_from_inputs( &mut self, inputs: &AdviceInputs, ) -> Result<(), AdviceError>
Extends the contents of this instance with the contents of an AdviceInputs
.
Sourcepub fn into_parts(self) -> (Vec<Felt>, AdviceMap, MerkleStore)
pub fn into_parts(self) -> (Vec<Felt>, AdviceMap, MerkleStore)
Consumes self
and return its parts (stack, map, store).
Note that the order of the stack is such that the element at the top of the stack is at the end of the returned vector.
Trait Implementations§
Source§impl Clone for AdviceProvider
impl Clone for AdviceProvider
Source§fn clone(&self) -> AdviceProvider
fn clone(&self) -> AdviceProvider
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for AdviceProvider
impl Debug for AdviceProvider
Source§impl Default for AdviceProvider
impl Default for AdviceProvider
Source§fn default() -> AdviceProvider
fn default() -> AdviceProvider
Source§impl From<AdviceInputs> for AdviceProvider
impl From<AdviceInputs> for AdviceProvider
Source§fn from(inputs: AdviceInputs) -> Self
fn from(inputs: AdviceInputs) -> Self
Auto Trait Implementations§
impl Freeze for AdviceProvider
impl RefUnwindSafe for AdviceProvider
impl Send for AdviceProvider
impl Sync for AdviceProvider
impl Unpin for AdviceProvider
impl UnwindSafe for AdviceProvider
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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<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