Require that shielded coinbase output note plaintexts are version 2 if Canopy is active.
Co-authored by Ying Tong (yingtong@electriccoin.co)
This commit is contained in:
parent
bf9baf2cb6
commit
4af761121d
17
src/main.cpp
17
src/main.cpp
|
@ -792,6 +792,7 @@ bool ContextualCheckTransaction(
|
||||||
bool saplingActive = chainparams.GetConsensus().NetworkUpgradeActive(nHeight, Consensus::UPGRADE_SAPLING);
|
bool saplingActive = chainparams.GetConsensus().NetworkUpgradeActive(nHeight, Consensus::UPGRADE_SAPLING);
|
||||||
bool isSprout = !overwinterActive;
|
bool isSprout = !overwinterActive;
|
||||||
bool heartwoodActive = chainparams.GetConsensus().NetworkUpgradeActive(nHeight, Consensus::UPGRADE_HEARTWOOD);
|
bool heartwoodActive = chainparams.GetConsensus().NetworkUpgradeActive(nHeight, Consensus::UPGRADE_HEARTWOOD);
|
||||||
|
bool canopyActive = chainparams.GetConsensus().NetworkUpgradeActive(nHeight, Consensus::UPGRADE_CANOPY);
|
||||||
|
|
||||||
// If Sprout rules apply, reject transactions which are intended for Overwinter and beyond
|
// If Sprout rules apply, reject transactions which are intended for Overwinter and beyond
|
||||||
if (isSprout && tx.fOverwintered) {
|
if (isSprout && tx.fOverwintered) {
|
||||||
|
@ -919,19 +920,29 @@ bool ContextualCheckTransaction(
|
||||||
}
|
}
|
||||||
|
|
||||||
// SaplingNotePlaintext::decrypt() checks note commitment validity.
|
// SaplingNotePlaintext::decrypt() checks note commitment validity.
|
||||||
if (!SaplingNotePlaintext::decrypt(
|
auto encPlaintext = SaplingNotePlaintext::decrypt(
|
||||||
output.encCiphertext,
|
output.encCiphertext,
|
||||||
output.ephemeralKey,
|
output.ephemeralKey,
|
||||||
outPlaintext->esk,
|
outPlaintext->esk,
|
||||||
outPlaintext->pk_d,
|
outPlaintext->pk_d,
|
||||||
output.cmu)
|
output.cmu);
|
||||||
) {
|
if (!encPlaintext) {
|
||||||
return state.DoS(
|
return state.DoS(
|
||||||
DOS_LEVEL_BLOCK,
|
DOS_LEVEL_BLOCK,
|
||||||
error("CheckTransaction(): coinbase output description has invalid encCiphertext"),
|
error("CheckTransaction(): coinbase output description has invalid encCiphertext"),
|
||||||
REJECT_INVALID,
|
REJECT_INVALID,
|
||||||
"bad-cb-output-desc-invalid-encct");
|
"bad-cb-output-desc-invalid-encct");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ZIP 212: Check that the note plaintexts use the v2 note plaintext
|
||||||
|
// version.
|
||||||
|
if (canopyActive != (encPlaintext->get_lead_byte() == 0x02)) {
|
||||||
|
return state.DoS(
|
||||||
|
DOS_LEVEL_BLOCK,
|
||||||
|
error("CheckTransaction(): coinbase output description has invalid note plaintext version"),
|
||||||
|
REJECT_INVALID,
|
||||||
|
"bad-cb-output-desc-invalid-note-plaintext-version");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,6 +171,9 @@ public:
|
||||||
|
|
||||||
uint256 rcm() const;
|
uint256 rcm() const;
|
||||||
uint256 generate_esk() const;
|
uint256 generate_esk() const;
|
||||||
|
bool get_lead_byte() const {
|
||||||
|
return leadByte;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class SaplingOutgoingPlaintext
|
class SaplingOutgoingPlaintext
|
||||||
|
|
Loading…
Reference in New Issue