diff --git a/src/komodo.h b/src/komodo.h index a0fbc7f31..b9fc9ac45 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -19,8 +19,9 @@ #include #include -int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY; +int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,NOTARIZED_HEIGHT; std::string NOTARY_PUBKEY; +uint256 NOTARIZED_HASH; int32_t komodo_checkmsg(void *bitcoinpeer,uint8_t *data,int32_t datalen) { @@ -57,6 +58,8 @@ int32_t komodo_blockindexcheck(CBlockIndex *pindex,uint32_t *nBitsp) int32_t komodo_blockcheck(CBlock *block,uint32_t *nBitsp) { + if ( block.GetHeight() <= NOTARIZED_HEIGHT ) + return(-1); // 1 -> valid notary block, change nBits to KOMODO_MINDIFF_NBITS // -1 -> invalid, ie, prior to notarized block return(0); // normal PoW block diff --git a/src/main.cpp b/src/main.cpp index 8fc822dc7..b2e441b72 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2952,6 +2952,8 @@ bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, bool f if (block.GetBlockTime() > GetAdjustedTime() + 60) return state.Invalid(error("CheckBlockHeader(): block timestamp too far in the future"),REJECT_INVALID, "time-too-new"); nBits = block.nBits; + if ( block.GetHeight() < NOTARIZED_HEIGHT || (block.GetHeight() == NOTARIZED_HEIGHT && NOTARIZED_HASH != block.GetBlockHash()) ) + return(false); if ( (retval= komodo_blockhdrcheck(&block,&nBits)) == 0 ) { // Check Equihash solution is valid diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 8521c2f6e..d4c5bd8b0 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -199,8 +199,7 @@ Value generate(const Array& params, bool fHelp) if ( (retval= komodo_blockcheck(pblock,&nBits)) == 0 ) { return CheckProofOfWork(pblock->GetHash(), nBits, Params().GetConsensus()); - } - else if ( retval < 0 ) // komodo rejects, ie. prior to notarized blockhash + } else if ( retval < 0 ) // komodo rejects, ie. prior to notarized blockhash return(false); return true; }; diff --git a/src/txdb.cpp b/src/txdb.cpp index 31bc73704..5140ade29 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -267,6 +267,8 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) { } int32_t komodo_blockindexcheck(CBlockIndex *pindex,uint32_t *nBitsp); +extern int32_t NOTARIZED_HEIGHT; +extern uint256 NOTARIZED_HASH; bool CBlockTreeDB::LoadBlockIndexGuts() { @@ -308,12 +310,13 @@ bool CBlockTreeDB::LoadBlockIndexGuts() int32_t retval; uint32_t nBits; nBits = pindexNew->nBits; + if ( pindexNew->nHeight < NOTARIZED_HEIGHT || (pindexNew->nHeight == NOTARIZED_HEIGHT && NOTARIZED_HASH != pindexNew->GetBlockHash()) ) + return(false); if ( (retval= komodo_blockindexcheck(pindexNew,&nBits)) == 0 ) { if (!CheckProofOfWork(pindexNew->GetBlockHash(), nBits, Params().GetConsensus())) return error("LoadBlockIndex(): CheckProofOfWork failed: %s", pindexNew->ToString()); - } - else if ( retval < 0 ) // komodo rejects, ie. prior to notarized blockhash + } else if ( retval < 0 ) // komodo rejects, ie. prior to notarized blockhash return(false); pcursor->Next(); } else {