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 }