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: u64Number 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: u64Depth 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: u64Number 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: u64Duration 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: u64Log₂ 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: usizeNumber 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: u64Block 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: u64Multiplier 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:
- Berkeley Upgrade: https://minaprotocol.com/blog/minas-berkeley-upgrade-what-to-expect
- Supercharged Rewards Removal: https://minaprotocol.com/blog/update-on-minas-supercharged-rewards-schedule
- Original Proposal: https://github.com/MinaProtocol/mina/issues/5753
Usage: Enhanced reward calculations, incentive mechanisms
account_creation_fee: u64Fee 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
impl BinProtWrite for ConstraintConstants
Source§impl Clone for ConstraintConstants
impl Clone for ConstraintConstants
Source§fn clone(&self) -> ConstraintConstants
fn clone(&self) -> ConstraintConstants
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ConstraintConstants
impl Debug for ConstraintConstants
Source§impl From<&ConstraintConstants> for ConstraintConstantsUnversioned
impl From<&ConstraintConstants> for ConstraintConstantsUnversioned
Source§fn from(constraints: &ConstraintConstants) -> Self
fn from(constraints: &ConstraintConstants) -> Self
Auto Trait Implementations§
impl Freeze for ConstraintConstants
impl RefUnwindSafe for ConstraintConstants
impl Send for ConstraintConstants
impl Sync for ConstraintConstants
impl Unpin for ConstraintConstants
impl UnwindSafe for ConstraintConstants
Blanket Implementations§
§impl<T> BinProtSize for Twhere
T: BinProtWrite,
impl<T> BinProtSize for Twhere
T: BinProtWrite,
fn binprot_size(&self) -> usize
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,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.