ConstraintConstants

Struct ConstraintConstants 

Source
pub struct ConstraintConstants {
    pub sub_windows_per_window: u64,
    pub ledger_depth: u64,
    pub work_delay: u64,
    pub block_window_duration_ms: u64,
    pub transaction_capacity_log_2: u64,
    pub pending_coinbase_depth: usize,
    pub coinbase_amount: u64,
    pub supercharged_coinbase_factor: u64,
    pub account_creation_fee: u64,
    pub fork: Option<ForkConstants>,
}
Expand description

Protocol constraint constants that define core blockchain behavior.

These constants configure fundamental aspects of the Mina protocol including consensus, transaction processing, economic parameters, and ledger structure. They are compile-time parameters that must be consistent across all nodes in a network.

§Consensus and Timing Parameters

The consensus mechanism relies on slot-based timing where blocks are produced in discrete time slots. The timing hierarchy is:

  • Slots: Basic time units for block production
  • Sub-windows: Groups of slots within an epoch
  • Windows: Collections of sub-windows that define epoch structure
  • Epochs: Complete consensus periods

§Economic Parameters

The protocol defines economic incentives through fees and rewards:

  • Coinbase rewards: Paid to block producers for successful blocks
  • Account creation fees: Required to create new accounts on the ledger
  • Supercharged rewards: Multiplier for enhanced block producer rewards

§Ledger and Transaction Structure

The ledger uses a Merkle tree structure for efficient verification:

  • Ledger depth: Determines the maximum number of accounts (2^depth)
  • Transaction capacity: Limits transactions per block for performance
  • Pending coinbase: Manages delayed coinbase payouts

§Usage Example

use mina_core::constants::constraint_constants;

// Access global constraint constants
let constants = constraint_constants();

// Calculate slots per window
let slots_per_window = constants.sub_windows_per_window;
println!("Sub-windows per window: {}", slots_per_window);

// Get block timing
let block_time_ms = constants.block_window_duration_ms;
println!("Block time: {}ms", block_time_ms);

// Check economic parameters
let coinbase_reward = constants.coinbase_amount;
let creation_fee = constants.account_creation_fee;
println!("Coinbase: {} nanomina, Account fee: {} nanomina",
         coinbase_reward, creation_fee);

§Network Differences

While most constraint constants are identical across networks, some parameters may differ between mainnet and testnets for development purposes.

Related OCaml implementation: https://github.com/MinaProtocol/mina/tree/compatible/src/config Protocol specification: https://github.com/MinaProtocol/mina/blob/compatible/docs/specs/types_and_structures/serialized_key.md

Fields§

§sub_windows_per_window: u64

Number of sub-windows that make up a complete window.

Used in the consensus mechanism to structure epoch timing. Combined with slots_per_sub_window from protocol constants, this determines the total slots per window: slots_per_window = slots_per_sub_window × sub_windows_per_window.

Value: 11 (both mainnet and devnet)

§ledger_depth: u64

Depth of the account ledger Merkle tree.

This determines the maximum number of accounts that can be stored in the ledger: max_accounts = 2^ledger_depth. The depth affects proof sizes and verification time. A larger depth allows more accounts but increases computational overhead.

Value: 35 (supports ~34 billion accounts) Usage: Account addressing, sparse ledger proofs, zkSNARK constraints

§work_delay: u64

Number of blocks to delay before SNARK work becomes available.

This creates a buffer period between when a block is produced and when the associated SNARK work can be included in subsequent blocks. This delay helps ensure fair distribution of SNARK work opportunities.

Value: 2 blocks Usage: SNARK work scheduling, proof marketplace timing

§block_window_duration_ms: u64

Duration of each block production slot in milliseconds.

This is the fundamental time unit for the consensus protocol. Block producers attempt to create blocks during their assigned slots. The duration affects network synchronization requirements and transaction confirmation times.

Value: 180,000ms (3 minutes) Usage: Consensus timing, slot calculations, network synchronization

§transaction_capacity_log_2: u64

Log₂ of the maximum number of transactions per block.

The actual transaction capacity is 2^transaction_capacity_log_2. This logarithmic representation is used because the value directly affects zkSNARK circuit constraints. Higher capacity allows more transactions but increases block processing time.

Corresponds to transaction_capacity in the protocol specification, which defines the maximum transactions per block (represented as two_to_the).

Value: 7 (supports 2^7 = 128 transactions per block) Usage: Transaction pool management, block construction, circuit constraints

§pending_coinbase_depth: usize

Number of confirmations before coinbase reward is spendable.

Coinbase rewards are not immediately spendable and require a certain number of block confirmations before they can be used. This parameter defines the depth of the pending coinbase Merkle tree structure used to track these delayed rewards until they mature.

Value: 5 (coinbase rewards require 5 block confirmations) Usage: Coinbase reward management, staged ledger operations, reward maturity

§coinbase_amount: u64

Block reward amount in nanomina (10⁻⁹ MINA).

This is the base reward paid to block producers for successfully creating a block. The amount is specified in nanomina, where 1 MINA = 10⁹ nanomina. Block producers may receive additional rewards through the supercharged coinbase mechanism.

Value: 720,000,000,000 nanomina (720 MINA) Usage: Block producer rewards, economic incentives, reward calculations

§supercharged_coinbase_factor: u64

Multiplier for supercharged coinbase rewards.

Supercharged rewards were designed to provide double block rewards (factor of 2) to block producers staking with unlocked tokens during the early mainnet period following the 2021 launch. This mechanism incentivized participation and orderly markets after mainnet launch.

Historical values:

  • Original mainnet: 2 (double rewards for unlocked tokens)
  • Berkeley hardfork (June 2024): 1 (supercharged rewards removed via MIP1)

The removal was decided by community vote on January 1, 2023, as proposed by community member Gareth Davies. This change ensures uniform rewards for all tokens and reduces inflation, promoting a sustainable economic model.

References:

Usage: Enhanced reward calculations, incentive mechanisms

§account_creation_fee: u64

Fee required to create a new account in nanomina.

When a transaction creates a new account that doesn’t exist on the ledger, this fee is charged in addition to the transaction fee. This prevents spam account creation and manages ledger growth.

Value: 1,000,000,000 nanomina (1 MINA) Usage: Account creation, transaction validation, fee calculations

§fork: Option<ForkConstants>

Optional fork constants defining a protocol upgrade point.

When present, these constants specify the blockchain state at which a protocol fork or upgrade occurred. This allows the protocol to handle transitions between different versions while maintaining consensus.

Usage: Protocol upgrades, compatibility handling, genesis configuration

Trait Implementations§

Source§

impl BinProtWrite for ConstraintConstants

Source§

impl Clone for ConstraintConstants

Source§

fn clone(&self) -> ConstraintConstants

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstraintConstants

Source§

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

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

impl From<&ConstraintConstants> for ConstraintConstantsUnversioned

Source§

fn from(constraints: &ConstraintConstants) -> Self

Converts to this type from the input type.

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
§

impl<T> BinProtSize for T
where T: BinProtWrite,

§

fn binprot_size(&self) -> usize

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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.

§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

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
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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