Remove early return logic from transaction parsing

This also fixes a bug in `CTransaction::SerializationOp` where
`CTransaction::UpdateHash` was not being called for v5 transactions.
This commit is contained in:
Jack Grigg 2021-06-11 22:56:01 +01:00
parent 66832c1e54
commit 88b3c377d1
1 changed files with 47 additions and 49 deletions

View File

@ -857,32 +857,31 @@ public:
// Orchard Transaction Fields // Orchard Transaction Fields
READWRITE(*const_cast<OrchardBundle*>(&orchardBundle)); READWRITE(*const_cast<OrchardBundle*>(&orchardBundle));
} else {
return; // Legacy transaction formats
} READWRITE(*const_cast<std::vector<CTxIn>*>(&vin));
READWRITE(*const_cast<std::vector<CTxOut>*>(&vout));
READWRITE(*const_cast<std::vector<CTxIn>*>(&vin)); READWRITE(*const_cast<uint32_t*>(&nLockTime));
READWRITE(*const_cast<std::vector<CTxOut>*>(&vout)); if (isOverwinterV3 || isSaplingV4 || isFuture) {
READWRITE(*const_cast<uint32_t*>(&nLockTime)); READWRITE(*const_cast<uint32_t*>(&nExpiryHeight));
if (isOverwinterV3 || isSaplingV4 || isFuture) { }
READWRITE(*const_cast<uint32_t*>(&nExpiryHeight)); if (isSaplingV4 || isFuture) {
} READWRITE(*const_cast<CAmount*>(&valueBalance));
if (isSaplingV4 || isFuture) { READWRITE(*const_cast<std::vector<SpendDescription>*>(&vShieldedSpend));
READWRITE(*const_cast<CAmount*>(&valueBalance)); READWRITE(*const_cast<std::vector<OutputDescription>*>(&vShieldedOutput));
READWRITE(*const_cast<std::vector<SpendDescription>*>(&vShieldedSpend)); }
READWRITE(*const_cast<std::vector<OutputDescription>*>(&vShieldedOutput)); if (nVersion >= 2) {
} // These fields do not depend on fOverwintered
if (nVersion >= 2) { auto os = WithVersion(&s, static_cast<int>(header));
// These fields do not depend on fOverwintered ::SerReadWrite(os, *const_cast<std::vector<JSDescription>*>(&vJoinSplit), ser_action);
auto os = WithVersion(&s, static_cast<int>(header)); if (vJoinSplit.size() > 0) {
::SerReadWrite(os, *const_cast<std::vector<JSDescription>*>(&vJoinSplit), ser_action); READWRITE(*const_cast<Ed25519VerificationKey*>(&joinSplitPubKey));
if (vJoinSplit.size() > 0) { READWRITE(*const_cast<Ed25519Signature*>(&joinSplitSig));
READWRITE(*const_cast<Ed25519VerificationKey*>(&joinSplitPubKey)); }
READWRITE(*const_cast<Ed25519Signature*>(&joinSplitSig)); }
if ((isSaplingV4 || isFuture) && !(vShieldedSpend.empty() && vShieldedOutput.empty())) {
READWRITE(*const_cast<binding_sig_t*>(&bindingSig));
} }
}
if ((isSaplingV4 || isFuture) && !(vShieldedSpend.empty() && vShieldedOutput.empty())) {
READWRITE(*const_cast<binding_sig_t*>(&bindingSig));
} }
if (ser_action.ForRead()) if (ser_action.ForRead())
UpdateHash(); UpdateHash();
@ -1049,31 +1048,30 @@ struct CMutableTransaction
// Orchard Transaction Fields // Orchard Transaction Fields
READWRITE(orchardBundle); READWRITE(orchardBundle);
} else {
return; // Legacy transaction formats
} READWRITE(vin);
READWRITE(vout);
READWRITE(vin); READWRITE(nLockTime);
READWRITE(vout); if (isOverwinterV3 || isSaplingV4 || isFuture) {
READWRITE(nLockTime); READWRITE(nExpiryHeight);
if (isOverwinterV3 || isSaplingV4 || isFuture) { }
READWRITE(nExpiryHeight); if (isSaplingV4 || isFuture) {
} READWRITE(valueBalance);
if (isSaplingV4 || isFuture) { READWRITE(vShieldedSpend);
READWRITE(valueBalance); READWRITE(vShieldedOutput);
READWRITE(vShieldedSpend); }
READWRITE(vShieldedOutput); if (nVersion >= 2) {
} auto os = WithVersion(&s, static_cast<int>(header));
if (nVersion >= 2) { ::SerReadWrite(os, vJoinSplit, ser_action);
auto os = WithVersion(&s, static_cast<int>(header)); if (vJoinSplit.size() > 0) {
::SerReadWrite(os, vJoinSplit, ser_action); READWRITE(joinSplitPubKey);
if (vJoinSplit.size() > 0) { READWRITE(joinSplitSig);
READWRITE(joinSplitPubKey); }
READWRITE(joinSplitSig); }
if ((isSaplingV4 || isFuture) && !(vShieldedSpend.empty() && vShieldedOutput.empty())) {
READWRITE(bindingSig);
} }
}
if ((isSaplingV4 || isFuture) && !(vShieldedSpend.empty() && vShieldedOutput.empty())) {
READWRITE(bindingSig);
} }
} }