iuna

iuna

iuna - experimental mainnet-candidate protocol
git clone https://getiuna.org/git/iuna.git
Log | Files | Refs | README | LICENSE

protocol.rs (4414B)


      1 pub type Amount = u64;
      2 
      3 pub const MICRO_IUNA: Amount = 1_000_000;
      4 pub const BLOCK_REWARD: Amount = MICRO_IUNA;
      5 pub const MINE_REWARD: Amount = MICRO_IUNA;
      6 pub const MINE_FINALIZER_FEE: Amount = MICRO_IUNA;
      7 /// Consensus height at which every newly-created reward output must use an
      8 /// address-v1 hybrid Ed25519 + ML-DSA payout address.
      9 pub const HYBRID_REWARD_ACTIVATION_HEIGHT: u64 = 3_750;
     10 pub const DEFAULT_MINE_FEE: Amount = MINE_FINALIZER_FEE;
     11 pub const DEFAULT_TRANSACTION_FEE: Amount = MICRO_IUNA;
     12 pub const DEFAULT_FEE_PER_BYTE: Amount = 1;
     13 pub const MAX_BLOCK_BYTES: usize = 1_000_000;
     14 #[cfg(not(feature = "e2e"))]
     15 pub const VDF_TARGET_BLOCK_MS: u64 = 10 * 60 * 1_000;
     16 #[cfg(feature = "e2e")]
     17 pub const VDF_TARGET_BLOCK_MS: u64 = 5_000;
     18 pub const RECOVERY_BLOCK_DELAY_MS: u64 = VDF_TARGET_BLOCK_MS * 6;
     19 pub const MAX_VDF_ROUNDS: u64 = i64::MAX as u64;
     20 pub const MINE_DIFFICULTY_BITS: u32 = 12;
     21 pub const MINE_ACTIONS_PER_ANCHOR_LIMIT: usize = 2;
     22 pub const BURN_COMMITTEE_SIZE: usize = 5;
     23 pub const MAX_BURN_BUNDLE_BYTES: usize = 10_000;
     24 pub const BURN_LINEAGE_MATURITY_HEIGHTS: u64 = 20;
     25 pub const GRINDING_RESISTANCE_ACTIVATION_HEIGHT: u64 = 1_000;
     26 pub const TRANSACTION_SIGNING_V1_ACTIVATION_HEIGHT: u64 = 1_000;
     27 pub const TRANSACTION_REPLAY_PROTECTION_ACTIVATION_HEIGHT: u64 = 1_000;
     28 pub const OBJECTIVE_FINALITY_ACTIVATION_HEIGHT: u64 = 1_000;
     29 pub const TIP_BOUND_BURN_ACTIVATION_HEIGHT: u64 = 1_000;
     30 
     31 pub const MAX_PENDING_TRANSACTIONS: usize = 10_000;
     32 pub(super) const MAX_PENDING_POOL_BYTES: usize = 8 * 1024 * 1024;
     33 pub(super) const MAX_ORPHAN_TRANSACTIONS: usize = 1_024;
     34 pub(super) const MAX_BLOCK_TRANSACTIONS: usize = 1_000;
     35 pub(super) const DEFAULT_TICKET_MATURITY_DELAY: u64 = 3;
     36 pub(super) const DEFAULT_TICKET_EXPIRY_WINDOW: u64 = 3;
     37 pub(super) const MAX_BLOCK_TIMESTAMP_FUTURE_DRIFT_MS: u64 = 2 * 60 * 1_000;
     38 pub(super) const BLOCK_MEDIAN_TIME_PAST_WINDOW: usize = 11;
     39 pub(super) const FORK_FINALITY_DEPTH: u64 = 6;
     40 pub(super) const PUBLIC_KEY_BYTES: usize = super::SignatureScheme::Ed25519.public_key_bytes();
     41 pub(super) const HASH_BYTES: usize = 32;
     42 pub(super) const SIGNATURE_BYTES: usize = super::SignatureScheme::Ed25519.signature_bytes();
     43 
     44 #[derive(Clone, Copy, Debug, Eq, PartialEq)]
     45 pub enum TransactionSubmitOutcome {
     46     Added,
     47     AlreadyKnown,
     48     ConflictsWithPending,
     49 }
     50 
     51 impl TransactionSubmitOutcome {
     52     pub fn added(self) -> bool {
     53         matches!(self, Self::Added)
     54     }
     55 }
     56 
     57 #[cfg(test)]
     58 mod tests {
     59     use super::*;
     60 
     61     #[test]
     62     fn mainnet_candidate_protocol_parameters_are_frozen() {
     63         assert_eq!(MICRO_IUNA, 1_000_000);
     64         assert_eq!(BLOCK_REWARD, MICRO_IUNA);
     65         assert_eq!(MINE_REWARD, MICRO_IUNA);
     66         assert_eq!(MINE_FINALIZER_FEE, MICRO_IUNA);
     67         assert_eq!(HYBRID_REWARD_ACTIVATION_HEIGHT, 3_750);
     68         assert_eq!(MAX_BLOCK_BYTES, 1_000_000);
     69         #[cfg(not(feature = "e2e"))]
     70         assert_eq!(VDF_TARGET_BLOCK_MS, 10 * 60 * 1_000);
     71         #[cfg(feature = "e2e")]
     72         assert_eq!(VDF_TARGET_BLOCK_MS, 5_000);
     73         assert_eq!(RECOVERY_BLOCK_DELAY_MS, 6 * VDF_TARGET_BLOCK_MS);
     74         assert_eq!(MINE_DIFFICULTY_BITS, 12);
     75         assert_eq!(MINE_ACTIONS_PER_ANCHOR_LIMIT, 2);
     76         assert_eq!(BURN_COMMITTEE_SIZE, 5);
     77         assert_eq!(MAX_BURN_BUNDLE_BYTES, 10_000);
     78         assert_eq!(BURN_LINEAGE_MATURITY_HEIGHTS, 20);
     79         assert_eq!(GRINDING_RESISTANCE_ACTIVATION_HEIGHT, 1_000);
     80         assert_eq!(TRANSACTION_SIGNING_V1_ACTIVATION_HEIGHT, 1_000);
     81         assert_eq!(TRANSACTION_REPLAY_PROTECTION_ACTIVATION_HEIGHT, 1_000);
     82         assert_eq!(OBJECTIVE_FINALITY_ACTIVATION_HEIGHT, 1_000);
     83         assert_eq!(TIP_BOUND_BURN_ACTIVATION_HEIGHT, 1_000);
     84         assert_eq!(MAX_PENDING_TRANSACTIONS, 10_000);
     85         assert_eq!(MAX_PENDING_POOL_BYTES, 8 * 1024 * 1024);
     86         assert_eq!(MAX_ORPHAN_TRANSACTIONS, 1_024);
     87         assert_eq!(MAX_BLOCK_TRANSACTIONS, 1_000);
     88         assert_eq!(DEFAULT_TICKET_MATURITY_DELAY, 3);
     89         assert_eq!(DEFAULT_TICKET_EXPIRY_WINDOW, 3);
     90         assert_eq!(MAX_BLOCK_TIMESTAMP_FUTURE_DRIFT_MS, 2 * 60 * 1_000);
     91         assert_eq!(BLOCK_MEDIAN_TIME_PAST_WINDOW, 11);
     92         assert_eq!(FORK_FINALITY_DEPTH, 6);
     93         assert_eq!(PUBLIC_KEY_BYTES, 32);
     94         assert_eq!(HASH_BYTES, 32);
     95         assert_eq!(SIGNATURE_BYTES, 64);
     96         assert_eq!(
     97             crate::domain::ticket::MISSED_FALLBACK_TICKET_INVALIDATION_HEIGHT,
     98             300
     99         );
    100     }
    101 }