Ensure that Sapling version range checks are always guarded by SAPLING_VERSION_GROUP_ID

This commit is contained in:
Kris Nuttycombe 2021-03-31 16:17:32 -06:00
parent 766abede57
commit da3eb82e96
1 changed files with 17 additions and 14 deletions

View File

@ -883,14 +883,14 @@ bool ContextualCheckTransaction(
// Rules that apply to Sapling and later: // Rules that apply to Sapling and later:
if (saplingActive) { if (saplingActive) {
// Reject transactions with invalid version // Reject transactions with invalid version
if (tx.nVersion < SAPLING_MIN_TX_VERSION) { if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) {
return state.DoS( if (tx.nVersion < SAPLING_MIN_TX_VERSION) {
dosLevelConstricting, return state.DoS(
error("ContextualCheckTransaction(): Sapling version too low"), dosLevelConstricting,
REJECT_INVALID, "bad-tx-sapling-version-too-low"); error("ContextualCheckTransaction(): Sapling version too low"),
} REJECT_INVALID, "bad-tx-sapling-version-too-low");
}
if (!futureActive) {
// Reject transactions with invalid version // Reject transactions with invalid version
if (tx.nVersion > SAPLING_MAX_TX_VERSION) { if (tx.nVersion > SAPLING_MAX_TX_VERSION) {
return state.DoS( return state.DoS(
@ -898,7 +898,9 @@ bool ContextualCheckTransaction(
error("ContextualCheckTransaction(): Sapling version too high"), error("ContextualCheckTransaction(): Sapling version too high"),
REJECT_INVALID, "bad-tx-sapling-version-too-high"); REJECT_INVALID, "bad-tx-sapling-version-too-high");
} }
}
if (!futureActive) {
// Reject transactions with invalid version group id // Reject transactions with invalid version group id
if (tx.nVersionGroupId != SAPLING_VERSION_GROUP_ID) { if (tx.nVersionGroupId != SAPLING_VERSION_GROUP_ID) {
return state.DoS( return state.DoS(
@ -1041,6 +1043,13 @@ bool ContextualCheckTransaction(
if (futureActive) { if (futureActive) {
// version group is the most recent available version group ID // version group is the most recent available version group ID
if (tx.nVersionGroupId == ZFUTURE_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 // Reject transactions with invalid version
if (tx.nVersion > SAPLING_MAX_TX_VERSION + 1) { if (tx.nVersion > SAPLING_MAX_TX_VERSION + 1) {
return state.DoS( return state.DoS(
@ -1049,13 +1058,7 @@ bool ContextualCheckTransaction(
REJECT_INVALID, "bad-tx-zfuture-version-too-high"); REJECT_INVALID, "bad-tx-zfuture-version-too-high");
} }
} else if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) { } else if (tx.nVersionGroupId == SAPLING_VERSION_GROUP_ID) {
// Reject transactions with invalid version //allow V4 transactions while futureActive
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");
}
} else { } else {
return state.DoS( return state.DoS(
dosLevelPotentiallyRelaxing, dosLevelPotentiallyRelaxing,