Skip to content

Commit f18a751

Browse files
authored
Merge pull request #3 from barrystyle/0.14-posblockindex
Refactor stakemodifier routines into AddToBlockIndex;
2 parents aa5f65f + ae7bc15 commit f18a751

File tree

3 files changed

+40
-70
lines changed

3 files changed

+40
-70
lines changed

src/chainparams.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ class CTestNetParams : public CChainParams {
415415
consensus.BIP65Height = 0;
416416
consensus.BIP66Height = 0;
417417
consensus.DIP0001Height = 1;
418-
consensus.DIP0003Height = 1;
418+
consensus.DIP0003Height = 50;
419419
consensus.DIP0003EnforcementHeight = 250;
420420
consensus.DIP0003EnforcementHash = uint256S("0x0000000000000000000000000000000000000000000000000000000000000000");
421421
consensus.powLimit = uint256S("0000fffff0000000000000000000000000000000000000000000000000000000");
@@ -485,9 +485,9 @@ class CTestNetParams : public CChainParams {
485485
nDefaultPort = 29999;
486486
nPruneAfterHeight = 1000;
487487

488-
genesis = CreateGenesisBlock(1563589000, 62255, 0x1f00ffff, 1, 0 * COIN);
488+
genesis = CreateGenesisBlock(1564329000, 1273, 0x1f00ffff, 1, 0 * COIN);
489489
consensus.hashGenesisBlock = genesis.GetHash();
490-
assert(consensus.hashGenesisBlock == uint256S("0x0000b67f0d64e977df72e86de5ef38e46b03d163790ed9a12e43240915be7197"));
490+
assert(consensus.hashGenesisBlock == uint256S("0x0000aa69de17dfd6989df2a1350ccfe8ed6b591a8d373f2b7a79c1ad3b94e70a"));
491491

492492
vFixedSeeds.clear();
493493
vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));

src/kernel.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ static bool GetLastStakeModifier(const CBlockIndex* pindex, uint64_t& nStakeModi
5151
return error("GetLastStakeModifier: null pindex");
5252
while (pindex && pindex->pprev && !pindex->GeneratedStakeModifier())
5353
pindex = pindex->pprev;
54-
if (!pindex->GeneratedStakeModifier())
55-
return error("GetLastStakeModifier: no generation at genesis block");
54+
if (!pindex->GeneratedStakeModifier()) {
55+
nStakeModifier = 0;
56+
return true;
57+
}
5658
nStakeModifier = pindex->nStakeModifier;
5759
nModifierTime = pindex->GetBlockTime();
5860
return true;

src/validation.cpp

+33-65
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ CCriticalSection cs_main;
7676
BlockMap mapBlockIndex;
7777
PrevBlockMap mapPrevBlockIndex;
7878
CChain chainActive;
79+
std::set<std::pair<COutPoint, unsigned int>> setStakeSeen;
7980
CBlockIndex *pindexBestHeader = NULL;
8081
CWaitableCriticalSection csBestBlock;
8182
CConditionVariable cvBlockChange;
@@ -3157,52 +3158,6 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex) {
31573158
return true;
31583159
}
31593160

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-
32063161
CBlockIndex* AddToBlockIndex(const CBlockHeader& block, enum BlockStatus nStatus = BLOCK_VALID_TREE)
32073162
{
32083163
// Check for duplicate
@@ -3219,32 +3174,50 @@ CBlockIndex* AddToBlockIndex(const CBlockHeader& block, enum BlockStatus nStatus
32193174
// competitive advantage.
32203175
pindexNew->nSequenceId = 0;
32213176
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+
32223182
pindexNew->phashBlock = &((*mi).first);
32233183
BlockMap::iterator miPrev = mapBlockIndex.find(block.hashPrevBlock);
32243184
if (miPrev != mapBlockIndex.end())
32253185
{
32263186
pindexNew->pprev = (*miPrev).second;
32273187
pindexNew->nHeight = pindexNew->pprev->nHeight + 1;
32283188
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));
32293213
}
3230-
pindexNew->nTimeMax = (pindexNew->pprev ? std::max(pindexNew->pprev->nTimeMax, pindexNew->nTime) : pindexNew->nTime);
32313214
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;
32403218

32413219
setDirtyBlockIndex.insert(pindexNew);
32423220

3243-
// track prevBlockHash -> pindex (multimap)
3244-
if (pindexNew->pprev) {
3245-
mapPrevBlockIndex.emplace(pindexNew->pprev->GetBlockHash(), pindexNew);
3246-
}
3247-
32483221
return pindexNew;
32493222
}
32503223

@@ -3756,9 +3729,6 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation
37563729
return error("%s: %s", __func__, FormatStateMessage(state));
37573730
}
37583731

3759-
if (!AcceptProofOfStakeBlock(block, pindex))
3760-
return false;
3761-
37623732
// Header is valid/has work, merkle tree is good...RELAY NOW
37633733
// (but if it does not build on our best tip, let the SendMessages loop relay it)
37643734
if (!IsInitialBlockDownload() && chainActive.Tip() == pindex->pprev)
@@ -4396,8 +4366,6 @@ static bool AddGenesisBlock(const CChainParams& chainparams, const CBlock& block
43964366
if (!WriteBlockToDisk(block, blockPos, chainparams.MessageStart()))
43974367
return error("%s: writing genesis block to disk failed", __func__);
43984368
CBlockIndex *pindex = AddToBlockIndex(block);
4399-
if (!AcceptProofOfStakeBlock(block, pindex))
4400-
return error("%s: genesis block not accepted", __func__);
44014369
if (!ReceivedBlockTransactions(block, state, pindex, blockPos))
44024370
return error("%s: genesis block not accepted", __func__);
44034371
return true;

0 commit comments

Comments
 (0)