Skip to content

Test real blocks #601

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ target/
/makefile-target
/makefile-target-opt-level3

# git shouldn't see the proof files. Bc big.
# git shouldn't see the proof files, or block files. Bc big.
/test_data/*.proof
/test_data/blk*.dat

# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Expand Down
102 changes: 20 additions & 82 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,7 @@ pub mod util_types;
#[cfg_attr(coverage_nightly, coverage(off))]
pub mod tests;

use std::collections::HashMap;
use std::env;
use std::net::SocketAddr;
use std::path::PathBuf;

use anyhow::Context;
Expand All @@ -62,8 +60,8 @@ use futures::StreamExt;
use models::blockchain::block::Block;
use models::blockchain::shared::Hash;
use models::peer::handshake_data::HandshakeData;
use models::peer::peer_info::PeerInfo;
use models::state::wallet::wallet_file::WalletFileContext;
use models::state::GlobalState;
use prelude::tasm_lib;
use prelude::triton_vm;
use prelude::twenty_first;
Expand All @@ -88,11 +86,6 @@ use crate::models::channel::MinerToMain;
use crate::models::channel::PeerTaskToMain;
use crate::models::channel::RPCServerToMain;
use crate::models::state::archival_state::ArchivalState;
use crate::models::state::blockchain_state::BlockchainArchivalState;
use crate::models::state::blockchain_state::BlockchainState;
use crate::models::state::light_state::LightState;
use crate::models::state::mempool::Mempool;
use crate::models::state::networking_state::NetworkingState;
use crate::models::state::wallet::wallet_state::WalletState;
use crate::models::state::GlobalStateLock;
use crate::rpc_server::RPC;
Expand Down Expand Up @@ -125,54 +118,13 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
DataDirectory::create_dir_if_not_exists(&data_directory.root_dir_path()).await?;
info!("Data directory is {}", data_directory);

// Get wallet object, create various wallet secret files
let wallet_dir = data_directory.wallet_directory_path();
DataDirectory::create_dir_if_not_exists(&wallet_dir).await?;
let wallet_file_context =
WalletFileContext::read_from_file_or_create(&data_directory.wallet_directory_path())?;
info!("Now getting wallet state. This may take a while if the database needs pruning.");
let wallet_state =
WalletState::try_new_from_context(&data_directory, wallet_file_context, &cli_args).await?;
info!("Got wallet state.");

// Connect to or create databases for block index, peers, mutator set, block sync
let block_index_db = ArchivalState::initialize_block_index_database(&data_directory).await?;
info!("Got block index database");

let peer_databases = NetworkingState::initialize_peer_databases(&data_directory).await?;
info!("Got peer database");

let archival_mutator_set = ArchivalState::initialize_mutator_set(&data_directory).await?;
info!("Got archival mutator set");

let archival_block_mmr = ArchivalState::initialize_archival_block_mmr(&data_directory).await?;
info!("Got archival block MMR");

let archival_state = ArchivalState::new(
data_directory.clone(),
block_index_db,
archival_mutator_set,
archival_block_mmr,
cli_args.network,
)
.await;

// Get latest block. Use hardcoded genesis block if nothing is in database.
let latest_block: Block = archival_state.get_tip().await;

// Bind socket to port on this machine, to handle incoming connections from peers
let incoming_peer_listener = if let Some(incoming_peer_listener) = cli_args.own_listen_port() {
let ret = TcpListener::bind((cli_args.listen_addr, incoming_peer_listener))
.await
.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))?;
info!("Now listening for incoming peer-connections");
ret
} else {
info!("Not accepting incoming peer-connections");
TcpListener::bind("127.0.0.1:0").await?
};

let peer_map: HashMap<SocketAddr, PeerInfo> = HashMap::new();
let (rpc_server_to_main_tx, rpc_server_to_main_rx) =
mpsc::channel::<RPCServerToMain>(RPC_CHANNEL_CAPACITY);
let genesis = Block::genesis(cli_args.network);
let global_state =
GlobalState::try_new(data_directory.clone(), genesis, cli_args.clone()).await?;
let mut global_state_lock =
GlobalStateLock::from_global_state(global_state, rpc_server_to_main_tx.clone());

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

let networking_state = NetworkingState::new(peer_map, peer_databases);

let light_state: LightState = LightState::from(latest_block);
let blockchain_archival_state = BlockchainArchivalState {
light_state,
archival_state,
};
let blockchain_state = BlockchainState::Archival(Box::new(blockchain_archival_state));
let mempool = Mempool::new(
cli_args.max_mempool_size,
cli_args.max_mempool_num_tx,
blockchain_state.light_state().hash(),
);

let (rpc_server_to_main_tx, rpc_server_to_main_rx) =
mpsc::channel::<RPCServerToMain>(RPC_CHANNEL_CAPACITY);

let mut global_state_lock = GlobalStateLock::new(
wallet_state,
blockchain_state,
networking_state,
cli_args,
mempool,
rpc_server_to_main_tx.clone(),
);

if let Some(bootstrap_directory) = global_state_lock.cli().bootstrap_from_directory.clone() {
info!(
"Bootstrapping from directory \"{}\"",
Expand All @@ -232,6 +158,18 @@ pub async fn initialize(cli_args: cli_args::Args) -> Result<MainLoopHandler> {
.await?;
info!("UTXO restoration check complete");

// Bind socket to port on this machine, to handle incoming connections from peers
let incoming_peer_listener = if let Some(incoming_peer_listener) = cli_args.own_listen_port() {
let ret = TcpListener::bind((cli_args.listen_addr, incoming_peer_listener))
.await
.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))?;
info!("Now listening for incoming peer-connections");
ret
} else {
info!("Not accepting incoming peer-connections");
TcpListener::bind("127.0.0.1:0").await?
};

// Connect to peers, and provide each peer task with a thread-safe copy of the state
let own_handshake_data: HandshakeData =
global_state_lock.lock_guard().await.get_own_handshakedata();
Expand Down
14 changes: 4 additions & 10 deletions src/main_loop/proof_upgrader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -901,12 +901,11 @@ mod tests {
// expiry of timelock). Rando is not premine recipient.
let cli_args = cli_args::Args {
min_gobbling_fee: NativeCurrencyAmount::from_nau(5),
network: Network::Main,
network,
..Default::default()
};
let alice =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args.clone())
.await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args.clone()).await;
let pc_tx_low_fee = transaction_from_state(
alice.clone(),
512777439428,
Expand All @@ -916,13 +915,8 @@ mod tests {
.await;

for tx_origin in [TransactionOrigin::Own, TransactionOrigin::Foreign] {
let mut rando = mock_genesis_global_state(
network,
2,
WalletEntropy::new_random(),
cli_args.clone(),
)
.await;
let mut rando =
mock_genesis_global_state(2, WalletEntropy::new_random(), cli_args.clone()).await;
let mut rando = rando.lock_guard_mut().await;
rando
.mempool_insert(pc_tx_low_fee.clone().into(), tx_origin)
Expand Down
41 changes: 21 additions & 20 deletions src/mine_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1156,10 +1156,9 @@ pub(crate) mod tests {
let mut rng = rand::rng();
let network = Network::RegTest;
let global_state_lock = mock_genesis_global_state(
network,
2,
WalletEntropy::devnet_wallet(),
cli_args::Args::default(),
cli_args::Args::default_with_network(network),
)
.await;

Expand Down Expand Up @@ -1224,11 +1223,12 @@ pub(crate) mod tests {
let guesser_fee_fraction = 0.0;
let cli_args = cli_args::Args {
guesser_fraction: guesser_fee_fraction,
network,
..Default::default()
};

let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
let tick = std::time::SystemTime::now();
let (transaction, _coinbase_utxo_info) = make_coinbase_transaction_from_state(
&genesis_block,
Expand Down Expand Up @@ -1259,10 +1259,9 @@ pub(crate) mod tests {
// Verify that a block template made with transaction from the mempool is a valid block
let network = Network::Main;
let mut alice = mock_genesis_global_state(
network,
2,
WalletEntropy::devnet_wallet(),
cli_args::Args::default(),
cli_args::Args::default_with_network(network),
)
.await;
let genesis_block = Block::genesis(network);
Expand Down Expand Up @@ -1439,11 +1438,11 @@ pub(crate) mod tests {
// force SingleProof capability.
let cli = cli_args::Args {
tx_proving_capability: Some(TxProvingCapability::SingleProof),
network,
..Default::default()
};

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

Expand Down Expand Up @@ -1502,10 +1501,11 @@ pub(crate) mod tests {
let network = Network::Main;
let cli_args = cli_args::Args {
guesser_fraction: 0.0,
network,
..Default::default()
};
let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
let tip_block_orig = Block::genesis(network);
let launch_date = tip_block_orig.header().timestamp;
let (worker_task_tx, worker_task_rx) = oneshot::channel::<NewBlockFound>();
Expand Down Expand Up @@ -1574,10 +1574,11 @@ pub(crate) mod tests {
let network = Network::Main;
let cli_args = cli_args::Args {
guesser_fraction: 0.0,
network,
..Default::default()
};
let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
let (worker_task_tx, worker_task_rx) = oneshot::channel::<NewBlockFound>();

let tip_block_orig = global_state_lock
Expand Down Expand Up @@ -1682,10 +1683,9 @@ pub(crate) mod tests {
) -> Result<()> {
let network = Network::RegTest;
let global_state_lock = mock_genesis_global_state(
network,
2,
WalletEntropy::devnet_wallet(),
cli_args::Args::default(),
cli_args::Args::default_with_network(network),
)
.await;

Expand Down Expand Up @@ -1905,11 +1905,11 @@ pub(crate) mod tests {
let cli_args = cli_args::Args {
guesser_fraction: 0.0,
fee_notification: notification_policy,
network,
..Default::default()
};
let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args)
.await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;
let genesis_block = Block::genesis(network);
let launch_date = genesis_block.header().timestamp;

Expand Down Expand Up @@ -2035,12 +2035,13 @@ pub(crate) mod tests {
let cli_args = cli_args::Args {
guesser_fraction,
fee_notification: notification_policy,
network,
..Default::default()
};
let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args)
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args.clone())
.await;
let genesis_block = Block::genesis(network);
let genesis_block = Block::genesis(cli_args.network);
let launch_date = genesis_block.header().timestamp;

let (transaction, expected_utxos) = make_coinbase_transaction_from_state(
Expand Down Expand Up @@ -2150,11 +2151,11 @@ pub(crate) mod tests {
let network = Network::Main;
let cli_args = cli_args::Args {
compose: true,
network,
..Default::default()
};
let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args.clone())
.await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args.clone()).await;

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

Expand Down Expand Up @@ -2221,10 +2222,11 @@ pub(crate) mod tests {
let network = Network::Main;
let cli_args = cli_args::Args {
compose: true,
network,
..Default::default()
};
let global_state_lock =
mock_genesis_global_state(network, 2, WalletEntropy::devnet_wallet(), cli_args).await;
mock_genesis_global_state(2, WalletEntropy::devnet_wallet(), cli_args).await;

let (miner_to_main_tx, _miner_to_main_rx) =
mpsc::channel::<MinerToMain>(MINER_CHANNEL_CAPACITY);
Expand Down Expand Up @@ -2345,10 +2347,9 @@ pub(crate) mod tests {

// obtain global state
let global_state_lock = mock_genesis_global_state(
network,
2,
WalletEntropy::devnet_wallet(),
cli_args::Args::default(),
cli_args::Args::default_with_network(network),
)
.await;

Expand Down
Loading
Loading