From b81e168b2a8f21d6831230f12f7c99c11e7b352a Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Tue, 16 Jan 2024 21:32:10 +0100 Subject: [PATCH] CURRENCY_HF4_MANDATORY_DECOY_SET_SIZE implemented as configurable(for coretest we would need to have 0 mixins due to old tests) --- src/currency_core/blockchain_storage.cpp | 2 +- src/currency_core/blockchain_storage.h | 4 ++-- src/currency_core/core_runtime_config.h | 2 ++ src/currency_core/currency_format_utils.cpp | 4 ++-- src/currency_core/currency_format_utils.h | 2 +- src/wallet/wallet2.cpp | 2 +- tests/core_tests/chaingen.cpp | 1 + 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/currency_core/blockchain_storage.cpp b/src/currency_core/blockchain_storage.cpp index 0dc1f949..3261626b 100644 --- a/src/currency_core/blockchain_storage.cpp +++ b/src/currency_core/blockchain_storage.cpp @@ -7475,7 +7475,7 @@ bool blockchain_storage::validate_alt_block_input(const transaction& input_tx, const txout_to_key& out_tk = boost::get(t); pk = out_tk.key; - bool mixattr_ok = is_mixattr_applicable_for_fake_outs_counter(p->tx.version, out_tk.mix_attr, abs_key_offsets.size() - 1); + bool mixattr_ok = is_mixattr_applicable_for_fake_outs_counter(p->tx.version, out_tk.mix_attr, abs_key_offsets.size() - 1, this->get_core_runtime_config()); CHECK_AND_ASSERT_MES(mixattr_ok, false, "input offset #" << pk_n << " violates mixin restrictions: mix_attr = " << static_cast(out_tk.mix_attr) << ", input's key_offsets.size = " << abs_key_offsets.size()); } diff --git a/src/currency_core/blockchain_storage.h b/src/currency_core/blockchain_storage.h index d9e7e478..2ebae077 100644 --- a/src/currency_core/blockchain_storage.h +++ b/src/currency_core/blockchain_storage.h @@ -809,7 +809,7 @@ namespace currency //fix for burned money patch_out_if_needed(const_cast(outtk), tx_id, n); - bool mixattr_ok = is_mixattr_applicable_for_fake_outs_counter(tx_ptr->tx.version, outtk.mix_attr, key_offsets.size() - 1); + bool mixattr_ok = is_mixattr_applicable_for_fake_outs_counter(tx_ptr->tx.version, outtk.mix_attr, key_offsets.size() - 1, this->get_core_runtime_config()); CHECK_AND_ASSERT_MES(mixattr_ok, false, "tx input ref #" << output_index << " violates mixin restrictions: tx.version = " << tx_ptr->tx.version << ", mix_attr = " << static_cast(outtk.mix_attr) << ", key_offsets.size = " << key_offsets.size()); if (hf4) { @@ -862,7 +862,7 @@ namespace currency bool r = is_output_allowed_for_input(out_zc, verified_input); CHECK_AND_ASSERT_MES(r, false, "Input and output are incompatible"); - r = is_mixattr_applicable_for_fake_outs_counter(tx_ptr->tx.version, out_zc.mix_attr, key_offsets.size() - 1); + r = is_mixattr_applicable_for_fake_outs_counter(tx_ptr->tx.version, out_zc.mix_attr, key_offsets.size() - 1, this->get_core_runtime_config()); CHECK_AND_ASSERT_MES(r, false, "tx input ref #" << output_index << " violates mixin restrictions: tx.version = " << tx_ptr->tx.version << ", mix_attr = " << static_cast(out_zc.mix_attr) << ", key_offsets.size = " << key_offsets.size()); bool legit_output_key = validate_output_key_legit(out_zc.stealth_address); diff --git a/src/currency_core/core_runtime_config.h b/src/currency_core/core_runtime_config.h index 31472800..f970e144 100644 --- a/src/currency_core/core_runtime_config.h +++ b/src/currency_core/core_runtime_config.h @@ -105,6 +105,7 @@ namespace currency uint64_t max_alt_blocks; crypto::public_key alias_validation_pubkey; core_time_func_t get_core_time; + uint64_t hf4_minimum_mixins; hard_forks_descriptor hard_forks; @@ -127,6 +128,7 @@ namespace currency pc.tx_pool_min_fee = TX_MINIMUM_FEE; pc.tx_default_fee = TX_DEFAULT_FEE; pc.max_alt_blocks = CURRENCY_ALT_BLOCK_MAX_COUNT; + pc.hf4_minimum_mixins = CURRENCY_HF4_MANDATORY_DECOY_SET_SIZE; // TODO: refactor the following pc.hard_forks.set_hardfork_height(1, ZANO_HARDFORK_01_AFTER_HEIGHT); diff --git a/src/currency_core/currency_format_utils.cpp b/src/currency_core/currency_format_utils.cpp index faa72a9f..a68cf842 100644 --- a/src/currency_core/currency_format_utils.cpp +++ b/src/currency_core/currency_format_utils.cpp @@ -728,12 +728,12 @@ namespace currency return total; } //--------------------------------------------------------------- - bool is_mixattr_applicable_for_fake_outs_counter(uint64_t out_tx_version, uint8_t mix_attr, uint64_t fake_outputs_count) + bool is_mixattr_applicable_for_fake_outs_counter(uint64_t out_tx_version, uint8_t mix_attr, uint64_t fake_outputs_count, const core_runtime_config& rtc) { if (out_tx_version >= TRANSACTION_VERSION_POST_HF4) { if (mix_attr != CURRENCY_TO_KEY_OUT_FORCED_NO_MIX) - return fake_outputs_count == CURRENCY_HF4_MANDATORY_DECOY_SET_SIZE; + return fake_outputs_count >= rtc.hf4_minimum_mixins; else return fake_outputs_count == 0; // CURRENCY_TO_KEY_OUT_FORCED_NO_MIX } diff --git a/src/currency_core/currency_format_utils.h b/src/currency_core/currency_format_utils.h index dace13a0..dd58c5ff 100644 --- a/src/currency_core/currency_format_utils.h +++ b/src/currency_core/currency_format_utils.h @@ -362,7 +362,7 @@ namespace currency tx_derivation_hint make_tx_derivation_hint_from_uint16(uint16_t hint); std::string short_hash_str(const crypto::hash& h); - bool is_mixattr_applicable_for_fake_outs_counter(uint64_t out_tx_version, uint8_t out_mix_attr, uint64_t fake_outputs_count); + bool is_mixattr_applicable_for_fake_outs_counter(uint64_t out_tx_version, uint8_t out_mix_attr, uint64_t fake_outputs_count, const core_runtime_config& rtc); bool is_tx_spendtime_unlocked(uint64_t unlock_time, uint64_t current_blockchain_size, uint64_t current_time); crypto::key_derivation get_encryption_key_derivation(bool is_income, const transaction& tx, const account_keys& acc_keys); bool decrypt_payload_items(bool is_income, const transaction& tx, const account_keys& acc_keys, std::vector& decrypted_items); diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 9fa3089d..1c3f77ab 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -6526,7 +6526,7 @@ bool wallet2::is_transfer_able_to_go(const transfer_details& td, uint64_t fake_o uint8_t mix_attr = CURRENCY_TO_KEY_OUT_RELAXED; if (get_mix_attr_from_tx_out_v(out_v, mix_attr)) { - if (!currency::is_mixattr_applicable_for_fake_outs_counter(td.m_ptx_wallet_info->m_tx.version, mix_attr, fake_outputs_count)) + if (!currency::is_mixattr_applicable_for_fake_outs_counter(td.m_ptx_wallet_info->m_tx.version, mix_attr, fake_outputs_count, m_core_runtime_config)) return false; } diff --git a/tests/core_tests/chaingen.cpp b/tests/core_tests/chaingen.cpp index fde7294e..7b68213c 100644 --- a/tests/core_tests/chaingen.cpp +++ b/tests/core_tests/chaingen.cpp @@ -2478,6 +2478,7 @@ bool test_chain_unit_enchanced::configure_core(currency::core& c, size_t ev_inde currency::core_runtime_config pc = c.get_blockchain_storage().get_core_runtime_config(); pc.min_coinstake_age = TESTS_POS_CONFIG_MIN_COINSTAKE_AGE; pc.pos_minimum_heigh = TESTS_POS_CONFIG_POS_MINIMUM_HEIGH; + pc.hf4_minimum_mixins = 0; pc.hard_forks = m_hardforks; c.get_blockchain_storage().set_core_runtime_config(pc); return true;