Skip to content

Commit

Permalink
Merge pull request #987 from 0xPolygonMiden/frisitano-tx-result
Browse files Browse the repository at this point in the history
feat: Extend `AdviceProvider` trait
  • Loading branch information
frisitano authored Jul 4, 2023
2 parents 3aa346f + 764e8be commit 7cfaaec
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
27 changes: 27 additions & 0 deletions processor/src/advice/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use super::{ExecutionError, Felt, InputError, StarkField, Word};
use core::borrow::Borrow;
use vm_core::{
crypto::{
hash::RpoDigest,
Expand Down Expand Up @@ -100,6 +101,11 @@ pub trait AdviceProvider {
/// are replaced with the specified values.
fn insert_into_map(&mut self, key: Word, values: Vec<Felt>) -> Result<(), ExecutionError>;

// ADVICE MAP
// --------------------------------------------------------------------------------------------
/// Returns a reference to the value(s) associated with the specified key in the advice map.
fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]>;

// ADVISE SETS
// --------------------------------------------------------------------------------------------

Expand Down Expand Up @@ -177,6 +183,15 @@ pub trait AdviceProvider {
/// advice provider.
fn merge_roots(&mut self, lhs: Word, rhs: Word) -> Result<Word, ExecutionError>;

/// Returns a subset of this Merkle store such that the returned Merkle store contains all
/// nodes which are descendants of the specified roots.
///
/// The roots for which no descendants exist in this Merkle store are ignored.
fn get_store_subset<I, R>(&self, roots: I) -> MerkleStore
where
I: Iterator<Item = R>,
R: Borrow<RpoDigest>;

// CONTEXT MANAGEMENT
// --------------------------------------------------------------------------------------------

Expand Down Expand Up @@ -214,6 +229,10 @@ where
T::insert_into_map(self, key, values)
}

fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> {
T::get_mapped_values(self, key)
}

fn get_tree_node(
&self,
root: Word,
Expand Down Expand Up @@ -255,6 +274,14 @@ where
T::merge_roots(self, lhs, rhs)
}

fn get_store_subset<I, R>(&self, roots: I) -> MerkleStore
where
I: Iterator<Item = R>,
R: Borrow<RpoDigest>,
{
T::get_store_subset(self, roots)
}

fn advance_clock(&mut self) {
T::advance_clock(self)
}
Expand Down
36 changes: 36 additions & 0 deletions processor/src/advice/providers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@ where
Ok(())
}

// ADVICE MAP
// --------------------------------------------------------------------------------------------
fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> {
self.map.get(key).map(|v| v.as_slice())
}

// ADVISE SETS
// --------------------------------------------------------------------------------------------

Expand Down Expand Up @@ -184,6 +190,14 @@ where
.map_err(ExecutionError::MerkleStoreMergeFailed)
}

fn get_store_subset<I, R>(&self, roots: I) -> MerkleStore
where
I: Iterator<Item = R>,
R: core::borrow::Borrow<RpoDigest>,
{
self.store.subset(roots).into_inner().into_iter().collect()
}

// CONTEXT MANAGEMENT
// --------------------------------------------------------------------------------------------

Expand Down Expand Up @@ -257,6 +271,10 @@ impl AdviceProvider for MemAdviceProvider {
self.provider.insert_into_map(key, values)
}

fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> {
self.provider.get_mapped_values(key)
}

fn get_tree_node(&self, root: Word, depth: &Felt, index: &Felt) -> Result<Word, ExecutionError> {
self.provider.get_tree_node(root, depth, index)
}
Expand All @@ -277,6 +295,13 @@ impl AdviceProvider for MemAdviceProvider {
self.provider.merge_roots(lhs, rhs)
}

fn get_store_subset<I, R>(&self, roots: I) -> MerkleStore
where
I: Iterator<Item = R>,
R: core::borrow::Borrow<RpoDigest> {
self.provider.get_store_subset(roots)
}

fn advance_clock(&mut self) {
self.provider.advance_clock()
}
Expand Down Expand Up @@ -383,6 +408,10 @@ impl AdviceProvider for RecAdviceProvider {
self.provider.insert_into_map(key, values)
}

fn get_mapped_values(&self, key: &[u8; 32]) -> Option<&[Felt]> {
self.provider.get_mapped_values(key)
}

fn get_tree_node(&self, root: Word, depth: &Felt, index: &Felt) -> Result<Word, ExecutionError> {
self.provider.get_tree_node(root, depth, index)
}
Expand All @@ -403,6 +432,13 @@ impl AdviceProvider for RecAdviceProvider {
self.provider.merge_roots(lhs, rhs)
}

fn get_store_subset<I, R>(&self, roots: I) -> MerkleStore
where
I: Iterator<Item = R>,
R: core::borrow::Borrow<RpoDigest> {
self.provider.get_store_subset(roots)
}

fn advance_clock(&mut self) {
self.provider.advance_clock()
}
Expand Down

0 comments on commit 7cfaaec

Please sign in to comment.