iuna

iuna - experimental devnet protocol
git clone https://iuna.jhx.app/git/iuna.git
Log | Files | Refs | README | LICENSE

node_lifecycle.rs (5341B)


      1 use std::collections::{BTreeMap, BTreeSet};
      2 
      3 use crate::{
      4     adapters::config_store::{DEFAULT_POW_MINING_WORKERS, clamp_pow_mining_workers},
      5     domain::{Amount, DEFAULT_FEE_PER_BYTE, Ledger, RevealBundle, Wallet},
      6 };
      7 
      8 use super::{GossipEnvelope, NodeConfig, NodeCore, NodeWallet};
      9 
     10 impl NodeCore {
     11     pub fn new(config: NodeConfig) -> Self {
     12         let ledger = Ledger::new(config.genesis_allocations, config.vdf_rounds);
     13         let mut node = Self::from_ledger_with_burn_fee(
     14             config.wallet,
     15             ledger,
     16             config.burn_per_block,
     17             config.burn_fee,
     18         );
     19         node.set_pow_mining_workers(config.pow_mining_workers);
     20         node.set_recovery_vdf_top_rank_percent(config.recovery_vdf_top_rank_percent);
     21         node
     22     }
     23 
     24     pub fn from_ledger(wallet: Wallet, ledger: Ledger, burn_per_block: Amount) -> Self {
     25         Self::from_ledger_with_burn_fee(wallet, ledger, burn_per_block, DEFAULT_FEE_PER_BYTE)
     26     }
     27 
     28     pub fn from_locked_wallet_address(
     29         address: impl Into<String>,
     30         ledger: Ledger,
     31         automatic_mining_enabled: bool,
     32         burn_per_block: Amount,
     33         burn_fee: Amount,
     34     ) -> Self {
     35         Self::from_node_wallet_with_burn_fee_and_enabled(
     36             NodeWallet::Locked {
     37                 address: address.into(),
     38             },
     39             ledger,
     40             automatic_mining_enabled,
     41             burn_per_block,
     42             burn_fee,
     43             DEFAULT_POW_MINING_WORKERS,
     44             100,
     45         )
     46     }
     47 
     48     pub fn from_ledger_with_burn_fee(
     49         wallet: Wallet,
     50         ledger: Ledger,
     51         burn_per_block: Amount,
     52         burn_fee: Amount,
     53     ) -> Self {
     54         Self::from_ledger_with_burn_fee_and_enabled(
     55             wallet,
     56             ledger,
     57             burn_per_block > 0,
     58             burn_per_block,
     59             burn_fee,
     60         )
     61     }
     62 
     63     pub fn from_ledger_with_burn_fee_and_enabled(
     64         wallet: Wallet,
     65         ledger: Ledger,
     66         automatic_mining_enabled: bool,
     67         burn_per_block: Amount,
     68         burn_fee: Amount,
     69     ) -> Self {
     70         Self::from_node_wallet_with_burn_fee_and_enabled(
     71             NodeWallet::Unlocked(wallet),
     72             ledger,
     73             automatic_mining_enabled,
     74             burn_per_block,
     75             burn_fee,
     76             DEFAULT_POW_MINING_WORKERS,
     77             100,
     78         )
     79     }
     80 
     81     fn from_node_wallet_with_burn_fee_and_enabled(
     82         wallet: NodeWallet,
     83         ledger: Ledger,
     84         automatic_mining_enabled: bool,
     85         burn_per_block: Amount,
     86         burn_fee: Amount,
     87         pow_mining_workers: u8,
     88         recovery_vdf_top_rank_percent: u8,
     89     ) -> Self {
     90         Self {
     91             wallet,
     92             ledger,
     93             automatic_mining_enabled,
     94             pow_mining_enabled: false,
     95             pow_mining_workers: clamp_pow_mining_workers(pow_mining_workers),
     96             burn_per_block,
     97             burn_fee,
     98             recovery_vdf_top_rank_percent: recovery_vdf_top_rank_percent.min(100),
     99             last_auto_burn_height: None,
    100             last_auto_anchor_burn_height: None,
    101             last_auto_pow_mine_anchor: None,
    102             last_auto_pow_mine_status: None,
    103             auto_pow_mine_cursor: None,
    104             owned_blinded_transactions: BTreeMap::new(),
    105             owned_blinded_reveals: BTreeMap::new(),
    106             owned_blinded_payloads: BTreeMap::new(),
    107             owned_blinded_outbox_version: 0,
    108             reveal_bundles: BTreeMap::<(u64, u8), RevealBundle>::new(),
    109             equivocated_reveal_bundle_slots: BTreeSet::new(),
    110             reveal_bundle_collection_started: None,
    111             local_block_anchor_burn: None,
    112             outbox: Vec::<GossipEnvelope>::new(),
    113         }
    114     }
    115 
    116     pub fn wallet_address(&self) -> &str {
    117         self.wallet.address()
    118     }
    119 
    120     pub fn wallet_is_locked(&self) -> bool {
    121         self.wallet.is_locked()
    122     }
    123 
    124     pub fn replace_wallet(&mut self, wallet: Wallet) {
    125         self.wallet = NodeWallet::Unlocked(wallet);
    126         self.reset_automatic_mining_progress();
    127         self.owned_blinded_transactions.clear();
    128         self.owned_blinded_reveals.clear();
    129         self.owned_blinded_payloads.clear();
    130         self.bump_owned_blinded_outbox_version();
    131         self.reveal_bundles.clear();
    132         self.equivocated_reveal_bundle_slots.clear();
    133         self.reveal_bundle_collection_started = None;
    134         self.local_block_anchor_burn = None;
    135     }
    136 
    137     pub fn reset_chain_to_setup_placeholder(&mut self) {
    138         self.ledger = Ledger::new(BTreeMap::new(), 1);
    139         self.reset_automatic_mining_progress();
    140         self.owned_blinded_transactions.clear();
    141         self.owned_blinded_reveals.clear();
    142         self.owned_blinded_payloads.clear();
    143         self.bump_owned_blinded_outbox_version();
    144         self.reveal_bundles.clear();
    145         self.equivocated_reveal_bundle_slots.clear();
    146         self.reveal_bundle_collection_started = None;
    147         self.local_block_anchor_burn = None;
    148         self.outbox.clear();
    149     }
    150 
    151     pub(super) fn reset_automatic_mining_progress(&mut self) {
    152         self.last_auto_burn_height = None;
    153         self.last_auto_anchor_burn_height = None;
    154         self.last_auto_pow_mine_anchor = None;
    155         self.last_auto_pow_mine_status = None;
    156         self.auto_pow_mine_cursor = None;
    157         self.reveal_bundle_collection_started = None;
    158     }
    159 }