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:
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,