From 30674f164c5bc85421584483cf160a94b8f29a44 Mon Sep 17 00:00:00 2001 From: jeffro256 Date: Wed, 29 Jan 2025 00:07:52 -0600 Subject: [PATCH] cryptonote_core: misc v17 consensus rules --- src/cryptonote_config.h | 4 ++++ src/cryptonote_core/tx_verification_utils.cpp | 21 +++++++++++++++++-- src/cryptonote_core/tx_verification_utils.h | 3 +++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/cryptonote_config.h b/src/cryptonote_config.h index 88c8e0c20e3..356c55000c2 100644 --- a/src/cryptonote_config.h +++ b/src/cryptonote_config.h @@ -188,6 +188,10 @@ #define HF_VERSION_BULLETPROOF_PLUS 15 #define HF_VERSION_VIEW_TAGS 15 #define HF_VERSION_2021_SCALING 15 +#define HF_VERSION_FCMP 17 +#define HF_VERSION_REJECT_UNLOCK_TIME 17 +#define HF_VERSION_REJECT_LARGE_EXTRA 17 +#define HF_VERSION_REJECT_UNMIXABLE_V1 17 #define PER_KB_FEE_QUANTIZATION_DECIMALS 8 #define CRYPTONOTE_SCALING_2021_FEE_ROUNDING_PLACES 2 diff --git a/src/cryptonote_core/tx_verification_utils.cpp b/src/cryptonote_core/tx_verification_utils.cpp index 38d74f0848e..2827c1c5287 100644 --- a/src/cryptonote_core/tx_verification_utils.cpp +++ b/src/cryptonote_core/tx_verification_utils.cpp @@ -136,6 +136,7 @@ static bool ver_non_input_consensus_templated(TxForwardIt tx_begin, TxForwardIt std::vector rvv; rvv.reserve(static_cast(std::distance(tx_begin, tx_end))); + const size_t min_tx_version = hf_version >= HF_VERSION_REJECT_UNMIXABLE_V1 ? 2 : 1; const size_t max_tx_version = hf_version < HF_VERSION_DYNAMIC_FEE ? 1 : 2; const size_t tx_weight_limit = get_transaction_weight_limit(hf_version); @@ -153,13 +154,29 @@ static bool ver_non_input_consensus_templated(TxForwardIt tx_begin, TxForwardIt return false; } - // Rule 2 & 3 - if (tx.version == 0 || tx.version > max_tx_version) + // Rule 2, Rule 3, and Rule 10 + if (tx.version < min_tx_version || tx.version > max_tx_version) { tvc.m_verifivation_failed = true; return false; } + // Rule 8 + if (hf_version >= HF_VERSION_REJECT_UNLOCK_TIME && tx.unlock_time != 0) + { + tvc.m_verifivation_failed = true; + tvc.m_nonzero_unlock_time = true; + return false; + } + + // Rule 9 + if (hf_version >= HF_VERSION_REJECT_LARGE_EXTRA && tx.extra.size() > MAX_TX_EXTRA_SIZE) + { + tvc.m_verifivation_failed = true; + tvc.m_tx_extra_too_big = true; + return false; + } + // Rule 4 const size_t tx_weight = get_transaction_weight(tx, blob_size); if (hf_version >= HF_VERSION_PER_BYTE_FEE && tx_weight > tx_weight_limit) diff --git a/src/cryptonote_core/tx_verification_utils.h b/src/cryptonote_core/tx_verification_utils.h index 29b032f2162..671c6989f5f 100644 --- a/src/cryptonote_core/tx_verification_utils.h +++ b/src/cryptonote_core/tx_verification_utils.h @@ -118,6 +118,9 @@ struct pool_supplement * 5. Passes core::check_tx_semantic() * 6. Passes Blockchain::check_tx_outputs() * 7. Passes ver_mixed_rct_semantics() [Uses batch RingCT verification when applicable] + * 8. Check unlock time is 0 from hardfork v17 + * 9. Check extra size <= MAX_TX_EXTRA_SIZE from hardfork v17 + * 10. Check all tx version >= 2 from hardfork v17, even unmixable sweeps * * For pool_supplement input: * We assume the structure of the pool supplement is already correct: for each value entry, the