Skip to content

Commit 63a0af0

Browse files
authored
Merge pull request #601 from Neptune-Crypto/test-real-blocks
Test real blocks Add a test that downloads real main net blocks and verifies that state can be restored from it.
2 parents 57516c8 + 568b952 commit 63a0af0

File tree

17 files changed

+672
-668
lines changed

17 files changed

+672
-668
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ target/
77
/makefile-target
88
/makefile-target-opt-level3
99

10-
# git shouldn't see the proof files. Bc big.
10+
# git shouldn't see the proof files, or block files. Bc big.
1111
/test_data/*.proof
12+
/test_data/blk*.dat
1213

1314
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
1415
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html

src/lib.rs

Lines changed: 20 additions & 82 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,8 +60,8 @@ 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;
64+
use models::state::GlobalState;
6765
use prelude::tasm_lib;
6866
use prelude::triton_vm;
6967
use prelude::twenty_first;
@@ -88,11 +86,6 @@ use crate::models::channel::MinerToMain;
8886
use crate::models::channel::PeerTaskToMain;
8987
use crate::models::channel::RPCServerToMain;
9088
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;
9689
use crate::models::state::wallet::wallet_state::WalletState;
9790
use crate::models::state::GlobalStateLock;
9891
use crate::rpc_server::RPC;
@@ -125,54 +118,13 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
125118
DataDirectory::create_dir_if_not_exists(&data_directory.root_dir_path()).await?;
126119
info!("Data directory is {}", data_directory);
127120

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-
let block_index_db = ArchivalState::initialize_block_index_database(&data_directory).await?;
140-
info!("Got block index database");
141-
142-
let peer_databases = NetworkingState::initialize_peer_databases(&data_directory).await?;
143-
info!("Got peer database");
144-
145-
let archival_mutator_set = ArchivalState::initialize_mutator_set(&data_directory).await?;
146-
info!("Got archival mutator set");
147-
148-
let archival_block_mmr = ArchivalState::initialize_archival_block_mmr(&data_directory).await?;
149-
info!("Got archival block MMR");
150-
151-
let archival_state = ArchivalState::new(
152-
data_directory.clone(),
153-
block_index_db,
154-
archival_mutator_set,
155-
archival_block_mmr,
156-
cli_args.network,
157-
)
158-
.await;
159-
160-
// Get latest block. Use hardcoded genesis block if nothing is in database.
161-
let latest_block: Block = archival_state.get_tip().await;
162-
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-
175-
let peer_map: HashMap<SocketAddr, PeerInfo> = HashMap::new();
121+
let (rpc_server_to_main_tx, rpc_server_to_main_rx) =
122+
mpsc::channel::<RPCServerToMain>(RPC_CHANNEL_CAPACITY);
123+
let genesis = Block::genesis(cli_args.network);
124+
let global_state =
125+
GlobalState::try_new(data_directory.clone(), genesis, cli_args.clone()).await?;
126+
let mut global_state_lock =
127+
GlobalStateLock::from_global_state(global_state, rpc_server_to_main_tx.clone());
176128

177129
// Construct the broadcast channel to communicate from the main task to peer tasks
178130
let (main_to_peer_broadcast_tx, _main_to_peer_broadcast_rx) =
@@ -182,32 +134,6 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
182134
let (peer_task_to_main_tx, peer_task_to_main_rx) =
183135
mpsc::channel::<PeerTaskToMain>(PEER_CHANNEL_CAPACITY);
184136

185-
let networking_state = NetworkingState::new(peer_map, peer_databases);
186-
187-
let light_state: LightState = LightState::from(latest_block);
188-
let blockchain_archival_state = BlockchainArchivalState {
189-
light_state,
190-
archival_state,
191-
};
192-
let blockchain_state = BlockchainState::Archival(Box::new(blockchain_archival_state));
193-
let mempool = Mempool::new(
194-
cli_args.max_mempool_size,
195-
cli_args.max_mempool_num_tx,
196-
blockchain_state.light_state().hash(),
197-
);
198-
199-
let (rpc_server_to_main_tx, rpc_server_to_main_rx) =
200-
mpsc::channel::<RPCServerToMain>(RPC_CHANNEL_CAPACITY);
201-
202-
let mut global_state_lock = GlobalStateLock::new(
203-
wallet_state,
204-
blockchain_state,
205-
networking_state,
206-
cli_args,
207-
mempool,
208-
rpc_server_to_main_tx.clone(),
209-
);
210-
211137
if let Some(bootstrap_directory) = global_state_lock.cli().bootstrap_from_directory.clone() {
212138
info!(
213139
"Bootstrapping from directory \"{}\"",
@@ -232,6 +158,18 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
232158
.await?;
233159
info!("UTXO restoration check complete");
234160

161+
// Bind socket to port on this machine, to handle incoming connections from peers
162+
let incoming_peer_listener = if let Some(incoming_peer_listener) = cli_args.own_listen_port() {
163+
let ret = TcpListener::bind((cli_args.listen_addr, incoming_peer_listener))
164+
.await
165+
.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))?;
166+
info!("Now listening for incoming peer-connections");
167+
ret
168+
} else {
169+
info!("Not accepting incoming peer-connections");
170+
TcpListener::bind("127.0.0.1:0").await?
171+
};
172+
235173
// Connect to peers, and provide each peer task with a thread-safe copy of the state
236174
let own_handshake_data: HandshakeData =
237175
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: 21 additions & 20 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);
@@ -2345,10 +2347,9 @@ pub(crate) mod tests {
23452347

23462348
// obtain global state
23472349
let global_state_lock = mock_genesis_global_state(
2348-
network,
23492350
2,
23502351
WalletEntropy::devnet_wallet(),
2351-
cli_args::Args::default(),
2352+
cli_args::Args::default_with_network(network),
23522353
)
23532354
.await;
23542355

0 commit comments

Comments
 (0)