From 5e10bd55d1b0b8926dd6cbcfdbfbf2b105207b09 Mon Sep 17 00:00:00 2001 From: Jude Nelson Date: Wed, 16 Nov 2022 15:25:41 -0500 Subject: [PATCH] feat: verify that the node can produce invalid blocks but continue to mine valid blocks afterwards (simulating a transient mining bug) --- .../src/tests/neon_integrations.rs | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/testnet/stacks-node/src/tests/neon_integrations.rs b/testnet/stacks-node/src/tests/neon_integrations.rs index 74577b395..aaff25470 100644 --- a/testnet/stacks-node/src/tests/neon_integrations.rs +++ b/testnet/stacks-node/src/tests/neon_integrations.rs @@ -1113,6 +1113,77 @@ fn deep_contract() { test_observer::clear(); } +#[test] +#[ignore] +fn bad_microblock_pubkey() { + if env::var("BITCOIND_TEST") != Ok("1".into()) { + return; + } + + let (mut conf, _miner_account) = neon_integration_test_conf(); + + test_observer::spawn(); + + conf.events_observers.push(EventObserverConfig { + endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT), + events_keys: vec![EventKeyType::AnyEvent], + }); + + let mut btcd_controller = BitcoinCoreController::new(conf.clone()); + btcd_controller + .start_bitcoind() + .map_err(|_e| ()) + .expect("Failed starting bitcoind"); + + let burnchain_config = Burnchain::regtest(&conf.get_burn_db_path()); + + let mut btc_regtest_controller = BitcoinRegtestController::with_burnchain( + conf.clone(), + None, + Some(burnchain_config.clone()), + None, + ); + + btc_regtest_controller.bootstrap_chain(201); + + eprintln!("Chain bootstrapped..."); + + let mut run_loop = neon::RunLoop::new(conf.clone()); + let blocks_processed = run_loop.get_blocks_processed_arc(); + let _client = reqwest::blocking::Client::new(); + let channel = run_loop.get_coordinator_channel().unwrap(); + + thread::spawn(move || run_loop.start(Some(burnchain_config), 0)); + + // give the run loop some time to start up! + wait_for_runloop(&blocks_processed); + + // first block wakes up the run loop + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + + // first block will hold our VRF registration + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + + // second block will be the first mined Stacks block + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + + // fault injection + env::set_var("STACKS_MICROBLOCK_PUBKEY_HASH", "0000000000000000000000000000000000000000"); + for _i in 0..10 { + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + } + + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + next_block_and_wait(&mut btc_regtest_controller, &blocks_processed); + + let blocks = test_observer::get_blocks(); + assert!(blocks.len() <= 3); + + channel.stop_chains_coordinator(); + test_observer::clear(); +} + #[test] #[ignore] fn liquid_ustx_integration() {