pub struct Restrictions<N: Network> { /* private fields */ }
Expand description
A registry of program execution restrictions for the Aleo network.
The Restrictions
struct maintains lists of programs, functions, and arguments that are
restricted from execution on the network, either permanently or within specific block height ranges.
§Structure
- Programs: Entire programs can be restricted by their program ID.
- Functions: Specific functions within programs can be restricted by their locator (program ID + function name).
- Arguments: Specific argument values to functions can be restricted based on input/output values.
§Block Ranges
All restrictions are associated with block ranges that define when the restriction is active:
..
- All blocks (permanent restriction).10..
- From block 10 onwards...10
- Up to block 10.10..20
- From block 10 to block 20.
§How to update the restrictions list and snarkVM
- Identify your favorite ${NETWORK}.
- Update the content of
fn test_restrictions_list_comparison
to reflect the restrictions list. - Run
cd synthesizer/src/restrictions && cargo test test_restrictions_list_comparison
. - Update the restrictions.json in
parameters/src/${NETWORK}/resources/restrictions.json
. - Run
cargo test test_restrictions_list_comparison
. - Update the restrictions id printed by the test in the test and in
parameters/src/${NETWORK}/resources/restrictions.json
. - Run
cargo test test_restrictions_list_comparison
again to verify.
§Example: Restricting a program
§In the test_restrictions_list_comparison
function of synthesizer/src/restrictions/mod.rs
:
// Set the network.
type Network = console::network::MainnetV0;
// Initialize the restrictions.
let mut restrictions = Restrictions::<Network>::new_blank().unwrap();
// Add a program ID.
restrictions.restrictions_id =
Field::from_str("5990626497004338480795078796922903812962674412239021866159347614258503263942field")
.unwrap();
let program_id = ProgramID::from_str("hello.aleo").unwrap();
let range = BlockRange::RangeFrom(10..);
restrictions.programs.insert(program_id, range);
// Check the restrictions.
check_restrictions!(restrictions, Network);
§In parameters/src/mainnet/resources/restrictions.json
:
{
"restrictions_id": "5990626497004338480795078796922903812962674412239021866159347614258503263942field",
"programs": {
"hello.aleo": {
"RangeFrom": 10
}
},
"functions": {},
"arguments": {}
}
§Example: Restricting an address
§In the import section of the tests of synthesizer/src/restrictions/mod.rs
:
Make sure to import console::types::Address
, e.g., by replacing use console::types::I8;
with use console::types::{Address, I8};
.
§In the test_restrictions_list_comparison function
of synthesizer/src/restrictions/mod.rs
:
// Set the network.
type Network = console::network::MainnetV0;
// Initialize the restrictions.
let mut restrictions = Restrictions::<Network>::new_blank().unwrap();
// Add a program ID.
restrictions.restrictions_id =
Field::from_str("565692246249929386853861250603407577977410496268514614186112026084930301564field")
.unwrap();
let program_id = ProgramID::from_str("credits.aleo").unwrap();
let function_id = Identifier::from_str("transfer_public").unwrap();
let literal = Literal::Address(
Address::from_str("aleo10unn23a4z4jh2ea4g2n9fa7vz5mxzd2jf5nxpmv7f2f2sh3ur5rstqnpcg").unwrap(),
);
let index = 0;
let range = BlockRange::RangeFrom(150..);
restrictions.arguments.insert(
Locator::new(program_id, function_id),
indexmap!( ArgumentLocator::new(true, index) => indexmap!( literal.clone() => range )),
);
// Check the restrictions.
check_restrictions!(restrictions, Network);
§In parameters/src/mainnet/resources/restrictions.json
:
{
"restrictions_id": "565692246249929386853861250603407577977410496268514614186112026084930301564field",
"programs": {},
"functions": {},
"arguments": {
"credits.aleo/transfer_public": {
"true/0": {
"aleo10unn23a4z4jh2ea4g2n9fa7vz5mxzd2jf5nxpmv7f2f2sh3ur5rstqnpcg": {
"RangeFrom": 150
}
}
}
}
}
Implementations§
Source§impl<N: Network> Restrictions<N>
impl<N: Network> Restrictions<N>
Source§impl<N: Network> Restrictions<N>
impl<N: Network> Restrictions<N>
Sourcepub const fn restrictions_id(&self) -> Field<N>
pub const fn restrictions_id(&self) -> Field<N>
Returns the restrictions ID, for the current state of the Restrictions
list.
Sourcepub const fn programs(&self) -> &IndexMap<ProgramID<N>, BlockRange>
pub const fn programs(&self) -> &IndexMap<ProgramID<N>, BlockRange>
Returns the set of program IDs that are restricted from being executed.
Sourcepub const fn functions(&self) -> &IndexMap<Locator<N>, BlockRange>
pub const fn functions(&self) -> &IndexMap<Locator<N>, BlockRange>
Returns the set of (program ID, function ID)
pairs that are restricted from being executed.
Sourcepub const fn arguments(
&self,
) -> &IndexMap<Locator<N>, IndexMap<ArgumentLocator, IndexMap<Literal<N>, BlockRange>>>
pub const fn arguments( &self, ) -> &IndexMap<Locator<N>, IndexMap<ArgumentLocator, IndexMap<Literal<N>, BlockRange>>>
Returns the set of (program ID, function ID, argument)
triples that are restricted from being executed.
Source§impl<N: Network> Restrictions<N>
impl<N: Network> Restrictions<N>
Sourcepub fn is_program_restricted(
&self,
program_id: &ProgramID<N>,
block_height: u32,
) -> bool
pub fn is_program_restricted( &self, program_id: &ProgramID<N>, block_height: u32, ) -> bool
Returns true
if the given program ID is restricted from being executed.
Sourcepub fn is_function_restricted(
&self,
program_id: &ProgramID<N>,
function_name: &Identifier<N>,
block_height: u32,
) -> bool
pub fn is_function_restricted( &self, program_id: &ProgramID<N>, function_name: &Identifier<N>, block_height: u32, ) -> bool
Returns true
if the given (program ID, function name)
pair is restricted from being executed.
Sourcepub fn is_argument_restricted(
&self,
transition: &Transition<N>,
block_height: u32,
) -> bool
pub fn is_argument_restricted( &self, transition: &Transition<N>, block_height: u32, ) -> bool
Returns true
if the given (program ID, function ID, argument)
triple is restricted from being executed.
Source§impl<N: Network> Restrictions<N>
impl<N: Network> Restrictions<N>
Sourcepub fn contains_restricted_transitions(
&self,
execution: &Execution<N>,
block_height: u32,
) -> bool
pub fn contains_restricted_transitions( &self, execution: &Execution<N>, block_height: u32, ) -> bool
Returns true
if the given execution contains any restricted transitions for the given block height.
Source§impl<N: Network> Restrictions<N>
impl<N: Network> Restrictions<N>
Sourcepub fn compute_restrictions_id(
programs: &IndexMap<ProgramID<N>, BlockRange>,
functions: &IndexMap<Locator<N>, BlockRange>,
arguments: &IndexMap<Locator<N>, IndexMap<ArgumentLocator, IndexMap<Literal<N>, BlockRange>>>,
) -> Result<Field<N>>
pub fn compute_restrictions_id( programs: &IndexMap<ProgramID<N>, BlockRange>, functions: &IndexMap<Locator<N>, BlockRange>, arguments: &IndexMap<Locator<N>, IndexMap<ArgumentLocator, IndexMap<Literal<N>, BlockRange>>>, ) -> Result<Field<N>>
Returns the restrictions ID.
Trait Implementations§
Source§impl<N: Clone + Network> Clone for Restrictions<N>
impl<N: Clone + Network> Clone for Restrictions<N>
Source§fn clone(&self) -> Restrictions<N>
fn clone(&self) -> Restrictions<N>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<N: Network> Debug for Restrictions<N>
impl<N: Network> Debug for Restrictions<N>
Source§impl<'de, N: Network> Deserialize<'de> for Restrictions<N>
impl<'de, N: Network> Deserialize<'de> for Restrictions<N>
Source§fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>
Deserializes the restrictions from a JSON-string.
Source§impl<N: Network> Display for Restrictions<N>
impl<N: Network> Display for Restrictions<N>
Source§impl<N: Network> FromStr for Restrictions<N>
impl<N: Network> FromStr for Restrictions<N>
impl<N: Eq + Network> Eq for Restrictions<N>
impl<N: Network> StructuralPartialEq for Restrictions<N>
Auto Trait Implementations§
impl<N> Freeze for Restrictions<N>
impl<N> RefUnwindSafe for Restrictions<N>where
<N as Environment>::Field: RefUnwindSafe,
<N as Environment>::Projective: RefUnwindSafe,
<N as Environment>::Scalar: RefUnwindSafe,
N: RefUnwindSafe,
impl<N> Send for Restrictions<N>
impl<N> Sync for Restrictions<N>
impl<N> Unpin for Restrictions<N>where
<N as Environment>::Field: Unpin,
<N as Environment>::Projective: Unpin,
<N as Environment>::Scalar: Unpin,
N: Unpin,
impl<N> UnwindSafe for Restrictions<N>where
<N as Environment>::Field: UnwindSafe,
<N as Environment>::Projective: UnwindSafe,
<N as Environment>::Scalar: UnwindSafe,
N: UnwindSafe,
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<'de, T> DeserializeExt<'de> for Twhere
T: DeserializeOwned,
impl<'de, T> DeserializeExt<'de> for Twhere
T: DeserializeOwned,
fn take_from_value<D>(
value: &mut Value,
field: &str,
) -> Result<T, <D as Deserializer<'de>>::Error>where
D: Deserializer<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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 more