Skip to content

Commit 0734ac0

Browse files
committed
refactor(GlobalState): improve encapsulation of constructor
Change function signature and logic of `GlobalState::new` to move more of the database initialization into this constructor. Previously, this database initialization happened directly in lib.rs's `initialize`. Also allow caller of this constructor to specify the genesis block, as this will widen our testing capabilities somewhat. Big diff because this changes many tests. But the diff of non-testing, mainline, code is quite small.
1 parent 863ff0a commit 0734ac0

File tree

14 files changed

+336
-392
lines changed

14 files changed

+336
-392
lines changed

src/lib.rs

Lines changed: 21 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ pub mod util_types;
4444
#[cfg_attr(coverage_nightly, coverage(off))]
4545
pub mod tests;
4646

47-
use std::collections::HashMap;
4847
use std::env;
49-
use std::net::SocketAddr;
5048
use std::path::PathBuf;
5149

5250
use anyhow::Context;
@@ -62,7 +60,6 @@ use futures::StreamExt;
6260
use models::blockchain::block::Block;
6361
use models::blockchain::shared::Hash;
6462
use models::peer::handshake_data::HandshakeData;
65-
use models::peer::peer_info::PeerInfo;
6663
use models::state::wallet::wallet_file::WalletFileContext;
6764
use prelude::tasm_lib;
6865
use prelude::triton_vm;
@@ -88,11 +85,6 @@ use crate::models::channel::MinerToMain;
8885
use crate::models::channel::PeerTaskToMain;
8986
use crate::models::channel::RPCServerToMain;
9087
use crate::models::state::archival_state::ArchivalState;
91-
use crate::models::state::blockchain_state::BlockchainArchivalState;
92-
use crate::models::state::blockchain_state::BlockchainState;
93-
use crate::models::state::light_state::LightState;
94-
use crate::models::state::mempool::Mempool;
95-
use crate::models::state::networking_state::NetworkingState;
9688
use crate::models::state::wallet::wallet_state::WalletState;
9789
use crate::models::state::GlobalStateLock;
9890
use crate::rpc_server::RPC;
@@ -125,41 +117,16 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
125117
DataDirectory::create_dir_if_not_exists(&data_directory.root_dir_path()).await?;
126118
info!("Data directory is {}", data_directory);
127119

128-
// Get wallet object, create various wallet secret files
129-
let wallet_dir = data_directory.wallet_directory_path();
130-
DataDirectory::create_dir_if_not_exists(&wallet_dir).await?;
131-
let wallet_file_context =
132-
WalletFileContext::read_from_file_or_create(&data_directory.wallet_directory_path())?;
133-
info!("Now getting wallet state. This may take a while if the database needs pruning.");
134-
let wallet_state =
135-
WalletState::try_new_from_context(&data_directory, wallet_file_context, &cli_args).await?;
136-
info!("Got wallet state.");
137-
138-
// Connect to or create databases for block index, peers, mutator set, block sync
139-
140-
let peer_databases = NetworkingState::initialize_peer_databases(&data_directory).await?;
141-
info!("Got peer database");
142-
120+
let (rpc_server_to_main_tx, rpc_server_to_main_rx) =
121+
mpsc::channel::<RPCServerToMain>(RPC_CHANNEL_CAPACITY);
143122
let genesis = Block::genesis(cli_args.network);
144-
let archival_state = ArchivalState::new(data_directory.clone(), genesis).await;
145-
info!("Got archival state");
146-
147-
// Get latest block. Use hardcoded genesis block if nothing is in database.
148-
let latest_block: Block = archival_state.get_tip().await;
149-
150-
// Bind socket to port on this machine, to handle incoming connections from peers
151-
let incoming_peer_listener = if let Some(incoming_peer_listener) = cli_args.own_listen_port() {
152-
let ret = TcpListener::bind((cli_args.listen_addr, incoming_peer_listener))
153-
.await
154-
.with_context(|| format!("Failed to bind to local TCP port {}:{}. Is an instance of this program already running?", cli_args.listen_addr, incoming_peer_listener))?;
155-
info!("Now listening for incoming peer-connections");
156-
ret
157-
} else {
158-
info!("Not accepting incoming peer-connections");
159-
TcpListener::bind("127.0.0.1:0").await?
160-
};
161-
162-
let peer_map: HashMap<SocketAddr, PeerInfo> = HashMap::new();
123+
let mut global_state_lock = GlobalStateLock::new(
124+
data_directory.clone(),
125+
genesis,
126+
cli_args.clone(),
127+
rpc_server_to_main_tx.clone(),
128+
)
129+
.await?;
163130

164131
// Construct the broadcast channel to communicate from the main task to peer tasks
165132
let (main_to_peer_broadcast_tx, _main_to_peer_broadcast_rx) =
@@ -169,32 +136,6 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
169136
let (peer_task_to_main_tx, peer_task_to_main_rx) =
170137
mpsc::channel::<PeerTaskToMain>(PEER_CHANNEL_CAPACITY);
171138

172-
let networking_state = NetworkingState::new(peer_map, peer_databases);
173-
174-
let light_state: LightState = LightState::from(latest_block);
175-
let blockchain_archival_state = BlockchainArchivalState {
176-
light_state,
177-
archival_state,
178-
};
179-
let blockchain_state = BlockchainState::Archival(Box::new(blockchain_archival_state));
180-
let mempool = Mempool::new(
181-
cli_args.max_mempool_size,
182-
cli_args.max_mempool_num_tx,
183-
blockchain_state.light_state().hash(),
184-
);
185-
186-
let (rpc_server_to_main_tx, rpc_server_to_main_rx) =
187-
mpsc::channel::<RPCServerToMain>(RPC_CHANNEL_CAPACITY);
188-
189-
let mut global_state_lock = GlobalStateLock::new(
190-
wallet_state,
191-
blockchain_state,
192-
networking_state,
193-
cli_args,
194-
mempool,
195-
rpc_server_to_main_tx.clone(),
196-
);
197-
198139
if let Some(bootstrap_directory) = global_state_lock.cli().bootstrap_from_directory.clone() {
199140
info!(
200141
"Bootstrapping from directory \"{}\"",
@@ -219,6 +160,18 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
219160
.await?;
220161
info!("UTXO restoration check complete");
221162

163+
// Bind socket to port on this machine, to handle incoming connections from peers
164+
let incoming_peer_listener = if let Some(incoming_peer_listener) = cli_args.own_listen_port() {
165+
let ret = TcpListener::bind((cli_args.listen_addr, incoming_peer_listener))
166+
.await
167+
.with_context(|| format!("Failed to bind to local TCP port {}:{}. Is an instance of this program already running?", cli_args.listen_addr, incoming_peer_listener))?;
168+
info!("Now listening for incoming peer-connections");
169+
ret
170+
} else {
171+
info!("Not accepting incoming peer-connections");
172+
TcpListener::bind("127.0.0.1:0").await?
173+
};
174+
222175
// Connect to peers, and provide each peer task with a thread-safe copy of the state
223176
let own_handshake_data: HandshakeData =
224177
global_state_lock.lock_guard().await.get_own_handshakedata();

src/main_loop/proof_upgrader.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -901,12 +901,11 @@ mod tests {
901901
// expiry of timelock). Rando is not premine recipient.
902902
let cli_args = cli_args::Args {
903903
min_gobbling_fee: NativeCurrencyAmount::from_nau(5),
904-
network: Network::Main,
904+
network,
905905
..Default::default()
906906
};
907907
let alice =
908-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args.clone())
909-
.await;
908+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args.clone()).await;
910909
let pc_tx_low_fee = transaction_from_state(
911910
alice.clone(),
912911
512777439428,
@@ -916,13 +915,8 @@ mod tests {
916915
.await;
917916

918917
for tx_origin in [TransactionOrigin::Own, TransactionOrigin::Foreign] {
919-
let mut rando = mock_genesis_global_state(
920-
network,
921-
2,
922-
WalletEntropy::new_random(),
923-
cli_args.clone(),
924-
)
925-
.await;
918+
let mut rando =
919+
mock_genesis_global_state(2, WalletEntropy::new_random(), cli_args.clone()).await;
926920
let mut rando = rando.lock_guard_mut().await;
927921
rando
928922
.mempool_insert(pc_tx_low_fee.clone().into(), tx_origin)

src/mine_loop.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,10 +1156,9 @@ pub(crate) mod tests {
11561156
let mut rng = rand::rng();
11571157
let network = Network::RegTest;
11581158
let global_state_lock = mock_genesis_global_state(
1159-
network,
11601159
2,
11611160
WalletEntropy::devnet_wallet(),
1162-
cli_args::Args::default(),
1161+
cli_args::Args::default_with_network(network),
11631162
)
11641163
.await;
11651164

@@ -1224,11 +1223,12 @@ pub(crate) mod tests {
12241223
let guesser_fee_fraction = 0.0;
12251224
let cli_args = cli_args::Args {
12261225
guesser_fraction: guesser_fee_fraction,
1226+
network,
12271227
..Default::default()
12281228
};
12291229

12301230
let global_state_lock =
1231-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
1231+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
12321232
let tick = std::time::SystemTime::now();
12331233
let (transaction, _coinbase_utxo_info) = make_coinbase_transaction_from_state(
12341234
&genesis_block,
@@ -1259,10 +1259,9 @@ pub(crate) mod tests {
12591259
// Verify that a block template made with transaction from the mempool is a valid block
12601260
let network = Network::Main;
12611261
let mut alice = mock_genesis_global_state(
1262-
network,
12631262
2,
12641263
WalletEntropy::devnet_wallet(),
1265-
cli_args::Args::default(),
1264+
cli_args::Args::default_with_network(network),
12661265
)
12671266
.await;
12681267
let genesis_block = Block::genesis(network);
@@ -1439,11 +1438,11 @@ pub(crate) mod tests {
14391438
// force SingleProof capability.
14401439
let cli = cli_args::Args {
14411440
tx_proving_capability: Some(TxProvingCapability::SingleProof),
1441+
network,
14421442
..Default::default()
14431443
};
14441444

1445-
let mut alice =
1446-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli).await;
1445+
let mut alice = mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli).await;
14471446
let genesis_block = Block::genesis(network);
14481447
let mocked_now = genesis_block.header().timestamp + Timestamp::months(7);
14491448

@@ -1502,10 +1501,11 @@ pub(crate) mod tests {
15021501
let network = Network::Main;
15031502
let cli_args = cli_args::Args {
15041503
guesser_fraction: 0.0,
1504+
network,
15051505
..Default::default()
15061506
};
15071507
let global_state_lock =
1508-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
1508+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
15091509
let tip_block_orig = Block::genesis(network);
15101510
let launch_date = tip_block_orig.header().timestamp;
15111511
let (worker_task_tx, worker_task_rx) = oneshot::channel::<NewBlockFound>();
@@ -1574,10 +1574,11 @@ pub(crate) mod tests {
15741574
let network = Network::Main;
15751575
let cli_args = cli_args::Args {
15761576
guesser_fraction: 0.0,
1577+
network,
15771578
..Default::default()
15781579
};
15791580
let global_state_lock =
1580-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
1581+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
15811582
let (worker_task_tx, worker_task_rx) = oneshot::channel::<NewBlockFound>();
15821583

15831584
let tip_block_orig = global_state_lock
@@ -1682,10 +1683,9 @@ pub(crate) mod tests {
16821683
) -> Result<()> {
16831684
let network = Network::RegTest;
16841685
let global_state_lock = mock_genesis_global_state(
1685-
network,
16861686
2,
16871687
WalletEntropy::devnet_wallet(),
1688-
cli_args::Args::default(),
1688+
cli_args::Args::default_with_network(network),
16891689
)
16901690
.await;
16911691

@@ -1905,11 +1905,11 @@ pub(crate) mod tests {
19051905
let cli_args = cli_args::Args {
19061906
guesser_fraction: 0.0,
19071907
fee_notification: notification_policy,
1908+
network,
19081909
..Default::default()
19091910
};
19101911
let global_state_lock =
1911-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args)
1912-
.await;
1912+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
19131913
let genesis_block = Block::genesis(network);
19141914
let launch_date = genesis_block.header().timestamp;
19151915

@@ -2035,12 +2035,13 @@ pub(crate) mod tests {
20352035
let cli_args = cli_args::Args {
20362036
guesser_fraction,
20372037
fee_notification: notification_policy,
2038+
network,
20382039
..Default::default()
20392040
};
20402041
let global_state_lock =
2041-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args)
2042+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args.clone())
20422043
.await;
2043-
let genesis_block = Block::genesis(network);
2044+
let genesis_block = Block::genesis(cli_args.network);
20442045
let launch_date = genesis_block.header().timestamp;
20452046

20462047
let (transaction, expected_utxos) = make_coinbase_transaction_from_state(
@@ -2150,11 +2151,11 @@ pub(crate) mod tests {
21502151
let network = Network::Main;
21512152
let cli_args = cli_args::Args {
21522153
compose: true,
2154+
network,
21532155
..Default::default()
21542156
};
21552157
let global_state_lock =
2156-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args.clone())
2157-
.await;
2158+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args.clone()).await;
21582159

21592160
let (cancel_job_tx, cancel_job_rx) = tokio::sync::watch::channel(());
21602161

@@ -2221,10 +2222,11 @@ pub(crate) mod tests {
22212222
let network = Network::Main;
22222223
let cli_args = cli_args::Args {
22232224
compose: true,
2225+
network,
22242226
..Default::default()
22252227
};
22262228
let global_state_lock =
2227-
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
2229+
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
22282230

22292231
let (miner_to_main_tx, _miner_to_main_rx) =
22302232
mpsc::channel::<MinerToMain>(MINER_CHANNEL_CAPACITY);

src/models/blockchain/block/mod.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1495,11 +1495,11 @@ pub(crate) mod tests {
14951495

14961496
let alice_wallet = WalletEntropy::devnet_wallet();
14971497
let mut alice = mock_genesis_global_state(
1498-
network,
14991498
3,
15001499
alice_wallet.clone(),
15011500
cli_args::Args {
15021501
guesser_fraction: 0.5,
1502+
network,
15031503
..Default::default()
15041504
},
15051505
)
@@ -1531,10 +1531,9 @@ pub(crate) mod tests {
15311531
for i in 0..10 {
15321532
println!("i: {i}");
15331533
alice = mock_genesis_global_state(
1534-
network,
15351534
3,
15361535
alice_wallet.clone(),
1537-
cli_args::Args::default(),
1536+
cli_args::Args::default_with_network(network),
15381537
)
15391538
.await;
15401539
alice.set_new_tip(block1.clone()).await.unwrap();
@@ -1862,9 +1861,12 @@ pub(crate) mod tests {
18621861
let alice_wallet = WalletEntropy::devnet_wallet();
18631862
let alice_key = alice_wallet.nth_generation_spending_key(0);
18641863
let alice_address = alice_key.to_address();
1865-
let mut alice =
1866-
mock_genesis_global_state(network, 0, alice_wallet, cli_args::Args::default())
1867-
.await;
1864+
let mut alice = mock_genesis_global_state(
1865+
0,
1866+
alice_wallet,
1867+
cli_args::Args::default_with_network(network),
1868+
)
1869+
.await;
18681870

18691871
let output = TxOutput::offchain_native_currency(
18701872
NativeCurrencyAmount::coins(4),
@@ -1952,8 +1954,12 @@ pub(crate) mod tests {
19521954
let mut rng = StdRng::seed_from_u64(893423984854);
19531955
let network = Network::Main;
19541956
let devnet_wallet = WalletEntropy::devnet_wallet();
1955-
let mut alice =
1956-
mock_genesis_global_state(network, 0, devnet_wallet, cli_args::Args::default()).await;
1957+
let mut alice = mock_genesis_global_state(
1958+
0,
1959+
devnet_wallet,
1960+
cli_args::Args::default_with_network(network),
1961+
)
1962+
.await;
19571963

19581964
let job_queue = TritonVmJobQueue::get_instance();
19591965

src/models/blockchain/block/validity/block_program.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,10 +496,9 @@ pub(crate) mod tests {
496496
let mut rng: StdRng = SeedableRng::seed_from_u64(2225550001);
497497
let alice_wallet = WalletEntropy::devnet_wallet();
498498
let alice = mock_genesis_global_state(
499-
network,
500499
3,
501500
WalletEntropy::devnet_wallet(),
502-
cli_args::Args::default(),
501+
cli_args::Args::default_with_network(network),
503502
)
504503
.await;
505504

0 commit comments

Comments
 (0)