diff options
| author | Patrick Lodder <[email protected]> | 2015-07-11 14:41:33 +0200 |
|---|---|---|
| committer | Patrick Lodder <[email protected]> | 2015-07-11 14:41:33 +0200 |
| commit | b66e509800025bbcd90f518b90f3b7cb582b99db (patch) | |
| tree | 0422e17d73ffc244e48ba41c4ea63cd39c8b09dd /src/main.cpp | |
| parent | Merge pull request #1199 from patricklodder/1.10-partition-alert (diff) | |
| parent | Adapt AuxPoW to Dogecoin (diff) | |
| download | discoin-b66e509800025bbcd90f518b90f3b7cb582b99db.tar.xz discoin-b66e509800025bbcd90f518b90f3b7cb582b99db.zip | |
Merge pull request #1200 from rnicoll/1.10-auxpow-clean
Add AuxPoW support
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/main.cpp b/src/main.cpp index 91d89cea7..39b97d1d6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,7 @@ #include "addrman.h" #include "alert.h" #include "arith_uint256.h" +#include "auxpow.h" #include "chainparams.h" #include "checkpoints.h" #include "checkqueue.h" @@ -1159,7 +1160,11 @@ bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos, const CMessageHeader::M return true; } -bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos) +/* Generic implementation of block reading that can handle + both a block and its header. */ + +template<typename T> +static bool ReadBlockOrHeader(T& block, const CDiskBlockPos& pos) { block.SetNull(); @@ -1177,15 +1182,16 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos) } // Check the header - if (!CheckProofOfWork(block.GetPoWHash(), block.nBits, Params().GetConsensus())) + if (!CheckAuxPowProofOfWork(block, Params().GetConsensus())) return error("ReadBlockFromDisk: Errors in block header at %s", pos.ToString()); return true; } -bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) +template<typename T> +static bool ReadBlockOrHeader(T& block, const CBlockIndex* pindex) { - if (!ReadBlockFromDisk(block, pindex->GetBlockPos())) + if (!ReadBlockOrHeader(block, pindex->GetBlockPos())) return false; if (block.GetHash() != pindex->GetBlockHash()) return error("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s", @@ -1193,6 +1199,21 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) return true; } +bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos) +{ + return ReadBlockOrHeader(block, pos); +} + +bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) +{ + return ReadBlockOrHeader(block, pindex); +} + +bool ReadBlockHeaderFromDisk(CBlockHeader& block, const CBlockIndex* pindex) +{ + return ReadBlockOrHeader(block, pindex); +} + CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { int halvings = nHeight / consensusParams.nSubsidyHalvingInterval; @@ -2646,7 +2667,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool fCheckPOW) { // Check proof of work matches claimed amount - if (fCheckPOW && !CheckProofOfWork(block.GetPoWHash(), block.nBits, Params().GetConsensus())) + if (fCheckPOW && !CheckAuxPowProofOfWork(block, Params().GetConsensus())) return state.DoS(50, error("CheckBlockHeader(): proof of work failed"), REJECT_INVALID, "high-hash"); @@ -2730,6 +2751,13 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta int nHeight = pindexPrev->nHeight+1; + // Disallow legacy blocks after merge-mining start. + if (!Params().GetConsensus().AllowLegacyBlocks(nHeight) + && block.nVersion.IsLegacy()) + return state.DoS(100, error("%s : legacy block after auxpow start", + __func__), + REJECT_INVALID, "late-legacy-block"); + // Check proof of work if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams)) return state.DoS(100, error("%s: incorrect proof of work", __func__), |