From eb7bf075cfb3ecc4e8ddfce01ef515a0548f3d18 Mon Sep 17 00:00:00 2001 From: sowle Date: Fri, 6 Sep 2019 18:59:59 +0300 Subject: [PATCH] coretests: hard_fork_1_pos_locked_height_vs_time greatly improved with additional checks --- tests/core_tests/hard_fork_1.cpp | 84 +++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/tests/core_tests/hard_fork_1.cpp b/tests/core_tests/hard_fork_1.cpp index eb2b4d3b..e8683a5f 100644 --- a/tests/core_tests/hard_fork_1.cpp +++ b/tests/core_tests/hard_fork_1.cpp @@ -614,14 +614,16 @@ bool hard_fork_1_pos_locked_height_vs_time::generate(std::vector Alice, miner -> Bob + uint64_t stake_unlock_time = 100; // locked until block 100 + uint64_t stake_amount = MK_TEST_COINS(10); std::vector extra; etc_tx_details_unlock_time ut = AUTO_VAL_INIT(ut); - ut.v = 100; // locked until block 100 + ut.v = stake_unlock_time; extra.push_back(ut); std::vector destinations; - destinations.push_back(tx_destination_entry(MK_TEST_COINS(10), alice_acc.get_public_address())); - destinations.push_back(tx_destination_entry(MK_TEST_COINS(10), bob_acc.get_public_address())); + destinations.push_back(tx_destination_entry(stake_amount, alice_acc.get_public_address())); + destinations.push_back(tx_destination_entry(stake_amount, bob_acc.get_public_address())); transaction tx_0 = AUTO_VAL_INIT(tx_0); r = construct_tx_to_key(events, tx_0, blk_0r, miner_acc, destinations, TESTS_DEFAULT_FEE, 0, 0, extra); @@ -635,7 +637,7 @@ bool hard_fork_1_pos_locked_height_vs_time::generate(std::vector()); pb.step3_build_stake_kernel(stake_output_amount, stake_output_gidx, stake_output_key_image, diff, prev_id, null_hash, prev_block.timestamp); - pb.step4_generate_coinbase_tx(generator.get_timestamps_median(prev_id), generator.get_already_generated_coins(prev_block), miner_acc.get_public_address()); + pb.step4_generate_coinbase_tx(generator.get_timestamps_median(prev_id), generator.get_already_generated_coins(prev_block), miner_acc.get_public_address(), stakeholder.get_public_address()); // set etc_tx_details_unlock_time2 remove_unlock_v1_entries_from_extra(pb.m_block.miner_tx.extra); // clear already set unlock @@ -672,11 +674,57 @@ bool hard_fork_1_pos_locked_height_vs_time::generate(std::vector(stake.vout[stake_output_idx].target).key; + + pos_block_builder pb; + pb.step1_init_header(height, prev_id); + pb.m_block.major_version = CURRENT_BLOCK_MAJOR_VERSION; + pb.step2_set_txs(std::vector()); + pb.step3_build_stake_kernel(stake_output_amount, stake_output_gidx, stake_output_key_image, diff, prev_id, null_hash, prev_block.timestamp); + pb.step4_generate_coinbase_tx(generator.get_timestamps_median(prev_id), generator.get_already_generated_coins(prev_block), miner_acc.get_public_address(), stakeholder.get_public_address()); + + // set etc_tx_details_unlock_time2 + remove_unlock_v1_entries_from_extra(pb.m_block.miner_tx.extra); // clear already set unlock + std::vector extra; + etc_tx_details_unlock_time2 ut2 = AUTO_VAL_INIT(ut2); + ut2.unlock_time_array.push_back(height + CURRENCY_MINED_MONEY_UNLOCK_WINDOW); // reward lock + for(size_t i = 0; i < pb.m_block.miner_tx.vout.size() - 1; ++i) + ut2.unlock_time_array.push_back(stake_unlock_time - 1); // stake locked by 1 less height that stake_unlock_time, that is incorrect as lock time of this coin is decreased + extra.push_back(ut2); + pb.m_block.miner_tx.extra.push_back(ut2); + + pb.step5_sign(stake_tx_pub_key, stake_output_idx, stake_output_pubkey, stakeholder); + blk_b2 = pb.m_block; + } + + // should no pass because stake output has less lock time than stake input + DO_CALLBACK(events, "mark_invalid_block"); + events.push_back(blk_b2); block blk_good; { @@ -702,7 +750,7 @@ bool hard_fork_1_pos_locked_height_vs_time::generate(std::vector()); pb.step3_build_stake_kernel(stake_output_amount, stake_output_gidx, stake_output_key_image, diff, prev_id, null_hash, prev_block.timestamp); - pb.step4_generate_coinbase_tx(generator.get_timestamps_median(prev_id), generator.get_already_generated_coins(prev_block), miner_acc.get_public_address()); + pb.step4_generate_coinbase_tx(generator.get_timestamps_median(prev_id), generator.get_already_generated_coins(prev_block), miner_acc.get_public_address(), stakeholder.get_public_address()); // set etc_tx_details_unlock_time2 remove_unlock_v1_entries_from_extra(pb.m_block.miner_tx.extra); // clear already set unlock @@ -710,7 +758,7 @@ bool hard_fork_1_pos_locked_height_vs_time::generate(std::vector()); // add modified block info + + MAKE_NEXT_BLOCK(events, blk_2, blk_good, miner_acc); + + std::vector sources; + r = fill_tx_sources(sources, events, blk_2, alice_acc.get_keys(), stake_amount / 2 + TESTS_DEFAULT_FEE, 0 /* nmix */, true /* check for spends */, false /* check for unlock time */); + CHECK_AND_ASSERT_MES(r, false, "fill_tx_sources failed"); + transaction tx_1 = AUTO_VAL_INIT(tx_1); + r = construct_tx(alice_acc.get_keys(), sources, std::vector{ tx_destination_entry(stake_amount / 2, miner_acc.get_public_address()) }, + empty_attachment, tx_1, stake_unlock_time /* try to use stake unlock time -- should not work as it is not a coinbase */); + CHECK_AND_ASSERT_MES(r, false, "construct_tx failed"); + + DO_CALLBACK(events, "mark_invalid_tx"); + events.push_back(tx_1); return true; }