Reject blocks with non-canonical signatures starting from protocol version 60016
This commit is contained in:
19
src/main.cpp
19
src/main.cpp
@@ -3884,22 +3884,27 @@ static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned
|
||||
return (nFound >= nRequired);
|
||||
}
|
||||
|
||||
bool static IsCanonicalBlockSignature(const CBlock* pblock)
|
||||
bool static IsCanonicalBlockSignature(const CBlock* pblock, bool checkLowS)
|
||||
{
|
||||
if (pblock->IsProofOfWork()) {
|
||||
return pblock->vchBlockSig.empty();
|
||||
}
|
||||
|
||||
return IsLowDERSignature(pblock->vchBlockSig, NULL, false);
|
||||
return checkLowS ? IsLowDERSignature(pblock->vchBlockSig, NULL, false) : IsDERSignature(pblock->vchBlockSig, NULL, false);
|
||||
}
|
||||
|
||||
bool ProcessNewBlock(CValidationState& state, const CChainParams& chainparams, CNode* pfrom, const CBlock* pblock, bool fForceProcessing, const CDiskBlockPos* dbp, bool fMayBanPeerIfInvalid)
|
||||
{
|
||||
if (!IsCanonicalBlockSignature(pblock)) {
|
||||
if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_VERSION)
|
||||
return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding"),
|
||||
REJECT_INVALID, "bad-block-signature-encoding");
|
||||
return false;
|
||||
if (!IsCanonicalBlockSignature(pblock, false)) {
|
||||
if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_VERSION)
|
||||
return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding"),
|
||||
REJECT_INVALID, "bad-block-signature-encoding");
|
||||
}
|
||||
|
||||
if (!IsCanonicalBlockSignature(pblock, true)) {
|
||||
if (pfrom && pfrom->nVersion >= CANONICAL_BLOCK_SIG_LOW_S_VERSION)
|
||||
return state.DoS(100, error("ProcessNewBlock(): bad block signature encoding (low-s)"),
|
||||
REJECT_INVALID, "bad-block-signature-encoding");
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user