@@ -76,6 +76,7 @@ CCriticalSection cs_main;
76
76
BlockMap mapBlockIndex;
77
77
PrevBlockMap mapPrevBlockIndex;
78
78
CChain chainActive;
79
+ std::set<std::pair<COutPoint, unsigned int >> setStakeSeen;
79
80
CBlockIndex *pindexBestHeader = NULL ;
80
81
CWaitableCriticalSection csBestBlock;
81
82
CConditionVariable cvBlockChange;
@@ -3157,52 +3158,6 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex) {
3157
3158
return true ;
3158
3159
}
3159
3160
3160
- bool AcceptProofOfStakeBlock (const CBlock &block, CBlockIndex *pindex)
3161
- {
3162
- if (!pindex)
3163
- return false ;
3164
-
3165
- if (block.IsProofOfStake ()) {
3166
- pindex->SetProofOfStake ();
3167
- pindex->prevoutStake = block.vtx [1 ]->vin [0 ].prevout ;
3168
- pindex->nStakeTime = block.nTime ;
3169
- } else {
3170
- pindex->prevoutStake .SetNull ();
3171
- pindex->nStakeTime = 0 ;
3172
- }
3173
-
3174
- // ppcoin: compute chain trust score
3175
- pindex->bnChainTrust = (pindex->pprev ? pindex->pprev ->bnChainTrust : ArithToUint256 (0 + pindex->GetBlockTrust ()));
3176
-
3177
- // ppcoin: compute stake entropy bit for stake modifier
3178
- if (!pindex->SetStakeEntropyBit (pindex->GetStakeEntropyBit ()))
3179
- LogPrintf (" AcceptProofOfStakeBlock() : SetStakeEntropyBit() failed \n " );
3180
-
3181
- // ppcoin: record proof-of-stake hash value
3182
- if (pindex->IsProofOfStake ()) {
3183
- uint256 hash = block.GetHash ();
3184
- if (!mapProofOfStake.count (hash))
3185
- LogPrintf (" AcceptProofOfStakeBlock() : hashProofOfStake not found in map \n " );
3186
- pindex->hashProofOfStake = mapProofOfStake[hash];
3187
- }
3188
-
3189
- // ppcoin: compute stake modifier
3190
- uint64_t nStakeModifier = 0 ;
3191
- bool fGeneratedStakeModifier = false ;
3192
- if (!ComputeNextStakeModifier (pindex, nStakeModifier, fGeneratedStakeModifier ))
3193
- LogPrintf (" AcceptProofOfStakeBlock() : ComputeNextStakeModifier() failed \n " );
3194
- pindex->SetStakeModifier (nStakeModifier, fGeneratedStakeModifier );
3195
- pindex->nStakeModifierChecksum = GetStakeModifierChecksum (pindex);
3196
- if (!CheckStakeModifierCheckpoints (pindex->nHeight , pindex->nStakeModifierChecksum )) {
3197
- LogPrintf (" AcceptProofOfStakeBlock() : Rejected by stake modifier checkpoint height=%d, modifier=0x%016llx, checksum=0x%08x\n " ,
3198
- pindex->nHeight , nStakeModifier, pindex->nStakeModifierChecksum );
3199
- return false ;
3200
- }
3201
-
3202
- setDirtyBlockIndex.insert (pindex);
3203
- return true ;
3204
- }
3205
-
3206
3161
CBlockIndex* AddToBlockIndex (const CBlockHeader& block, enum BlockStatus nStatus = BLOCK_VALID_TREE)
3207
3162
{
3208
3163
// Check for duplicate
@@ -3219,32 +3174,50 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block, enum BlockStatus nStatus
3219
3174
// competitive advantage.
3220
3175
pindexNew->nSequenceId = 0 ;
3221
3176
BlockMap::iterator mi = mapBlockIndex.insert (std::make_pair (hash, pindexNew)).first ;
3177
+
3178
+ // mark as PoS seen
3179
+ if (pindexNew->IsProofOfStake ())
3180
+ setStakeSeen.insert (std::make_pair (pindexNew->prevoutStake , pindexNew->nTime ));
3181
+
3222
3182
pindexNew->phashBlock = &((*mi).first );
3223
3183
BlockMap::iterator miPrev = mapBlockIndex.find (block.hashPrevBlock );
3224
3184
if (miPrev != mapBlockIndex.end ())
3225
3185
{
3226
3186
pindexNew->pprev = (*miPrev).second ;
3227
3187
pindexNew->nHeight = pindexNew->pprev ->nHeight + 1 ;
3228
3188
pindexNew->BuildSkip ();
3189
+
3190
+ // ppcoin: compute chain trust score
3191
+ pindexNew->bnChainTrust = (pindexNew->pprev ? pindexNew->pprev ->bnChainTrust : ArithToUint256 (0 + pindexNew->GetBlockTrust ()));
3192
+
3193
+ // ppcoin: compute stake entropy bit for stake modifier
3194
+ if (!pindexNew->SetStakeEntropyBit (pindexNew->GetStakeEntropyBit ()))
3195
+ LogPrintf (" AddToBlockIndex() : SetStakeEntropyBit() failed \n " );
3196
+
3197
+ // ppcoin: record proof-of-stake hash value
3198
+ if (pindexNew->IsProofOfStake ()) {
3199
+ if (!mapProofOfStake.count (hash))
3200
+ LogPrintf (" AddToBlockIndex() : hashProofOfStake not found in map \n " );
3201
+ pindexNew->hashProofOfStake = mapProofOfStake[hash];
3202
+ }
3203
+
3204
+ // ppcoin: compute stake modifier
3205
+ uint64_t nStakeModifier = 0 ;
3206
+ bool fGeneratedStakeModifier = false ;
3207
+ if (!ComputeNextStakeModifier (pindexNew->pprev , nStakeModifier, fGeneratedStakeModifier ))
3208
+ LogPrintf (" AddToBlockIndex() : ComputeNextStakeModifier() failed \n " );
3209
+ pindexNew->SetStakeModifier (nStakeModifier, fGeneratedStakeModifier );
3210
+ pindexNew->nStakeModifierChecksum = GetStakeModifierChecksum (pindexNew);
3211
+ if (!CheckStakeModifierCheckpoints (pindexNew->nHeight , pindexNew->nStakeModifierChecksum ))
3212
+ LogPrintf (" AddToBlockIndex() : Rejected by stake modifier checkpoint height=%d, modifier=%s \n " , pindexNew->nHeight , boost::lexical_cast<std::string>(nStakeModifier));
3229
3213
}
3230
- pindexNew->nTimeMax = (pindexNew->pprev ? std::max (pindexNew->pprev ->nTimeMax , pindexNew->nTime ) : pindexNew->nTime );
3231
3214
pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev ->nChainWork : 0 ) + GetBlockProof (*pindexNew);
3232
- if (nStatus & BLOCK_VALID_MASK) {
3233
- pindexNew->RaiseValidity (nStatus);
3234
- if (pindexBestHeader == NULL || pindexBestHeader->nChainWork < pindexNew->nChainWork )
3235
- pindexBestHeader = pindexNew;
3236
- } else {
3237
- pindexNew->RaiseValidity (BLOCK_VALID_TREE); // required validity level
3238
- pindexNew->nStatus |= nStatus;
3239
- }
3215
+ pindexNew->RaiseValidity (BLOCK_VALID_TREE);
3216
+ if (pindexBestHeader == NULL || pindexBestHeader->nChainWork < pindexNew->nChainWork )
3217
+ pindexBestHeader = pindexNew;
3240
3218
3241
3219
setDirtyBlockIndex.insert (pindexNew);
3242
3220
3243
- // track prevBlockHash -> pindex (multimap)
3244
- if (pindexNew->pprev ) {
3245
- mapPrevBlockIndex.emplace (pindexNew->pprev ->GetBlockHash (), pindexNew);
3246
- }
3247
-
3248
3221
return pindexNew;
3249
3222
}
3250
3223
@@ -3756,9 +3729,6 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation
3756
3729
return error (" %s: %s" , __func__, FormatStateMessage (state));
3757
3730
}
3758
3731
3759
- if (!AcceptProofOfStakeBlock (block, pindex))
3760
- return false ;
3761
-
3762
3732
// Header is valid/has work, merkle tree is good...RELAY NOW
3763
3733
// (but if it does not build on our best tip, let the SendMessages loop relay it)
3764
3734
if (!IsInitialBlockDownload () && chainActive.Tip () == pindex->pprev )
@@ -4396,8 +4366,6 @@ static bool AddGenesisBlock(const CChainParams& chainparams, const CBlock& block
4396
4366
if (!WriteBlockToDisk (block, blockPos, chainparams.MessageStart ()))
4397
4367
return error (" %s: writing genesis block to disk failed" , __func__);
4398
4368
CBlockIndex *pindex = AddToBlockIndex (block);
4399
- if (!AcceptProofOfStakeBlock (block, pindex))
4400
- return error (" %s: genesis block not accepted" , __func__);
4401
4369
if (!ReceivedBlockTransactions (block, state, pindex, blockPos))
4402
4370
return error (" %s: genesis block not accepted" , __func__);
4403
4371
return true ;
0 commit comments