From da3eb82e961486573d65a88c17def486cf92129a Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Wed, 31 Mar 2021 16:17:32 -0600 Subject: [PATCH] Ensure that Sapling version range checks are always guarded by SAPLING_VERSION_GROUP_ID --- src/main.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a924aff71..8d6d7179d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -883,14 +883,14 @@ bool ContextualCheckTransaction( // Rules that apply to Sapling and later: if (saplingActive) { // Reject transactions with invalid version - if (tx.nVersion < SAPLING_MIN_TX_VERSION) { - return state.DoS( - dosLevelConstricting, - error("ContextualCheckTransaction(): Sapling version too low"), - REJECT_INVALID, "bad-tx-sapling-version-too-low"); - } + if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) { + if (tx.nVersion < SAPLING_MIN_TX_VERSION) { + return state.DoS( + dosLevelConstricting, + error("ContextualCheckTransaction(): Sapling version too low"), + REJECT_INVALID, "bad-tx-sapling-version-too-low"); + } - if (!futureActive) { // Reject transactions with invalid version if (tx.nVersion > SAPLING_MAX_TX_VERSION) { return state.DoS( @@ -898,7 +898,9 @@ bool ContextualCheckTransaction( error("ContextualCheckTransaction(): Sapling version too high"), REJECT_INVALID, "bad-tx-sapling-version-too-high"); } + } + if (!futureActive) { // Reject transactions with invalid version group id if (tx.nVersionGroupId != SAPLING_VERSION_GROUP_ID) { return state.DoS( @@ -1041,6 +1043,13 @@ bool ContextualCheckTransaction( if (futureActive) { // version group is the most recent available version group ID if (tx.nVersionGroupId == ZFUTURE_VERSION_GROUP_ID) { + if (tx.nVersion <= SAPLING_MAX_TX_VERSION) { + return state.DoS( + dosLevelConstricting, + error("ContextualCheckTransaction(): Future version too low"), + REJECT_INVALID, "bad-tx-zfuture-version-too-low"); + } + // Reject transactions with invalid version if (tx.nVersion > SAPLING_MAX_TX_VERSION + 1) { return state.DoS( @@ -1049,13 +1058,7 @@ bool ContextualCheckTransaction( REJECT_INVALID, "bad-tx-zfuture-version-too-high"); } } else if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) { - // Reject transactions with invalid version - if (tx.nVersion > SAPLING_MAX_TX_VERSION) { - return state.DoS( - dosLevelPotentiallyRelaxing, - error("ContextualCheckTransaction(): Sapling version too high"), - REJECT_INVALID, "bad-tx-sapling-version-too-high"); - } + //allow V4 transactions while futureActive } else { return state.DoS( dosLevelPotentiallyRelaxing,